序列推薦(transformer)

Attention演進(RNN&LSTM&GRU&Seq2Seq + Attention機制)

LSTM

LSTM是RNN的一種變體,RNN由於梯度消失只有短期記憶,而LSTM網路通過精妙的門控制,一定程度上緩解了梯度消失的問題。
LSTM得神經網路模組具有不同的結構,LSTM包含遺忘門、輸入門和輸出門,增加了非線性的相互作用。整體結構如圖所示:
LSTM

點擊查看公式

遺忘門:\(
f_{t}=\sigma\left(W_{f} \cdot\left[h_{t-1}, x_{t}\right]+b_{f}\right)
\)

輸入門:\(
\begin{array}{l}
i_{t}=\sigma\left(W_{i} \cdot\left[h_{t-1}, x_{t}\right]+b_{i}\right)
\end{array}
\)

cell state更新:
\(\tilde{C_t}=\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]+b_{C}\right)\)
\(C_{t}=f_{t} * C_{t-1}+i_{t} * \tilde{C}_{t}\)

輸出門:\(
\begin{array}{l}
o_{t}=\sigma\left(W_{o}\left[h_{t-1}, x_{t}\right]+b_{o}\right)
\end{array}
\)

當前層輸出:\(
\begin{array}{l}
h_{t}=o_{t} * \tanh \left(C_{t}\right)
\end{array}
\)

GRU

GRU是LSTM的一種變體,也是為了解決梯度消失(即長期記憶問題)而提出來的。相較於LSTM,GRU的網路結構更加簡單,且效果很好。

GRU

Seq2Seq + Attention機制

提出問題:在做機器翻譯時,專家學者們發現,在Seq2Seq結構中,Encoder把所有的輸入序列都編碼成一個統一的語義向量context,然後再由Decoder解碼。其中,context自然也就成了限制模型性能的瓶頸,當要翻譯的句子較長時,一個 context 可能存不下那麼多資訊。同時,只使用編碼器的最後一個隱藏層狀態,似乎不是很合理。

解決方案:因此,引入了Attention機制(將有限的認知資源集中到最重要的地方)。在生成 Target 序列的每個詞時,用到的中間語義向量 context 是 Source 序列通過Encoder的隱藏層的加權和,而不是只用Encoder最後一個時刻的輸出作為context,這樣就能保證在解碼不同詞的時候,Source 序列對現在解碼詞的貢獻是不一樣的。例如,Decoder 在解碼」machine」時,」機」和」器」提供的權重要更大一些,同樣,在解碼」learning」時,」學」和」習」提供的權重相應的會更大一些。

實現步驟:(1)衡量編碼中第 j 階段的隱含層狀態和解碼時第 i 階段的相關性(有很多種打分方式,這裡不細講);(2)通過相關性的打分為編碼中的不同階段分配不同的權重;(3)解碼中第 i 階段輸入的語義向量context就來自於編碼中不同階段的隱含層狀態的加權和。

Attention

簡單總結下:attention比rnn之類參數更少,速度更快(類似cnn可以並行化),效果更好【1】;因為其過濾掉大部分無用資訊,所以可以處理更長的序列;下面看下attention是如何建模完成資訊過濾的。

Attention機制(self-attention)

Attention其實就是計算一種相關程度;Attention通常可以進行如下描述,表示為將query(Q)和key-value pairs映射到輸出上,其中query、每個key、每個value都是向量,輸出是V中所有values的加權,其中權重是由Query和每個key計算出來的,計算方法分為三步:
1)計算比較Q和K的相似度,用f來表示:

\[f\left(Q, K_{i}\right) , i=1,2,3
\]

2)將得到的相似度進行softmax歸一化:

\[\alpha_{i}=\frac{e^{f\left(Q, K_{i}\right)}}{\sum_{j=1}^{m} e^{f\left(Q, K_{i}\right)}}, i=1,2,3, . .
\]

3)針對計算出來的權重,對所有的values進行加權求和,得到Attention向量:

\[\sum_{i=1}^m a_i V_i
\]

變種之Memory-based Attention

mba

Q&A 任務中,k 是 question,v 是 answer,q 是新來的 question,看看歷史 memory 中 q 和哪個 k 更相似,然後依葫蘆畫瓢,根據相似 k 對應的 v,合成當前 question 的 answer。

Key-Value Memory network

模型的輸入是一個稠密特徵q,輸出是一個特徵向量v,向量v的計算是通過對每個embedding vector進行加權求和得到的;【2】

變種之Soft/Hard Attention

