2016_ICLR-Session-based recommendations with recurrent neural networks閱讀筆記

基於序列的循環神經網絡推薦系統

session-based 的概念
session是服務器端用來記錄識別用戶的一種機制。典型的場景比如購物車,服務端爲特定的對象創建了特定的Session,用於標識這個對象,並且跟蹤用戶的瀏覽點擊行爲。這裏可以將其理解爲具有時序關係的一些記錄序列。
可以理解爲從進入某個app直到退出的全過程中,根據用戶的行爲變化所發生的推薦,此時session是從進入app到退出app的全過程;也可以理解爲根據用戶某段時間內的行爲序列發生的推薦,此時session不一定是從進入app到退出的全過程,比如airbnb的論文中,只要前後兩次的點擊不超過30min,都算作同一個session。

基於物品的協同過濾 指根據用戶對物品的行爲數據來計算物品與物品之間的相似度,爲用戶推薦喜歡的物品相似的物品,例如:如果一個用戶喜歡物品A的同時也喜歡物品B那麼就認爲物品A與物品B相似;

基於用戶的協同過濾 指通過物品對用戶的行爲數據來計算用戶與用戶的相似度,爲用戶推薦相似用戶喜歡的物品。協同過濾在能夠進行高質量推薦之前需要大量的歷史數據,面臨着冷啓動問題。

寫作動機

實時推薦系統常常面臨只能依靠短序列建模而不是長的用戶歷史數據的問題。
在實際中通常使用item-to-item推薦方法(建立item to item的相似度矩陣)來解決,比如當用戶在一個session中點擊了某一個物品時,基於相似度矩陣得到相似的物品推薦給用戶。這種方法簡單有效,並被廣泛應用,但是這種推薦方法只考慮了用戶的最後一次點擊,實際上忽略了過去的點擊(clicks)信息。
另一種方法是利用馬爾可夫決策過程(MDPs)進行推薦,
本文提出對整個序列建模可以提供更精準的推薦。其主要學習的是狀態轉移概率,即點擊了物品A之後,下一次點擊的物品是B的概率,並基於這個狀態轉移概率進行推薦。這樣的缺陷主要是隨着物品的增加,建模用戶所有的可能的點擊序列變得難以管控。
General Factorization Framework (GFF) 方法用事件(event)之和來建模會話(session),用item本身的特徵表達以及item作爲會話的一部分的表達的平均值作爲潛在表達(latent representation)。但是這種方法沒有考慮會話中的事件的順序信息。
本文提出的模型是基於RNN的方法來進行基於會話的推薦,我們可以稱之爲GRU4Rec模型。

模型介紹

模型結構如下:
在這裏插入圖片描述輸入: 依次輸入一個session的點擊序列x=[x1,x2...xr1,xr],1rnx=[x_1, x_2 ... x_{r-1}, x_r], 1\leq r \leq n
序列中的每一個 xi,xixx_i,x_i\in x 表示成獨熱編碼,隨後通過embedding層壓縮爲低維連續向量作爲 GRU 單元的輸入。
輸出: 預測每一個item被點擊的預測概率y=M(x),wherey=[y1,y2...ym]y=M(x),where y =[y_1, y_2...y_m],其中概率最大的yjy_j爲預測的下一個被點擊的item。
GRU層: RNN效果不佳,LSTM同準確度下速度更慢
Embedding層和 Feedforward層: 可選項
GRU層數: 層數爲1時效果最佳;會話跨越較短的時間框架;不需要多尺度建模。

將模型與RecSys任務融合

爲了提高模型訓練的效率,修改訓練策略使GRU適用於RecSys任務。

Trick1: Session parallel mini-batches

提出該trick的動機:
1)會話長度差異很大,例如session1session_1包含2個事件,而session2session_2可能包含100個事件;
2)捕捉會話隨時間的演變過程。
在這裏插入圖片描述
具體策略:

  • 將所有的會話排序(隨機排序或按照時間排序);
  • 前X個會話中,每個會話的第一個事件組成第一個輸入的Mini-batch1(X爲mini-batch的尺寸Batch-Size);
  • 前X個會話中,每個會話的第二個事件爲第一個輸入的Mini-batch的期望輸出;依此類推,第二個Mini-batch(輸入)則由第二個事件組成,(期望輸出)則由第三個事件組成;當某個會話結束時,將下一個可用會話放在其位置。由於Session之間是獨立的,需要重置相應的GRU中的隱藏狀態。

如圖所示,Session1的長度爲4,Session2的長度爲2,Session3的長度爲6,Session4的長度爲2,Session5的長度爲3。假設Batch-Size爲3,那麼我們首先用前三個Session進行訓練,不過當訓練到第三個物品時,Session2已經結束了,那麼我們便將Session4來接替上,不過這裏要注意將GRU中的狀態重新初始化。

Trick2: Sampling the output

提出該trick的動機:
1)item的數量通常很多(十萬甚至上百萬個);
2)訓練規模=事件數 * hidden layer層數 * 輸出維度(等於item總數),爲O(NEHNI)O(N_EHN_I)
3)item樣本和用戶行爲的變化很快,需要頻繁地訓練模型。

