《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可以並行。
參考文獻:
https://arxiv.org/abs/1706.03762
https://arxiv.org/pdf/1711.02132.pdf
詳解深度學習中的 Normalization,不只是BN(2)
推薦閱讀:
※關於語音交互的不得不知的技術知識
※TextGAN 代碼閱讀筆記
※Learning to Skim Text 閱讀筆記
※第二節 自然語言處理的框架與流程
※Relation Extraction: Perspective from Convolutional Neural Networks