王 駿,虞 歌
(杭州師范大學(xué) 信息科學(xué)與工程學(xué)院,浙江 杭州 311121)
在2006年之前,矩陣分解法采用的是數(shù)學(xué)上的SVD法,不僅占用大量?jī)?nèi)存,而且時(shí)間復(fù)雜度高。Simon Funk發(fā)表了一個(gè)算法(稱為Funk-SVD),提供了矩陣分解的新思路,矩陣分解變成分解為兩個(gè)低階矩陣,并縮小低階矩陣相乘之積與原來矩陣的差距。這個(gè)算法后來被Netflix Prize的冠軍Koren稱為(latent factor model, LFM),使得矩陣分解算法在海量數(shù)據(jù)中的個(gè)性化信息推薦應(yīng)用成為可能。
隨著神經(jīng)網(wǎng)絡(luò)的發(fā)展,谷歌在2016年推出Wide&Deep網(wǎng)絡(luò)[1]后,在特征嵌入層之上加入多層感知機(jī)(multi-layer perceptron,MLP),使得模型泛化能力更強(qiáng)。何向南等進(jìn)一步提出多層感知機(jī)與廣義矩陣分解(genera-lized matrix decomposition,GMF)結(jié)合的神經(jīng)協(xié)同過濾模型[2](neural collaborative filtering,NCF),使模型的推薦能力得到更大提升[2]。
神經(jīng)協(xié)同過濾模型的多層感知機(jī)層把用戶特征向量與物品特征向量?jī)?nèi)積產(chǎn)生的向量送入神經(jīng)網(wǎng)絡(luò)中學(xué)習(xí)得到高階隱含特征信息,廣義矩陣分解層把用戶特征向量與物品特征向量進(jìn)行內(nèi)積產(chǎn)生的向量當(dāng)?shù)碗A特征組合信息,最后模型得到的信息綜合了高階隱含特征信息和低階特征組合信息[3]。可是使用神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)抽象的隱含信息總會(huì)丟失一部分信息,而且神經(jīng)網(wǎng)絡(luò)雖然有強(qiáng)大的擬合能力,可是具有解釋性差的特點(diǎn),單一的信息來源難以滿足復(fù)雜的推薦問題。
本文基于神經(jīng)協(xié)同過濾模型,把原GMF結(jié)構(gòu)改為BPR[4]結(jié)構(gòu)來挖掘排序信息,實(shí)驗(yàn)結(jié)果表明,排序信息與低階特征組合信息相比,有更好的推薦結(jié)果。在改進(jìn)的神經(jīng)協(xié)同過濾模型上,結(jié)合使用電影類型因子、電影流行度等輔助信息優(yōu)化推薦結(jié)果,建立個(gè)性化電影推薦系統(tǒng),并實(shí)現(xiàn)該系統(tǒng)電影推薦仿真。使用MovidLens-100K和 MovidLens-1M 數(shù)據(jù)集的實(shí)驗(yàn)結(jié)果表明,改進(jìn)的神經(jīng)協(xié)同過濾模型(本文稱為B-NCF模型)在推薦結(jié)果的命中率和歸一化折扣累積增益[5]上都優(yōu)于神經(jīng)協(xié)同過濾模型。
神經(jīng)協(xié)同過濾模型(NCF)中,輸入層上面是嵌入層,它是一個(gè)全連接層,將來自輸入層的稀疏表示映射為稠密向量[2](dense vector)。NCF模型用兩條路線來對(duì)用戶和物品建模(用戶ID和物品ID兩個(gè)輸入),需要通過GMF和MLP兩個(gè)路線,把他們各自的運(yùn)算得到的信息連接起來。GMF應(yīng)用了一個(gè)線性內(nèi)核來模擬潛在的特征交互;MLP使用非線性內(nèi)核從數(shù)據(jù)中學(xué)習(xí)高階特征交互信息[3]。
神經(jīng)協(xié)同過濾模型結(jié)構(gòu),如圖1所示。
圖1 神經(jīng)協(xié)同過濾模型結(jié)構(gòu)
貝葉斯個(gè)性化排序(Bayesian personalized ranking,BPR)算法[4]是實(shí)現(xiàn)最大化后驗(yàn)概率優(yōu)化排序的算法,在UAI 2009被采用,至今仍然是很重要的推薦系統(tǒng)算法。推薦排序算法[6]大體分為3種,第一種是逐點(diǎn)方法(pointwise approach),第二種是成對(duì)方法(pairwise approach),還有一種是列表方法(listwise approach)。貝葉斯個(gè)性化排序算法屬于第二種方法,利用概率統(tǒng)計(jì)方法對(duì)元素進(jìn)行兩兩之間排序。
假設(shè)任意用戶u在電影p與n同時(shí)存在的情況下選擇了電影p,我們就認(rèn)為p排序在n前面,如此記錄這三元組 (u,p,n)。 所有 (u,p,n) 組合用集合D表示,>u代表用戶u對(duì)應(yīng)的所有商品的全序關(guān)系,則優(yōu)化目標(biāo)是最大化后驗(yàn)概率p(θ|>u)。 根據(jù)貝葉斯公式,貝葉斯個(gè)性化排序算法最終的最大對(duì)數(shù)后驗(yàn)估計(jì)函數(shù)如式(1)所示
(1)
本文在基于神經(jīng)協(xié)同過濾模型基礎(chǔ)上,提出了改進(jìn)的神經(jīng)協(xié)同過濾模型B-NCF。B-NCF模型在NCF模型基礎(chǔ)上使用BPR結(jié)構(gòu)代替神經(jīng)協(xié)同過濾網(wǎng)絡(luò)的GMF結(jié)構(gòu)挖掘排序信息,如圖2所示。
圖2 B-NCF模型結(jié)構(gòu)
輸入層上面是嵌入層,它是一個(gè)全連接層,用于將數(shù)據(jù)映射為特征向量。其中用戶ID(Uid)映射為用戶特征向量,用戶已經(jīng)評(píng)分的電影ID(Pid)和用戶沒有評(píng)分的電影ID(Nid)映射為電影特征向量。容易看出,三元組 (u,p,n) 中任意用戶u對(duì)電影p感興趣的概率大于電影n。
Uid,Pid與Nid都分別經(jīng)過BPR嵌入層和MLP嵌入層映射為向量,然后后綴為Emb的向量去BPR層,后綴為MLP的向量去MLP層,分別命名為Uid_MLP,Uid_Emb,Pid_MLP,Pid_Emb,Nid_MLP,Nid_Emb。
根據(jù)BPR算法的使用方法,算法模型訓(xùn)練好后,BPR嵌入層的權(quán)重可以看作用戶隱因子矩陣和電影隱因子矩陣,使用BPR嵌入層權(quán)重可以計(jì)算出任意用戶u對(duì)任意一部電影的排序得分。
如圖2中MLP層所示,Pid_MLP,Nid_MLP,Uid_MLP向量拼接成新的向量進(jìn)入MLP層經(jīng)過多層感知機(jī)產(chǎn)生高階特征信息。
在神經(jīng)協(xié)同過濾模型的多層感知機(jī)層基礎(chǔ)上,增加了批標(biāo)準(zhǔn)化[7](batch normalization,BN)層與丟棄(Dro-pout)層,其中,BN層統(tǒng)一各層的方差加快模型的收斂速度,Dropout層提高泛化性防止過擬合。
多層感知機(jī)層輸出高階特征信息φMLP, 表達(dá)式[2]如式(2)所示
(2)
如圖2中BPR層所示,Uid_Emb,Pid_Emb,Nid_Emb向量進(jìn)入BPR層產(chǎn)生排序信息。
貝葉斯個(gè)性化排序的目標(biāo)是最大化電影p總排在電影n前面這個(gè)集合排列的概率,為了最大化這個(gè)概率就要最小化BPR loss。我們希望這個(gè)概率越大越好,對(duì)于BPR loss是越小越好[4],BPR loss表達(dá)式如式(3)所示
(3)
(4)
通過減小預(yù)測(cè)值(Model Prediction)與真實(shí)屬性值(Target)的交叉熵來迭代更新模型參數(shù),表達(dá)式[2]如式(5) 所示
(5)
改進(jìn)神經(jīng)協(xié)同過濾模型所有參數(shù)更新步驟如下[9]:
輸入:3組數(shù)據(jù)Uid、Pid和Nid,學(xué)習(xí)率α, 正則項(xiàng)系數(shù)λ, 隱空間的維度K。
輸出:用戶BPR嵌入層權(quán)重矩陣W,電影BPR嵌入層權(quán)重矩陣H。
(1)初始化所有嵌入層權(quán)重。
(2)在BPR層,Uid_Emb*Pid_Emb與Uid_Emb*Nid_Emb作差,由sigmoid激活函數(shù)變換得到[0,1]值再與1作差,差值作為排序信息BPR loss。BPR 層輸出排序信息與MLP層信息拼接成新的向量。
(3)新向量通過sigmoid激活函數(shù)轉(zhuǎn)為取值在[0,1]的預(yù)測(cè)值,同時(shí)把評(píng)分表中任意用戶的大于或等于4分的電影屬性值設(shè)為1其余電影屬性值設(shè)為0,通過減小預(yù)測(cè)值(model prediction)與真實(shí)屬性值target的交叉熵來迭代更新模型參數(shù)。如果損失函數(shù)收斂,則模型訓(xùn)練結(jié)束,輸出W和H,否則回到步驟(2)。
(4)迭代更新完成后,就可以根據(jù)BPR嵌入層權(quán)重計(jì)算出任意用戶u對(duì)任意一部電影的排序得分。
本文提出的電影推薦系統(tǒng)由兩部分組成,推薦得分也由兩部分信息生成。以神經(jīng)協(xié)同過濾模型為基礎(chǔ)的B-NCF模型生成排序得分,再綜合流行度、電影類型因子等輔助信息得到推薦得分。電影推薦得分生成如圖3所示,訓(xùn)練過程中,把命中率和歸一化折扣累積增益表現(xiàn)最好的那一次更新過程中的BPR嵌入層權(quán)重輸出(圖中假設(shè)權(quán)重是 0~9 的整數(shù)),訓(xùn)練得到的權(quán)重可以看作對(duì)應(yīng)的用戶隱因子矩陣和電影隱因子矩陣(item latent matrix),假設(shè)給用戶ID為1的用戶推薦電影,從用戶隱因子矩陣取第一行作用戶隱因子向量(user latent vector),與電影隱因子矩陣相乘得到相應(yīng)的排序得分(rank score),通過輔助信息電影流行度(popularity score)和用戶評(píng)分(genre score)微調(diào)推薦得分(recommended score)。最后按推薦得分大小排序輸出前5部電影以及對(duì)應(yīng)推薦得分。
圖3 電影推薦得分生成
一個(gè)用戶會(huì)喜歡多種類型電影,一部電影可以屬于多種類型,根據(jù)用戶觀看同一類型電影占所看電影數(shù)量比例,得到電影類型因子,公式如式(6)所示
(6)
同理,電影流行度是根據(jù)電影已經(jīng)評(píng)價(jià)人數(shù)占總評(píng)價(jià)用戶人數(shù)的比例,再加1得到。本文的最終推薦得分如式(7)所示
RecommendedScore=
PopularityScore*RankScore*GenreScore
(7)
最后根據(jù)排序得分前5名輸出包含對(duì)應(yīng)電影信息的推薦電影列表。
實(shí)驗(yàn)數(shù)據(jù)集:MovieLens-100K,數(shù)據(jù)集里面包括u.data、u.info、u.item、u.genre、u.user、u.occupation等文件,其中u.data文件包含943個(gè)用戶對(duì)于1682部電影的100 000個(gè)評(píng)分(分值為[1,5]之間的整數(shù));每個(gè)用戶至少評(píng)級(jí)20部電影;u.user文件包含用戶的人口統(tǒng)計(jì)信息(年齡,性別,職業(yè),郵編);u.item文件包括電影名,電影ID,上映日期,IMDB電影網(wǎng)對(duì)應(yīng)電影主頁網(wǎng)址,所屬的電影類型(恐怖,犯罪,喜劇等)。
由MovieLens-100K的評(píng)分(u.data)文件抽取80%數(shù)據(jù)做訓(xùn)練數(shù)據(jù)集生成99 057對(duì)偏序?qū)?,Uid、Pid為評(píng)分用戶ID和評(píng)分電影ID,Nid為未評(píng)分電影ID,99 057對(duì)(Uid,Pid,Nid)偏序?qū)ψ鲇?xùn)練數(shù)據(jù)訓(xùn)練模型,剩下的20%數(shù)據(jù)提供真實(shí)屬性值用作測(cè)試集,訓(xùn)練好的模型輸入測(cè)試集來計(jì)算改進(jìn)模型的命中率和歸一化折扣累積增益。
MovieLens-1M數(shù)據(jù)集含有來自6040名用戶對(duì)3706部電影的100萬條評(píng)分?jǐn)?shù)據(jù),分為3個(gè)表:評(píng)分表、用戶信息表和電影信息表,同理得到訓(xùn)練數(shù)據(jù)994 169對(duì)(Uid,Pid,Nid)偏序?qū)蜏y(cè)試集。
使用聯(lián)想筆記本電腦,內(nèi)存為8 GB,CPU為Intel酷睿i53230M,CPU主頻為2.4 GHz,硬盤容量為1 TB;操作系統(tǒng)是Windows10,使用PyCharm編譯程序,使用Python版本是3.6.3,Tensorflow版本為1.10.0。
排名列表的性能由命中率(hit rate,HR)和歸一化折扣累積增益(normalized discounted cumulative gain,NDCG)衡量。
命中率公式如式(8)所示
(8)
式中: |GT| 代表所有測(cè)試集合,分子是推薦列表中屬于測(cè)試集合的數(shù)量。
NDCG基于列表排名位置折損因子體現(xiàn),它的思想主要是位置在推薦列表越靠前的推薦內(nèi)容,其相關(guān)度應(yīng)該越高,具體表達(dá)式如式(9)所示
(9)
其中,累加項(xiàng)的分子部分是效用函數(shù)或叫做增益(Gain),分母是關(guān)于位置的一個(gè)折損因子,Z是一個(gè)歸一化因子,表示理想的推薦列表的折損累計(jì)增益(discounted cumulative gain,DCG)。NDCG取值范圍在0到1區(qū)間,分值越高代表推薦越好。N是列表排名個(gè)數(shù),本文取前10個(gè)輸出進(jìn)行HR和NDCG評(píng)價(jià),取N=10。
每批次訓(xùn)練數(shù)據(jù)量(Batchsize)定為256,訓(xùn)練輪數(shù)(Epoch)為50。
在嵌入層,生成服從均值為0,方差為0.1的正態(tài)分布隨機(jī)數(shù)初始化嵌入層權(quán)重,用戶嵌入層輸入維度為用戶數(shù)量和電影嵌入層輸入維度為電影數(shù)量,隱空間的維度K都為10。
在MLP層,使用BN層對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行歸一化,多層神經(jīng)網(wǎng)絡(luò)各層神經(jīng)元數(shù)量默認(rèn)依次為64、32、16、8,丟棄率為0.2,MLP各層輸出都使用Relu激活函數(shù)。
在輸出層,BPR層輸出值與MLP層輸出值默認(rèn)賦予 1∶1 的權(quán)重,直接拼接在一起產(chǎn)生新向量。使用sigmoid激活函數(shù)產(chǎn)生預(yù)測(cè)值,衡量預(yù)測(cè)值與真實(shí)值差距的損失函數(shù)使用交叉熵函數(shù),學(xué)習(xí)率為0.001。該層權(quán)重初始化使用lecun uniform函數(shù)。優(yōu)化器使用Adam[8]優(yōu)化器,Adam優(yōu)化器被廣泛認(rèn)為在不同情況下工作性能都比較優(yōu)秀的優(yōu)化器。
5.4.1 MLP層的隱藏層數(shù)與預(yù)測(cè)因子個(gè)數(shù)
更多隱藏層數(shù)能夠加強(qiáng)神經(jīng)網(wǎng)絡(luò)提取信息能力,在合適范圍內(nèi)增加層數(shù)提升模型性能,但是超出范圍會(huì)導(dǎo)致過擬合,導(dǎo)致神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)能力降低;神經(jīng)協(xié)同過濾模型的最后一層隱藏層決定了模型的性能,所以將其作為預(yù)測(cè)因子[2](predictive factors),使用 [0,16,32,64,128] 的中間各層神經(jīng)元數(shù)量和 [8,16,32] 的預(yù)測(cè)因子數(shù)量進(jìn)行了模型評(píng)估。所用數(shù)據(jù)集同為MovieLens-1M,訓(xùn)練50輪,實(shí)驗(yàn)結(jié)果見表1 和表2。
表1 不同隱藏層和不同神經(jīng)元NDCG
表2 不同隱藏層和不同神經(jīng)元HR
模型穩(wěn)定性有待改進(jìn),訓(xùn)練前訓(xùn)練集NDCG和HR都低的情況下容易訓(xùn)練出低分值NDCG和HR,嘗試別的優(yōu)化器情況也不見好轉(zhuǎn)。因此整個(gè)實(shí)驗(yàn)每組條件都是取多次出現(xiàn)結(jié)果并求平均值作為表現(xiàn)。在隱藏層為 [8,16,32,64], 雖然偶有低分表現(xiàn),可是概率小得多。由表1和表2可以看到,隨著隱藏層增加模型表現(xiàn)越來越好,但在五層隱藏層的時(shí)候開始出現(xiàn)性能下降。神經(jīng)網(wǎng)絡(luò)逐漸學(xué)習(xí)到有用的信息。預(yù)測(cè)因子并沒有隨著數(shù)量增加提升模型的性能,因此對(duì)比表1和表2,本文選擇使用 [8,16,32,64] 作為隱藏層,不僅因?yàn)楸憩F(xiàn)好,而且待更新參數(shù)比五層隱含層 [8,16,32,64,128] 少。
5.4.2 BPR排序信息和MLP層信息混合比例
在輸出層,BPR排序信息和MLP層信息以一定權(quán)重結(jié)合形成新的向量。所用數(shù)據(jù)集同為MovieLens-1M,在訓(xùn)練50輪,得到表3結(jié)果。
由表3可以看到偏離1∶1越遠(yuǎn)的比例,相應(yīng)實(shí)驗(yàn)結(jié)果的NDCG和HR都逐漸減小,最佳的比例在1∶1附近,本文選擇1∶1作為BPR排序信息和MLP層信息混合比例。
表3 不同比例拼接得到的NDCG和HR
5.5.1 模型對(duì)比
本文選取了神經(jīng)協(xié)同過濾(NCF)模型,貝葉斯個(gè)性化排序(BPR)模型,多層感知機(jī)(MLP)模型和廣義矩陣分解(GMF)模型作為對(duì)照,主要的參數(shù)設(shè)置和神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)與B-NCF模型相同。訓(xùn)練50輪,取不同算法在 MovieLens-100K 和MovieLens-1M數(shù)據(jù)集中多次表現(xiàn)的平均值,見表4和表5。
表4 不同模型在 MovieLens-100K分析比較
表5 不同模型在MovieLens-1M分析比較
由表4和表5可知,B-NCF模型平均能帶來至少 4%HR 和20%NDCG提升,由于使用了BPR排序算法,NDCG 的提升相當(dāng)明顯??傮w來說,GMF模型、BPR模型和MLP模型在兩個(gè)數(shù)據(jù)集的表現(xiàn)差不多,推薦水平相當(dāng),NCF模型總體性能比BPR、MLP和GMF模型要好,B-NCF 模型是這幾個(gè)模型中表現(xiàn)最好的,而且訓(xùn)練更新的參數(shù)量只比神經(jīng)協(xié)同過濾模型多不到2%。綜合來看,B-NCF 模型雖然HR和NDCG得到提升,可是沒有犧牲更多的計(jì)算資源去提升推薦性能。
5.5.2 在不同數(shù)據(jù)集表現(xiàn)
圖4和圖5為訓(xùn)練50輪,B-NCF在數(shù)據(jù)集MovieLens-100K和MovieLens-1M的HR@10和NDCG@10曲線圖(縱坐標(biāo)起點(diǎn)是0.6)。
圖4 在MovieLens-100K數(shù)據(jù)集的表現(xiàn)
圖5 在MovieLens-1M數(shù)據(jù)集的表現(xiàn)
由圖4和圖5可以看到,在不同數(shù)據(jù)集,B-NCF模型的HR和NDCG都在0.65以上,保持著較高的水平,而且在訓(xùn)練輪數(shù)接近10的時(shí)候,HR和NDCG都趨向穩(wěn)定,模型收斂速度很快,而且訓(xùn)練數(shù)據(jù)集越大,模型學(xué)習(xí)能力越強(qiáng)。
本文挑選評(píng)分列表中的第一個(gè)用戶給電影推薦系統(tǒng)進(jìn)行推薦仿真,使用MovieLens-100K數(shù)據(jù),該用戶評(píng)分電影272部,是一位24歲的男性工程師,喜歡黑色(Film-Noir)電影,喜劇(Comedy)電影,動(dòng)畫(Animation)電影以及流行的好萊塢電影,基于該用戶的各項(xiàng)推薦得分見表6(只截取排序得分最大的前5部電影)。電影推薦系統(tǒng)給該用戶推薦結(jié)果見表7。
表6 各項(xiàng)得分情況
電影推薦系統(tǒng)給該用戶推薦結(jié)果見表7。
表7 電影推薦結(jié)果
通過上述研究可以看到,從挖掘信息的深度來看,基于神經(jīng)協(xié)同過濾模型的B-NCF模型,提高了推薦的命中率和歸一化折扣累積增益,而且只增加了極少計(jì)算資源,在信息來源的廣度上看,基于B-NCF模型的電影推薦系統(tǒng)還綜合考慮了輔助信息來拓寬信息來源的多樣化,使得電影推薦更加個(gè)性化。
本文研究重點(diǎn)是推出基于B-NCF模型的電影推薦系統(tǒng),對(duì)于B-NCF模型的最優(yōu)參數(shù)并沒有做細(xì)致研究,輔助信息只選擇了電影流行度和電影類型因子,更多的推薦因素可以得到更好的個(gè)性化推薦結(jié)果,本文不再展開討論。B-NCF模型穩(wěn)定性有待提高,初始訓(xùn)練集低NDCG和低HR容易訓(xùn)練出低NDCG和HR的推薦結(jié)果。可以通過篩選合適訓(xùn)練集,比如訓(xùn)練集初始HR和NDCG高于預(yù)設(shè)閾值才啟動(dòng)運(yùn)算推薦,否則重新生成訓(xùn)練集,來減少出現(xiàn)低NDCG和HR的推薦情況。
今后的研究工作,會(huì)關(guān)注深度學(xué)習(xí)在推薦系統(tǒng)的各個(gè)方向的應(yīng)用,比如注意力機(jī)制[10]在用戶興趣偏好上的應(yīng)用,對(duì)抗生成網(wǎng)絡(luò)[11]模擬產(chǎn)生推薦列表。