0
本文作者: AI研習(xí)社-譯站 | 2020-11-02 15:35 |
譯者:AI研習(xí)社(季一帆)
雙語原文鏈接:https://www.yanxishe.com/TextTranslation/2968
一個基于深度學(xué)習(xí)的電影推薦系統(tǒng)
你看過《盜夢空間》嗎?是否被影片中的夢中夢燒腦,或是想象現(xiàn)實(shí)世界中物品能否像電影中那樣漂浮在空中?至少目前我們沒有辦法使物體懸浮在空中,但是,數(shù)據(jù)科學(xué)家可以將python向量映射到多維空間。
本文將為介紹一個電影推薦系統(tǒng),在推薦系統(tǒng)中,有許多電影向量懸浮于多維空間。同時,本文介紹的推薦系統(tǒng)無需租用服務(wù)器、編寫代碼、抓取數(shù)據(jù)或網(wǎng)頁維護(hù)等繁雜的工作,非常容易上手。此外,你還可以將其擴(kuò)展到社交網(wǎng)絡(luò)、股票、運(yùn)動員、電視節(jié)目、書籍等領(lǐng)域。想象一下,眾多實(shí)例都會被映射到多維矢量空間,一覽無余,那時多么直觀啊。
你可以點(diǎn)擊該鏈接預(yù)覽我們的電影推薦系統(tǒng)。
學(xué)習(xí)本文需要滿足以下條件:對新概念的好奇心,渴望部署自己的Web應(yīng)用程序。
同時,你最好對這些知識有所了解:word2vec嵌入,神經(jīng)網(wǎng)絡(luò),Tensorflow,Github和推薦系統(tǒng)。
1.Embedding:將高維向量投射到低維稠密向量空間。由于表示圖像/單詞的像素或標(biāo)記特征可能需要數(shù)百萬個參數(shù),因此我們需要定義一種受限統(tǒng)一結(jié)構(gòu),以此作為ML模型的輸入。在對高維或大量特征進(jìn)行建模以導(dǎo)出受限數(shù)據(jù)大小模式時,通常會遇到維數(shù)災(zāi)難,即模型無法從輸入數(shù)據(jù)中提取相關(guān)模式。通常我們會使用主成分分析(PCA),TSNE或L1正則化等方法進(jìn)行降維,但是對于極高維度和稀疏數(shù)據(jù)集(如Wikipedia語料庫中的數(shù)百萬個標(biāo)記),基于神經(jīng)網(wǎng)絡(luò)的嵌入可以很好的提取相關(guān)屬性。
嵌入能夠捕獲標(biāo)記或像素之間的語義相似性,并將其投影到向量空間中。例如,我們知道“費(fèi)德勒”和“網(wǎng)球”之間存在密切關(guān)聯(lián),那么在100維嵌入空間中,“費(fèi)德勒”比“特朗普”更接近“網(wǎng)球”。
圖示如下:
word2vec向量相似性
2. Tensorboard Projector:Tensorflow開源的Web應(yīng)用,可以接收模型嵌入并在低維空間進(jìn)行渲染,實(shí)現(xiàn)可視化交互。在tensorboard主頁上可以查看Wikipedia和MNIST語料庫的示例投影。建議讀者花時間具體了解下映射、濾波、嵌入空間以及各種降維算法。
Wikipedia的Tensorboard項(xiàng)目示例
3.降維算法:盡管模型嵌入維度為100,但人眼只能看到3維物品,為此,我們需要將矢量壓縮為2維或3維形式。
方法a:主成分分析PCA。一種常用的降維算法,可提高模型的可解釋性,同時最大程度地減少信息丟失。其主要思想是,構(gòu)建新的互不相關(guān)的主成分,最大程度地提高方差,即將包含最大信息的特征轉(zhuǎn)化為低維主成分。根據(jù)主成分增量方差(如90%的方差)確定截止值。
方法b:t分布隨機(jī)鄰域嵌入TSNE。一種用于探索高維數(shù)據(jù)的非線性降維算法,將多維數(shù)據(jù)映射到適合于人類觀察的兩個或多個維度。該算法的關(guān)鍵在于最小化兩個分布之間的差異,即測量輸入對象的成對相似性的分布以及相應(yīng)低維嵌入點(diǎn)的成對相似性的分布。
PCA和TSNE之間的主要區(qū)別為:一是PCA為線性降維,而TSNE是非線性度降維;二是目標(biāo)函數(shù)不同,PCA試圖保留全局?jǐn)?shù)據(jù)結(jié)構(gòu),而TSNE保留局部結(jié)構(gòu)。
Geeks For Geeks更詳細(xì)的指出了TSNE和PCA之間的八項(xiàng)區(qū)別,為人們提供了很好的參考。
4.MovieLens數(shù)據(jù)集:作為電影推薦系統(tǒng)的標(biāo)準(zhǔn)數(shù)據(jù)集,該數(shù)據(jù)集提供[userid-movieid]數(shù)據(jù),包含58,000電影和2,600萬評分。自1997年以來,該數(shù)據(jù)對于推動推薦系統(tǒng)的發(fā)展起著重要作用。在Google books搜索“ movielens”得到2,750個結(jié)果,在Google Scholar搜索得到7,580個結(jié)果,MovieLens數(shù)據(jù)集的影響可見一斑。應(yīng)用該數(shù)據(jù)集可基于SVD矩陣或神經(jīng)網(wǎng)絡(luò)構(gòu)建面向電影條目或是用戶的推薦系統(tǒng),并根據(jù)過去的偏好預(yù)測新用戶評分。
根據(jù)上述這些概念,我們可以創(chuàng)建一個電影推薦的Web應(yīng)用,使用的電影數(shù)據(jù)包括3700Netflix電影和上述數(shù)據(jù)集中的58k電影。(數(shù)據(jù)源見此)
就像word2vec嵌入將相近單詞映射到向量空間后距離較小,我們在100維向量空間中對電影進(jìn)行嵌入,這樣就將數(shù)據(jù)維度從58k(類似one-hot表示)減少到100k(嵌入表示)。
輸入MovieLens數(shù)據(jù)集,該數(shù)據(jù)集包含用戶對電影的評分,分值從0到5。為避免噪聲,MovieLens剔除了評分次數(shù)低于20且統(tǒng)計不準(zhǔn)確的用戶。同時,該數(shù)據(jù)集有諸多版本,范圍從[1k用戶* 1.7k電影]到[280k用戶* 58k電影],使用時請注意查看。對基于用戶的協(xié)同過濾,可以忽略分級質(zhì)量,以0/1表示用戶是否對電影進(jìn)行評分。
根據(jù)之前的介紹,電影推薦可分為以下三種類型:
1.基于流行度:標(biāo)識過去X時段內(nèi)最受歡迎(觀看最多)的電影,將這些電影推薦給所有用戶。
2.基于電影屬性:根據(jù)電影的元標(biāo)記(如演員,導(dǎo)演,語言,發(fā)行年份等)進(jìn)行推薦。但這樣的缺點(diǎn)是,電影的屬性不會隨時間改變,無法考慮用戶行為進(jìn)行實(shí)時推薦。
3.基于用戶:根據(jù)用戶的觀看模式和喜好,對用戶進(jìn)行分組,為用戶推薦同組內(nèi)其他用戶觀看的電影。例如,如果我觀看了Inception和Dark Knight,其他看過這兩部電影的人也喜歡看Prestige,那么推薦給我Prestige是較好的選擇。
關(guān)于基于電影的協(xié)同過濾創(chuàng)建推薦系統(tǒng),我之前寫過一篇詳細(xì)的博客。感興趣的讀者可以點(diǎn)此查看,并將推薦結(jié)果與基于用戶的推薦結(jié)果進(jìn)行比較。
對于新興的OTT平臺,由于沒有資源生成元標(biāo)簽和標(biāo)注電影,同時希望用戶與平臺進(jìn)行隱式交互,因此基于用戶的協(xié)同過濾(CF)方法是最適合的。至于像Netflix,Youtube這樣的大公司,實(shí)際上使用Prime-Video混合推薦方法。在本文中,我們僅討論基于用戶的協(xié)同過濾,即通過用戶矢量表征電影。數(shù)據(jù)集結(jié)構(gòu)如下:
MovieLens輸入數(shù)據(jù)格式
與word2vec嵌入類似,我們通過用戶ID訓(xùn)練淺層神經(jīng)網(wǎng)絡(luò)。經(jīng)過訓(xùn)練,我們在用戶ID嵌入中實(shí)現(xiàn)類似“網(wǎng)球-費(fèi)德勒”的關(guān)系。至此,我們可以找到相似的用戶,并可以將用戶分為幾類,通過推送或電子郵件發(fā)送有針對性的訊息。除了基于相似用戶的推薦方法,我們還可以根據(jù)電影進(jìn)行推薦,這就需要對電影信息進(jìn)行類似操作了。
接下來是句子嵌入,即將用戶視為句子,捕獲句子的語義相似性。通過BERT,Elmo,Doc2Vec和Universal Sentence Encoder等方式均可方便的實(shí)現(xiàn)句子嵌入,具體選擇哪種方式主要取決于模型的速度,根據(jù)我的測試,Fast_Sentence_Embeddings(FSE)是我比較推薦的方法,該方法直接根據(jù)各詞的word2vec生成復(fù)合向量。對于BERT這樣的SOTA系統(tǒng)而言,用戶ID很難表現(xiàn)出語義相似性,因此,即使使用經(jīng)過Wikipedia或GoogleNews預(yù)訓(xùn)練的模型,也不會有太大差異,這樣,模型的速度就成為唯一的衡量標(biāo)準(zhǔn)。FSE每秒可處理約500K句子,而預(yù)訓(xùn)練編碼模型低于每秒100句。
之后,將句子向量投影到多維空間中。例如,"Obama speaks to the media in Illinois" 和"The President greets the press in Chicago"表達(dá)的意思相近,在多維空間中距離就比較近。
基于上下文的句子相似性
Movielens數(shù)據(jù)的電影嵌入代碼:
base=[] for i in range(0,size): #print(kw[0][i].split(" ")) string=kw[i].split(",") #print(string) base=base+string if(len(base)>2): base = ','.join(base) return base s_test=links s_test=s_test[['userId','movieId']].drop_duplicates() s_test['keywords_comb']=s_test.groupby(['movieId'])['userId'].transform(combine) print("Start of Word2Vec",datetime.now().strftime('%Y-%m-%d %H:%M:%S')) data=s_test[['movieId','keywords_comb']].drop_duplicates() data['word_count'] = data.keywords_comb.str.count(',')+1 data=data[data['word_count']>5] data['tokenise'] = data['keywords_comb'].astype('str').apply(lambda x: [x for x in x.split(',')]) a1=data['tokenise'].tolist() model_items = Word2Vec(a1, size=100) #data=data.dropna() print("Start of Sentence To vec",datetime.now().strftime('%Y-%m-%d %H:%M:%S')) sent=data['keywords_comb'].astype('str').apply(lambda x: [x for x in x.split(',')]).tolist() s = IndexedList(sent) from fse.models import uSIF model = uSIF(model_items, lang_freq="en") |
完成影片嵌入后,我們將結(jié)合tensorboard和Github完成電影推薦系統(tǒng)的部署。特別感謝Google對tensorboard開源的工作。
使用嵌入結(jié)構(gòu)構(gòu)建web步驟如下:
1.將嵌入數(shù)據(jù)上傳到GitHub gist,并在config JSON中進(jìn)行更新。對于初學(xué)者,可以直接使用我在此托管的嵌入數(shù)據(jù)。
2.將元數(shù)據(jù)上傳到Github gist上,以便圖示節(jié)點(diǎn)帶有標(biāo)簽。
3.創(chuàng)建一個JSON文件并將URI提供給TensorflowL,見JSON配置示例。
Github輸入配置文件
4.部署Web應(yīng)用程序!
web應(yīng)用包括以下兩種:a. Floating recommender without images and b. Floating recommender with images
Ratatouille示例
5.使用tensorboard可視化交互,單擊某一電影即可查找類似的電影,還提供TSNE或PCA降維操作。
總結(jié):本文介紹了如何處理Movielens數(shù)據(jù)集,矢量嵌入(文中指用戶ID),基于FSE的句子相似度矩陣以及使用Google的TensorFlow部署web電影推薦應(yīng)用。
帶有電影海報的推薦頁面
希望讀者自行在電影或其他相關(guān)數(shù)據(jù)集上DIY自己的Web應(yīng)用程序。如果您遇到任何問題或有其他有趣的想法,歡迎交流。
其他可用于推薦的數(shù)據(jù)集:
1. 圖書 https://www.kaggle.com/zygmunt/goodbooks-10k
2. 電子商務(wù)產(chǎn)品 https://www.kaggle.com/c/instacart-market-basket-analysis
4. 美食 https://github.com/hasan-kamal/Cuisine-Prediction
AI研習(xí)社是AI學(xué)術(shù)青年和AI開發(fā)者技術(shù)交流的在線社區(qū)。我們與高校、學(xué)術(shù)機(jī)構(gòu)和產(chǎn)業(yè)界合作,通過提供學(xué)習(xí)、實(shí)戰(zhàn)和求職服務(wù),為AI學(xué)術(shù)青年和開發(fā)者的交流互助和職業(yè)發(fā)展打造一站式平臺,致力成為中國最大的科技創(chuàng)新人才聚集地。
如果,你也是位熱愛分享的AI愛好者。歡迎與譯站一起,學(xué)習(xí)新知,分享成長。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。