高浩元, 許建強
(1. 中國科學(xué)院大學(xué) 人工智能學(xué)院, 北京 100049; 2. 上海應(yīng)用技術(shù)大學(xué) 理學(xué)院, 上海 201418)
如今的互聯(lián)網(wǎng)行業(yè),個性化推薦已經(jīng)成為一個越來越重要的技術(shù),而如今的推薦系統(tǒng)主要是基于大數(shù)據(jù)和各類機器學(xué)習(xí)、協(xié)同過濾等人工智能算法和數(shù)學(xué)模型來實現(xiàn)的,無論是監(jiān)督學(xué)習(xí)、關(guān)聯(lián)規(guī)則還是協(xié)同過濾的推薦思路都需要一定的訓(xùn)練數(shù)據(jù),而這些數(shù)據(jù)就必須包含著用戶與對應(yīng)產(chǎn)品關(guān)聯(lián)的信息(如用戶曾經(jīng)看過哪個產(chǎn)品等)。國內(nèi)外目前常用的推薦系統(tǒng)包括傳統(tǒng)的基于物品(Item)或用戶(User)的協(xié)同過濾算法[1-2]、基于矩陣分解的算法[3-4]以及基于深度學(xué)習(xí)的算法[5-7]等。
半監(jiān)督學(xué)習(xí)能將未標記的數(shù)據(jù)利用起來,在一定程度上改善最終的推薦效果。目前在推薦算法中常用的半監(jiān)督學(xué)習(xí)方法包括基于圖和隨機游走的模型[8]、基于協(xié)同訓(xùn)練和主動學(xué)習(xí)的模型[9-10]、基于半監(jiān)督支持向量機的模型等[11]。
在一些分布式計算的場景中,數(shù)據(jù)被存儲在多個結(jié)點上的,分布式機器學(xué)習(xí)算法運行的過程中,各結(jié)點之間不會對任意一個特定的數(shù)據(jù)樣本進行交換,而只會交換一些計算所得的參數(shù)。根據(jù)文獻調(diào)研,基于consensus算法使用分布式梯度下降構(gòu)建分布式神經(jīng)網(wǎng)絡(luò)解決半監(jiān)督推薦問題的研究尚未見報道,本文就嘗試使用該方法對該問題進行研究,并創(chuàng)造性地提出了使用Metropolis算法結(jié)合深度協(xié)同過濾(neural collaborative filtering,NCF)模型[7]構(gòu)建分布式推薦系統(tǒng)的思路。
在本文中,首先對整個推薦系統(tǒng)的整體結(jié)構(gòu)進行了概述。然后介紹了基于consensus算法的分布式神經(jīng)網(wǎng)絡(luò)模型和目前常用的半監(jiān)督學(xué)習(xí)方法及其在推薦系統(tǒng)中的應(yīng)用,在此基礎(chǔ)上提出了一種基于協(xié)同訓(xùn)練的分布式半監(jiān)督學(xué)習(xí)模型。最后在MovieLens公開數(shù)據(jù)集[12]上對該推薦系統(tǒng)進行測試,并與獨立協(xié)同過濾、分布式隱語義(latent factor model, LFM)模型及分布式多層感知機(multilayer perceptron, MLP)模型等作了對比。
圖1 推薦系統(tǒng)結(jié)構(gòu)總覽Fig.1 The structure of the recommendation system
本文所要解決的問題是,當(dāng)用戶對物品的行為數(shù)據(jù)分布在不同的服務(wù)器上時,如何在各服務(wù)器不交換特定數(shù)據(jù)樣本信息的情況下,使各服務(wù)器能協(xié)同構(gòu)建推薦系統(tǒng),充分利用整個系統(tǒng)中每個服務(wù)器的所有信息進行推薦,同時使用半監(jiān)督學(xué)習(xí)中的協(xié)同訓(xùn)練算法提升預(yù)測準確度。
本文中提出的推薦系統(tǒng)模型的具體架構(gòu)如圖1所示。用戶對物品的行為數(shù)據(jù)被分別存儲在網(wǎng)絡(luò)中的各個結(jié)點上。在每個結(jié)點上構(gòu)建一個NCF模型,其輸入部分由LFM模型和MLP模型兩部分組成,每一部分都分別將物品和用戶的獨熱編碼向量輸入進一個embedding層并將其轉(zhuǎn)化為一個稠密的、低維的隱語義向量,再在LFM模型和MLP模型中分別使用Element-wise Product和神經(jīng)網(wǎng)絡(luò)層將隱語義向量進行融合,最終將兩個模型學(xué)習(xí)到的特征向量一同輸入到尾端的全連接神經(jīng)網(wǎng)絡(luò)層中,并使用sigmoid函數(shù)作為輸出函數(shù),將用戶對物品感興趣的概率值作為輸出,使用交叉熵損失函數(shù)對整個模型進行基于梯度下降法的訓(xùn)練。
在每個結(jié)點使用梯度下降訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程中,結(jié)點之間通過metropolis算法進行參數(shù)交換,實現(xiàn)梯度向量的consensus,以實現(xiàn)分布式的NCF模型。根據(jù)以上流程,以不同的隱層數(shù)量和結(jié)點數(shù)量構(gòu)建2個不同結(jié)構(gòu)的NCF模型,并對2個模型進行協(xié)同訓(xùn)練(Co-training),對未標記數(shù)據(jù)進行預(yù)測,篩選出其中置信度高的數(shù)據(jù)提供給對方模型作為訓(xùn)練數(shù)據(jù)(負樣本),以使得最后的預(yù)測結(jié)果更加精準。對于Co-training與NCF模型結(jié)合的中心化模型,將其命名為Co-NCF模型,而整個分布式半監(jiān)督推薦系統(tǒng)(distirbuted co-training neural collaborative filtering, DISCONNECT)模型。
基于前饋神經(jīng)網(wǎng)絡(luò)的推薦算法有許多不同的類型。目前,一種常見的結(jié)構(gòu)被稱為NCF模型。NCF模型使用一個針對二分類問題的神經(jīng)網(wǎng)絡(luò)模型來對用戶是否會對物品感興趣進行預(yù)測。若完全使用MLP模型對用戶對于物品的興趣進行預(yù)測,則其輸入層輸入的特征向量是由用戶和物品通過某些embedding算法映射得到的向量,而輸出層的輸出值是一個介于0和1之間的標量,即當(dāng)前被預(yù)測用戶對被預(yù)測物品可能感興趣的概率值。而在NCF模型中,構(gòu)建一個前饋神經(jīng)網(wǎng)絡(luò),其中結(jié)合了MLP模型和LFM模型,物品和用戶的獨熱向量(若物品為3號物品,則其獨熱向量為[0,0,1,0,…,0,0])分別輸入2個模型中進行embedding和融合,最終使用一個神經(jīng)網(wǎng)絡(luò)進行結(jié)合,如圖2所示。在上述2個模型中,都可使用真實標記與預(yù)測的概率值構(gòu)建交叉熵損失函數(shù), 之后使用梯度下降法進行訓(xùn)練。
圖2 NCF模型結(jié)構(gòu)概覽Fig.2 The structure of the NCF model
NCF模型相對于傳統(tǒng)的協(xié)同過濾算法來說,有著更高的預(yù)測準確率,這是由于經(jīng)過embedding層轉(zhuǎn)化的稠密的向量包含的信息量更大,從其中學(xué)到的信息也就更多,并且該模型相當(dāng)于使用stacking集成方法結(jié)合了LFM和MLP模型提取出的特征,所以其表現(xiàn)能夠超越這2個模型單獨的預(yù)測效果。同時,基于神經(jīng)網(wǎng)絡(luò)的推薦算法相對于其他推薦算法(基于矩陣分解或圖模型),可以容易地使用分布式梯度下降(或分布式隨機梯度下降)算法實現(xiàn)分布式訓(xùn)練。
當(dāng)數(shù)據(jù)被分布式存儲在各個結(jié)點上,且各結(jié)點只能與其鄰居結(jié)點進行通信(通常整個網(wǎng)絡(luò)的拓撲結(jié)構(gòu)是一個聯(lián)通圖,即其中任一結(jié)點最少有一個鄰居結(jié)點),由于數(shù)據(jù)安全、通信效率等問題的考慮,要求結(jié)點之間的通信不能對特定的數(shù)據(jù)樣本進行交換。在以上情況下,要進行個性化推薦,就需要構(gòu)建分布式的推薦系統(tǒng)。
本文引入consensus算法,通過各個結(jié)點與其鄰居結(jié)點的通信,在一定迭代次數(shù)以后,最終可以實現(xiàn)每個結(jié)點對同一個參數(shù)達到共識的目標。consensus算法分為maximum consensus、average consensus等類型[13-14],其中maximum consensus最后希望所有結(jié)點對該參數(shù)達到一致的值是各結(jié)點初始的該參數(shù)中的最大值,而average consensus希望得到初始參數(shù)值的平均值。例如,若有3個結(jié)點,每個結(jié)點所保存的參數(shù)向量分別為[1,1,4],若使用maximum consensus,則最終希望3個結(jié)點保存的參數(shù)向量均為[4,4,4],而在average consensus中最終3個結(jié)點保存的參數(shù)向量均為[2,2,2]。本文中,使用的是average consensus算法中的Metropolis算法[15]。Metropolis算法對參數(shù)的更新公式如下:
基于該算法可以將梯度下降法改造為分布式梯度下降法[16],其算法偽代碼如下:
Algorithm 1 Distributed Gradient DesecentRequire: Each agent initial the local parameter wi(0) fort=1:Tdo fori=1:Ndo Calculate the local gradient xi(t) vi(t)=Consensusj∈Ni(xj(t)) wi(t)=wi(t-1)-αvi(t) end for end for
分布式梯度下降法用來對分布式神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練。具體來說就是針對一個由許多結(jié)點組成的通信網(wǎng)絡(luò),這些結(jié)點組成的圖是一個聯(lián)通圖,結(jié)點之間的拓撲關(guān)系是非時變的,每個結(jié)點只能與它的鄰居結(jié)點進行通信。每個結(jié)點上存儲著一個神經(jīng)網(wǎng)絡(luò),而整個數(shù)據(jù)集被分散存儲在各個結(jié)點上。各個結(jié)點的目的是,基于自己所知的部分訓(xùn)練數(shù)據(jù)集,對自己本地存儲的神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練,在訓(xùn)練過程中以某種方式與自己的鄰居結(jié)點交換某些參數(shù)值,使得最終各個結(jié)點訓(xùn)練得到的神經(jīng)網(wǎng)絡(luò)參數(shù)達到一致,并且訓(xùn)練出的神經(jīng)網(wǎng)絡(luò)效果足夠接近當(dāng)數(shù)據(jù)被存儲在同一臺主機上時訓(xùn)練神經(jīng)網(wǎng)絡(luò)的效果。
根據(jù)算法1的偽代碼,分布式梯度下降的思路非常簡單。初始狀態(tài)下,每個結(jié)點對自己本地的神經(jīng)網(wǎng)絡(luò)參數(shù)進行初始化,同時將訓(xùn)練數(shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò)進行前向傳播,計算得到本地的梯度值之和。之后,各結(jié)點對梯度值進行交換通信,直至梯度值達到consensus,接著各結(jié)點按照consensus所得的梯度值進行梯度下降法,更新神經(jīng)網(wǎng)絡(luò)的參數(shù)值。由于神經(jīng)網(wǎng)絡(luò)更新前的參數(shù)值和更新所使用的梯度值都是一致的,故各結(jié)點更新后所得到的神經(jīng)網(wǎng)絡(luò)參數(shù)值仍是一致的,且在某個精度水平上等價于中心化梯度下降法的訓(xùn)練結(jié)果。重復(fù)以上過程,直至達到訓(xùn)練停止條件(可設(shè)置為consensus后得到的梯度值小于某閾值時)。
半監(jiān)督學(xué)習(xí)是將有標注的數(shù)據(jù)與無標注的數(shù)據(jù)結(jié)合起來對模型進行訓(xùn)練的方法。通常,在無標注的數(shù)據(jù)中也包含有許多的信息,半監(jiān)督學(xué)習(xí)將這些信息與有標注數(shù)據(jù)結(jié)合起來使用,實現(xiàn)了對數(shù)據(jù)價值的最大化利用。半監(jiān)督學(xué)習(xí)是近年來關(guān)注的熱點,這是由于有標注數(shù)據(jù)通常是少量的,而剩下的無標注數(shù)據(jù)數(shù)量更大。
半監(jiān)督學(xué)習(xí)中有許多基于不同思想的方法,其中包括主動學(xué)習(xí)、混合聚類、協(xié)同訓(xùn)練以及一些特定機器學(xué)習(xí)算法的半監(jiān)督學(xué)習(xí)版本(如半監(jiān)督學(xué)習(xí)支持向量機等)。這些方法中,在分布式系統(tǒng)中,較為適用的是協(xié)同訓(xùn)練。在此對協(xié)同訓(xùn)練的思想和算法流程進行闡述。
協(xié)同訓(xùn)練中,首先將數(shù)據(jù)集按照某種視圖進行分割。如,某數(shù)據(jù)集中每個樣本的特征值有6個,則可以取其中前3個特征值,放入一個模型中訓(xùn)練,再取其中后3個特征值,放入另一個模型中訓(xùn)練,然后在這兩個訓(xùn)練出來的模型上分別對無標注數(shù)據(jù)進行預(yù)測。根據(jù)預(yù)測的置信度,篩選出2個模型各自預(yù)測中置信度最高的那些樣本,作為訓(xùn)練數(shù)據(jù)提供給另一個模型。視圖的劃分是為了使2個參與協(xié)同訓(xùn)練的模型具有足夠高的多樣性,若不對視圖進行劃分,也可使用相異的模型,如樸素貝葉斯與邏輯回歸,或2個結(jié)構(gòu)不同的神經(jīng)網(wǎng)絡(luò)模型。最終通過該方法能分別訓(xùn)練出2個預(yù)測模型,之后對于所有的未標記數(shù)據(jù),選取對其預(yù)測置信度較高的模型的預(yù)測結(jié)果作為其最終標記。協(xié)同訓(xùn)練的流程如圖3所示。
圖3 協(xié)同訓(xùn)練結(jié)構(gòu)概覽Fig.3 The structure of collaborative training
在本文的模型中,數(shù)據(jù)被分別存儲在各個結(jié)點上。對于單個結(jié)點來說,模型首先根據(jù)給出的網(wǎng)絡(luò)結(jié)構(gòu)構(gòu)建2個不同結(jié)構(gòu)的NCF模型,之后,對于每一個用戶,將訓(xùn)練數(shù)據(jù)中其已有行為的記錄標記為正例,即其標簽為1。對于每一個用戶,根據(jù)文獻[7]中的方法,采樣4倍于其正例數(shù)量的負例,即標簽為0的樣本。不同于文獻[7]的是,在采樣負例時,使用傳統(tǒng)的協(xié)同過濾算法,基于該結(jié)點有限的本地數(shù)據(jù),來對該用戶和已有的所有物品計算相關(guān)概率,并根據(jù)概率值從小到大進行排序。從排序數(shù)據(jù)中,選取前K條作為負樣本,K為需要采樣的負例數(shù)量。
使用初始化的訓(xùn)練集分別對2個NCF模型進行訓(xùn)練,在訓(xùn)練過程中通過Metropolis算法與其他結(jié)點交換信息,使用分布式梯度下降法訓(xùn)練。
初始化2個模型后,分別使用2個模型基于結(jié)點本地數(shù)據(jù),對每個用戶對于所有物品的興趣概率進行計算并排序,選出概率最小的K個樣本作為負例提供給對方模型作為下一輪的訓(xùn)練負例。
之后使用新生成的訓(xùn)練集對2個模型進行訓(xùn)練,訓(xùn)練過程中同樣使用Metropolis算法進行通信,以構(gòu)建分布式梯度下降算法。訓(xùn)練后再次進行預(yù)測并更新雙方的訓(xùn)練集。重復(fù)以上過程直到達到最大迭代次數(shù)。最后在測試集上測試模型時,分別使用2個模型進行預(yù)測,并在輸出結(jié)果中選擇置信度較高的(偏離0.5更大的)結(jié)果作為預(yù)測概率。
MovieLens是一個由美國 Minnesota 大學(xué)計算機科學(xué)與工程學(xué)院創(chuàng)辦的電影推薦系統(tǒng),主要用于研究實驗而非商業(yè)用途。MovieLens數(shù)據(jù)集分為幾個版本,本文中使用的是MovieLens 1MB數(shù)據(jù)集,其中包含來自 6 040 名用戶對 3 706 部電影的 1 000 209 條評分信息,其中每名用戶至少進行過20次評分。另外,MovieLens 1MB還提供了電影的一些基本信息,包括電影名稱、上映時間(年月)、電影類型等。
選取的基準模型是獨立協(xié)同過濾算法(即各結(jié)點分別使用其本地存儲的部分數(shù)據(jù)進行協(xié)同過濾預(yù)測)、分布式LFM模型、分布式MLP模型和分布式NCF模型。在測試中,分別選取item-based和 user-based的協(xié)同過濾算法,而相似度度量使用余弦相似度公式。
在測試中,對于各模型的超參數(shù),參考文獻[7]中表現(xiàn)較好的網(wǎng)絡(luò)結(jié)構(gòu)。對于LFM模型,設(shè)置embedding的維度為16;對于MLP模型,embedding維度為32,設(shè)置其網(wǎng)絡(luò)結(jié)構(gòu)為[64,32,16];對于NCF模型,設(shè)置MLP部分embedding維度為32,網(wǎng)絡(luò)結(jié)構(gòu)為[64,32,16];設(shè)置LFM部分embedding維度為16,設(shè)置最后融合部分的網(wǎng)絡(luò)結(jié)構(gòu)為[32,16,8]。
對于Co-NCF模型的2個模型中,模型1使用上述提到的NCF模型結(jié)構(gòu),模型2使用的結(jié)構(gòu)如下:設(shè)置MLP部分embedding層維度為32,網(wǎng)絡(luò)結(jié)構(gòu)為[32,32,32,16,16,16,8],設(shè)置LFM部分embedding層維度為16,并通過一個MLP隱藏層映射為維度8的向量,最后NCF融合部分的結(jié)構(gòu)為[16,16,8,8,4,4]。這2種網(wǎng)絡(luò)結(jié)構(gòu)分別代表了深度較高、寬度較小的網(wǎng)絡(luò)和深度較低、寬度較大的網(wǎng)絡(luò),這2種網(wǎng)絡(luò)結(jié)構(gòu)的優(yōu)勢不同,故能夠為模型帶來多樣性,使得協(xié)同訓(xùn)練方法的優(yōu)勢得到充分地發(fā)揮。所有梯度下降的batch-size設(shè)為 1 024,學(xué)習(xí)步長為 0.000 1。
在測試過程中,使用leave-one-out評判指標,即,對于任意一個用戶,保留其時間上最晚的一條行為記錄作為測試集,而使用剩余所有的樣本行為記錄作為訓(xùn)練集[17]。對于每個用戶,隨機采樣100個用戶沒有過行為的物品,將其與那一條測試數(shù)據(jù)混合。在對模型進行測試時,讓模型對這101條數(shù)據(jù)按照相關(guān)性自大到小進行排序,并檢測前10條數(shù)據(jù)中是否包含測試數(shù)據(jù)。對于所有用戶,都執(zhí)行以上操作,最終計算出命中的比率,稱其為命中率指標(hit ratio, HR)[18]。
表1為在MovieLens 1MB上基于4種結(jié)點拓撲結(jié)構(gòu)對模型預(yù)測效果測試的HR結(jié)果。由表1可見,對于使用分布式梯度下降來訓(xùn)練的模型,即LFM、MLP、NCF和Co-NCF來說,分布式的算法基本上能達到與中心化算法相同的預(yù)測精度,且其預(yù)測水平不會隨著數(shù)據(jù)分布的分散程度(即結(jié)點的數(shù)量)越高而越差,而是基本保持穩(wěn)定的。這點上顯著強于傳統(tǒng)的協(xié)同過濾算法,從表中可以看出,無論是Item CF還是User CF,當(dāng)結(jié)點數(shù)越來越多時,預(yù)測精度下降十分顯著。分析認為,這是由于在傳統(tǒng)的協(xié)同過濾算法中,當(dāng)數(shù)據(jù)被分布存儲在各結(jié)點時,結(jié)點之間的訓(xùn)練過程是獨立的,無法共享信息,相當(dāng)于每個結(jié)點只能使用自己本地有限的數(shù)據(jù)。要改進該算法,就必然要允許結(jié)點之間對特定的樣本進行交換,而這不符合在論文開頭提出的安全性原則。相反地,基于consensus算法的分布式梯度下降可以讓每個結(jié)點存儲的模型,在實際上都使用了所有結(jié)點的數(shù)據(jù)來進行訓(xùn)練,所以其表現(xiàn)能和中心化的算法有同樣的精度。
表1 各拓撲結(jié)構(gòu)、結(jié)點數(shù)量下各模型的HR結(jié)果Tab.1 The results of HR with different topology and number of nodes
橫向?qū)Ρ雀鱾€算法的預(yù)測精度可以發(fā)現(xiàn),無論是在何種拓撲結(jié)構(gòu)下,多少個結(jié)點數(shù)情況下,模型NCF都要優(yōu)于LFM和MLP模型。據(jù)分析,這是由于NCF模型的構(gòu)建過程實際上是將LFM和MLP模型的預(yù)測結(jié)果使用機器學(xué)習(xí)中的Stacking方法進行集成的結(jié)果。而Co-NCF模型在任一情況下皆優(yōu)于NCF模型,可見使用協(xié)同訓(xùn)練方法后,確實提升了NCF模型的預(yù)測能力。
本文提出了使用Co-training與NCF模型結(jié)合的Co-NCF模型,并且探討了使用基于consensus算法的分布式梯度下降法來構(gòu)建分布式推薦系統(tǒng)的可能性,進而提出了DISCONNECT模型,即使用Consensus-based分布式梯度下降與Co-NCF模型結(jié)合而構(gòu)建的分布式推薦系統(tǒng)。在MovieLens數(shù)據(jù)集上使用HR 10作為評判指標的測試表明, DISCONNECT模型無論是在中心化情況還是分布式情況下都優(yōu)于現(xiàn)有的NCF模型和協(xié)同過濾算法。同時也表明,Co-NCF算法在不同結(jié)點數(shù)和拓撲結(jié)構(gòu)下,其預(yù)測精度基本不變,在分布式和中心化上能達到同樣好的表現(xiàn)水平。