《attention is all you need》解读
Motivation:
- 靠attention機制,不使用rnn和cnn,并行度高
- 通過attention,抓長距離依賴關(guān)系比rnn強
創(chuàng)新點:
- 通過self-attention,自己和自己做attention,使得每個詞都有全局的語義信息(長依賴
- 由于 Self-Attention 是每個詞和所有詞都要計算 Attention,所以不管他們中間有多長距離,最大的路徑長度也都只是 1。可以捕獲長距離依賴關(guān)系
- 提出multi-head attention,可以看成attention的ensemble版本,不同head學習不同的子空間語義。
attention表示成k、q、v的方式:
傳統(tǒng)的attention(sequence2sequence問題):
上下文context表示成如下的方式(h的加權(quán)平均):
?
那么權(quán)重alpha(attention weight)可表示成Q和K的乘積,小h即V(下圖中很清楚的看出,Q是大H,K和V是小h):
上述可以做個變種,就是K和V不相等,但需要一一對應,例如:
- V=h+x_embedding
- Q = H
- k=h
乘法VS加法attention
加法注意力:
還是以傳統(tǒng)的RNN的seq2seq問題為例子,加性注意力是最經(jīng)典的注意力機制,它使用了有一個隱藏層的前饋網(wǎng)絡(luò)(全連接)來計算注意力分配:
乘法注意力:
就是常見的用乘法來計算attention score:
乘法注意力不用使用一個全連接層,所以空間復雜度占優(yōu);另外由于乘法可以使用優(yōu)化的矩陣乘法運算,所以計算上也一般占優(yōu)。
論文中的乘法注意力除了一個scale factor:
論文中指出當dk比較小的時候,乘法注意力和加法注意力效果差不多;但當d_k比較大的時候,如果不使用scale factor,則加法注意力要好一些,因為乘法結(jié)果會比較大,容易進入softmax函數(shù)的“飽和區(qū)”,梯度較小。
self-attention
以一般的RNN的S2S為例子,一般的attention的Q來自Decoder(如下圖中的大H),K和V來自Encoder(如下圖中的小h)。self-attention就是attention的K、Q、V都來自encoder或者decoder,使得每個位置的表示都具有全局的語義信息,有利于建立長依賴關(guān)系。
Layer normalization(LN)
batch normalization是對一個每一個節(jié)點,針對一個batch,做一次normalization,即縱向的normalization:
layer normalization(LN),是對一個樣本,同一個層網(wǎng)絡(luò)的所有神經(jīng)元做normalization,不涉及到batch的概念,即橫向normalization:
BN適用于不同mini batch數(shù)據(jù)分布差異不大的情況,而且BN需要開辟變量存每個節(jié)點的均值和方差,空間消耗略大;而且 BN適用于有mini_batch的場景。
LN只需要一個樣本就可以做normalization,可以避免 BN 中受 mini-batch 數(shù)據(jù)分布影響的問題,也不需要開辟空間存每個節(jié)點的均值和方差。
但是,BN 的轉(zhuǎn)換是針對單個神經(jīng)元可訓練的——不同神經(jīng)元的輸入經(jīng)過再平移和再縮放后分布在不同的區(qū)間,而 LN 對于一整層的神經(jīng)元訓練得到同一個轉(zhuǎn)換——所有的輸入都在同一個區(qū)間范圍內(nèi)。如果不同輸入特征不屬于相似的類別(比如顏色和大小,scale不一樣),那么 LN 的處理可能會降低模型的表達能力。
encoder:
- 輸入:和conv s2s類似,詞向量加上了positional embedding,即給位置1,2,3,4...n等編碼(也用一個embedding表示)。然后在編碼的時候可以使用正弦和余弦函數(shù),使得位置編碼具有周期性,并且有很好的表示相對位置的關(guān)系的特性(對于任意的偏移量k,PE[pos+k]可以由PE[pos]表示):
- 輸入的序列長度是n,embedding維度是d,所以輸入是n*d的矩陣
- N=6,6個重復一樣的結(jié)構(gòu),由兩個子層組成:
- 子層1:
- Multi-head self-attention
- 殘余連接和LN:
- Output = LN (x+sublayer(x))
- 子層1:
-
- 子層2:
- Position-wise fc層(跟卷積很像)
- 對n*d的矩陣的每一行進行操作(相當于把矩陣每一行鋪平,接一個FC),同一層的不同行FC層用一樣的參數(shù),不同層用不同的參數(shù)(對于全連接的節(jié)點數(shù)目,先從512變大為2048,再縮小為512),這里的max表示使用relu激活函數(shù):
- 子層2:
- 整個encoder的輸出也是n*d的矩陣
decoder:
?輸入:假設(shè)已經(jīng)翻譯出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,線性映射得到的結(jié)果維度可以不變、也可以減少(類似降維)
- 或者通過Split對Q、K、V進行劃分(分段)
如果采用線性映射的方式,使得維度降低;或者通過split的方式使得維度降低,那么多個head做attention合并起來的復雜度和原來一個head做attention的復雜度不會差多少,而且多個head之間做attention可以并行。
總結(jié)
本文提出用attention做翻譯,不用RNN和CNN,attention計算快,并行度高,而且任何兩個詞的距離都是1,抓長距離依賴擅長。但是如果要堆那么多層的話,其實也不見得快到哪里去。
另外,說一些我的經(jīng)驗,不一定放諸四海皆準,僅供參考(我是在語義匹配里的任務的經(jīng)驗,不是翻譯):
- positional encoding一般可以加快收斂,但是對提升效果一般作用微小
- multi-head attention在emb較小時,例如128,一般無效果。但是像原文中的512就可能有用。但是對工業(yè)界的系統(tǒng),emb開不到512,內(nèi)存沒那么大。
- attention和gru一起用,效果會有提升,在匹配任務里,attention替換不了gru,但是attention計算快。
參考文獻:
https://arxiv.org/abs/1706.03762
https://arxiv.org/pdf/1711.02132.pdf
詳解深度學習中的 Normalization,不只是BN(2)
BERT大火卻不懂Transformer?讀這一篇就夠了
總結(jié)
以上是生活随笔為你收集整理的《attention is all you need》解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌BERT预训练源码解析(三):训练过
- 下一篇: Bert系列(二)——源码解读之模型主体