基於深度學習的推薦(一):神經協同過濾NCF

寫在前面

這篇文章發表在《World Wide Web》(2017)上,論文鏈接:https://arxiv.org/pdf/1708.05031.pdf
文章提出,神經網絡已經被證明可以近似模擬任意連續函數[1],並且深度學習在很多領域的成功應用也證明了其有效性。而一些近期的研究也將深度學習應用到了推薦中,然而很多工作都是將深度學習作爲輔助工作,比如提取文本和圖像的特徵,而對於推薦的關鍵特徵處理,user特徵和item特徵的交互,仍使用MF的思想。
作者利用深度學習來對user和item特徵進行建模,使模型具有非線性表達能力。具體來說使用多層感知機來學習user-item交互函數。

1. NCF 原理

在這裏插入圖片描述
這是論文中給出的NCF的通用框架,試驗中使用one-hot編碼進行映射爲user和item latent vector,然後輸入到MLP中進行訓練。這個user和item可以泛化地理解,比如使用基於內容的方式,就可以去解決冷啓動問題。

個人拙見,論文中的NCF通用模型並不能實例化成論文中說的GMF,因爲通用模型中講了是利用多層感知機,而GMF顯然和這沒什麼關係。並且GMF那部分只證明了MF是GMF的特例,而不能證明GMF是NCF的特例。

1.1 GMF模型

在這裏插入圖片描述
從論文中的解釋看,user和item都通過one-hot編碼得到稀疏向量,然後通過一個embedding層映射爲user vector和item vector。這樣就獲得了user和item的隱向量,就可以使用哈達馬積(Element-wise Produce)來交互user和item向量了。不過後面多了一個全連接層:
在這裏插入圖片描述
在這裏插入圖片描述

我們可以發現,LFM模型的user和item隱向量是隨機初始化然後訓練出來,而這裏是使用one-hot稀疏向量做embedding映射。

1.2 MLP

在這裏插入圖片描述

這裏同樣先通過映射獲得user和item vector,但要注意,之前的MF vector和MLP vector雖然同爲映射的向量,但絕對不一樣,因爲模型對隱向量的維度等要求是不一樣的。

然後將user和item vector輸入到MLP中進行訓練,MLP大家都知道,重點是如何處理user和item vector,作者是直接將兩個向量串聯起來。文中指出這是借鑑了多模態中的做法,我之前做過點多模態的研究,實際上,多模態中這是最常見的一種做法,還有很多其他方式,比如簡單的串聯後加個正則,或者找個建模能力更強的神經網絡模型(可能需要自己設計)。作者在當時採用的這種直接串聯的方式雖然簡單,但是可以說是個“劃時代”的做法。

這樣串聯起來後,輸入到MLP中,可以學習出user和item之間的非線性交互函數。具體MLP過程是這麼做的:
在這裏插入圖片描述

1.3 NeuMF

在這裏插入圖片描述
上圖所示的框架被稱爲“Neural matrix factorization model”,簡稱爲NeuMF。但實際上,提起NCF可能我們想到的就是這個模型,有時候和別人交流,說的NCF就是指這個模型。

首先想到的是將兩個模型進行結果融合,就是將兩個模型的“輸出”結果相加後套個激活函數,然後加一層感知機獲得最終結果:
在這裏插入圖片描述
個人拙見,即使進行結果融合也應該將MF的部分放在a(wx+b)的外部,最後一起加一層感知機。畢竟wx+b加上激活函數纔是MLP倒數第二層的輸出。不知道爲什麼要寫在一個括號裏。可能是實驗效果更好?

其實無所謂,這個公式已經被作者鄙視後拋棄。因爲這種共享最後一層嵌入層的方式可能限制模型的表達性能。看公式就知道,嵌入層的輸入要求pq和wx+b具有相同的維度,才能進行向量相加。

之前講過,不能強行要求GMF和MLP在輸入時的隱向量維度一致,畢竟是兩個不同的模型,所以分別做embedding。現在對兩個模型的“輸出”也不能做這種要求,因此作者想了個更好的辦法:將兩個模型的倒數第二層特徵串聯爲一個特徵,然後加層感知機:
在這裏插入圖片描述
實際上,h是個權重向量,相當於對兩個模型倒數第二層的結果進行加權。我們知道,集成模型中一般對最後一層的輸出結果進行加權,現在換成倒數第二層,就變成了“特徵”融合,最後的performance肯定也是大不相同的。

