推荐算法炼丹笔记:序列化推荐算法Bert4Rec
之前和海歸博士朋友聊天,他說,這篇文章是他所有的復現算法中,處理序列最好的算法之一。原本以為Bert只常見于NLP中,本文我們一起詳細地閱讀學習一下如何使用Bert來做推薦系統并取得最好的效果的。
之前我們的序列化模型從左到右的無向模型是次優的,
- 單向體系結構限制了隱藏表示在用戶行為序列中的能力;
- 假設一個嚴格有序的序列,這并是實用的;
本文是最早使用Bert方法來處理該問題的文章。為了防止信息泄露并且高效地訓練雙向模型,我們在序列化建模時采用了Cloze目標,通過聯合調節左右上下文來預測序列中的隨機屏蔽項。通過這種方式,我們學習了一個雙向表示模型,通過允許用戶歷史行為中的每一項融合來自左側和右側的信息來融合信息。
Bert4Rec
問題描述
模型框架
如上圖所示,Bert4Rec是由L個有向Transformer層堆疊起來的,在每一層,它通過與Transformer層并行地交換前一層所有位置的信息,迭代地修改每個位置的表示,與圖1d中基于RNN的方法不同, self-attentio賦予BERT4Rec直接捕捉任何距離的依賴關系的能力,而不是像圖1d中基于RNN的方法那樣一步一步地傳遞相關信息。這種機制導致了一個全局的接受野,而基于CNN的方法,如Caser通常有一個有限的接受野。此外,與基于RNN的方法相比,self-attention非常易于直接并行化。
對比圖1b、1c和1d,最顯著的區別是基于SASRec和RNN的方法都是從左到右的單向結構,而我們的BERT4Rec使用雙向的自我注意來建模用戶的行為序列。這樣,我們提出的模型可以獲得更強大的用戶行為序列表示,從而提高推薦性能。
1. Transformer層
2. Multi-Head Self-Attention
注意機制已經成為各種任務中序列建模的一個重要組成部分,它允許捕獲表示對之間的依賴關系,而不考慮它們在序列中的距離。
以往的工作表明,在不同的位置聯合處理來自不同表示子空間的信息是有益的。因此,我們在這里采用多頭自我注意,而不是執行單一的注意功能。具體地說,多頭注意首先用不同的、可學習的線性投影將H線性投影到h子空間,然后應用h注意函數產出輸出的表示。
于是我們有:
此處,我們省略掉網絡層的下標L, 于是我們得到Scaled Dot-Product Attention:
3. Position-wise Feed-Forward Network
self-attention sub-layer主要是基于線性投影,為了賦予模型非線性和不同維度的交互,此處我們對self-attention sub-layer的輸出加入Position-wise的FNN。它主要由兩塊組成
4. Stacking Transformer Layer
如上所述,我們可以使用自我注意機制輕松地捕捉整個用戶行為序列中的商品-商品交互。然而,通過堆疊自我注意層來學習更復雜的商品轉換模式通常是有益的。
然而,隨著網絡的深入,訓練變得更加困難。因此,如圖1a所示,我們在兩個子層的每一層周圍使用殘差連接,然后進行層標準化。此外,我們還將dropout應用于每個子層的輸出,然后將其規范化。即每個子層的輸出為LN(x+Dropout(sublayer(x)),其中sublayer是子層本身實現的功能,LN是中定義的層規范化函數。我們使用LN對同一層所有隱藏單元的輸入進行規范化,以穩定和加速網絡訓練。
5. Embedding層
6. 輸出層
模型學習
1. 訓練
為了防止過擬合等問題,我們創建了t-1個樣本(子序列的形式為:([v1],v2), ([v1,v2],v3) ,...) 我們將用雙向模型對每個歷史子序列進行編碼以預測目標,為了方便我們模型的快速訓練,我們使用了一個新的目標:Cloze task(Masked Language Model). 在每個訓練步,我們隨機mask掉輸入序列中占比的商品。
與“[mask]”相對應的最終隱藏向量被輸入到商品集上的輸出softmax中,就像在傳統的順序推薦中一樣。最終,我們定義每個masked掉的輸入作為masked的目標的negative log-likelihood:
Cloze task的另外一個優勢在于它可以產出更多的樣本用于模型的訓練。
2. 測試
如上所述,我們在訓練和最終的順序推薦任務之間造成了不匹配,因為Cloze task的目標是預測當前被屏蔽的商品,而順序推薦的目標是預測未來。為了解決這個問題,我們在用戶行為序列的末尾附加一個特殊的標記“[mask]”,然后根據這個token的最終隱藏表示來預測下一個項目。為了更好地匹配順序推薦任務(即預測最后一個項目),我們還生成了在訓練期間只屏蔽輸入序列中最后一個商品的樣本。它的工作原理類似于順序推薦的微調,可以進一步提高推薦性能。
實驗
1. 效果比較
Bert4Rec在所有的數據集上超過了所有的方法;它和所有的強的Baseline相比,HR@10上獲得了7.24%的提升; NDCG@10上取得了11.03%的提升, MRR上取得了11.46%的提升。
2. Cloze objective以及Bidirectional的模型為什么好的討論
2.1 是否Cloze objective的Bidirectional self-attention模型可以帶來幫助?
可以,而且幫助比較大。
2.2 為什么Bidirectional的模型比unidirectional的模型好?
不同的head對應的attention不同。
- 在第1層中,head 1傾向于關注左側的商品,而head 2傾向于關注右側的商品。
- 不同層次的注意力不同。顯然,第二層的關注點往往集中在最近的項目上。這是因為第2層直接連接到輸出層,最近的項目在預測未來方面扮演著更重要的角色。
- 與單向模型只能關注左側的項目不同,BERT4Rec中的項目傾向于關注兩側的項目。這說明雙向性對于用戶行為序列建模是必要的和有益的。
3. 參數影響比較
3.1 隱藏維度d的影響
隨著維度的變高,模型會收斂更快。維度變高并不能保證模型取得最好的效果。
3.2 Mask的比例p的影響
- p的大小不同數據集不一樣,一般不能太小也不能太大,太小或者太大都會帶來較差的影響。
- p的大小非常依賴于數據集的序列長度。
3.3 最大序列長度的影響
不同數據集取得最佳效果的序列長度不一致,并不是越長的序列效果越好;
4. 解耦分析
- PE:位置編碼對于Bert4Rec的影響是巨大的,刪除PE,模型的效果大大的下降了。
- PFFN: 長的序列可以從PFFN中獲得較多的幫助;
- LN,RC以及Dropout: 每個元素都可以從這些神經網絡中獲得提升;
- 層的個數: 在大的數據集上,stacking Transformer layers可以得到較為明顯的提升;
- Head個數:不同數據集對于head的個數要求不一樣;
結論
深度bidirectional自我注意結構在語言理解方面取得了巨大的成功。本文介紹了一種用于序列推薦的深度雙向序列模型BERT4Rec。在模型訓練中,我們引入Cloze task任務,該任務利用左右兩個上下文預測被掩蔽的商品。在四個真實世界數據集的大量實驗結果表明,我們的模型優于目前最好的方案。
參考文獻
總結
以上是生活随笔為你收集整理的推荐算法炼丹笔记:序列化推荐算法Bert4Rec的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐算法炼丹笔记:标签工程
- 下一篇: 读不完的顶会Paper,我该如何读论文?