基於 RNN 的序列化推薦系統總結

作者 | 陽光明媚

單位 | 華東師範大學

方向 | 推薦系統

本文介紹兩篇基於 RNN 的用戶序列行爲建模的經典論文,原文地址:

  1. Session-based Recommendations with Recurrent Neural Networks

https://arxiv.org/abs/1511.06939

  1. Parallel Recurrent Neural Network Architectures for Feature-rich Session-based Recommendations

http://www.hidasi.eu/content/p_rnn_recsys16.pdf

Session-based Recommendations with Recurrent Neural Networks

本文首次將 RNN 引入了用戶序列行爲的建模,並取得了顯著的效果提升。

解決的關鍵問題:

爲了使得推薦系統能夠學習用戶的序列決策數據,引入一個排序損失函數,並用 RNN 模型來建模稀疏的序列決策數據。

挑戰:

模型結構與算法細節:

模型的輸入是會話的狀態,具體的可以是事件中的物品的 one-hot 編碼 (1-of-N encoding),或者會話的歷史事件的表示的加權和 (給較早的時間較低的權重)。出於穩定性考慮,給輸入向量做正則化,因爲這可以強化局部的順序約束,而這不容易被 RNN 的長期記憶捕獲。(爲什麼正則化可以強化局部順序約束?怎麼正則化的?)作者還實驗了用一層 embedding layer 來做編碼,但 1-of-N encoding 效果總是更好。

網絡結構主要就是多層的 GRU 和用於輸出結構的前向傳播層。多層的 GRU 中,上一層的隱狀態作爲下一層的輸入。輸入也可以選擇去連接到網絡中更深的 GRU 層,作者發現這樣效果更好。

Session-parallel mini-batches

用戶序列數據與 NLP 序列數據做的任務不同,NLP 中的 mini-batch 會用一個滑動窗口來選擇句子中的單詞,預測其他單詞,mini-batch 中的每一個元素對應一個滑動窗口;但是對於用戶序列數據我們更想要建模用戶的長期行爲,因此不能用 NLP 中的這種方式來做 mini-batch。文中提出了一種用於用戶序列行爲數據建模的 mini-batch 組織方式:

上圖展示了 batch_size 爲 3 的情況,3 個 session 的序列數據同時進入模型,但是每個 session 的長短可能不同,當 batch 中某個 session 已經全部進入網絡時,馬上接替一個新的 session。如圖中右側的 input 所示,第 2 行的 session 最短,只有 2 個 event,第 2 個 event 結束之後馬上接上第 4 個 session 序列,所以 i2,2 後面跟的是 i4,1。

Sampling on the output

由於物品的數目巨大,不可能對每個物品都計算分數,因此對輸出進行採樣,只計算一小部分物品的分數,也就是負採樣。

對於一個 session 中作爲結束的 event,一般的解釋是用戶根本不知道 event 中的物品的存在,因而沒有交互。用戶知道這個物品,但是因爲不喜歡而去不交互的概率很低。物品越流行,用戶越可能瞭解這個物品,因此作爲結束的事件如果包含了這個物品,那很可能說明用戶真的不喜歡這個物品。因此我們會根據流行度作爲權重來採樣物品,而不是爲每個訓練樣例分別採樣一些物品,我們使用來自其他 mini-batch 的訓練樣例作爲負樣本。這種方法的好處是我們可以通過跳過採樣來進一步降低計算負擔。此外,在實現方面,從降低代碼複雜度到加快矩陣操作也有好處。同時,該方法也是一種基於流行度的抽樣方法,因爲一個項目出現在小批量的其他訓練示例中的可能性與其流行度成正比。

Ranking loss

推薦系統的核心是基於相關性對物品排序,爲了在序列化推薦中實現這一點,需要選擇合適的排序損失函數。排序的學習方式通常有以下三種:

  1. Pointwise 排序估計彼此獨立的項目的得分或排名,損失的定義方式應使相關項目的排名較。

  2. Pairwise 排序比較一個正項目和一個負項目的得分或成對的排名,損失強制要求正項目的排名應低於負項目的排名。

  3. Listwise 排序使用所有項目的分數和等級,並將它們與完美順序進行比較。由於它包括排序,通常計算成本更高,因此不經常使用。此外,如果只有一個相關的項目 - 在我們的案例中 - listwise 排序可以通過 pairwise 排序解決。

作者採用了多種排序損失函數,發現 pointwise 的損失函數表現不穩定,pairwise 的表現更好,文章列出了兩種 pairwise 損失函數:

論文的模型部分到這裏就結束了,下面看一下執行細節與實驗部分

