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