NCF(Neural Collaborative Filtering)——協同過濾與神經網絡的結合

Neural Collaborative Filtering paper

關於協同過濾

協同過濾簡而言之就是物以類聚人以羣分,在真實場景中,通常會獲得一張用戶物品交互表,其實就是一個矩陣M,M[i][j]=1M[i][j]=1則表示用戶ii購買了物品jjM[i][j]=0M[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\hat{\boldsymbol{y}}_{u i}

y^ui=f(u,ipu,qi)=puTqi=k=1Kpukqik\hat{y}_{u i}=f\left(u, i | \mathbf{p}_{u}, \mathbf{q}_{i}\right)=\mathbf{p}_{u}^{T} \mathbf{q}_{i}=\sum_{k=1}^{K} p_{u k} q_{i k}
其中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交互矩陣YRM×N\mathbf{Y} \in \mathbb{R}^{M \times N}

yui={1, if interaction ( user u, item i) is observed 0, otherwise y_{u i}=\left\{\begin{array}{ll}1, & \text { if interaction }(\text { user } u, \text { item } i) \text { is observed } \\ 0, & \text { otherwise }\end{array}\right.
爲1表示有交互,爲0表示其他。
在這裏插入圖片描述
如圖所示NCF的通用框架其實就是embedding後的user和item向量進入DNN模型中得到結果。
NCF的預測模型表達式可以寫成:
y^ui=f(PTvuU,QTviIP,Q,Θf)\hat{y}_{u i}=f\left(\mathbf{P}^{T} \mathbf{v}_{u}^{U}, \mathbf{Q}^{T} \mathbf{v}_{i}^{I} | \mathbf{P}, \mathbf{Q}, \Theta_{f}\right)
其中:

  • PRM×K\mathbf{P} \in \mathbb{R}^{M \times K} and QRN×K\mathbf{Q} \in \mathbb{R}^{N \times K}:分別表示用戶和item的潛在向量,即embedding向量
  • Θf\Theta_{f}:表示交叉函數ff的參數
  • ff表示交叉函數,在這裏ff是一個多層神經網絡

所以上式又能寫成:
f(PTvuU,QTviI)=ϕout(ϕX(ϕ2(ϕ1(PTvuU,QTviI))))f\left(\mathbf{P}^{T} \mathbf{v}_{u}^{U}, \mathbf{Q}^{T} \mathbf{v}_{i}^{I}\right)=\phi_{\text {out}}\left(\phi_{X}\left(\ldots \phi_{2}\left(\phi_{1}\left(\mathbf{P}^{T} \mathbf{v}_{u}^{U}, \mathbf{Q}^{T} \mathbf{v}_{i}^{I}\right)\right) \ldots\right)\right)

其中:

  • ϕout\phi_{o u t}:表示輸出層的映射函數
  • ϕx\phi_{x}:表示DNN網絡中第xx層的映射函數(這個映射函數可以是激活函數,也可以是內積運算)

該圖顯示的爲NCF的通用框架,其中Neutral CF layer的不同會產生不同的模型,比如下面將要提到的GMF和MLP。

NCF學習

NCFN採用的是point-wise loss學習,即預測函數和label之間的損失,在NCF的場景中label是0/1的二進制結果,所以目標函數可以用似然函數表示,如下:

p(Y,YP,Q,Θf)=(u,i)Yy^ui(u,j)Y(1y^uj)p\left(\mathcal{Y}, \mathcal{Y}^{-} | \mathbf{P}, \mathbf{Q}, \Theta_{f}\right)=\prod_{(u, i) \in \mathcal{Y}} \hat{y}_{u i} \prod_{(u, j) \in \mathcal{Y}^{-}}\left(1-\hat{y}_{u j}\right)

戴帽子的y表示模型預測值,當正樣本本預測爲1負樣本被預測爲0時,該似然函數是最大的。
按照邏輯迴歸損失函數的哪一套,將損失函數寫成交叉熵的形式,即爲NCF的目標函數。
L=(u,i)Ylogy^ui(u,j)Ylog(1y^uj)=(u,i)YYyuilogy^ui+(1yui)log(1y^ui)\begin{aligned} L &=-\sum_{(u, i) \in \mathcal{Y}} \log \hat{y}_{u i}-\sum_{(u, j) \in \mathcal{Y}^{-}} \log \left(1-\hat{y}_{u j}\right) \\ &=-\sum_{(u, i) \in \mathcal{Y} \cup \mathcal{Y}^{-}} y_{u i} \log \hat{y}_{u i}+\left(1-y_{u i}\right) \log \left(1-\hat{y}_{u i}\right) \end{aligned}

Generalized Matrix Factorization (GMF)廣義矩陣分解

該部分主要說明MF是NCF的一個特例。

當DNN只有一層,且該層的映射函數爲內積,並且輸出部分的映射函數爲恆等變換時,NCF就退化成了一個MF模型:
DNN部分:
ϕ1(pu,qi)=puqi\phi_{1}\left(\mathbf{p}_{u}, \mathbf{q}_{i}\right)=\mathbf{p}_{u} \odot \mathbf{q}_{i}
output部分:
y^ui=aout(hT(puqi))\hat{y}_{u i}=a_{o u t}\left(\mathbf{h}^{T}\left(\mathbf{p}_{u} \odot \mathbf{q}_{i}\right)\right)

aouta_{\text {out}}爲sigmoid函數時,通過交叉熵損失函數進行學習,這個特殊的MF模型更具有表現裏,這裏稱其爲GMF。

Multi-Layer Perceptron(MLP) 多層感知機

如果Neural CF layer部分是個DNN模型,那麼NCF會變成一個MLP模型,模型結構如下所示:
z1=ϕ1(pu,qi)=[puqi]ϕ2(z1)=a2(W2Tz1+b2)y^L(zL1)=aL(WLTzL1+bL)y^ui=σ(hTϕL(zL1))\begin{aligned} \mathbf{z}_{1} &=\phi_{1}\left(\mathbf{p}_{u}, \mathbf{q}_{i}\right)=\left[\begin{array}{l} \mathbf{p}_{u} \\ \mathbf{q}_{i} \end{array}\right] \\ \phi_{2}\left(\mathbf{z}_{1}\right) &=a_{2}\left(\mathbf{W}_{2}^{T} \mathbf{z}_{1}+\mathbf{b}_{2}\right) \\ \ldots & \\ \hat{y}_{L}\left(\mathbf{z}_{L-1}\right) &=a_{L}\left(\mathbf{W}_{L}^{T} \mathbf{z}_{L-1}+\mathbf{b}_{L}\right) \\ \hat{y}_{u i} &=\sigma\left(\mathbf{h}^{T} \phi_{L}\left(\mathbf{z}_{L-1}\right)\right) \end{aligned}
其中:

  • Wx,bx,axW_x,b_x,a_x分別爲第DNN第xx層的權重、偏置項和激活函數
  • 在第一層中,將user向量和item向量進行了拼接
GMF與MLP的融合

從上面可以看到NCF可以退化爲一個GMF和一個MLP,其中GMF考慮到了user和item向量的線性交互,而MLP考慮到了這兩者向量的非線性交互。這一部分考慮將兩種模型進行融合,來學習到更強的表達能力。
一種做法是讓GMF部分和MLP部分共享了Embedding 層,然後這兩個部分處理後的結果進行組合後進行輸出,以單層MLP爲例,公式爲:
y^ui=σ(hTa(puqi+W[puqi]+b))\hat{y}_{u i}=\sigma\left(\mathbf{h}^{T} a\left(\mathbf{p}_{u} \odot \mathbf{q}_{i}+\mathbf{W}\left[\begin{array}{l} \mathbf{p}_{u} \\ \mathbf{q}_{i} \end{array}\right]+\mathbf{b}\right)\right)

在這裏插入圖片描述
但是在真實場景中,GMF部分與MLP部分Embedding向量的維度可能不同,所以需要進行預訓練,這裏分別對兩個部分進行Embedding,輸入到對應的部分,並將這兩部分最終的輸出進行連接,公式如下:

ϕGMF=puGqiGϕMLP=aL(WLT(aL1(a2(W2T[puMqiM]+b2)))+bL)y^ui=σ(hT[ϕGMFϕMLP])\begin{aligned} \phi^{G M F} &=\mathbf{p}_{u}^{G} \odot \mathbf{q}_{i}^{G} \\ \phi^{M L P} &=a_{L}\left(\mathbf{W}_{L}^{T}\left(a_{L-1}\left(\ldots a_{2}\left(\mathbf{W}_{2}^{T}\left[\begin{array}{c} \mathbf{p}_{u}^{M} \\ \mathbf{q}_{i}^{M} \end{array}\right]+\mathbf{b}_{2}\right) \ldots\right)\right)+\mathbf{b}_{L}\right) \\ \hat{y}_{u i} &=\sigma\left(\mathbf{h}^{T}\left[\begin{array}{c} \phi^{G M F} \\ \phi^{M L P} \end{array}\right]\right) \end{aligned}
其中p和q的上標表示他們屬於GFM還是MLP的embedding向量。

GMF和MLP兩部分佔的權重需要根據具體場景進行trade-off。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章