hard attention 是一個隨機取樣,取樣集合是輸入向量的集合,取樣的概率分布即attention weight。因此,hard attention 的輸出是某一個特定的輸入向量。
soft attention 是一個帶權求和的過程,求和集合是輸入向量的集合,對應權重是 相似度function 產出的 attention weight。

soft attention 是更常用的,下面討論相似度function 【3】

score_func

變種之self-attention

定義:Self Attention,指的不是Target和Source之間的Attention機制,而是Source內部元素之間或者Target內部元素之間發生的Attention機制,也可以理解為Target=Source這種特殊情況下的Attention。

Scaled Dot-Product Attention

sdpa

Dot-Product計算相似度

outputs = tf.matmul(Q,tf.transpose(K,[0,2,1]))
outputs = outputs / (K.get_shape().as_list()[-1] ** 0.5)

Encoder mask(主要是padding value平滑下)

key_masks = tf.sign(tf.abs(tf.reduce_sum(keys,axis=-1)))
key_masks = tf.tile(tf.expand_dims(key_masks,1),[1,tf.shape(queries)[1],1])
paddings = tf.ones_like(outputs) * (-2 ** 32 + 1)
outputs = tf.where(tf.equal(key_masks,0),paddings,outputs)

Decoder mask(padding value平滑+只能利用之前的輸入約束)

diag_vals = tf.ones_like(outputs[0,:,:])
tril = tf.contrib.linalg.LinearOperatorTriL(diag_vals).to_dense()
masks = tf.tile(tf.expand_dims(tril,0),[tf.shape(outputs)[0],1,1])
paddings = tf.ones_like(masks) * (-2 ** 32 + 1)
outputs = tf.where(tf.equal(masks,0),paddings,outputs)

計算結果outputs

# scaled 
outputs = tf.nn.softmax(outputs)
# Query Mask
query_masks = tf.sign(tf.abs(tf.reduce_sum(queries,axis=-1)))
query_masks = tf.tile(tf.expand_dims(query_masks,-1),[1,1,tf.shape(keys)[1]])
outputs *= query_masks
# Dropout
outputs = tf.layers.dropout(outputs,rate = dropout_rate,training = tf.convert_to_tensor(is_training))
# Weighted sum
outputs = tf.matmul(outputs,V)
# Residual connection
outputs += queries
# Normalize
outputs = normalize(outputs)

Multi-Head Attention

mha
Multi-Head Attention就是把Scaled Dot-Product Attention的過程做H次,然後把輸出concat合起來。

序列建模有哪些經典論文?

Next Item Recommendation with Self-Attention
Behavior Sequence Transformer for E-commerce Recommendation in Alibaba
Session-based recommendations with recurrent neural networks
Neural Attentive Session-based Recommendation
Translation-based Recommendation
BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer
SHAN:Sequential Recommender System based on Hierarchical Attention Networks
BINN:Learning from history and present: next-item recommendation via discrimina-tively exploiting user behaviors

SDM論文筆記

回顧與引入(ABSTRACT+1,2兩小節)

SDM:SDM: Sequential Deep Matching Model for Online Large-scale Recommender System
在淘寶的場景中,用戶的行為主要分為兩種,第一個是當前的瀏覽session,用戶在一個session中,需求往往是十分明確的,比如你想買球鞋,往往只會關注球鞋類的商品。另一個是之前的記錄,一個用戶雖然可能不是每次都來買球鞋,但是也可能提供一定的有用資訊,比如用戶只買阿迪的鞋子或者只買帆布鞋等等。因此分別建模這兩種行為序列來刻畫用戶的興趣,是十分有用的。

提出問題:1)CF類方法並未建模用戶的興趣的動態性和興趣隨時間的演化過程(DSIN);2)一個session內也可能存在多種興趣傾向(feed的多個維度);3)長期偏好和短期偏好沒很好融合

我對動態性/靜態性的理解:1)icf是取topk相似的item,然後i2i推薦,相當於僅利用了分布的頭部部分;2)傳統的embedding建模假設用戶的興趣是長久穩定的和集中的,不隨時間和context變化;所以相對的就是動態多興趣的假設
我對多興趣傾向的理解:文章中主要是提出電商場景下用戶會綜合商品的多個角度,也就是多興趣觀點;個人在雙列feed的關注點基本1)萌寵/美女類型2)訂閱科技/影視作者;還有可能關注封面;同時全局類策略一般不看

解決方案:提出multi-head attention和Gate自適應長短期融合

