程磊,高茂庭
(上海海事大學(xué)信息工程學(xué)院,上海 201306)
互聯(lián)網(wǎng)時(shí)代的飛速發(fā)展,為人類的信息共享提供便捷的同時(shí),也帶來了信息過載的問題。為了解決此問題,推薦系統(tǒng)應(yīng)用而生,如今在各種領(lǐng)域得到廣泛應(yīng)用,例如電子商務(wù)、信息檢索、社交網(wǎng)絡(luò)、信息服務(wù)和新聞推送等。推薦系統(tǒng)通常是根據(jù)用戶的歷史記錄進(jìn)行推薦,其中推薦算法顯得尤為重要,目前主流的包括協(xié)同過濾、基于內(nèi)容和混合的推薦算法[1]。近年來深度學(xué)習(xí)已經(jīng)成功應(yīng)用于推薦領(lǐng)域。
深度學(xué)習(xí)是通過組合低層的稀疏特征形成高層稠密的語(yǔ)義抽象,從而挖掘數(shù)據(jù)的特征表示。深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Network,DNN)是深度學(xué)習(xí)的一個(gè)學(xué)習(xí)模型,在較多領(lǐng)域上具有很高的推薦準(zhǔn)確度。劉帆[2]等人將DNN用于圖像融合,通過DNN提取低頻子帶的特征,并通過隱藏層的權(quán)值識(shí)別低頻子帶分量。王昕[3]等人將DNN應(yīng)用到語(yǔ)音識(shí)別的鄰域,DNN通過擬合噪語(yǔ)音和純語(yǔ)音之間的非線性關(guān)系,得到純語(yǔ)音的近似表征,達(dá)到降噪的作用。陳春利[4]等人將DNN進(jìn)行改進(jìn),提出一種堆疊深度信念網(wǎng)絡(luò),通過探討隱含層參數(shù)、迭代次數(shù)和學(xué)習(xí)率來將DNN用于信號(hào)分選,從而提高了分類的準(zhǔn)確率。趙紅燕[5]等人將DNN用于漢語(yǔ)識(shí)別,通過利用DNN自動(dòng)學(xué)習(xí)目標(biāo)詞的上下文特征建立了一個(gè)漢語(yǔ)框架識(shí)別模型。張艷[6]等人將DNN用于DNA位點(diǎn)的選擇,使用DNN構(gòu)建數(shù)據(jù)分析模型,實(shí)現(xiàn)了致病位點(diǎn)與疾病的關(guān)聯(lián)分析。萬(wàn)圣賢[7]等人將DNN用于微博情感分析,將微博中的文本輸入到DNN中,經(jīng)過處理后對(duì)文本進(jìn)行分詞,提高了分類的準(zhǔn)確性。陳耀旺[8]等人將DNN用于個(gè)性化游戲推薦,通過分析用戶的偏好及時(shí)間推移興趣建立訓(xùn)練集,通過DNN進(jìn)行建模分析,提高了推薦準(zhǔn)確度。
本文將深度神經(jīng)網(wǎng)絡(luò)用于推薦算法,對(duì)用戶的項(xiàng)目評(píng)分和項(xiàng)目類型進(jìn)行分析,提出一種基于深度神經(jīng)網(wǎng)絡(luò)的推薦算法。該推薦算法是一種基于內(nèi)容的推薦[9],主要根據(jù)項(xiàng)目的評(píng)分和項(xiàng)目的類型,挖據(jù)項(xiàng)目類型上的相似性給予推薦,相比于協(xié)同過濾,該推薦算法不需依賴于近鄰用戶的評(píng)分,只需根據(jù)用戶個(gè)人的評(píng)分和項(xiàng)目類型就能產(chǎn)生推薦。
深度神經(jīng)網(wǎng)絡(luò)是一組限制玻爾茲曼機(jī)組成的層次神經(jīng)網(wǎng)絡(luò)[10],其結(jié)構(gòu)如圖1所示。
圖1 DNN模型圖
圖1中,DNN是一個(gè)層級(jí)結(jié)構(gòu),包括輸入層、隱含層(一層或者多層)和輸出層。輸入層用于接收輸入信號(hào),輸出層節(jié)點(diǎn)用于輸出信號(hào)。相鄰層的節(jié)點(diǎn)采用全連接,每個(gè)連接都存在一個(gè)連接權(quán)值,而同一層的節(jié)點(diǎn)不存在連接。
數(shù)據(jù)包括用戶項(xiàng)目評(píng)分和項(xiàng)目類型,其中,Ui表示第i個(gè)用戶,Ii表示第i個(gè)項(xiàng)目,Ti表示第i個(gè)類型。數(shù)據(jù)格式分別如表1和表2所示。
表1 用戶項(xiàng)目評(píng)分表
表2 項(xiàng)目類型表
表1中,數(shù)字1到5表示用戶對(duì)項(xiàng)目的存在評(píng)分,且評(píng)分等級(jí)為1到5,等級(jí)越高,表明用戶對(duì)項(xiàng)目越喜歡;數(shù)字0表示用戶對(duì)項(xiàng)目不存在評(píng)分。表2中,數(shù)字1表示項(xiàng)目屬于類型,數(shù)字0表示項(xiàng)目不屬于類型。
推薦算法主要包括離線部分和在線部分。離線部分主要是數(shù)據(jù)處理和DNN訓(xùn)練,在線部分是實(shí)時(shí)預(yù)測(cè)。
DNN訓(xùn)練前,需要對(duì)模型輸入層和輸出層的數(shù)據(jù)進(jìn)行處理,并建立一種對(duì)應(yīng)關(guān)系。模型輸入層的數(shù)據(jù)為用戶項(xiàng)目喜好度,模型輸出層為用戶項(xiàng)目評(píng)分。
(1)輸入層數(shù)據(jù)處理
用戶對(duì)項(xiàng)目進(jìn)行評(píng)分時(shí),項(xiàng)目的類型起到了一定的引導(dǎo)性作用。例如,用戶對(duì)不同項(xiàng)目的類型存在不同的喜愛程度,當(dāng)項(xiàng)目類型中存在用戶喜歡的類型時(shí),用戶就會(huì)給予項(xiàng)目更高的評(píng)分等級(jí)。通過統(tǒng)計(jì)用戶評(píng)分過的項(xiàng)目數(shù),可以得到用戶對(duì)于不同項(xiàng)目類型的評(píng)分次數(shù),出現(xiàn)評(píng)分次數(shù)越多的類型,表明用戶對(duì)此類型的喜好程度越高。
首先,計(jì)算用戶u對(duì)類型t的評(píng)論次數(shù),用Sut表示,它是通過用戶-項(xiàng)目隸屬矩陣?和項(xiàng)目-類型隸屬矩陣I?的對(duì)應(yīng)項(xiàng)相乘得到。在?中,當(dāng)用戶u存在對(duì)項(xiàng)目 i的評(píng)分時(shí),=1,否則=0。同理,在 I?中,當(dāng)項(xiàng)目 i中屬于類型 t時(shí),?=1,否則=0。如式(1):
其中,k表示項(xiàng)目種類數(shù)。
然后,計(jì)算用戶u對(duì)所有類型的總評(píng)論次數(shù),用Su表示。如式(2):
其中,m表示類型種類數(shù)。
最后,計(jì)算每個(gè)用戶u對(duì)于項(xiàng)目類型t的喜好度,用 Put表示,如式(3):
(2)輸出層數(shù)據(jù)處理
用戶對(duì)項(xiàng)目的評(píng)分表示了用戶對(duì)項(xiàng)目的喜好程度,將喜好程度進(jìn)行編碼,如表3所示。
表3 用戶項(xiàng)目評(píng)分編碼表
(3)建立對(duì)應(yīng)關(guān)系
將處理后的輸入層數(shù)據(jù)和輸出層數(shù)據(jù)進(jìn)行匯總,建立對(duì)應(yīng)關(guān)系。以U1為例,其訓(xùn)練數(shù)據(jù)如表4。
表4 關(guān)系對(duì)應(yīng)表
DNN訓(xùn)練前,需要搭建模型并確定方法,模型具體包括一個(gè)輸入層,兩個(gè)隱含層和一個(gè)輸出層。輸入神經(jīng)元的個(gè)數(shù)為Nin,隱藏層第l層神經(jīng)元的個(gè)數(shù)為,輸出層神經(jīng)元的個(gè)數(shù)為Nout。隱含層采用Dropout策略,激活函數(shù)為ReLU,輸出層的激活函數(shù)為Softmax,代價(jià)函數(shù)采用分類交叉熵,代價(jià)函數(shù)的求解方式采用Adam。
模型中隱含層神經(jīng)元的個(gè)數(shù)采用Kolmogorov定理,輸入神經(jīng)元數(shù)目與隱含層神經(jīng)元的數(shù)目存在等量關(guān)系,如式(4):
DNN訓(xùn)練過程中,主要包括以下幾個(gè)步驟:
線性求和,激活函數(shù),代價(jià)函數(shù)和代價(jià)函數(shù)求解。
(1)線性求和
隱含層和輸出層中每一個(gè)神經(jīng)元的輸入都來自前一層所有神經(jīng)元輸出值的線性加權(quán)和,為了防止過度擬合,對(duì)輸入值采取 Dropout策略[11],如式(5):
(2)激活函數(shù)
激活函數(shù)是將線性求和的輸入值進(jìn)行非線性映射,使得神經(jīng)網(wǎng)絡(luò)具備了分層學(xué)習(xí)的能力。隱含層中的激活函數(shù)采用ReLU,輸出層的激活函數(shù)采用Softmax,分別如式(6)和式(7):
(3)代價(jià)函數(shù)
DNN接收輸入信號(hào)并產(chǎn)生輸出信號(hào)的過程稱之為前向傳播過程,當(dāng)?shù)玫捷敵鲋岛笮枰c實(shí)際值進(jìn)行比對(duì),這時(shí)需要代價(jià)函數(shù)。根據(jù)任務(wù)的不同,常分為交叉熵準(zhǔn)則和最小均方差。在模型中采用交叉熵準(zhǔn)則的一種,稱為分類交叉熵,其表達(dá)是如(8):
其中,Li表示第i個(gè)輸出值與目標(biāo)值的差值,tij表示第i個(gè)輸入信號(hào)對(duì)應(yīng)的第 j個(gè)實(shí)際類,pij表示第i個(gè)輸入信號(hào)對(duì)應(yīng)的第 j個(gè)預(yù)測(cè)類,j表示預(yù)測(cè)值的類別數(shù)。
(4)代價(jià)函數(shù)求解
代價(jià)函數(shù)的求解采用Adam算法[12],即自適應(yīng)時(shí)刻估計(jì)方法(Adaptive Moment Estimation),它是用來替代隨機(jī)梯度下降的優(yōu)化算法,它利用梯度的一階矩陣和二階矩陣估計(jì)動(dòng)態(tài)調(diào)整每個(gè)參數(shù)的學(xué)習(xí)率,其中目標(biāo)函數(shù),一階矩陣和二階矩陣的更新參數(shù)分別為α,β1,β2。則算法流程如下:
輸入:參數(shù) α,β1,β2,目標(biāo)函數(shù) f(θ)
輸出:使得目標(biāo)函數(shù)收斂的θ
執(zhí)行步驟:
1)Intial:parameter vector:θ0
2)1stmomentvector:m0←0
3)2stmomentvector:v0←0
4)timestep:t←0
5)whileθtnot converged do
6)t←t+1
7)gt← ?θf(wàn)t(θt-1)
8)mt← β1?mt-1+(1- β1)?gt
9)vt← β2?vt-1+(1- β2)?g2t
10)m?t←mt/(1-β1
t)
11)v?t← vt/(1- β2
t)
12)θt←θt-1-α?m?t/(?- ε)
13)end while
14)return θt
DNN訓(xùn)練結(jié)束后,確定最佳的模型參數(shù),即可得到最佳模型。當(dāng)加入新項(xiàng)目時(shí),將目標(biāo)項(xiàng)目先進(jìn)行數(shù)據(jù)處理,然后經(jīng)過模型訓(xùn)練,便得到預(yù)測(cè)結(jié)果。對(duì)于預(yù)測(cè)后的結(jié)果,按照表3進(jìn)行反編碼,即可得到目標(biāo)用戶對(duì)目標(biāo)項(xiàng)目的預(yù)測(cè)評(píng)分pui。
實(shí)驗(yàn)數(shù)據(jù)集采用MovieLens 100K數(shù)據(jù)集,它包含用戶對(duì)電影的評(píng)分和電影的類型。實(shí)驗(yàn)數(shù)據(jù)集采用實(shí)驗(yàn)環(huán)境為Windows7 x64操作系統(tǒng),Intel Core i5處理器和8G內(nèi)存,代碼使用Python3.5語(yǔ)言實(shí)現(xiàn)。
模型的搭建使用Keras,它是一種基于Theano或TensorFlow的深度學(xué)習(xí)庫(kù)、線性求和、激活函數(shù)、代價(jià)函數(shù)和代價(jià)函數(shù)的求解采用Keras中的默認(rèn)參數(shù),而剩余的其他參數(shù)的設(shè)置如表5。
表5 實(shí)驗(yàn)參數(shù)設(shè)置
參數(shù)設(shè)置完畢后,需要對(duì)模型進(jìn)行訓(xùn)練,模型訓(xùn)練的迭代次數(shù)為1000,批尺寸為20,實(shí)時(shí)保存最佳模型。模型保存后,需要對(duì)模型進(jìn)行測(cè)試,采用5折交叉驗(yàn)證,通過均方誤差去衡量預(yù)測(cè)的準(zhǔn)確性。
本文采用均方誤差(RMSE)作為度量標(biāo)準(zhǔn),它可以直觀反映總體預(yù)測(cè)的誤差,如式(9):
其中,pui表示用戶u對(duì)項(xiàng)目i的預(yù)測(cè)評(píng)分,rui表示用戶u對(duì)項(xiàng)目i的實(shí)際評(píng)分,N表示預(yù)測(cè)的項(xiàng)目數(shù)。
實(shí)驗(yàn)對(duì)比的目的是確定算法在不同的訓(xùn)練項(xiàng)目數(shù)下模型預(yù)測(cè)的誤差變化,從而給出最佳的訓(xùn)練項(xiàng)目數(shù)。由于本文推薦算法需要用戶有一定的評(píng)論項(xiàng)目數(shù)才可以給出預(yù)測(cè),并且在實(shí)際生活中,用戶的評(píng)論項(xiàng)目數(shù)是一個(gè)不確定數(shù)目,所以設(shè)置模型訓(xùn)練的項(xiàng)目數(shù)分別為10,20,30,40,50,60,70,模型測(cè)試時(shí)的項(xiàng)目數(shù)均為30,比較在不同訓(xùn)練項(xiàng)目數(shù)下,算法預(yù)測(cè)評(píng)分的均方誤差,如圖2。
圖2 不同項(xiàng)目數(shù)下的RMSE值變化
從圖2中可以看出,隨著模型訓(xùn)練的項(xiàng)目數(shù)增加,算法預(yù)測(cè)評(píng)分的均方誤差逐漸降低,當(dāng)模型訓(xùn)練的項(xiàng)目數(shù)為60的時(shí)候,其均方誤差最小。因此,項(xiàng)目數(shù)為60時(shí),算法預(yù)測(cè)的效果已經(jīng)基本達(dá)到最佳。
選取模型訓(xùn)練的項(xiàng)目數(shù)為60,進(jìn)行預(yù)測(cè)評(píng)分實(shí)驗(yàn),當(dāng)預(yù)測(cè)項(xiàng)目數(shù)為30時(shí),其預(yù)測(cè)評(píng)分與實(shí)際評(píng)分的對(duì)比效果圖,如圖3。
從圖3中可以看出,當(dāng)模型訓(xùn)練的項(xiàng)目數(shù)為60時(shí),算法預(yù)測(cè)評(píng)分的效果已經(jīng)呈現(xiàn)不錯(cuò)的效果。在30個(gè)預(yù)測(cè)項(xiàng)目中,存在8個(gè)項(xiàng)目的預(yù)測(cè)評(píng)分與實(shí)際評(píng)分存在偏差,而剩余22個(gè)項(xiàng)目的預(yù)測(cè)評(píng)分與實(shí)際評(píng)分完全一致,若從命中率分析,算法的命中率高達(dá)73.33%。
圖3 預(yù)測(cè)評(píng)分與實(shí)際評(píng)分對(duì)比效果圖
本文提出了一種基于深度神經(jīng)網(wǎng)絡(luò)的推薦算法,算法不需要依賴于近鄰的評(píng)分,只需根據(jù)項(xiàng)目類型和項(xiàng)目評(píng)分產(chǎn)生推薦。在用戶存在一定的評(píng)分項(xiàng)目數(shù)時(shí),利用本文算法可以產(chǎn)生令人滿意的推薦效果。下一步將著手于融合用戶的評(píng)分時(shí)間和評(píng)論留言,利用CNN或NLP等前沿的深度學(xué)習(xí)框架產(chǎn)生推薦,提高算法的準(zhǔn)確度。