代碼地址:

https://github.com/yhs968/pyGRU4REC

用 GRU 對輸入建模:

# reset the hidden states if some sessions have just terminated
hidden = reset_hidden(hidden, mask).detach()
# Go through the GRU layer
logit, hidden = self.gru(input, target, hidden)
# Output sampling

logit_sampled = logit[:, target.view(-1)]
# Calculate the mini-batch loss
loss = self.loss_fn(logit_sampled)

模型直觀且簡單,這裏 reset_hidden 是用於處理 batch 中結束的 session,處理方式就是把對應的 hidden_state 置爲 0。GRU 的輸入是數據和上一層的 hidden_state,但在示例代碼中,僅使用了一層的 GRU。

Top1 Loss 的計算:

def TOP1Loss(logit):
    """
    Args:
        logit (BxB): Variable that stores the logits for the items in the session-parallel mini-batch.
                     Negative samples for a specific item are drawn from the other items in the
                     session-parallel minibatch, as mentioned in the original GRU4REC paper.
                     The first dimension corresponds to the batches, and the second dimension
                     corresponds to sampled number of items to evaluate.
    """
    # differences between the item scores
    diff = -(logit.diag().view(-1, 1).expand_as(logit) - logit)
    # final loss
    loss = F.sigmoid(diff).mean() + F.sigmoid(logit ** 2).mean()

    return loss

在 session 中的每一個 event,模型預測下一個 event 的物品排序列表。評價指標採用了 Recall@20 和 MRR@20,MRR 是 Mean Reciprocal Rank,計算方式爲:

一個正確物品如果被排到了 20 名開外,記爲 0 分。

baseline 選擇了基於流行度的推薦,和基於物品相似度的推薦:

實驗效果部分,可以看到提升非常顯著:

Parallel recurrent neural network architectures for feature-rich session-based recommendations

在上文的基礎上,本文考慮了用戶行爲序列中的更多信息,諸如圖像、文本,並設計了新的基於 RNN 的網絡模型 parellel-RNN,來利用這些信息。有了上文的基礎,這裏直接介紹本文相對於上文的修改。

上圖展示了文中所提出的幾種融合特徵信息的 RNN 結構,分成兩行:

第一行的模型分別爲:只考慮 ID 輸入,ID 與圖像拼接輸入,ID 與圖像分別輸入且並行訓練

第二行的模型分別爲:只考慮圖像輸入,ID 與圖像分別輸入且並行訓練但是彼此的網絡之間有交互,ID 與圖像分別輸入且共享參數矩陣

但是分別處理諸如 ID 與圖像特徵時,由於學習的目標不同,兩部分的網絡不能同時訓練,因此文中提出了幾種交替訓練的方式:

  1. Simultaneous:所有參數同時進行訓練,用作 baseline。

  2. Alternating:每個 epoch 只訓練一個特徵的網絡,其他特徵對應的網絡參數固定,循環進行,例如:第一次訓練 ID 網絡,第二次圖像網絡,第三次 ID 網絡.......

  3. Residual:每個網絡分支依次訓練,但是不會循環,每個網絡分支的單次訓練長度比 Alternating 要長,比如 ID 網絡訓練 10 個 epoch,接着 feature 網絡基於前面 ID 網絡的參差訓練 10 個 epoch。每個網絡分支基於之前訓練過的網絡分支的 residual error 的 ensemble 進行訓練。

  4. Interleaving:對於每個 mini-batch,在網絡分支間交替進行如下訓練:第一個子網絡正常訓練,第二個子網絡基於當前 mini-batch 在當前網絡的殘差訓練。更爲頻繁的交替訓練能使得網絡之間的訓練更爲平衡,且這樣做沒有了同步訓練的缺點。

在與 Item-KNN 的對比試驗中,發現 Feature-Only(只使用圖像特徵) 的網絡竟然不如對方,而 ID-Only 就已經效果提升很多,說明僅使用圖像特徵可能無法很好地表示物品。另外第四行,兩種信息特徵拼接之後的效果,也不如 ID-Only,說明單層的 GRU 無法很好的區別這兩種拼接的特徵。

上面的實驗結果說明覆雜的網絡結構沒有得到很好地利用,因此作者又做了 Parallel 網絡的實驗:

這次採用了更大的隱藏層,實驗效果也有了明顯提升。而且此時 Feature-Only 的網絡也終於超過了 baseline。同時,Parallel(int) 網絡也取得了最佳的效果,證明了這種利用了更加豐富的信息的 RNN-based 的模型結構的有效性。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/tTVQYyPDiBm-41CCzMzqCQ