Neural Collaborative Filtering paper
關於協同過濾
協同過濾簡而言之就是物以類聚人以羣分,在真實場景中,通常會獲得一張用戶物品交互表,其實就是一個矩陣M,M[i][j]=1則表示用戶i購買了物品j,M[i][j]=0表示沒有購買。
協同過濾主要分爲以下兩種:
- user-based協同過濾:基於用戶做推薦,給相似的用戶推薦商品,A和B相似,A購買了itema而B沒買,就可以吧itema推薦給B。如何計算A與B的相似性呢,每個用戶是否購買商品可以形成一個一維的0-1向量構成用戶向量,這樣就能計算用戶之間的相似性。
- item-based協同過濾:基於商品做推薦,將相似的物品推薦給用戶,比如itema和itemb相似,用戶買了itema就可以給其推薦itemb;
在實際情況中,商品數量巨大,而每個用戶實際購買的商品只佔總商品極小一部分,從而造成用戶向量稀疏,計算量大,而且當商品增加時需要再次進行用戶相似度的計算,而user-based的方法可以預先進行商品相似度的計算,再放到線上使用。
解決痛點
傳統的基於矩陣分解的模型,主要用用戶向量和物品向量的內積(對應位置乘積求和)來衡量某用戶喜歡某物品的可能性y^ui:
y^ui=f(u,i∣pu,qi)=puTqi=k=1∑Kpukqik
其中K是用戶/物品向量的維度,即每個維度乘積後的等權線性組合。該種判定方法存在很大的侷限性。
如上圖所示,user-item的矩陣如(a)所示,可以得到物品和用戶向量(因爲這是協同過濾,可以由交互矩陣直接得到兩類向量),對於一個新向量U4,按道理來說他應該離U1最近U3其次U2最遠(真實近似度可以用Jaccard來計算,即交集數除以並集數),但是在內積或者餘弦相似度下,無法找到一個滿足“離U1最近U3其次U2最遠”的位置,這就是侷限性所在。
當然解決的該問題可以通過擴大用戶向量/物品向量的維度K來解決,但是K太大會降低模型的泛化能力。NCF通過DNN的方式來學習到潛在向量的之間的任意函數關係。
矩陣分解是一種將矩陣分解爲其組成部分的方式,可以像圖中那樣直接抽取行向量列向量,也可以使用類似於SVD分解這些方法
建模背景
NCF主要是對隱式反饋進行建模:
- 顯式反饋(explicit feedback):用戶對物品反映直接喜好信息,比如電影評分等等
- 隱式反饋(implicit feedback): 用戶間接的反映對物品的喜好,比如搜索歷史、瀏覽歷史、購買記錄等等
在真實場景中,顯示反饋比較少,大多都是隱式反饋,所以NCF模型主要是對隱式反饋進行建模。(個人理解是去預測用戶是否會對某個物品採取action,這個action可以是搜索、購買或者瀏覽等)。
通用框架
NCF主要來學習隱式交互數據,用M和N分別表示用戶數和商品數,定義user-item交互矩陣Y∈RM×N:
yui={1,0, if interaction ( user u, item i) is observed otherwise
爲1表示有交互,爲0表示其他。
如圖所示NCF的通用框架其實就是embedding後的user和item向量進入DNN模型中得到結果。
NCF的預測模型表達式可以寫成:
y^ui=f(PTvuU,QTviI∣P,Q,Θf)
其中:
- P∈RM×K and Q∈RN×K:分別表示用戶和item的潛在向量,即embedding向量
- Θf:表示交叉函數f的參數
- f表示交叉函數,在這裏f是一個多層神經網絡
所以上式又能寫成:
f(PTvuU,QTviI)=ϕout(ϕX(…ϕ2(ϕ1(PTvuU,QTviI))…))
其中:
- ϕout:表示輸出層的映射函數
- ϕx:表示DNN網絡中第x層的映射函數(這個映射函數可以是激活函數,也可以是內積運算)
該圖顯示的爲NCF的通用框架,其中Neutral CF layer的不同會產生不同的模型,比如下面將要提到的GMF和MLP。
NCF學習
NCFN採用的是point-wise loss學習,即預測函數和label之間的損失,在NCF的場景中label是0/1的二進制結果,所以目標函數可以用似然函數表示,如下:
p(Y,Y−∣P,Q,Θf)=(u,i)∈Y∏y^ui(u,j)∈Y−∏(1−y^uj)
戴帽子的y表示模型預測值,當正樣本本預測爲1負樣本被預測爲0時,該似然函數是最大的。
按照邏輯迴歸損失函數的哪一套,將損失函數寫成交叉熵的形式,即爲NCF的目標函數。
L=−(u,i)∈Y∑logy^ui−(u,j)∈Y−∑log(1−y^uj)=−(u,i)∈Y∪Y−∑yuilogy^ui+(1−yui)log(1−y^ui)
Generalized Matrix Factorization (GMF)廣義矩陣分解
該部分主要說明MF是NCF的一個特例。
當DNN只有一層,且該層的映射函數爲內積,並且輸出部分的映射函數爲恆等變換時,NCF就退化成了一個MF模型:
DNN部分:
ϕ1(pu,qi)=pu⊙qi
output部分:
y^ui=aout(hT(pu⊙qi))
當aout爲sigmoid函數時,通過交叉熵損失函數進行學習,這個特殊的MF模型更具有表現裏,這裏稱其爲GMF。
Multi-Layer Perceptron(MLP) 多層感知機
如果Neural CF layer部分是個DNN模型,那麼NCF會變成一個MLP模型,模型結構如下所示:
z1ϕ2(z1)…y^L(zL−1)y^ui=ϕ1(pu,qi)=[puqi]=a2(W2Tz1+b2)=aL(WLTzL−1+bL)=σ(hTϕL(zL−1))
其中:
- Wx,bx,ax分別爲第DNN第x層的權重、偏置項和激活函數
- 在第一層中,將user向量和item向量進行了拼接
GMF與MLP的融合
從上面可以看到NCF可以退化爲一個GMF和一個MLP,其中GMF考慮到了user和item向量的線性交互,而MLP考慮到了這兩者向量的非線性交互。這一部分考慮將兩種模型進行融合,來學習到更強的表達能力。
一種做法是讓GMF部分和MLP部分共享了Embedding 層,然後這兩個部分處理後的結果進行組合後進行輸出,以單層MLP爲例,公式爲:
y^ui=σ(hTa(pu⊙qi+W[puqi]+b))
但是在真實場景中,GMF部分與MLP部分Embedding向量的維度可能不同,所以需要進行預訓練,這裏分別對兩個部分進行Embedding,輸入到對應的部分,並將這兩部分最終的輸出進行連接,公式如下:
ϕGMFϕMLPy^ui=puG⊙qiG=aL(WLT(aL−1(…a2(W2T[puMqiM]+b2)…))+bL)=σ(hT[ϕGMFϕMLP])
其中p和q的上標表示他們屬於GFM還是MLP的embedding向量。
GMF和MLP兩部分佔的權重需要根據具體場景進行trade-off。