1. 程式人生 > 其它 >Neural Collaborative Filtering

Neural Collaborative Filtering

目錄

He X., Liao L., Zhang H., Nie L., Hu X. and Chua T. Neural collaborative filtering. In International World Wide Web Conference (WWW), 2017.

對使用者和物品隱變數分別建模, 然後協同過濾.

主要內容

\(Y \in \mathbb{R}^{M \times N}\)表示 user-item 的互動矩陣, 其中若二者存在互動則 \(y_{ui} = 1\)

, 否則 \(y_{ui} = 0\). 需要注意的是, \(y_{ui} = 0\) 並不能代表使用者 \(u\) 對於物品 \(i\) 不感興趣, 有可能只是單純沒有機會遇到而已. 本文就是希望預測這些'缺失'的部分:

\[\hat{y}_{ui}. \]

出發點

傳統的基於矩陣分解的協同過濾可以理解為

\[\hat{y}_{ui} = f(u, i | \bm{p}_u, \bm{q}_i) = \bm{p}_u^T \bm{q}_i. \]

其中\(\bm{p}_u, \bm{q}_i \in \mathbb{R}^K\)分別表述使用者 \(u\) 和物品 \(i\) 的隱變數.

倘若我們以 Jaccard coeffcient 來表述使用者 \(i\), \(j\) 間的相似度

\[s_{ij} = \frac{|R_i \cap R_j |}{|R_i \cup R_j|}, \]

其中 \(R_u = \{j: y_{uj} = 1\}\).

那麼自然的, 我會希望 \(\bm{p}_i, \bm{p}_j\)的內積儘可能滿足這一相似度, 即

\[\bm{p}_i^T \bm{p}_j = s_{ij}. \]

現在, 讓我們以上圖為例來說明這一方法的侷限性. 此時有

\[s_{23}(0.66) > s_{12}(0.5) > s_{13}(0.4), \]

故隱變數\(\bm{p}_1, \bm{p}_2, \bm{p}_3 \in \mathbb{R}^2\)

(b) 方式排列, 此時我們再考慮 \(u_4\) 的隱變數. 我們可以發現, 找不到合適的 \(\bm{p}_4\) 服從

\[s_{41}(0.6) > s_{43}(0.4) > s_{42}(0.2). \]

這說明了基於矩陣分解這種簡單的模式過於簡單了.

Neural CF

如上圖所示, Neural CF 流程如下:

  1. 對於使用者 \(u\) 和物品 \(i\), 分別獲取各自 embedding \(\bm{p}_u, \bm{q}_i\);
  2. 連線二者:
\[\bm{z}_1 = \phi(\bm{p}_u, \bm{q}_i) = \left [ \begin{array}{c} \bm{p}_u \\ \bm{q}_i \end{array} \right]; \]
  1. 通過MLP提取特徵
\[\bm{z}_2 = \phi_2(\bm{z}_1) = a_2 (W_2^T \bm{z}_1 + \bm{b}_2) \\ \cdots \\ \bm{z}_L = \phi_L(\bm{z}_{L-1}) = a_L (W_L^T \bm{z}_{L-1} + \bm{b}_L); \]
  1. 邏輯斯蒂迴歸:
\[\hat{y}_{ui} = \sigma(h^T \bm{z}_L). \]

GMF and MLP

為了進一步用上隱變數的交叉資訊, 作者融合了左端的 GMF:

  1. 對於使用者 \(u\) 和物品 \(i\), 分別獲取各自 embedding \(\bm{p}_u, \bm{q}_i\) (注意, 該embedding 和 MLP的是獨立的);
  2. 交叉二者:
\[\bm{z}^{GMF} = \phi_1(\bm{p}_u, \bm{q}_i) = \bm{p}_u \odot \bm{q}_i, \]

其中\(\odot\)表逐元素相乘;

再結合右端 MLP 所提取的特徵 \(\bm{z}^{MLP}\), 最後預測模型為

\[\hat{y}_{ui} = \sigma(\bm{h}^T \left [ \begin{array}{c} \bm{z}^{GMF} \\ \bm{z}^{MLP} \end{array} \right] ). \]

其它細節

  1. 損失採用的是BCE:
\[L = -\sum_{(u, i) \in \mathcal{Y} \cup \mathcal{Y}^{-}} y_{ui} \log \hat{y}_{ui} (1 - y_{ui}) \log (1 - \hat{y}_{ui}), \]

其中 \(\mathcal{Y}^{-}\)表示未觀測到的互動 \(y_{ui} = 0\), 每次迭代取樣部分得到.

可見, 充分的負樣本是必要的.

  1. 先對 GMF 和 MLP 部分獨立預訓練, 然後再融合.

  2. MLP 中啟用函式選用 ReLU 而非 Sigmoid, Tanh.

  3. 預訓練採用 Adam, 然後正式訓練採用不帶momentum的SGD.

程式碼

原文程式碼

PyTorch