論文筆記 | ICDM2018 | Self-Attentive Sequential Recommendation

SASRec-title.png

論文地址:https://arxiv.org/abs/1808.09781

官方代碼:https://github.com/kang205/SASRec

一 為什么讀這篇

搜索用self-attention做推薦的相關文章,本篇算是比較相關的而且排名較高,作者開放的源碼也是基于transformer那個第三方的開源實現,算是一脈相承,看看別人是怎么改transformer,應用到推薦里的。

二 截止閱讀時這篇論文的引用次數

2019.6.25 15次。

三 相關背景介紹

中了18年IEEE的ICDM,同年8月掛到arXiv上。算是跟進比較及時的,transformer出來一年后就應用到自己工作的領域并發了paper。兩位作者來自加州圣地亞哥大學,一作Wang-Cheng Kang是個華人小哥PHD,16年本科畢業于南大,期間受周志華教授指導,PHD是推薦系統和CV雙修,CVPR和RecSys的論文都發過,又是一個強人。。二作Julian McAuley是Kang的老板,還在coursera上開了一門專項課程Python Data Products for Predictive Analytics

四 關鍵詞

Sequential Recommendation

self-attention

五 論文的主要貢獻

1 將Transformer應用在序列推薦問題上

2 做了細致的剝離對比實驗

六 詳細解讀

0 摘要

動態序列是許多推薦系統的關鍵特征,為了利用這一點,主要有馬爾科夫鏈(MCs)和RNN方法。其中MC適用于短序列, 稀疏數據集,模型簡單;RNN原則上適用于長序列,密集數據集,不過模型更復雜。本文目標是平衡這兩個目標,通過提出基于序列模型的self-attention(SASRec),使之可以捕獲長期語義(像RNN那樣),但是使用attention機制,使預測基于相關的少數行為(像MC那樣)。在每一個時間步,SASRec從用戶的歷史行為中尋找哪些item是"相關的",并基于它們來預測下一個item。

1 介紹

序列推薦研究主要涉及到如何簡便地捕獲高階動態。本文主要就是探索將self-attention機制應用到序列推薦問題上。希望這個想法可以解決MC和RNN的兩個問題,一方面能夠從過去的所有行為中獲取context(像RNN),另一方面能夠以少量的行為進行預測(像MC)。本文提出的SASRec(Self-Attention based Sequential Recommendation)如圖1所示。

SASRec-fig1.png

2 相關工作

2.1 常規推薦

基于point-wise,pairwise的方法來解決隱式反饋關于"未觀察到"這種二義的解釋。主要都是基于矩陣分解(MF)的方法來發現用戶偏好和item屬性。還有近年的深度學習方法用于提取特征或用來替代傳統的MF方法。如NeuMF,AutoRec。

2.2 時序推薦

TimeSVD++通過將時間劃分為幾個段,并分別對user和item建模達到了很好的效果。

2.3 序列推薦

有一階的MC方法,高階的MC方法。基于CNN的Caser,基于RNN的GRU4Rec。

2.4 Attention機制

Attention機制背后的本質理念是,順序輸出的每項都依賴于模型應該連續關注的某些輸入的"相關"部分。還有個優勢是基于attention的方法更容易解釋。例如AFM(Attentional Factorization Machines)學習每個特征交互對于內容感知推薦的重要性。

本文工作受transformer啟發,提出基于self-attention的序列推薦模型。因為序列推薦的問題與機器翻譯有很大差異,所以需要對模型進行特殊設計。

3 方法

定義用戶行為序列為\mathcal{S}^{u}=\left(\mathcal{S}_{1}^{u}, \mathcal{S}_{2}^{u}, \ldots, \mathcal{S}_{\left|\mathcal{S}^{u}\right|}^{u}\right),在時間步t,模型預測的下一個item取決于之前的t個item。模型輸入可以視為\left(\mathcal{S}_{1}^{u}, \mathcal{S}_{2}^{u}, \ldots, \mathcal{S}_{\left|\mathcal{S}^{u}\right| - 1}^{u}\right),其期望輸出是同樣序列的"偏移"版本:\left(\mathcal{S}_{2}^{u}, \mathcal{S}_{3}^{u}, \ldots, \mathcal{S}_{\left|\mathcal{S}^{u}\right|}^{u}\right)。所用符號如表1所示。

