博客地址:http://www.cnblogs.com/daniel-D/p/5602254.html
這篇論文的工作是講 RNN 應用到推薦系統中,想法在於把一個 session 點擊一系列 item 的行為看做一個序列,用來訓練一個 RNN 模型。在預測階段,把 session 已知的點擊序列作為輸入,用 softmax 預測該session下一個最有可能點擊的item。論文想法雖然很朴素很直白,但是目前這類直接用deep learning的結構來做推薦的論文非常少(RBM除外),因此值得仔細研讀。
Architecture
論文采用了 RNN 中的 GRU 單元作為基本結構,組建了一個深層的神經網絡來預測該session下一個點擊的item 的概率。比如item擁有 2w 個,那么通過 1-of-N coding 的方式(one hot encoding),神經網絡的第一層就有2w個節點,然后通過第二層embedding層壓縮為低維連續向量(假設200維),當然最開始這些向量都是隨機初始化的。embedding這一層實際上是一個 2w * 200的矩陣字典,每一行 200 維的向量就是一個item的presentation。這200維向量可作為 stacked GRU 的輸入,得到低維連續的輸出(200維),然后通過與 一個 200 * 2w 的矩陣相乘,得到了下一個點擊的item在 2w 個節點中的預測概率,整體而言,這是一個 sequence to sequence 的預測問題。
為了更好的並行計算,論文采用了mini-batch的處理,即把不同的session拼接起來,同一個sequence遇到下一個Session時,要注意將 GRU 中的一些向量重新初始化。因為item的維度非常高,每次要預測 2w 個item 的概率會導致計算量龐大,因此原則上只選取當前的正樣本(即下一個點擊的item)加上隨機抽取的負樣本。論文采用了取巧的方法來減少采樣需要的計算量,即選取了同一個 mini-batch 中其他sequence下一個點擊的item作為負樣本,用這些正負樣本來訓練整個神經網絡。
Loss Function
作者嘗試了 常見的 point-wise rank loss,即認為負樣本為 0, 正樣本為 1 的loss function,發現訓練出來的模型並不穩定,原因可能因為在推薦里面,並不存在絕對的正樣本和負樣本。在同一個情景里面,用戶只能點擊一個最偏好的item,對其他item可能也存在偏好,這並不是一個非黑即白的classification問題。然后作者嘗試了 pair-wise rank loss,並且對於負樣本的分數進行了近0約束,防止訓練過程中分數相互“攀比”的情形下所有的預測分數都越來越高。實際上,我認為這種約束方法近似於對 權重進行了 L2 約束。
Results
論文在 recSys2015 競賽的數據集上進行了點擊item的預測評比,對比的方法有 pop 、s-pop 、item-knn以及 BPR-MF,評測標准有 MRR@20 和 Recall@20,貌似都取得了不錯的效果。
一些想法
a、最后一層很重要,最后一層隱層實際是前面點擊序列的embedding結果,可以看做 user 向量。輸出層某個節點表示一個item,與之相連的實際是item的向量。
b、user 向量只用到了item序列,item和user本身的profile屬性是否可以應用到模型里來?