摘 要: 評分預(yù)測是推薦系統(tǒng)的一個組成部分,通過一個實(shí)數(shù)表達(dá)對用戶的偏好進(jìn)行預(yù)測,在學(xué)術(shù)界被廣泛研究。神經(jīng)網(wǎng)絡(luò)具有很強(qiáng)的特征提取能力,能獲取數(shù)據(jù)深層次的特征。使用神經(jīng)網(wǎng)絡(luò)中的一種網(wǎng)絡(luò)即自編碼器,通過擴(kuò)展使其具有處理像評分矩陣這種有缺失數(shù)據(jù)的矩陣的能力,并通過實(shí)驗(yàn)證明其預(yù)測結(jié)果與當(dāng)前主流的評分預(yù)測算法SVD的性能接近。
關(guān)鍵詞: 推薦系統(tǒng);神經(jīng)網(wǎng)絡(luò);自編碼器;評分預(yù)測
0 引言
協(xié)同過濾算法是推薦系統(tǒng)中較為常用的算法,因?yàn)槭褂脜f(xié)同過濾算法進(jìn)行推薦時(shí),只需收集用戶對某件物品的一個動作表達(dá)用戶對物品的偏好程度,如評分、加入購物車、購買等,即可進(jìn)行推薦,這樣的數(shù)據(jù)對于電子商務(wù)網(wǎng)站或者視頻網(wǎng)站來說是非常容易收集的。基于領(lǐng)域[1]的算法是協(xié)同過濾算法中最基本的算法,主要分為基于用戶的協(xié)同過濾算法,即給用戶B推薦物品,只需尋找與他相似的用戶并將該用戶喜歡而用戶B沒有看過的物品推薦給B?;谖锲返膮f(xié)同過濾算法與基于用戶的思路類似只是主體換成了物品,這兩種算法在業(yè)界被廣泛應(yīng)用。后來又出現(xiàn)了矩陣分解的方法,其中具有代表性的是SIMON F提出的SVD算法[2]。SVD算法是對用戶評分矩陣進(jìn)行分解,然后再重構(gòu),重構(gòu)的結(jié)果就是預(yù)測結(jié)果,SVD算法在評分預(yù)測方面的性能優(yōu)于傳統(tǒng)的基于鄰域的算法,在Netflix Prize競賽中取得了巨大的成功。
神經(jīng)網(wǎng)又稱為多層感知器,因其具有強(qiáng)大的函數(shù)表達(dá)能力,可以表達(dá)復(fù)雜模型,是機(jī)器學(xué)習(xí)的一個重要研究分支,2006年HINTON G E[3]等人發(fā)明訓(xùn)練深度網(wǎng)絡(luò)的方法以后,具有深度結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)成為了機(jī)器學(xué)習(xí)領(lǐng)域的一個研究熱點(diǎn)。自編碼器是神經(jīng)網(wǎng)絡(luò)中一種用于無監(jiān)督學(xué)習(xí)的網(wǎng)絡(luò),本文提出一種關(guān)于自編碼器在評分預(yù)測上的擴(kuò)展,并與當(dāng)前熱門的評分預(yù)測算法SVD進(jìn)行試驗(yàn)對比。
1 算法
目前很多的機(jī)器學(xué)習(xí)工作都會使用自編碼器進(jìn)行無監(jiān)督學(xué)習(xí),得到一組好的特征表示來完成更高級的任務(wù)[4-5],使用這樣的方法獲得了顯著的效果?;谧跃幋a器有很強(qiáng)的發(fā)現(xiàn)潛在特征的能力,在評分預(yù)測中對于用戶評分矩陣,用已經(jīng)評分的部分作為輸入,使用自編碼器學(xué)習(xí)恒等函數(shù)y(x)≈x獲得數(shù)據(jù)更深層次的表達(dá),然后再利用這組表達(dá)去重構(gòu)評分矩陣缺失的部分,即得到預(yù)測值。
1.1 網(wǎng)絡(luò)結(jié)構(gòu)
假設(shè)有N個用戶,M部電影,用戶對某個電影的評分為1~K之間的某個整數(shù),就形成了M×N的矩陣V,這個矩陣是一個有缺失數(shù)據(jù)的矩陣,如果用戶i沒有對電影j進(jìn)行評分則元素Vji就是缺失的。矩陣的一列的第i屬性表示用戶i對電影的評分,用矩陣V的一個列向量作為輸入給自編碼器。自編碼器輸入層的每一個節(jié)點(diǎn)代表用戶對當(dāng)前電影的評分,對于輸入向量中缺失評分的那個用戶,網(wǎng)絡(luò)中對應(yīng)的輸入的單元和輸出單元也是缺失的,這樣自編碼器會根據(jù)不同的電影輸入而改變網(wǎng)絡(luò)結(jié)構(gòu),但是隱藏層的單元數(shù)是固定的,單元之間的參數(shù)是共享的,網(wǎng)絡(luò)的結(jié)構(gòu)如圖1所示。在圖中展示了兩個電影輸入給自編碼器的情況,第一個電影只被用戶1、2、3、5評過分,則相應(yīng)的第4個輸入和輸出節(jié)點(diǎn)是缺失的;第二個電影被用戶1、3、4評過分,則第2和第5個節(jié)點(diǎn)是缺失的。
現(xiàn)在來分析特定電影被用戶評分的向量作為輸入情況下的自編碼器。假設(shè)電影被n個用戶評價(jià),h為隱藏層的單元個數(shù),則有如下符號定義:
v:神經(jīng)網(wǎng)絡(luò)的輸入,v∈Rn。
h:隱藏層的單元數(shù)。
W:第層的單元j到連接到第l+1層的單元i的參數(shù),其中W(1)∈Rh×n,W(2)∈Rh×n。
b:連接到l+1層的單元i的偏置。
a:第l層的單元i的激活,其中a=vi表示第i個輸入。
自編碼器的向前計(jì)算過程為:
1.2 網(wǎng)絡(luò)訓(xùn)練
網(wǎng)絡(luò)的訓(xùn)練采用反向傳播算法,包含向前階段和向后階段兩個過程。向前階段使用式(1)、(2)計(jì)算出預(yù)測值,在向后階段利用誤差向后傳播的思想計(jì)算梯度,即先計(jì)算l+1梯度,再計(jì)算l層的梯度。每個電影的輸入用向量v表示,則每個參數(shù)的梯度為:
使用bath-method訓(xùn)練時(shí),不同電影的輸入被相同用戶評分為輸出單元和輸入單元,可以把與這些單元相關(guān)的參數(shù)的梯度進(jìn)行累加,作為總梯度來進(jìn)行參數(shù)的更新。
2006年Chu Chengtao[6]提出當(dāng)算法能夠?qū)懗梢环N稱為summation form的形式時(shí)這種算法就能很容易地進(jìn)行并行化訓(xùn)練,并給出了神經(jīng)網(wǎng)絡(luò)在Map-Reduce框架下的并行化訓(xùn)練思路,本文提出的預(yù)測評分算法很容易擴(kuò)展到處理大數(shù)據(jù)的環(huán)境。
1.3 預(yù)測
網(wǎng)絡(luò)訓(xùn)練完成后進(jìn)入到預(yù)測階段,如要預(yù)測用戶u1對電影的評分,網(wǎng)絡(luò)的輸入層到隱藏層不變,只需在輸出層增加一個關(guān)于用戶u1的輸出節(jié)點(diǎn),為了能夠預(yù)測其訓(xùn)練集中所有用戶對當(dāng)前電影的評分,可以把輸出層的節(jié)點(diǎn)數(shù)增加到N,網(wǎng)絡(luò)結(jié)構(gòu)修改如圖2所示。輸入層的節(jié)點(diǎn)4是缺失的,但是輸出層的節(jié)點(diǎn)4還在,因此輸出層的節(jié)點(diǎn)4就是算法對用戶4關(guān)于當(dāng)前電影的評分預(yù)測。然后使用式(1)、(2)對網(wǎng)絡(luò)進(jìn)行一次向前計(jì)算,即可得到網(wǎng)絡(luò)對電影被某個用戶評分的預(yù)測。
1.4 利用隱式反饋
在推薦系統(tǒng)領(lǐng)域,會遇到一種叫做冷啟動的問題。網(wǎng)站有很多的電影和用戶,但是用戶對電影的評分卻很少,評分矩陣過于稀疏,導(dǎo)致評分預(yù)測精度下降。電影網(wǎng)站很容易獲得一種隱式的反饋,即用戶看過或?yàn)g覽過某部電影,但是因?yàn)槟撤N原因沒有給出評分,這種隱式的反饋,也可以在一定程度上解釋用戶的偏好,因此算法就可以利用這組隱式反饋數(shù)據(jù)??紤]向量d∈{0,1}N是一個長度為N的0~1向量,表示電影是否被某個用戶查看過,這樣就可以通過這組向量去影響隱藏層的表示,這時(shí)對式(1)進(jìn)行修改如下:
本次實(shí)驗(yàn)采用MoiveLens-100k數(shù)據(jù)集,其中含有943個用戶對1 682部電影的10萬次評分,評分取值是從1~5之間的整數(shù),實(shí)驗(yàn)前需要對數(shù)據(jù)進(jìn)行預(yù)處理,即對整個數(shù)據(jù)除以5,最后算法的輸出結(jié)果乘以5得到最終的預(yù)測結(jié)果。在實(shí)驗(yàn)中把數(shù)據(jù)集劃分為不相交的兩部分,第一部分包含9萬個用戶評分作為訓(xùn)練集,剩下的作為測試集驗(yàn)證預(yù)測效果,上述過程會重復(fù)劃分10次,進(jìn)行10次訓(xùn)練和預(yù)測。預(yù)測結(jié)果的評價(jià)采用評分預(yù)測中常用的均方根誤差(RMSE)作為評分標(biāo)準(zhǔn)。假設(shè)用戶u對電影i的真實(shí)評分為rui,算法預(yù)測評分為ui,T是一個集合存放測試集中用戶u對電影i評分的二元組,則RMSE的計(jì)算公式為:
每次訓(xùn)練,把訓(xùn)練數(shù)據(jù)分成10批(batche),每批含有168個電影的訓(xùn)練用例,最后一批含有170個電影訓(xùn)練用例,每一批計(jì)算完梯度后進(jìn)行參數(shù)更新,神經(jīng)網(wǎng)絡(luò)的隱藏單元個數(shù)設(shè)置為50。對比實(shí)驗(yàn)選擇當(dāng)下預(yù)測評分算法中比較流行的SVD,SVD的隱式因子設(shè)定為50,數(shù)據(jù)全部經(jīng)過算法訓(xùn)練一次記一個周期(epoch),訓(xùn)練50個周期,在1~50個周期的誤差中選擇最好的訓(xùn)練結(jié)果,如圖3所示。10次測試的平均結(jié)果如表1所示。從結(jié)果來看,基于自編碼器的評分預(yù)測算法性能在當(dāng)前數(shù)據(jù)集上好于SVD,帶有隱式反饋的自編碼器性能略好于原始的自編碼器,但是提升效果不明顯,僅有0.06。
3 結(jié)論
本文提出了一種基于自編碼器的評分預(yù)測算法,在MoiveLens數(shù)據(jù)集上獲得了不錯的效果,實(shí)驗(yàn)中的參數(shù)并沒有被很好地調(diào)節(jié),算法還有提高的可能性,用戶的隱式反饋雖然還能提高算法的預(yù)測精度,但是在實(shí)驗(yàn)中提高僅僅只有0.06,并不明顯,如何更好地利用這種隱式反饋需要進(jìn)一步研究。通常在獲取的用戶評分?jǐn)?shù)據(jù)中往往帶有時(shí)間屬性,而這也是一個非常好收集到的屬性, KOREN Y提出的一個SVD的變種[1]中使用了時(shí)間屬性并取得了好的成績,今后的研究中會考慮把時(shí)間屬性加入到自編碼器模型中。近年來基于深度結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)成為機(jī)器學(xué)習(xí)研究的熱點(diǎn),已被成功地使用到很多領(lǐng)域,如自然語言處理、信息檢索、分類。未來利用具有構(gòu)建深度結(jié)構(gòu)的自編碼器來提高預(yù)測結(jié)果也值得進(jìn)一步研究。
參考文獻(xiàn)
[1] 項(xiàng)亮.推薦系統(tǒng)實(shí)戰(zhàn)[M].北京:人民郵電出版社,2012.
[2] SIMON F. Netfix update: tray this at home[EB/OL]. [2006-12-11](2014-09-01).http://sifter.org/~simon/journal/20061211.html.
[3] HINTON G E, OSINDERO S, TEH Y. A fast learning algorithm for deep belief nets [J]. Neural Computation, 2006,(18):1527-1554.
[4] RAINA R, BATTLE A, LEE H, et al. Self-taught learning: transfer learning from unlabeled data[C]. Proceedings of the 24th International Conference on Machine Learning, ICML 2007,2007:759-766.
[5] HINTON G E, SALAKHUTDINOV R. Reducing the dimensionality of data with neural networks[J]. Science, 2006,31(3):504-507.
[6] Chu Chengtao, KIM S K, Lin Yian, el al. Map-reduce for machine learning on multicore [C]. NIPS 2006.