multi-head attention主要有兩點原因:
1)用戶的行為中存在一些誤點擊行為,通過self-attention來降低這種影響;
2)用戶可能對不同物品的關注點不同。

Gate自適應長短期融合的原因:
之前簡單將item concat或者weighted sum的工作,因為用戶找了很久才找到和NBA明星相關的球鞋,其他item反而是噪音;本工作對應的模組是類似lstm的長短期向量門融合模組可以避免這種噪音干擾;

建模&模型架構/結構(第3節)

長期序列:相隔一周以內的行為認為是用戶的長期行為(不包含短期序列)
短期序列:
1)日誌中標記了同樣的session ID
2)雖然session ID不相同,但是相鄰的行為間隔小於10min
3)最長的session長度為50,超過50的劃分到前一個session

這裡論文沒給出規則2,3的原因,推測還是阿里這邊數據分析的經驗;
sdk埋點中session_id定義:應用進入前台生成session_id,退至後台10秒以上重新進入前台重新生成session_id

sdm

在長期行為中挖掘用戶對商品屬性的偏好(如類目、品牌、店鋪等),在短期行為中結合Multi-Head Self-Attention過濾掉session內部的casual click,並利用Multi-Head挖掘用戶在session內的多方面興趣,最後構造Gate自適應的融合長短期興趣得到用戶興趣的充分表達。

train&serving

循環層:
使用LSTM捕獲和刻畫短期行為數據中的全局時序依賴

Multi-Head Attention:

User Attention層
對於不同的用戶,即使是相似的商品集合,用戶在偏好方面也可能有所不同。因此使用User Attention層去捕獲更細粒度的用戶偏好。使用用戶的embedding(eu)作為attention的query。

\[\alpha_{k}=\frac{\exp \left(\hat{h}\_{k}^{u T} e_{u}\right)}{\sum_{k=1}^{t} \exp \left(\hat{h}\_{k}^{u T} e_{u}\right)}
\]

\[s_{t}^{u}=\sum_{k=1}^{t} \alpha_{k} \hat{h}\_{k}^{u}
\]

短期行為和長期行為融合:

\[G_{t}^{u}=\operatorname{sigmoid}\left(W^{1} e_{u}+W^{2} s_{t}^{u}+W^{3} p^{u}+b\right)
\]

\[o_t^u=\left(1-G_t^u\right) \odot p^u+G_t^u \odot s_t^u
\]

(線上線下)實驗設計&實驗分析(第4,5,6小節)

數據集:
1)淘寶數據集:8天內行為物品大於40的活躍用戶,但過濾行為超過1000 items的異常用戶+過濾出現5次以下的item+過濾長度小於2的session(訓練階段);前7天做訓練第8天測試;長期行為限制為20;
2)京東數據機:3周訓練1周測試;其餘與淘寶數據機相同;

t1

論文中雖然給了程式碼和數據集鏈接,但具體的數據處理,模型輸入和離線驗證都是基於阿里的ODPS和PAI,所以基本不可復現;只能看DeepMatch中關於movielens數據集復現

實現細節:
1)multi-head attention中頭個數的實驗

t2

p2

2)融合門的實驗

t4

p5

程式碼:
//github.com/alicogintel/SDM
//github.com/shenweichen/DeepMatch

附錄

【1】一文看懂 Attention(本質原理+3大優點+5大類型)
【2】稠密特徵加入CTR預估模型有哪些方法?
【3】一步步解析Attention is All You Need!
【4】使用Excel通俗易懂理解Transformer!
【5】推薦系統遇上深度學習(三十一)–使用自注意力機制進行物品推薦
【6】推薦系統遇上深度學習(四十)-SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORKS.
【7】推薦系統遇上深度學習(四十八)-BST:將Transformer用於淘寶電商推薦
【8】推薦系統遇上深度學習(五十二)-基於注意力機制的用戶行為建模框架ATRank
【9】推薦系統遇上深度學習(五十八)-基於「翻譯」的序列推薦方法
【10】推薦系統遇上深度學習(六十一)-[阿里]使用Bert來進行序列推薦
【11】推薦系統遇上深度學習(六十三)-[阿里]大型推薦系統中的深度序列匹配模型SDM
【12】推薦系統遇上深度學習(六十四)-通過自注意力機制來自動學習特徵組合
【13】SDM(Sequential Deep Matching Model)的復現之路
【14】深度學習中的序列模型演變及學習筆記(含RNN/LSTM/GRU/Seq2Seq/Attention機制),智慧推薦演算法演變及學習筆記,數據挖掘比賽/項目全流程介紹!