Rethinking self-attention
self-attention機制隨著Transformer的誕生可謂是火遍了NLP領域,它的優點是在不依賴外部信息的情況下依然可以對序列計算attention,進而得到效果不錯的序列編碼。
追溯下歷史,self-attention在2017 ICLR論文<A Structured Self-Attentive Sentence Embedding>中被提出。今天重讀此論文時,心中卻多了一份困惑,故作此文,希望與大家分享,以求解答。
先來看什麼是attention機制,目前大家普遍接受Transformer給出的定義方式:
query q和Key-Value中的每個key進行某種角度/距離計算,這樣每個key都有一個相應的attention數值,可以看作和q的相似度,然後對所有attention數值進行softmax計算,這個值就是value的權重,最後對所有value進行線性加權,得到最後的結果。
如果q恰好來自Key-Value,那麼就成了self-attention。目前大多數的self-attention應用場景(比如句子的encoding)中q和Key相同。所以可以寫成
可以看到,self-attention的核心思想就是Key-Value中key之間進行attention計算,得到各種互信息。
ok,再來看論文<A Structured Self-Attentive Sentence Embedding>是如何定義self-attention的,先說下論文的背景,為了得到句子的embedding,一般做法是用RNN/CNN處理句子,以RNN為例,將RNN每個時刻的隱狀態向量進行簡單的sum或average,得到的結果作為句子embedding。論文認為這種方法太簡單,效果未必很好,於是提出了self-attention來代替簡單的sum/average/max-pooling等方法,期望得到語義豐富的句子embedding。論文中以biLSTM為例,結合self-attention,論證新方法的效果。
假設句子長度為 ,LSTM隱狀態向量維度 ,由於是biLSTM,將兩個方向的隱狀態向量進行concat,得到 維度的隱向量,用 表示:
然後為每個 計算一個權重值,最後對所有 進行線性加權,就得到了句子embedding。如果計算 的權重值呢?
其中 , ,
不難看出, 就是一層全連接,後面跟著一層softmax。
問題來了,這裡涉及兩次維度變換( ), 是對每個 進行線性變換,維度從 ,壓根沒有考慮 與 之間的關係, 也是對降維後的 進行線性變換,維度由 ,也沒有考慮 與 之間的關係。那"self-attention"從何談起呢???
其實這裡的"self-attention"就是Transformer裏提到的position-wise feed-forward network!