2017-深度協同過濾
代碼地址:pytorch版
https://github.com/hexiangnan/neural_collaborative_filtering
作者何向南
使用神經結構替換矩陣分解的內積
摘要
近幾年來,深度學習在推薦系統領域應用不多,本文力爭使用深度學習解決推薦系統領域的關鍵問題:隱式反饋的協同過濾
儘管最近也有一些工作將深度學習應用於推薦領域,但都主要集中在對輔助信息建模上,比如物品的文本描述、音樂的聲學特徵等等。
但對於協同過濾中的關鍵點,用戶和物品的交互建模上仍然是矩陣分解MF,然後使用用戶和物品的隱特徵做內積。
本文提出了一種通用框架,NCF(Neural network- based Collaborative Filtering),基於神經網絡的協同過濾,它把內積部分替換成了可以擬合任意函數的神經網絡結構。
NCF是一個通用框架,可以表達並泛化到矩陣分解。爲了提高NCF的非線性,本文提出使用MLP學習用戶物品交互函數。最後在兩個實際數據集上驗證了NCF遠優於sota方法。經驗表明,使用深度神經網絡能提供更好的推薦效果。
深度協同過濾
先說明如何使用強調隱式反饋二值性的概率模型學習NCF,再闡明NCF可以表達MF並泛化到MF。爲了探索用於協同過濾的DNN結構,本文提出了一個NCF實例,使用MLP學習用戶物品交互函數。
最後,本文提出一個在NCF框架下融合MF和MLP的新的深度矩陣分解模型,既有MF的線性優勢,又利用MLP的非線性建模用戶物品的隱特徵。
通用框架
爲了實現一個全神經網絡的協同過濾,引入多層表示來建模用戶物品交互,上一層的輸出是下一層的輸入。如下圖所示,
- 最底層的輸入input layer由兩個描述用戶和物品的特徵向量和組成,它們可以被定製成各種各樣的用戶物品模型,比如上下文感知,基於內容,基於近鄰等等
鑑於本文集中於純粹的協同過濾場景,只使用用戶身份和物品獨熱編碼的二值稀疏向量作爲輸入特徵。使用通用特徵表示作爲輸入的另一個好處是使我們的方法可以通過引入內容特徵表示用戶和物品來輕易解決冷啓動問題。 - 輸入層之上是embedding layer,這是一個全連接層,將稀疏表示映射爲稠密向量。得到的用戶/物品embedding可以看做是隱因子模型中的隱向量。用戶和物品的embedding隨後餵給一個多層神經網絡結構,本文稱之爲深度協同過濾層,將隱向量映射到預測分數。
- Neural CF layers的每一層都可以定製化爲挖掘用戶物品交互的某種隱式結構。最後一層隱層X的維度決定了模型的表達能力。
- 最後是輸出層output layer,預測分值,訓練也是通過最小化和目標值之間的pointwise loss進行的。
我們注意到訓練本文模型的另外一種方式是pairwise學習,比如使用貝葉斯個性化排序BPR和margin-based loss。由於本文的重點是神經網絡建模部分,我們把pairwise learning的擴展部分作爲未來工作。
現在NCF的預測模型可以表達爲:,其中和,分別表示用戶和物品的隱因子矩陣,表示交互函數f的模型參數。
函數f是一個多層神經網絡,可以描述爲,其中,和分別表示輸出層和第x層深度協同過濾層,Neural CF共有X層。
學習NCF
現有的pointwise方法大部分都是使用平方損失迴歸學習模型參數:,其中y表示Y中觀測到的行爲,表示負樣本,可以是所有沒觀測到的行爲也是未觀測行爲的採樣,是一個超參數,表示訓練實例(u,i)的權重。然後平方損失的前提是觀測數據是服從高斯分佈的,本文認爲這一點可能並不符合隱式反饋數據,因爲隱式反饋的目標值是二分值0或1,表示u是否和i有交互。接下來,我們會提出一種學習pointwise NCF的概率方法,重點關注隱式反饋的二值屬性。
鑑於隱式反饋的一元本質,可以把的值看做是標籤,1表示物品i和用戶u相關,0則無關。預測分數表示物品i和用戶u的相關度。爲了讓NCF有這樣的概率解釋,需要限制輸出的範圍在[0,1]內,這一點使用概率函數(如Logistic函數或Probit函數)作爲輸出層的激活函數非常容易做到。
由此,得到似然函數:
取負的對數似然,得到:
這也是最小化NCF的目標函數,可以通過SGD優化。這個目標函數和二值交叉熵損失是一樣的,也就是log loss。
爲了給NCF找到概率解法,本文把隱式反饋推薦問題定義爲二分類問題。由於用於分類的log loss幾乎從未被用於推薦場景,本文探索了這種方法並證明了其有效性。
對於負樣本,統一在每個迭代中從未觀測行爲中採樣得到,採樣率和觀測行爲數目有關。但非統一採樣策略(例如物品流行度偏差)也許可以進一步提高效果,這也作爲未來工作探索了。
泛化矩陣分解Generalized Matrix Factorization(GMF)
本節解釋MF是如何作爲NCF框架的特例的。MF是推薦領域最流行的模型,關於MF的研究非常多,NCF能復現它也就復現了一大波分解模型。
由於輸入層是one-hot編碼,embedding層得到的向量可以視爲用戶或物品的隱向量。用戶隱向量改寫爲,物品隱向量q_i改寫爲。
定義第一層Neural CF層的映射函數爲:,其中表示向量的元素積,即點積。
再把向量映射到輸出層:,其中,和h分別表示激活函數和輸出層的邊權重。顯然,如果設置成恆等函數,h設置成全1的向量,這就是一個MF模型了。
在NCF框架下,MF可以輕易泛化和擴展。例如,如果允許h從沒有統一限制的數據中學習,就會得到一個能賦予隱向量維度不同權重的MF模型變種。而且如果使用非線性函數作爲,就可以把MF泛化到非線性場景,比線性MF更有表達能力。本文實現了一個這樣的NCF框架下泛化版本的MF模型,其中使用sigmoid函數,使用log loss從數據中學習函數h,命名爲GMF(Generalized Matrix Factorization)
多層感知機MLP(Multi-Layer Perceptron)
由於NCF使用兩個通路建模用戶和物品,最直覺的方法就是把這兩路特徵拼接起來。這種設計方式在多模型深度學習應用非常廣泛。然而,簡單地向量拼接並不能表示用戶和物品的隱特徵之間的交互,不足以對協同效果建模。爲了解決這個問題,本文提出在拼接向量的基礎上增加隱層,使用標準MLP學習用戶和物品隱特徵之間的交互。這樣一來,模型就極具靈活性以及和之間的非線性,不像GMF那樣只使用固定的元素積。
更精確地說,NCF框架下的MLP模型被定義爲:
其中,,和分別表示第x層的權重矩陣,偏置矩陣,激活函數。MLP的激活函數可以隨意挑選,sigmoid,tanh,ReLU或者其他都行。
關於激活函數:
- 1.sigmoid函數會限制每個神經元的值在(0,1)範圍,這一點可能會限制模型性能,而且會出現梯度飽和,即當神經元輸出接近0或1的時候神經元會停止學習
- 2.tanh通常是更好的選擇,但也只是某種程度上的緩解sigmoid的問題,因爲tanh可以看做是sigmoid的rescaled版本,
- 3.本文選擇了ReLU,ReLU更具有生物學上的可能性(???),不會梯度飽和,而且它更支持稀疏激活函數,更適合稀疏數據且不易過擬合。據本文的經驗判斷ReLU比tanh的性能稍好,比sigmoid有明顯優勢
網絡結構的設計上遵循了單塔模式,底層最寬,逐層減少神經元個數。上層隱藏單元數較小有利於學習數據中更抽象的特徵。本文按照經驗採用的是逐層減半的方式。整體網絡結構如上圖2所示
GMF和MLP混合
本文已經提出了NCF的兩種實例:
- GMF使用線性核建模交互的隱特徵
- MLP使用非線性核學習交互函數
如何才能在NCF框架下融合二者使其互相加強呢?直觀的方法是讓GMF和MLP共享同一個embedding層,然後聯合交互函數的輸出。這種方式和Neural Tensor Network(NTN)的方式很像。
聯合GMF和一層MLP的模型可以看做是:
但,GMF和MLP共享embedding可能會限制混合模型的性能,例如,這樣以來,GMF和MLP必須使用相同維度的embeddings,對於不同的數據集這兩種模型對應的最優向量維度各不相同,這種方案可能無法獲得最優組合。
爲了讓混合模型更具靈活性,我們允許GMF和MLP分別學習embedding,僅在最後的隱層中聯合兩個模型。模型結構如下圖所示:
公式表示如下:
其中,和表示GMF和MLP部分的用戶embedding,和則是物品embedding。如前文所述,使用ReLU作爲MLP的激活函數。
這個模型聯合了MF的線性核DNN的非線性共同建模用戶物品隱結構,稱之爲NeuMF(Neural Matrix Factorization)。
預訓練
由於NeuMF的目標函數是非凸的,基於梯度的優化方法只能找到局部最優解。本文建議使用GMF和MLP的預訓練模型初始化NeuMF。
先隨機初始化GMF和MLP並訓練到收斂。再用這些模型參數作爲NeuMF的對應部分的初始化。唯一需要調整的是輸出層,這兩個模型的拼接權重如下:
,其中和分別表示GMF和MLP的預訓練的h向量,是決定兩個模型比重的超參數。
使用Adam從頭開始訓練GMF和MLP模型,實驗證明,在這兩個模型上,Adam方法比SGD收斂更快,節省學習率調試。但把預訓練模型喂入NeuMF之後,本文采用SGD優化而不是Adam,因爲Adam需要保存用於參數更新的動量信息,預訓練模型初始化後不必保存動量信息。