2. 幾個重點

2.1 顯性反饋和隱性反饋

NCF專注於專注於隱性反饋,通過參考觀看視頻,購買產品和點擊項目等間接反映用戶偏好的行爲。無論你是評過分,收藏過,看過有關內容,都可以作爲隱性反饋。與顯性反饋(評分和評級)不同,隱性反饋可以更容易收集。

對於有評分這樣的顯性反饋,有評分就用,沒有評分的數據也要處理,一般就是記分值爲0。而對於隱性反饋,爲了處理沒有觀察到的數據,可以將所有無交互的條目視爲負反饋,也可以從中抽樣作爲負反饋實例,NCF中也記爲0。

令 ? 和 ? 分別表示用戶和項目的數量,通過從用戶的隱性反饋學習user-item交互矩陣:
在這裏插入圖片描述
這裏y爲 1 表示用戶 ? 和項目 ? 存在交互記錄;然而這並不意味着 ? 真的喜歡 ?。同樣的,值 0 也不是表明 ? 不喜歡 ?,也有可能是這個用戶根本不知道有這個項目。這對隱性反饋的學習提出了挑戰,因爲它提供了關於用戶偏好的噪聲信號。雖然觀察到的條目至少反映了用戶對項目的興趣,但是未查看的條目可能只是丟失數據,並且這其中存在自然稀疏的負反饋[2]。顯然隱性反饋不能反映用戶的滿意度,還是顯性的評分更好用。

2.2 逐點損失和成對損失

文獻中常用的有兩種函數:逐點損失(pointwise loss)和成對損失(pairwise loss)。逐點損失一般通過最小化預測值y和目標值y之間的平方誤差,使用迴歸的框架來估計參數。而成對損失的思想是觀察到的條目應該比未觀察到的條目的評分更高,推薦看一看BPR(Bayesian personalized ranking)更進一步瞭解pairwise loss。

考慮到隱性反饋的一類性質,我們可以將 ??? 的值作爲一個標籤————1表示項目 ? 和用戶 ? 相關,否則爲0。這樣一來預測分數 ?ˆ?? 就代表了項目 ? 和用戶 ? 相關的可能性大小。爲了賦予NCF這樣的概率解釋,我們需要將網絡輸出限制到[0,1]的範圍內,通過使用概率函數(e.g. 邏輯函數sigmoid或者probit函數)作爲激活函數作用在輸出層 ??? ,我們可以很容易地實現數據壓縮。經過以上設置後,我們這樣定義似然函數[2]:
在這裏插入圖片描述