SASRec-table1.png

3.1 Embedding層

將訓練序列\left(\mathcal{S}_{1}^{u}, \mathcal{S}_{2}^{u}, \ldots, \mathcal{S}_{\left|\mathcal{S}^{u}\right| - 1}^{u}\right)轉為固定長度序列s=\left(s_{1}, s_{2}, \dots, s_{n}\right)。如果序列長度超過n,則用最近的n個行為。如果不足,則從左補足直到長度為n

位置Embedding

因為self-attention并不包含RNN或CNN模塊,因此它不能感知到之前item的位置。本文給輸入Embedding插入可學習的位置Embedding \mathbf{P} \in \mathbb{R}^{n \times d}
\widehat{\mathbf{E}}=\left[\begin{array}{c}{\mathbf{M}_{s_{1}}+\mathbf{P}_{1}} \\ {\mathbf{M}_{s_{2}}+\mathbf{P}_{2}} \\ {\cdots} \\ {\mathbf{M}_{s_{n}}+\mathbf{P}_{n}}\end{array}\right]
本文也試了transformer中固定的位置Embedding,不過效果更糟。

3.2 Self-Attention塊

Transformer中的縮放點積attention定義如下:
\text { Attention }(\mathbf{Q}, \mathbf{K}, \mathbf{V})=\operatorname{softmax}\left(\frac{\mathbf{Q} \mathbf{K}^{T}}{\sqrtmjkc71u}\right) \mathbf{V}

Self-Attention層

本文中,self-attention以embedding \widehat{\mathbf{E}}作為輸入,通過線性投影將它轉為3個矩陣,然后輸入attention層:
\mathbf{S}=\operatorname{SA}(\widehat{\mathbf{E}})=\text { Attention }\left(\widehat{\mathbf{E}} \mathbf{W}^{Q}, \widehat{\mathbf{E}} \mathbf{W}^{K}, \widehat{\mathbf{E}} \mathbf{W}^{V}\right)

Causality

為了避免穿越問題,需要禁止Q_{i}\mathbf{K}_{j}(j>i)之間所有的連接。

Point-wise前饋網絡

盡管self-attention能夠用自適應權重聚集之前所有item的embedding,最終它仍然是個線性模型。為了增加非線性同時考慮不同隱式維度之間的交互,用了一個兩層的point-wise前饋網絡:
\mathbf{F}_{i}=\mathrm{FFN}\left(\mathbf{S}_{i}\right)=\operatorname{ReLU}\left(\mathbf{S}_{i} \mathbf{W}^{(1)}+\mathbf{b}^{(1)}\right) \mathbf{W}^{(2)}+\mathbf{b}^{(2)}

3.3 Self-Attention塊的堆疊

堆疊公式如下:
\mathbf{S}^{(b)}=\mathrm{S} \mathrm{A}\left(\mathbf{F}^{(b-1)}\right) \\ \mathbf{F}_{i}^{(b)}=\operatorname{FFN}\left(\mathbf{S}_{i}^{(b)}\right), \quad \forall i \in\{1,2, \ldots, n\}
然而隨著網絡的加深也出現幾個問題:

  1. 模型容量的增加導致過擬合
  2. 由于梯度消失訓練過程變得不穩定
  3. 更多的參數需要更長的訓練時間

受Transformer啟發,用了LayerNorm,Dropout,殘差連接:
g(x)=x+\text { Dropout }(g(\text { LayerNorm }(x)))
其中g表示self-attention層或前饋網絡。

LayerNorm公式如下:
\text { LayerNorm }(\mathbf{x})=\alpha \odot \frac{\mathbf{x}-\mu}{\sqrt{\sigma^{2}+\epsilon}}+\boldsymbol{\beta}
其中\odot為element-wise積(Hadamard product),x為包含所有特征的一個樣本。

