<Attention is All You Need>閱讀筆記
來自專欄 nlp相關論文筆記
來源:NIPS 2017
寫在前面:
- 畢竟Google的文章,影響力就是大,這篇雖然有刻意attention的嫌疑,但是讀了之後還是很多收穫的。
- 用attention搭建了整個seq2seq模型框架,且沒用RNN和CNN。文中基本上全是self-attention,即Query=Keys=Values,例如輸入一個句子,那麼裡面的每個詞都要和該句子中的所有詞進行 Attention 計算,目的是學習句子內部的詞依賴關係,捕獲句子的內部結構。也用了很多trick,比如ResNet,Layer Norm,dropout等等。
- RNN有一個很重要的優點就是可以捕獲位置信息,單純的attention是沒有這個能力的。所以作者用了一個很機智的Positional Embedding來補充位置信息,positional encoding的每一個維度都對應了一個正弦曲線,波長區間為2π~10000×2π,作者認為這種方法可以使模型更容易去學著attend相關的position。
- 文章專門開了一節來講Why Self-Attention。
Why Self-Attention
- 每層的複雜度。由上表可以看出,如果輸入序列的長度 n 小於維度 d 的話,Self-Attention 有優勢。而n大於d的時候,作者提出了一種Self-Attention(restricted),即只計算當期詞附近r個詞的attention,但此時maximum path length也會增大,這就要視具體情況取捨了。
- 是否可以並行計算。RNN的輸出直接依賴於前一時刻,所以複雜度與句長正相關。Self-Attention 和 CNN 一樣不依賴於前一時刻的計算,可以很好的並行,優於 RNN。
- 網路中長距離依賴的路徑長度。由於 Self-Attention 是每個詞和所有詞都要計算 Attention,所以不管他們中間有多長距離,最大的路徑長度也都只是 1,可以捕獲長距離依賴關係。Self-Attention(restricted)只計算附近r個詞的attention,所以長距離依賴的路徑長度增大。
Model Architecture
大部分自然語言轉換模型都是encoder-decoder結構,借用張俊林博士的引入attention機制的encoder-decoder結構圖。
本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重係數。現在來看看本文Transformer的結構圖
Encoder由N=6個相同的layer組成,每個layer有兩個sub-layer,一個multi-head self-attention和一個position-wise FFN,再加上殘差連接和LayerNorm,所以每個sub-layer的輸出都是LayerNorm(x + Sublayer(x))。
Decoder與Encoder不同的地方在於每個layer多了一個multi-head attention sub-layer,這個子層作用於encoder的輸出(從圖中也可以看到,Q和K的箭頭都來於encoder的輸出),且細心的讀者可以發現第一個sub-layer多了個Masked,這就是為了防止輸出會從後面的序列中獲取信息:第i個位置的輸出只能依賴於已知的i以前的輸出。
Attention
Transformer的主要組成部分就是這個多頭Attention,先直接上圖
Scaled Dot-Product Attention實際上就是點積計算權重,不同之處就是除了個值,尺度變換是為了防止dot products量綱過大,導致softmax的梯度極小,導致訓練不穩定,這個根號dk就是所謂的scaled,本質上還是dot product。
本文用的self-attention主要包括三種:
- encoder自身的self-attention,Q K V均來自於上一層輸出,當前層的每個position可以attend到上一層的所有位置。
- deocder自身的self-attention,與1類似,除了採用 0-1mask 消除右側單詞對當前單詞 attention 的影響。
- encoder-decoder attention,Query來自decoder內部的上一層,K和V均來自於encoder的輸出。這一步操作模擬了傳統機器翻譯中的attention過程(信息的交互)。
Multi-Head Attention
這個實際上就是把Q,K,V分成h部分同時進行Scaled Dot-Product Attention,然後把結果拼接起來,分成h部分是在embedding維度上進行的,比如Q的embedding維度為512,h=8的話,那麼分成h部分之後就變成64了。文中說這個方法可以讓模型從不同的表示子空間中獲取信息。
不共享參數。
Positional Encoding
在前面講了,這裡放公式好了,pos是位置,i是第i個維度。
Generation具體的生成過程 @孫建東 孫建東:從《Convolutional Sequence to Sequence Learning》到《Attention Is All You Need》最後來看一下具體的生成過程。首先,將輸入的序列通過word embedding,得到一個的矩陣,然後將其於position encoding矩陣相加,就得到了encoder的輸入。此時,該輸入被同時當作Q,K,V送入到multi-head attention中。經過運算,得到head 的,然後,將其分別通過scaled dot-product attention,將結果進行連接,就得到了multi-head attention的輸出結果(在本文中直接使用的是,所以這個結果與輸入相同,都是維的;如果不同的話,也可以使用一個線性變換將其轉換成維的)。
得到multi-head attention所輸出的維矩陣之後,需要通過一個 Position-wise Feed-Forward Networks。此時我們發現,該網路的輸入大小是可變的,也就是說,我們不能使用一個的權值矩陣去處理這個輸入。此時,作者想到了一個解決方案,那就是position-wise。也就是說,Position-wise Feed-Forward Networks其實是獨立作用在輸入矩陣的每一列上的(separately and identically),其輸入與輸出都是維的向量。經過如此的N層之後,我們就可以得到encoder的最終輸出了,顯然,它也是一個的矩陣。此時,decoder就可以開始生成過程了。生成過程將encoder的輸出作為key和value,將之前生成的詞(經過相應的embedding與position encoding)通過一個Masked Multi-Head Attention之後的結果作為query,然後與encoder一樣,進行N層處理+Linear(此處應當有一個維度變換的過程,原文中沒有做具體說明)+softmax之後就可以得到當前生成的詞了。推薦閱讀:
TAG:自然語言處理 | 深度學習DeepLearning | 機器學習 |