上面的這段解釋實在是經典。這句話對理解邏輯迴歸中的損失函數也有幫助。《傳統推薦算法(五) FFM模型(1) 邏輯迴歸損失函數》中我們講了獲得似然函數後如何推導最小化損失函數,這裏不再多說,極小化損失函數的表達式是:
[外鏈圖片轉存失敗(img-DJfidqAW-1565444571138)(https://raw.githubusercontent.com/wyl6/wyl6.github.io/master/imgs_for_blogs/20190810192708.png)]

2.2 正例和負例的選擇

NCF使用逐點損失函數,爲了處理沒有觀察到的數據,要麼將所有未觀察到的條目視作負反饋,要麼從沒有觀察到條目中抽樣作爲負反饋實例。而正例就是那些有記錄的交互。

2.3 訓練集和測試集的劃分

論文使用留一機制,就是將用戶最近的那次交互作爲測試集,當然交互的物品基本不會相同,比如用戶1是25,用戶2是133。

測試的時候,並不排列所有的item,而是抽樣100個做top k(比如10)推薦,只要測試的物品在top 10裏就算推薦成功。當然了,爲了防止隨機抽樣沒有抽中測試的那個物品(肯定推薦不到),論文從無交互的物品中抽樣99個,加上測試的物品,湊成100個,做top10推薦。然後計算HR和NDCG指標的值做評估。

2.4 預訓練機制

首先單獨使用GMF和MLP進行訓練,並獲得最後感知機層的權重和偏置項,然後將這些參數用來初始化NeuMF中GMF和MLP部分。當然,給了一個α\alpha控制兩個權重的貢獻。
[外鏈圖片轉存失敗(img-DDLIYN8w-1565444571139)(https://raw.githubusercontent.com/wyl6/wyl6.github.io/master/imgs_for_blogs/20190810201350.png)]

3. LFM和NCF的區別

3.1 概述

LFM常用的實現方式是基於矩陣分解技術,通過損失函數加正則的反向梯度下降來優化模型參數。求解出來的是用戶-隱類矩陣和物品-隱類矩陣,可以理解爲物品對各隱類的偏愛程度和物品對各隱類的歸屬程度。最後求出這兩個矩陣,然後就可以計算用戶對物品的評分。

NCF是通過神經網絡從數據中學習用戶和物品的交互關係,最後要訓練出一個模型。

3.2 相同點

核心思想都是模擬用戶和物品間的交互關係。
都可以使用梯度下降來求解參數。

3.3 不同點

3.3.1 建模思想

LFM通過隱特徵將用戶與物品聯繫起來,求解能最大似然聯繫用戶和物品的隱空間的特徵表達,而NCF使用NN來學習用戶和物品的交互函數,其中包括隱特徵的求解過程(one-hot到隱特徵的映射關係);

3.3.2 求解結果

LFM求解的是用戶-隱類矩陣和物品-隱類矩陣,而NCF求解得到的是一個模型;

3.3.3 泛化能力

lfm只能根據兩個矩陣,計算已出現的用戶和已出現但沒評分的物品的評分,只能填補原先用戶-物品矩陣的空白,ncf的模型是通用的,可以計算新用戶和新物品(這裏能實現的原因是ncf在輸入層有一個映射層,學得參數後可以獲得一個通用映射關係,可以映射新用戶或新物品到隱特徵空間,而lfm新用戶新物品沒法獲得隱特徵向量的表示形式)。

3.3.4 實現方法

lfm實現方式最廣的是矩陣分解(也是它的思想來源)加梯度下降。其中的優化過程,矩陣分解的優化可以使用梯度下降,也可以使用最小二乘法。而ncf實現過程論文給出了,神經網絡協同過濾用梯度下降。

3.3.5 學習能力

lfm只考慮了各隱類間的線性關係,隱類間一般都是非線性關係的尤其是在隱類數較少的時候;ncf結合一個推廣的矩陣分解GMF,考慮各隱類間的線性關係的同時,還使用MLP來學習用戶和物品間潛在特徵之間的非線性關係。非常靈活。

4. 大家一起找茬

4.1 user embedding & item embedding

像論文中所說的,用戶只有id信息時,通過id來進行映射是否有必要呢?這個id是人爲賦予,id只能幫我們記錄是哪個用戶,本身不含有任何信息,實際上,數組下標可以一一對應,已經可以幫助我們記錄是哪個用戶。

當然,論文中考慮了這點,並說明底部輸入層的兩個user和item向量,可以進行定製,用以支持廣泛的user和item的建模,比如上下文感知,基於內容等。

但是,只有id的情況下,和LFM的訓練類似,隱性向量隨機初始化已經足夠了。感興趣可以自己做下實驗。

4.2 泛化能力

正如之前所說,如果user和item只有id的情況下,這個模型泛華能力太弱。因爲id本身包含的信息太少,無論新來的是哪個用戶,id都是第k個,獲得的user latent vector都是同一個,item同理。

因此,如果只考慮user-item這樣的評分矩陣,NCF的泛華能力有待商榷(和LFM有一拼,至少還能embedding一個隱向量出來),但是考慮到論文所說的,兩個user和item向量,可以進行定製,比如user是一串文本來表示,那就有泛化能力。

5. keras手擼ncf

論文作者給了python2源碼:
https://github.com/hexiangnan/neural_collaborative_filtering

我的實驗環境:
keras: 2.6.4
python: 3.6.4
numpy: 1.14.0

可能版本不對,跑的時候有很多錯,我改了些錯並改成python3版本:
https://github.com/wyl6/Recommender-Systems-Samples/tree/master/RecSys%20And%20Deep%20Learning/DNN/ncf

引用

[1] Hornik, K., Stinchcombe, M., & White, H. (1989). Multilayer feedforward networks are universal approximators. Neural networks, 2(5), 359-366.
[2] https://www.cnblogs.com/HolyShine/p/6728999.html

公衆號

更多精彩內容請移步公衆號:推薦算法工程師

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