3.4 預測層

采用MF層來預測相關的item i
r_{i, t}=\mathbf{F}_{t}^{(b)} \mathbf{N}_{i}^{T}
其中r_{i, t}是給定t個items,下一個item i的相關性。\mathbf{N} \in \mathbb{R}^{|\mathcal{I}| \times d}是一個item embedding矩陣。

共享Item Embedding

為了減少模型尺寸及避免過擬合,用一個item embedding \mathrm{M},即:
r_{i, t}=\mathbf{F}_{t}^{(b)} \mathbf{M}_{i}^{T}

顯式用戶建模

為了提供個性化推薦,當前主要有兩種方法:

  1. 學習顯式的用戶embedding表示用戶偏好(MF,FPMC,Caser)
  2. 考慮用戶之前的行為,通過訪問過的item的embedding推測隱式的用戶embedding

本文采用第二種方式,同時額外在最后一層插入顯式用戶embedding,例如通過加法實現r_{u, i, t}=\left(\mathbf{U}_{u}+\mathbf{F}_{t}^{(b)}\right) \mathbf{M}_{i}^{T}。但是通過實驗發現增加顯式用戶embedding并沒有提升效果。。

3.5 網絡訓練

定義O_{t}為時間步t的期望輸出:
o_{t}=\left\{\begin{array}{ll}{<\mathrm{pad}>} & {\text { if } s_{t} \text { is a padding item }} \\ {s_{t+1}} & {1 \leq t<n} \\ {\mathcal{S}_{\left|S^{u}\right|}^{u}} & {t=n}\end{array}\right.
用二元交叉熵損失作為目標函數:
-\sum_{\mathcal{S}^{u} \in \mathcal{S}} \sum_{t \in[1,2, \ldots, n]}\left[\log \left(\sigma\left(r_{o_{t}, t}\right)\right)+\sum_{j \notin \mathcal{S}^{u}} \log \left(1-\sigma\left(r_{j, t}\right)\right)\right]

3.6 復雜度分析

空間復雜度

總參數量為:O\left(|\mathcal{I}| d+n d+d^{2}\right)

時間復雜度

主要是self-attention層和前饋網絡,占O\left(n^{2} d+n d^{2}\right)。但是因為self-attention層可以完全并行化,所以O\left(n^{2} d\right)也不是什么問題。實驗發現速度10倍于基于RNN和基于CNN的方法。

處理長序列

雖然通過實驗經驗性地驗證了本文方法的效率,但最終還是無法擴展到很長的序列。未來的工作可能有:

  1. 使用restricted self-attention『A time-restricted self-attention layer for asr』
  2. 將長序列切分為段『Personalized top-n sequential recommendation via convolutional sequence embedding』

3.7 討論

本文發現SASRec可以視為某種經典CF模型的泛化。

退化為已有模型

經過簡化SASRec可以視為FMC,FPMC,FISM。(這里感覺好牽強)

基于MC的推薦

本文解決了MC的問題(長序列)

基于RNN的推薦

本文解決了RNN的問題(并行計算,最大路徑長度)

4 實驗

實驗設計是為了回答下面4個問題:

  1. SASRec是否超過了當前包括基于CNN/RNN模型的方法,達到了SOTA
  2. SASRec架構中各種組件的影響是什么
  3. 訓練效率和擴展性如何
  4. Attention權重是否能學到有意義的模式,關于位置或item屬性

4.1 數據集

SASRec-table2.png

數據集劃分為3個部分。最后一次行為為測試集,倒數第二次行為為驗證集,剩下的為訓練集。測試時也用了驗證集的數據。

4.2 比較方法

將對比方法分為三類。

第一類為只考慮用戶反饋不考慮序列行為順序的常規推薦方法。包括PopRec,BPR

第二類為基于一階馬爾科夫鏈的序列推薦,考慮了最后訪問的一個item。包括FMC,FPMC,TransRec

第三類為深度學習方法,考慮之前幾個或全部的item。包括GRU4Rec,GRU4Rec+,Caser

4.3 實現細節

SASRec的默認版本,用了2個self-attention塊(b=2),經學習獲得的位置embedding,embedding層中的item embedding和預測層中的是共享的。優化器是Adam,學習率為0.001,batch_size=128,MovieLens-1M數據集的dropout比率為0.2,由于稀疏性其他數據集的比率為0.5。MovieLens-1M的最大序列長度n設置為200,其他數據集設置為50。粗略來看大概是每個用戶的平均行為數。

4.4 評估指標

采用兩種常見的Top-N指標,Hit Rate@10和NDCG@10。為了避免過重的計算量,對每個用戶隨機采樣100個負item,加上ground-truth item,對這101個item排序計算其指標。

4.5 推薦效果

這里回答了問題1。

SASRec-table3.jpg

效果如表3所示,發現非神經網絡方法(a-e)在稀疏數據集上表現好點,神經網絡方法(f-h)在密集數據集上表現更好。而本文方法在兩種數據集上表現都更好。

SASRec-fig2.jpg

圖2分析了關鍵超參隱式維度d的影響,發現本文方法d越大效果越好,對所有的數據集,當d \geq 40達到滿意的效果。

4.6 剝離實驗

這里回答了問題2。默認方法和8個變種方法(d都是50)的效果如表4所示。

SASRec-table4.jpg
  1. 移除位置embedding

    除了稀疏數據集Beauty,效果變差。這個變種也許適合稀疏數據集,這種情況下通常用戶序列都很短。

  2. 不共享Item Embedding

    性能嚴重下降,有可能是因為過擬合

  3. 移除殘差連接

    性能嚴重下降

  4. 移除dropout

    dropout在稀疏數據集上更有效,也說明密集數據集上過擬合問題更少點

  5. 塊的個數

    塊越多更適合于密集數據集

  6. Multi-head

    2個頭的效果比1個頭的稍微糟點,沒有像Transformer原文用那么多頭,因為d的維度只有50,不像Transformer有512,所以不適合分解為更小的子空間。

4.7 訓練效率和擴展性

從訓練速度和閉合時間兩方面來回答問題3。

SASRec-fig3.jpg

序列越長,效果越好,如表5所示。

SASRec-table5.jpg

4.8 可視化Attention權重

這里回答問題4。

SASRec-fig4.jpg

通過a和c的對比,發現模型在稀疏數據集上更傾向關注最近的item,而在密集數據集上對最近的item較少關注。這說明本文方法可以自適應的處理稀疏和密集數據集。

通過b和c的對比,說明位置embedding的影響,沒有它們attention權重基本上是均勻分布。

通過c和d的對比,說明模型的層次性,更高的層傾向于關注最近的位置。可能是因為第一個self-attention塊已經考慮了之前所有的item,所以第二個塊無需考慮更遠的位置。

總之,通過可視化可以說明self-attention機制是自適應的,有位置感知以及有層次性的。

七 小結

本文整個感覺其實就是將transformer的self-attention應用到推薦上來,沒有什么特別創新的地方,屬于應用型論文。以現在的觀點來看,好像很普通,不過考慮到transformer出來不久后本文工作就跟上了,這點還是很厲害的。感慨一下搞科研也得追熱點,而且不能只盯著自己那一塊東西,得看大領域的熱點。此外,通過查找作者的背景資料,根據作者過往產出成果,感覺本文應該不是坑,是可以借鑒應用的。

素質四連

要解決什么問題

序列推薦問題

用了什么方法解決

transformer的self-attention機制

效果如何

超過了基于馬爾科夫鏈,CNN/RNN的方法,速度也快很多

還存在什么問題

沒有特別創新的改造,就是應用了一下self-attention

算法背后的模式和原理

拿來主義,將不同領域的方法工具拿來用,針對要解決的具體問題細致的調參

八 補充

同一天在arXiv上發表的AttRec:Next Item Recommendation with Self-Attention

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容