BST: Behavior Sequence Transformer中的self attention過程詳解

用戶歷史行為中包含了豐富的信息,是刻畫用戶心智的重點特征。在推薦廣告領域,如何挖掘用戶行為序列中的有效信息是CTR預估等任務的重點。筆者在上一篇文章中介紹了DIN(Deep Interest Network),其抓住了用戶行為序列與目標廣告/商品之間的關系。在這篇文章中將介紹阿里團隊的另外一項重要的工作:BST(Behavior Sequence Transformer) ,將NLP中的transformer模型運用到了CTR預估中,更好地挖掘用戶行為序列內部的時序關系。

文章地址:Behavior Sequence Transformer for E-commerce Recommendation in Alibaba
Transformer論文地址:Attention Is All You Need,想對transformer有詳細了解的同學們可以參考

transformer的tensorflow代碼可以參考tf官方的github:地址
我自己試了一下,簡潔直觀,容易實現(xiàn)。

1. BST網(wǎng)絡簡介

BST的網(wǎng)絡結構如下圖所示:

圖1 BST網(wǎng)絡結構

1.1 核心思想
WDL 和 DIN沒有考慮到用戶序列的時序性,即用戶序列中不同商品間的關系。本論文使用了transformer的結構,來捕捉這種關系。

1.2 輸入特征
網(wǎng)絡的輸入特征有兩部分:用戶行為序列(User Behavior Sequence)和其他特征(user, item, context, cross等)。其中用戶序列中的每一個item有兩部分組成:sequence item feature 和positional feature,如圖1所示。這里的用戶序列也包含了target item及其position,見圖1的右下角。

  • sequence item feature:使用item_id和category_id
  • positional feature: 用戶序列中商品的位置信息,目的是為用戶序列引入時序信息。商品v_i的位置特征計算如下:
    pos(v_i) = t(v_t)-t(v_i) \tag1
    即商品的點擊時間與當前target item v_t的推薦時間之間的gap。這里加入的position feature相當于<<attention is all you need>>里的postitional encoding,只是本論文中沒有使用sin/cos的編碼方法,而是更直接地將postional feature與item feature進行了concat.

1.3 transformer layer

  • transformer layer主要實現(xiàn)了<<attention is all you need>>里的multi-head self attention + Point-wised FFN 結構(即encoder結構)

  • multi-head self attention:
    {\rm Attention}(\boldsymbol {Q, K, V}) = {\rm softmax}(\frac{\boldsymbol { QK}^{T}}{\sqrt d})\boldsymbol V \tag2
    其中\boldsymbol {Q, K, V}即Query, Key 和Value,是同一個item與不同的權值矩陣\boldsymbol {W^Q, W^k, W^V}相乘得到,權值矩陣\boldsymbol {W^Q, W^k, W^V}為可學習參數(shù);d為embedding size。此處的attention抽象為對Value中的每個item進行加權,而加權所用到的weight就是式(3)所計算得到的,即用Query和Key來決定注意力應該放到value中的哪個item上。Query之所以叫query(查詢),是因為每次都用一個embedding vector去查詢其與其他的embedding vector的match程度。一共要做n輪這種操作,n為1個batch中的序列個數(shù)。

    multi-head:將Q, K 和V在embedding size維度上投影h次,分別進行學習,最后concat起來作為attention的最終輸出。使用multi head是為了使模型能夠自適應地學到不同子空間下的序列信息。這里與CNN的feature map思想有些類似,使用相同形狀的多個feature map,以期待模型能夠自動學習到不同子空間下的特征。
    \boldsymbol S = MH(\boldsymbol E) = Concat(head_1, head_2, ..., head_h)\boldsymbol W^H \tag3
    注:這里論文的公式寫法有些混亂,我的理解head_1, ..., head_h就是把Q, K, V分成了h等份(源碼中使用的是tf.split()函數(shù)),分別做公式(2)中的變換,再concat起來。詳細分析見后面的圖解。

  • Point-Wised Feed-Forward Networks(FFN)
    F = FFN(\boldsymbol S)\tag4
    FFN中應用了normalization和residual blocks。self attention和FFN中都應用了dropout和LeakyReLU來避免過擬合。

  • 疊加多層self attention和FFN模塊:
    \boldsymbol S^b = SA(F^{(b-1)})\tag5
    \boldsymbol F^b = FFN(\boldsymbol S^b), \forall i \in 1, 2, ..., n.\tag6
    疊加多層模塊是為了模型能夠更好地學習序列間的復雜關系。但論文的實驗中證明b=1時的效果最好。

2. self attention過程詳解

圖2 self attention
圖3 multi-head self attention

在圖2中,seq 首先經(jīng)過embedding得到向量\boldsymbol E \in \mathbb{R}^{n\rm x d}, 其中n=4為序列長度,d=6為embedding size. 然后\boldsymbol E與3個相同形狀的權重矩陣\boldsymbol W_Q, \boldsymbol W_K, \boldsymbol W_V點乘,將自身映射為3個不同的矩陣\boldsymbol Q, \boldsymbol K, \boldsymbol V。接下來這三個矩陣會完成self attention的基本操作,即式(2)。\boldsymbol Q\boldsymbol K得到的attention score \boldsymbol W作為權重,與\boldsymbol V點乘,作為self attention的輸出。

圖3在圖2的基礎上加入了multi head 操作,即將\boldsymbol Q, \boldsymbol K, \boldsymbol V在embedding size d 的維度拆分為h個矩陣(圖中h=3),分別進行self attention 操作,得到的結果再concat起來作為最終的輸出。

參考文獻:
[1] multi-head attention
[2] 推薦系統(tǒng)遇上深度學習(四十八)-BST:將Transformer用于淘寶電商推薦
[3] 論文筆記:Attention is all you need

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容