周雕,郝勝男
(華北理工大學(xué)人工智能學(xué)院,唐山063210)
在數(shù)據(jù)爆炸式增長(zhǎng)的時(shí)代,如何從海量數(shù)據(jù)中獲取關(guān)鍵有效的數(shù)據(jù)是人們所面臨的一個(gè)難題,而推薦系統(tǒng)的出現(xiàn)為這個(gè)難題提供了有效解決方案。過(guò)去,常用的推薦算法主要有基于用戶的協(xié)同過(guò)濾、基于物品的協(xié)同過(guò)濾、基于內(nèi)容的推薦、基于知識(shí)的推薦等,其中協(xié)同過(guò)濾是推薦系統(tǒng)中應(yīng)用最為廣泛的算法。
但是近年來(lái),許多學(xué)者已經(jīng)不再局限于研究傳統(tǒng)算法,越來(lái)越多的推薦系統(tǒng)研究工作基于深度學(xué)習(xí)展開(kāi)。例如,He X等人[1]提出了一種神經(jīng)協(xié)同過(guò)濾框架,該框架結(jié)合協(xié)同過(guò)濾的思想,并使用神經(jīng)網(wǎng)絡(luò)代替?zhèn)鹘y(tǒng)的內(nèi)積操作,是一種推薦系統(tǒng)通用框架。Cheng H T等人[2]提出了Wide&Deep模型,該模型由Wide部分和Deep部分組成,兼具較好的記憶能力與泛化能力。而在實(shí)際應(yīng)用中,YouTube提出了一種基于DNN的視頻推薦模型[3],該模型能夠從百萬(wàn)視頻數(shù)據(jù)中迅速生成候選集,并實(shí)現(xiàn)Top-K推薦。阿里巴巴提出了一種深度興趣網(wǎng)絡(luò)[4],該網(wǎng)絡(luò)能夠高效地利用用戶行為數(shù)據(jù)并準(zhǔn)確地捕捉用戶的偏好特征。上述工作給推薦系統(tǒng)的研究提供了很好的建議。
一個(gè)良好的推薦系統(tǒng)往往需要高精度的數(shù)據(jù)支撐,然而現(xiàn)實(shí)中,用于模型訓(xùn)練的數(shù)據(jù)往往具有龐大、稀疏、噪聲大等問(wèn)題,這些問(wèn)題給推薦模型的準(zhǔn)確度、魯棒性帶來(lái)了極大的挑戰(zhàn)。因此,提出一種分類訓(xùn)練方法,通過(guò)K-means[5]將訓(xùn)練集中的用戶按照歷史行為聚類成不同的簇,然后將各簇?cái)?shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò)進(jìn)行并行訓(xùn)練。由于各簇之間的相互獨(dú)立性與簇內(nèi)用戶的相似性,神經(jīng)網(wǎng)絡(luò)模型能夠更快地學(xué)習(xí)到用戶特征與項(xiàng)目特征從而迅速收斂,另外,并行訓(xùn)練的方式也能進(jìn)一步加快訓(xùn)練速度,且不影響準(zhǔn)確性。
所提方法的總架構(gòu)簡(jiǎn)化圖如圖1所示。
圖1 模型基本架構(gòu)
架構(gòu)的核心組成部分為K-means聚類模塊以及神經(jīng)網(wǎng)絡(luò)模塊。其中K-means聚類模塊的主要作用是將用戶訓(xùn)練數(shù)據(jù)分為k個(gè)簇,而神經(jīng)網(wǎng)絡(luò)模塊的作用則是對(duì)k個(gè)簇中的數(shù)據(jù)進(jìn)行并行訓(xùn)練,最后將訓(xùn)練模型保存即可直接用于推薦場(chǎng)景。
在龐大的用戶-項(xiàng)目行為稀疏矩陣中,由于用戶數(shù)量與項(xiàng)目數(shù)量太多,用戶與用戶之間的偏好差異存在太大的不確定性,如果使用同一模型來(lái)對(duì)這些用戶進(jìn)行訓(xùn)練,那么模型很難“照顧”到所有用戶的偏好規(guī)律,也就是說(shuō),模型難以較好地?cái)M合所有用戶。因此,在進(jìn)行神經(jīng)模型的正式訓(xùn)練之前,對(duì)所有用戶進(jìn)行分類,使得同類別中的用戶在偏好上有著更高的相似度。而同類用戶的聚類是進(jìn)行用戶分類的前提。
在K-means聚類步驟中,設(shè)定簇中心(或稱質(zhì)心)的個(gè)數(shù)為k,即訓(xùn)練數(shù)據(jù)將被劃分為k個(gè)類別,所有訓(xùn)練數(shù)據(jù)的集合表示為Dtrain={C1,C2,…,Ck-1,Ck}。初始簇中心為隨機(jī)生成,在聚類過(guò)程中,簇內(nèi)用戶緊靠簇中心,而簇與簇之間的距離較大,由此,用戶按所屬不同的簇中心而被區(qū)分開(kāi)來(lái),達(dá)到用戶分類的目的。
進(jìn)行正式聚類前,首先對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行預(yù)處理。訓(xùn)練數(shù)據(jù)中包含了用戶的評(píng)分行為數(shù)據(jù),但這些評(píng)分分值往往并不分布在0到1的區(qū)間內(nèi),為了減緩奇異樣本帶來(lái)的負(fù)面影響,因此需對(duì)所有評(píng)分?jǐn)?shù)據(jù)進(jìn)行歸一化操作,使得所有分值分布于區(qū)間[0,1]內(nèi),對(duì)于評(píng)分記錄i,歸一化的變換公式為:
其中,xi為原始評(píng)分,xmin為所有評(píng)分記錄中的最小分值,xmax為所有評(píng)分記錄中的最大分值,為歸一化后的分值。
聚類過(guò)程中,為了使用戶找到合適的簇中心,采用歐氏距離來(lái)度量用戶與各個(gè)簇中心的距離。并通過(guò)迭代使簇內(nèi)用戶之間的歐氏距離盡量小,而簇與簇之間的歐氏距離盡量大。設(shè)簇中心的特征向量維度為n,則簇中心u1與u2的歐氏距離通過(guò)以下公式計(jì)算:
如何達(dá)到良好的聚類效果是問(wèn)題核心所在。在迭代過(guò)程中,需要站在全局角度來(lái)評(píng)估聚類性能,具體做法是通過(guò)反復(fù)計(jì)算所有用戶與簇中心的距離之和來(lái)判斷聚類效果的好壞。因此,K-means的最終目的是優(yōu)化距離,優(yōu)化過(guò)程公式為:
在評(píng)分預(yù)測(cè)過(guò)程,使用DNN神經(jīng)網(wǎng)絡(luò)回歸實(shí)現(xiàn)。DNN又稱多層感知機(jī),是一種典型的全連接神經(jīng)網(wǎng)絡(luò),即上層的每一個(gè)神經(jīng)元與下層的每一個(gè)神經(jīng)元一一相連。全連接結(jié)構(gòu)使得模型具有更強(qiáng)的特征表達(dá)能力以及泛化能力。圖2為全連接結(jié)構(gòu)示意圖。
圖2 全連接層結(jié)構(gòu)
在本文所提方法中,由于采用并行訓(xùn)練的方式,因此需要同時(shí)構(gòu)建多個(gè)神經(jīng)網(wǎng)絡(luò)模型,這些模型之間相互獨(dú)立,且具有完全相同的結(jié)構(gòu)和訓(xùn)練參數(shù),被用來(lái)同時(shí)訓(xùn)練不同類別的用戶簇。其中任意一個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)可以概括為圖3所示。
圖3 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
該網(wǎng)絡(luò)結(jié)構(gòu)主要由用戶與項(xiàng)目特征學(xué)習(xí)模塊、全連接模塊以及評(píng)分預(yù)測(cè)模塊組成。
在用戶特征學(xué)習(xí)中,為了更準(zhǔn)確地學(xué)習(xí)到用戶特征,不僅利用用戶ID、年齡、性別等用戶注冊(cè)信息,而且還充分利用用戶的行為序列。用戶的行為序列中包含了許多用戶的歷史交互行為,其顯性行為一般以評(píng)分形式呈現(xiàn),而在實(shí)際推薦場(chǎng)景,用戶行為還包括諸如點(diǎn)擊、瀏覽等隱性行為,充分地利用行為數(shù)據(jù)可以使模型性能更好。而在項(xiàng)目特征學(xué)習(xí)中,主要使用項(xiàng)目ID、項(xiàng)目名稱、項(xiàng)目類別等項(xiàng)目參數(shù)進(jìn)行特征生成。
然而,用戶與項(xiàng)目的初始特征往往以one-hot向量形式存在,one-hot向量非常稀疏,如果在整個(gè)神經(jīng)網(wǎng)絡(luò)中直接用one-hot向量進(jìn)行訓(xùn)練,則會(huì)消耗巨大的計(jì)算成本。因此,用戶與項(xiàng)目信息在進(jìn)入神經(jīng)網(wǎng)絡(luò)的第一步就是進(jìn)行Embedding嵌入操作。Embedding的作用是將用戶與項(xiàng)目的高維one-hot向量映射成低維稠密向量,稠密向量經(jīng)過(guò)兩個(gè)全連接層即可得到完整的用戶特征向量與項(xiàng)目特征向量。得到特征向量后并不能直接獲得評(píng)分,接下來(lái),將用戶與項(xiàng)目特征向量進(jìn)行特征拼接,再次經(jīng)過(guò)兩個(gè)全連接層,即可將高維拼接特征映射成一維預(yù)測(cè)評(píng)分。
在整個(gè)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程中,包含向前傳播與向后傳播兩部分。向前傳播過(guò)程中,主要實(shí)現(xiàn)用戶與項(xiàng)目特征學(xué)習(xí)以及用戶對(duì)項(xiàng)目的評(píng)分預(yù)測(cè),該過(guò)程中,采用ReLu激活函數(shù),該函數(shù)具有易求導(dǎo),能緩解梯度消失等特點(diǎn),能夠加快模型的收斂速度。對(duì)于第t個(gè)隱層,設(shè)輸入為Xt=(x1,x2,…,xj-1,xj),輸出為Yt=(y1,y2,…,yk-1,yk),則輸入與輸出之間滿足以下公式:
其中,Wt為權(quán)重矩陣,Bt為偏置矩陣。在整個(gè)網(wǎng)絡(luò)中,幾乎所有層都是類似的計(jì)算方法,但是在Em?bedding層與最后的預(yù)測(cè)輸出層并不設(shè)置激活函數(shù)。
在模型的反向傳播過(guò)程中,使用MSE損失函數(shù)計(jì)算預(yù)測(cè)值與真實(shí)值的誤差,并進(jìn)行各層矩陣與偏置的更新。另外,使用L2正則化防止模型的過(guò)擬合。本文所提方法中使用的損失函數(shù)表達(dá)式為:
其中,n為單批次訓(xùn)練的樣本數(shù)量,yi、y'i分別為真實(shí)值與預(yù)測(cè)值,T為總的網(wǎng)絡(luò)層數(shù)。
實(shí)驗(yàn)中,選擇使用公開(kāi)的電影評(píng)分?jǐn)?shù)據(jù)集Movie-Lens 1M和MovieLens 100K(https://grouplens.org/datas?ets/movielens/)對(duì)算法模型進(jìn)行評(píng)估驗(yàn)證。其中MovieLens 1M中包含了大約6000用戶對(duì)4000部電影的一百萬(wàn)個(gè)評(píng)分;MovieLens 100K中包含了大約950個(gè)用戶對(duì)1600余部電影的十萬(wàn)個(gè)評(píng)分。其中,每個(gè)用戶至少包含有20個(gè)電影評(píng)分記錄。在實(shí)驗(yàn)過(guò)程中,隨機(jī)選取80%的數(shù)據(jù)作為訓(xùn)練集,其余為測(cè)試集。
由于本文所提方法最終實(shí)現(xiàn)評(píng)分預(yù)測(cè),因此,在本文中,計(jì)算預(yù)測(cè)分與實(shí)際分之間的偏差是一種有效的性能評(píng)估方法,這類常見(jiàn)的方法有RMSE、MSE、MAE等。這些評(píng)估方法沒(méi)有太大的本質(zhì)上的差別,在本文實(shí)驗(yàn)中,選用RMSE和MAE作為評(píng)估標(biāo)準(zhǔn),并且與經(jīng)典的矩陣分解算法進(jìn)行比較,驗(yàn)證模型的性能。
RMSE的計(jì)算公式如下式所示:
MAE的計(jì)算公式如下式所示:
實(shí)驗(yàn)的訓(xùn)練與測(cè)試均在PyTorch深度學(xué)習(xí)框架下進(jìn)行。為了驗(yàn)證所提方法的有效性,在模型性能測(cè)試環(huán)節(jié),將所有分類訓(xùn)練的模型在測(cè)試集上進(jìn)行了15次測(cè)試,并取平均值作為最終的測(cè)試結(jié)果。表1為所提方法與SVD[6]、AutoSVD++[7]、NNMF[8]等矩陣分解算法的RMSE、MAE結(jié)果對(duì)比,其中本文方法取所有分類訓(xùn)練的平均值。
表1 實(shí)驗(yàn)結(jié)果比較
從實(shí)驗(yàn)結(jié)果可以看出,本文方法相比傳統(tǒng)的矩陣分解算法有著較大的性能提升,這是因?yàn)楸疚哪P筒捎昧松窠?jīng)網(wǎng)絡(luò)進(jìn)行評(píng)分預(yù)測(cè),保證了模型的泛化能力的提升,其次,由于K-means聚類算法的引入,使得模型對(duì)于不同類型用戶具有更好的適應(yīng)性。