《attention is all you need》解讀

Motivation:

  • 靠attention機制,不使用rnn和cnn,並行度高

創新點:

  • 提出self-attention,自己和自己做attention,使得每個詞都有全局的語義信息(長依賴)
  • 提出multi-head attention,可以看成attention的ensemble版本,不同head學習不同的子空間語義。

attention表示成k、q、v的方式:

傳統的attention(sequence2sequence問題):

上下文context表示成如下的方式(h的加權平均):

那麼權重alpha(attention weight)可表示成Q和K的乘積,小h即V(下圖中很清楚的看出,Q是大H,K和V是小h):

上述可以做個變種,就是K和V不想等,但需要一一對應,例如:

  • V=h+x_embedding
  • Q = H
  • k=h

乘法VS加法attention

加法注意力:

還是以傳統的RNN的seq2seq問題為例子,加性注意力是最經典的注意力機制,它使用了有一個隱藏層的前饋網路(全連接)來計算注意力分配:

乘法注意力:

就是常見的用乘法來計算attention score:

乘法注意力不用使用一個全連接層,所以空間複雜度佔優;另外由於乘法可以使用優化的矩陣乘法運算,所以計算上也一般佔優。

論文中的乘法注意力除了一個scale factor:

論文中指出當dk比較小的時候,乘法注意力和加法注意力效果差不多;但當d_k比較大的時候,如果不使用scale factor,則加法注意力要好一些,因為乘法結果會比較大,容易進入softmax函數的「飽和區」,梯度較小。

self-attention

以一般的RNN的S2S為例子,一般的attention的Q來自Decoder(如下圖中的大H),K和V來自Encoder(如下圖中的小h)。self-attention就是attention的K、Q、V都來自encoder或者decoder,使得每個位置的表示都具有全局的語義信息,有利於建立長依賴關係。

Layer normalization(LN)

batch normalization是對一個每一個節點,針對一個batch,做一次normalization,即縱向的normalization:

layer normalization(LN),是對一個樣本,同一個層網路的所有神經元做normalization,不設計到batch的概念,即橫向normalization:

bn適用於不同mini batch數據分布差異不大的情況,而且bn需要開劈變數存每個節點的均值和方差,空間消耗略大;而且 bn適用於mini_batch的場景。

ln只需要一個樣本就可以做normalization,可以避免 BN 中受 mini-batch 數據分布影響的問題,也不需要開闢空間存每個節點的均值和方差。

但是,BN 的轉換是針對單個神經元可訓練的——不同神經元的輸入經過再平移和再縮放後分布在不同的區間,而 LN 對於一整層的神經元訓練得到同一個轉換——所有的輸入都在同一個區間範圍內。如果不同輸入特徵不屬於相似的類別(比如顏色和大小),那麼 LN 的處理可能會降低模型的表達能力。

encoder:

  • 輸入:和conv s2s類似,詞向量加上了positional embedding,即給位置1,2,3,4...n等編碼(也用一個embedding表示)。然後在編碼的時候可以使用正弦和餘弦函數,使得位置編碼具有周期性,並且有很好的表示相對位置的關係的特性(對於任意的偏移量k,PE[pos+k]可以由PE[pos]表示):

  • 輸入的序列長度是n,embedding維度是d,所以輸入是n*d的矩陣
  • N=6,6個重複一樣的結構,由兩個子層組成:
    • 子層1:
      • Multi-head self-attention
      • 殘餘連接和LN:
        • Output = LN (x+sublayer(x))

    • 子層2:
      • Position-wise fc層(跟卷積很像)
      • 對n*d的矩陣的每一行進行操作(相當於把矩陣每一行鋪平,接一個FC),同一層的不同行FC層用一樣的參數,不同層用不同的參數(對於全連接的節點數目,先從512變大為2048,再縮小為512):

  • 整個encoder的輸出也是n*d的矩陣

decoder:

?輸入:假設已經翻譯出k個詞,向量維度還是d

?同樣使用N=6個重複的層,依然使用殘餘連接和LN

?3個子層,比encoder多一個attention層,是Decoder端去attend encoder端的信息的層:

  • Sub-L1:

    self-attention,同encoder,但要Mask掉未來的信息,得到k*d的矩陣

  • Sub-L2:和encoder做attention的層,輸出k*d的矩陣
  • Sub-L3:全連接層,輸出k*d的矩陣,用第k行去預測輸出y

mutli-head attention:

MultiHead可以看成是一種ensemble方式,獲取不同子空間的語義:

獲取每個子任務的Q、K、V:

  • 通過全連接進行線性變換映射成多個Q、K、V,線性映射得到的結果維度可以不變、也可以減少(類似降維)
  • 或者通過Split對Q、K、V進行劃分(分段)

如果採用線性映射的方式,使得維度降低;或者通過split的方式使得維度降低,那麼多個head做attention合併起來的複雜度和原來一個head做attention的複雜度不會差多少,而且多個head之間做attention可以並行。

參考文獻:

arxiv.org/abs/1706.0376

arxiv.org/pdf/1711.0213

詳解深度學習中的 Normalization,不只是BN(2)


推薦閱讀:

關於語音交互的不得不知的技術知識
TextGAN 代碼閱讀筆記
Learning to Skim Text 閱讀筆記
第二節 自然語言處理的框架與流程
Relation Extraction: Perspective from Convolutional Neural Networks

TAG:機器學習 | 自然語言處理 | 機器翻譯 |