具體策略:

  • 對於輸入,期望的輸出是一個關於所有item的one-hot向量;
  • 計算期望的輸出(即desired items)的得分;
  • 基於受歡迎程度進行抽樣:某個事件沒有點擊更受歡迎的item,則說明該item很大可能是負反饋;
  • 使用同一mini-batch中的其他item作爲當前事件的負樣本。這是一種在實際上有效果的機遇受歡迎程度的採樣方法。

圖中i1i_1爲對應某輸入的正樣本,i5i_5i8i_8則爲負樣本。

Pairwise ranking loss function

動機:

  • 推薦系統的目的是對item進行排序 (ranking);
  • 單文檔法(pointwise ranking)和文檔對法(pairwise ranking)已被廣泛應用,而文檔列表 (listwise-ranking)的可擴展性差;
  • 文檔對法效果通常更好。

方法:

  • BPR(Adapt Bayesian Personalized Ranking):
    對比正樣本和每個負樣本的點擊概率值,若正樣本的點擊概率大於負樣本的點擊概率,這樣損失會比較小,若正樣本的點擊概率小於負樣本,損失會比較大。
    在這裏插入圖片描述
  • TOP1(presented):
    該排名損失是本文爲推薦任務設計的,它是期望item的相對排序的正則逼近。相關item的相對排名爲:
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Er7syp39-1584278944725)(2016-ICLR-Session-based recommendations with recurrent neural networks.resources/8DBF2D46-9AF3-4D23-8E1E-0BFAD0E8ED89.png)]
    式中,I{}I\{\cdot\}爲sigmoid函數,NSN_S爲一個Mini_batch中的Session總數,即batch_size。
    爲了防止正負樣本間差異很小導致負樣本分數偏高的情況,因此增加正則化項使負樣本的分數儘可能接近0。
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aIwnN13P-1584278944726)(2016-ICLR-Session-based recommendations with recurrent neural networks.resources/ACB1D247-E9C0-4651-8DD0-ACFB7F5ADAC1.png)]
    式中, r^s,i\hat{r}_{s,i}是當前時刻在item i(期望的item)上的打分,r^s,j\hat{r}_{s,j}是當前時刻在item j(負樣本)上的打分。

此處引用文哥的一段原文:
好了,最後我們來討論一下我閱讀本文時最爲疑慮的地方吧,爲什麼使用pair-wise的損失函數,要比point-wise的損失函數更好呢?這主要還是看場景吧。比如在電商領域、外賣點餐的時候,我們可能很多東西都喜歡,但是隻會挑選一個最喜歡的物品進行點擊或者購買。這種情況下並不是一個非黑即白的classification問題,只是說相對於某個物品,我們更喜歡另一個物品,這時候更多的是體現用戶對於不同物品的一個相對偏好關係,此時使用pair-wise的損失函數效果可能會好一點。在廣告領域,一般情況下用戶只會展示一個廣告,用戶點擊了就是點擊了,沒點擊就是沒點擊,我們可以把它當作非黑即白的classification問題,使用point-wise的損失函數就可以了。
不過還是要提一點,相對於使用point-wise的損失函數,使用pair-wise的損失函數,我們需要採集更多的數據,如果在數據量不是十分充足的情況下,point-wise的損失函數也許是更合適的選擇。

實驗

數據集:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OqNIPPJt-1584278944726)(2016-ICLR-Session-based recommendations with recurrent neural networks.resources/1A9F5E68-F81D-4A57-BBFA-E0C05437187D.png)]

評價指標:

  • recall@20:
    該指標是期望的item在模型輸出的分數排名前20的個數(不考慮具體的排名)。
  • MRR@20:
    該指標是期望的item在模型輸出的分數中的排序的倒數,其後對所有事件取平均可得。排名大於20時,MRR=0。

Baseline:

  • POP:推薦訓練集中最受歡迎的item
  • S-POP:推薦當前session中最受歡迎的item
  • Item-KNN:推薦與實際item相似的item,相似度被定義爲session向量之間的餘弦相似度
  • BPR-MF:一種矩陣分解法,新會話的特徵向量爲其內的item的特徵向量的平均,把它作爲用戶特徵向量。

實驗結果:

  • 效果最好的Baseline爲Item-KNN
  • 通過在隨機選取的參數空間點對每個數據集和損失函數進行100個實驗,對超參數進行了優化。得出的最佳參數如下表。
    在這裏插入圖片描述
  • 實驗得出單層GRU的效果最佳,下圖爲分別改變單層GRU的節點數及損失函數的實驗結果。
  • 表中數據爲相對於最佳的Baseline(Item-KNN)的Recall@20和MRR@20兩個評價指標的增長。
  • 可以看到,使用point-wise的交叉熵損失函數不穩定。使用文中提出的兩種Rank Loss相較於使用point-wise的交叉熵損失函數,模型的推薦效果有了較大的提升。
    在這裏插入圖片描述
  • 將表格轉換爲柱形圖更爲直觀,可見基於RNN的推薦算法效果顯著。
    在這裏插入圖片描述

參考鏈接:

論文下載地址爲:http://arxiv.org/abs/1511.06939
文哥的學習日記:https://www.jianshu.com/p/9a4b3791fda2
原文代碼地址:https://github.com/hidasib/GRU4Rec
tf參考代碼地址:https://github.com/princewen/tensorflow_practice/tree/master/recommendation/Basic-SessionBasedRNN-Demo
python2代碼地址:https://github.com/Songweiping/GRU4Rec_TensorFlow

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