十個(gè)優(yōu)秀開源推薦系統(tǒng)/算法/資源
一、推薦系統(tǒng)簡(jiǎn)介
在互聯(lián)網(wǎng)時(shí)代,推薦系統(tǒng)隨處可見,比如:我昨天晚上還在“某東”看一個(gè)運(yùn)動(dòng)鞋,今天早上“某條”上的廣告就給我推薦運(yùn)動(dòng)鞋相關(guān)的廣告。在看這個(gè)這篇公眾號(hào)博文的你,是否已經(jīng)注意到上面的廣告是否是你曾經(jīng)關(guān)注的?
推薦系統(tǒng)一直以來(lái)都是一個(gè)熱門技術(shù)領(lǐng)域,也是機(jī)器學(xué)習(xí)技術(shù)在商業(yè)中最成功和最廣泛的應(yīng)用之一。它是根據(jù)用戶的歷史行為、社交關(guān)系、興趣點(diǎn)等信息去判斷用戶當(dāng)前需要或感興趣的產(chǎn)品或者服務(wù)的一類應(yīng)用。推薦系統(tǒng)本身是一種信息過(guò)濾的方法,與搜索和欄目導(dǎo)航組成三大主流的信息過(guò)濾方法。
推薦系統(tǒng)對(duì)用戶而言,能幫助他們找到喜歡的產(chǎn)品、服務(wù),幫助用戶做出選擇;對(duì)服務(wù)提供方而言,可以給用戶提供個(gè)性化的服務(wù),提高用戶信任度和粘性,增加營(yíng)收。
二、什么是推薦引擎?
推薦系統(tǒng)的核心是推薦引擎,推薦引擎根據(jù)特定客戶之前的購(gòu)買歷史過(guò)濾出他或她感興趣或會(huì)購(gòu)買的產(chǎn)品。關(guān)于客戶的可用數(shù)據(jù)越多,建議就越準(zhǔn)確。但如果客戶是新客戶,這種方法將失敗,因?yàn)槲覀儧](méi)有該客戶以前的數(shù)據(jù)。因此,為了解決這個(gè)問(wèn)題,就需改變策略,通常推薦最受歡迎的產(chǎn)品給客戶不一定準(zhǔn)確,因?yàn)閷?duì)所有新客戶推薦內(nèi)容都是一樣的。因此,一些APP會(huì)詢問(wèn)新客戶的興趣,以便他們可以更準(zhǔn)確地推薦。
針對(duì)不同的客戶或者產(chǎn)品,推薦引擎的過(guò)濾方式可以包括:基于內(nèi)容的過(guò)濾、協(xié)同過(guò)濾、混合過(guò)濾等。
1.基于內(nèi)容的過(guò)濾
基于內(nèi)容的過(guò)濾根據(jù)產(chǎn)品提供的描述或某些數(shù)據(jù)來(lái)查找產(chǎn)品之間的相似性。根據(jù)用戶的先前歷史,找到用戶可能喜歡的類似產(chǎn)品。例如:如果用戶喜歡“諜中諜”之類的電影,那么我們可以向他推薦“湯姆克魯斯”的電影。
這種過(guò)濾方式使用兩種類型的數(shù)據(jù)。第一,用戶相關(guān)的信息——用戶向量,包括用戶的喜好、用戶的興趣、用戶的個(gè)人信息(如年齡)、用戶的歷史等。第二,與產(chǎn)品相關(guān)的信息——項(xiàng)目向量,項(xiàng)目向量包含所有項(xiàng)目的特征,基于這些特征可以計(jì)算它們之間的相似性。
可以使用余弦相似度計(jì)算。如果“A”是用戶向量,“B”是項(xiàng)目向量,則余弦相似度采用以下公式計(jì)算:
最后將余弦相似度矩陣中計(jì)算的值按降序排序,并推薦給該用戶排在前面的一個(gè)或幾個(gè)項(xiàng)目。
基于內(nèi)容的過(guò)濾的優(yōu)勢(shì)是:
- 用戶會(huì)被推薦他們喜歡的物品類型;
- 用戶對(duì)推薦的類型感到滿意;
- 只需要擁有新項(xiàng)目數(shù)據(jù),就可以推薦新項(xiàng)目;
缺點(diǎn)是:
- 用戶永遠(yuǎn)不會(huì)被推薦不同的項(xiàng)目;
- 由于用戶不嘗試不同類型的產(chǎn)品,業(yè)務(wù)無(wú)法擴(kuò)展;
- 如果用戶矩陣或項(xiàng)目矩陣發(fā)生變化,則需要重新計(jì)算余弦相似度矩陣;
2.協(xié)同過(guò)濾
協(xié)同過(guò)濾是根據(jù)用戶的行為來(lái)執(zhí)行的。用戶的歷史行為信息扮演著重要的角色。例如,如果用戶“A”喜歡“Coldplay”、“The Linkin Park”和“Britney Spears”,而用戶“B”喜歡“Coldplay”、“The Linkin Park”和“Taylor Swift”,則他們具有相似的興趣。因此,存在用戶“A”喜歡“Taylor Swift”并且用戶“B”喜歡“Britney Spears”的巨大概率。這就是協(xié)同過(guò)濾的方式。
協(xié)同過(guò)濾技術(shù)包括:用戶-用戶協(xié)同過(guò)濾、項(xiàng)目-項(xiàng)目協(xié)同過(guò)濾。
(1) 用戶-用戶協(xié)同過(guò)濾
用戶向量包括用戶購(gòu)買的所有物品以及針對(duì)每個(gè)特定產(chǎn)品給出的評(píng)價(jià)。使用n*n矩陣計(jì)算用戶之間的相似性,其中n是存在的用戶的數(shù)量。相似度使用相同的余弦相似度公式計(jì)算。現(xiàn)在,計(jì)算推薦矩陣。在這種情況下,評(píng)級(jí)乘以購(gòu)買該項(xiàng)目的用戶與必須向其推薦項(xiàng)目的用戶之間的相似性。為該用戶的所有新項(xiàng)目計(jì)算這個(gè)值,并按降序排序。然后,將最重要的項(xiàng)目推薦給該用戶。
如果有新用戶到來(lái),或者老用戶改變了他對(duì)項(xiàng)目的評(píng)價(jià),則推薦項(xiàng)目就可能改變。
(2) 項(xiàng)目-項(xiàng)目協(xié)同過(guò)濾
在這種方式下,考慮的不是類似的用戶,而是類似的項(xiàng)目。如果用戶“A”喜歡“盜夢(mèng)空間”,他可能會(huì)喜歡“火星人”,因?yàn)椤氨I夢(mèng)空間”和“火星人”的某些方面是類似的。推薦矩陣是m*m矩陣,其中m是存在的項(xiàng)目的數(shù)量。
協(xié)同過(guò)濾算法的優(yōu)勢(shì)是:
- 可以向用戶推薦新產(chǎn)品;
- 可以推廣新產(chǎn)品,擴(kuò)大業(yè)務(wù);
缺點(diǎn)是:
- 需要用戶以前的歷史記錄或產(chǎn)品數(shù)據(jù);
- 如果沒(méi)有用戶購(gòu)買或評(píng)價(jià),則無(wú)法推薦新項(xiàng)目;
3.混合推薦算法
基于內(nèi)容的推薦或者協(xié)同過(guò)濾算法各有優(yōu)缺點(diǎn)。為了更準(zhǔn)確地推薦產(chǎn)品,還可以使用混合推薦算法,即同時(shí)使用基于內(nèi)容和協(xié)同過(guò)濾推薦產(chǎn)品?;旌贤扑]算法具有更高的效率和更好的實(shí)用性。
三、10個(gè)最佳開源推薦系統(tǒng)相關(guān)資源
為了進(jìn)一步理解推薦系統(tǒng),以下收集了一些用于學(xué)習(xí)或者開發(fā)的最佳開源項(xiàng)目,包括:學(xué)習(xí)資源、開發(fā)包、完整的推薦系統(tǒng)等。
1.d2l-zh或d2l-en
GitHub(K):
- 中文:https://github.com/d2l-ai/d2l-zh
- 英文:https://github.com/d2l-ai/d2l-en
語(yǔ)言:Python
這個(gè)庫(kù)包含各種交互式深度學(xué)習(xí)書籍,多種框架代碼,數(shù)學(xué)和討論,其中也包含推薦系統(tǒng)算法。這個(gè)庫(kù)已經(jīng)被斯坦福大學(xué)、麻省理工學(xué)院、哈佛和劍橋在內(nèi)的70個(gè)國(guó)家的500所大學(xué)采用。絕對(duì)是學(xué)習(xí)人工智能技術(shù)的好資源。
這個(gè)庫(kù)的目的是:
- 所有人均可在網(wǎng)上免費(fèi)獲取;
- 提供足夠的技術(shù)深度,從而幫助讀者實(shí)際成為深度學(xué)習(xí)應(yīng)用科學(xué)家:既理解數(shù)學(xué)原理,又能夠?qū)崿F(xiàn)并不斷改進(jìn)方法;
- 包含可運(yùn)行的代碼,為讀者展示如何在實(shí)際中解決問(wèn)題。這樣不僅直接將數(shù)學(xué)公式對(duì)應(yīng)成實(shí)際代碼,而且可以修改代碼、觀察結(jié)果并及時(shí)獲取經(jīng)驗(yàn);
- 允許我們和整個(gè)社區(qū)不斷快速迭代內(nèi)容,從而緊跟仍在高速發(fā)展的深度學(xué)習(xí)領(lǐng)域;
- 由包含有關(guān)技術(shù)細(xì)節(jié)問(wèn)答的論壇作為補(bǔ)充,使大家可以相互答疑并交換經(jīng)驗(yàn)。
2.Recommenders
GitHub(16.7K):https://github.com/recommenders-team/recommenders
語(yǔ)言:Python
該庫(kù)包含構(gòu)建推薦系統(tǒng)的各種示例和最佳實(shí)踐,以Jupyter notebooks的形式提供。
下圖描述了這個(gè)最佳實(shí)踐示例是如何在推薦系統(tǒng)開發(fā)工作流程中幫助研究人員/開發(fā)人員的。
下面是examples目錄下的子目錄內(nèi)容介紹。
3.Gorse
GitHub(7.7K):https://github.com/gorse-io/gorse
語(yǔ)言:Go
Gorse是一個(gè)用Go語(yǔ)言編寫的開源推薦系統(tǒng)。Gorse的目標(biāo)是成為一個(gè)通用的開源推薦系統(tǒng),可以快速引入各種在線服務(wù)。通過(guò)將項(xiàng)目、用戶和交互數(shù)據(jù)導(dǎo)入到Gorse中,系統(tǒng)將自動(dòng)訓(xùn)練模型,為每個(gè)用戶生成推薦。
特點(diǎn)包括:
- 多源推薦:熱門、最新、基于用戶、基于項(xiàng)目和協(xié)同過(guò)濾的推薦。
- AutoML:可在后臺(tái)自動(dòng)搜索最佳推薦模型。
- 分布式預(yù)測(cè):支持單節(jié)點(diǎn)訓(xùn)練,而在推理階段支持橫向伸縮。
- RESTful API:為數(shù)據(jù)CRUD和推薦請(qǐng)求提供RESTful API。
- 在線評(píng)估:從最近新增的反饋中分析在線推薦性能。
- 儀表板盤:提供GUI用于數(shù)據(jù)管理、系統(tǒng)監(jiān)控和集群狀態(tài)檢查。
Gorse系統(tǒng)將數(shù)據(jù)存儲(chǔ)在MySQL、MongoDB或Postgres中,中間結(jié)果緩存在Redis、MySQL、MongoDB或Postgres中。支持在一個(gè)單節(jié)點(diǎn)訓(xùn)練,并在分布式環(huán)境允許推薦系統(tǒng)。管理員可以通過(guò)主節(jié)點(diǎn)上的儀表盤監(jiān)控系統(tǒng)運(yùn)行狀態(tài)、執(zhí)行數(shù)據(jù)導(dǎo)入導(dǎo)出等操作。
其分布式架構(gòu)如下:
儀表盤界面如下:
4.LightFM
GitHub(4.5K):https://github.com/lyst/lightfm
語(yǔ)言:Python
LightFM是一個(gè)用Python實(shí)現(xiàn)的一種混合推薦算法。用于隱式和顯式反饋的推薦算法項(xiàng)目,包括基于BPR和WARP損失算法的有效實(shí)現(xiàn)。它易于使用,快速(通過(guò)多線程模型估計(jì)),并能夠產(chǎn)生高質(zhì)量的結(jié)果。
它還可以將項(xiàng)目和用戶元數(shù)據(jù)合并到傳統(tǒng)的矩陣分解算法中。從而允許推薦推廣到新項(xiàng)目(通過(guò)項(xiàng)目特征)和新用戶(通過(guò)用戶特征)。
5.implicit
GitHub(3.3K):https://github.com/benfred/implicit
語(yǔ)言:Python
這個(gè)項(xiàng)目提供了幾種不同的流行推薦算法的快速Python實(shí)現(xiàn),以及用于快速Python協(xié)作過(guò)濾的隱式數(shù)據(jù)集:
- 交替最小二乘法,如在論文中所述的協(xié)同過(guò)濾隱式反饋數(shù)據(jù)集和應(yīng)用共軛梯度法隱式反饋協(xié)同過(guò)濾
- 貝葉斯個(gè)性化排名
- 邏輯矩陣分解
- 使用余弦、TFIDF或BM 25作為距離度量的項(xiàng)-項(xiàng)最近鄰模型。
6.spotlight
GitHub(2.9K):https://github.com/maciejkula/spotlight
語(yǔ)言:Python
Spotlight是個(gè)使用PyTorch構(gòu)建的深度推薦模型。旨在成為推薦系統(tǒng)快速實(shí)踐工具和新型推薦模型的原型。
7.EasyRec
GitHub(1.3K):https://github.com/alibaba/EasyRec
語(yǔ)言:Python
EasyRec是一個(gè)阿里巴巴開源的大規(guī)模推薦算法框架。實(shí)現(xiàn)了用于常見推薦任務(wù)的最先進(jìn)的深度學(xué)習(xí)模型:候選生成(匹配),評(píng)分(排名)和多任務(wù)學(xué)習(xí)。它通過(guò)簡(jiǎn)單的配置和超參數(shù)調(diào)整(HPO)提高了生成高性能模型的效率。
8.Tensorflow Recommenders
GitHub(1.7K):https://github.com/tensorflow/recommenders
TensorFlow Recommenders是一個(gè)使用TensorFlow構(gòu)建的推薦系統(tǒng)模型的庫(kù)。這個(gè)項(xiàng)目可用于構(gòu)建推薦系統(tǒng)的完整工作流程,包括:數(shù)據(jù)準(zhǔn)備、模型制定、培訓(xùn)、評(píng)估和部署等環(huán)節(jié)。它建立在Keras框架之上,具備溫和學(xué)習(xí)曲線,同時(shí)也支持靈活地構(gòu)建復(fù)雜的模型。
9.TorchRec
GitHub(2K):https://github.com/pytorch/torchrec
語(yǔ)言:Python
TorchRec是一個(gè)PyTorch域庫(kù),旨在提供大規(guī)模推薦系統(tǒng)(RecSys)所需的常見稀疏并行原語(yǔ)。它允許作者使用跨多個(gè)GPU來(lái)訓(xùn)練模型。
TorchRec提供的內(nèi)容包括:
- 使用混合數(shù)據(jù)并行性、模型并行性,輕松創(chuàng)作支持大型高性能多設(shè)備/多節(jié)點(diǎn)模型的并行性原語(yǔ)。
- TorchRec Sharder可以使用不同的分片策略對(duì)嵌入表進(jìn)行分片,包括數(shù)據(jù)并行、表式、行式、表式行式、列式、表式列式分片。
- TorchRec規(guī)劃器可以自動(dòng)為模型生成優(yōu)化的分片計(jì)劃。
- 流水線訓(xùn)練與數(shù)據(jù)加載設(shè)備傳輸(復(fù)制到GPU)、設(shè)備間通信(input_dist)和計(jì)算(向前、向后)重疊,以提高性能。
- 針對(duì)由FBGEMM提供支持的RecSys優(yōu)化內(nèi)核。
- 量化支持降低精度的訓(xùn)練和推理。
- RecSys的通用模塊。
- 用于RecSys的經(jīng)過(guò)生產(chǎn)驗(yàn)證的模型架構(gòu)。
- RecSys數(shù)據(jù)集(點(diǎn)擊日志和movielens)
- 端到端訓(xùn)練的例子,比如在criteo click logs數(shù)據(jù)集上訓(xùn)練的dlrm事件預(yù)測(cè)模型。
10.RecSysDatasets
GitHub:https://github.com/RUCAIBox/RecSysDatasets
語(yǔ)言:Python
這是用于訓(xùn)練推薦系統(tǒng)(RS)的公共數(shù)據(jù)源。所有數(shù)據(jù)集都可以轉(zhuǎn)換為原子文件, 它是一個(gè)統(tǒng)一、全面、高效的推薦系統(tǒng)資源。轉(zhuǎn)換為原子文件后的數(shù)據(jù)集,可以使用RecBole在這些數(shù)據(jù)集上測(cè)試不同推薦模型的性能。
數(shù)據(jù)集包括:購(gòu)物、電影、廣告、音樂(lè)、圖書、圖片、游戲、網(wǎng)站、食品、新聞、衣服等等。
總之
以上這些開源推薦系統(tǒng)相關(guān)資源,可以讓我們更好地學(xué)習(xí)推薦技術(shù)。基于現(xiàn)有的這些技術(shù),互聯(lián)網(wǎng)平臺(tái)可以讓用戶更能夠快速接納自己提供的信息或者產(chǎn)品,給自己帶來(lái)營(yíng)收,為用戶提供“千人千面”的服務(wù)。但同時(shí)也產(chǎn)生了“大數(shù)據(jù)殺熟”或者“信息繭房”的副作用。未來(lái)的推薦系統(tǒng),也許還應(yīng)該更加人性化一些吧。