直觀理解
先來看一個翻譯的例子“I arrived at the bank after crossing the river” 這里面的bank指的是銀行還是河岸呢,這就需要我們聯系上下文,當我們看到river之后就應該知道這里bank很大概率指的是河岸。在RNN中我們就需要一步步的順序處理從bank到river的所有詞語,而當它們相距較遠時RNN的效果常常較差,且由於其順序性處理效率也較低。Self-Attention則利用了Attention機制,計算每個單詞與其他所有單詞之間的關聯,在這句話里,當翻譯bank一詞時,river一詞就有較高的Attention score。利用這些Attention score就可以得到一個加權的表示,然后再放到一個前饋神經網絡中得到新的表示,這一表示很好的考慮到上下文的信息。encoder讀入輸入數據,利用層層疊加的Self-Attention機制對每一個詞得到新的考慮了上下文信息的表征。Decoder也利用類似的Self-Attention機制,但它不僅僅看之前產生的輸出的文字,而且還要attend encoder的輸出。
循環神經網絡具有如下問題:
- 順序計算,限制了並行能力
- 對於特別長期的依賴,LSTM依舊無能為力
基本原理
基本結構
放縮點積attention(scaled dot-Product attention)
對於self-attention來講,Q(Query), K(Key), V(Value)三個矩陣均來自同一輸入,首先我們要計算Q與K之間的點乘,然后為了防止其結果過大,會除以一個尺度標度\(\sqrt{d_k}\),其中\(d_k\)為一個query和key向量的維度。再利用Softmax操作將其結果歸一化為概率分布,然后再乘以矩陣V就得到權重求和的表示
假如我們要翻譯一個詞組Thinking Machines,其中Thinking的輸入的embedding vector用 \(x_1\)表示,Machines的embedding vector用\(x_2\)表示。
當我們處理Thinking這個詞時,我們需要計算句子中所有詞與它的Attention Score,這就像將當前詞作為搜索的query,去和句子中所有詞(包含該詞本身)的key去匹配,看看相關度有多高。我們用\(q_1\)代表Thinking對應的query vector,\(k_1\)及\(k_2\)分別代表Thinking以及Machines對應的key vector,則計算Thinking的attention score的時候我們需要計算\(q_1\)與\(k_1\),\(k_2\)的點乘,同理,我們計算Machines的attention score的時候需要計算\(q_2\)與\(k_1\),\(k_2\)的點乘。如上圖中所示我們分別得到了\(q_1\)與\(k_1\),\(k_2\)的點乘積,然后我們進行尺度縮放與softmax歸一化,如下圖所示:
顯然,當前單詞與其自身的attention score一般最大,其他單詞根據與當前單詞重要程度有相應的score。然后我們在用這些attention score與value vector相乘,得到加權的向量。
如果將輸入的所有向量合並為矩陣形式,則所有query, key, value向量也可以合並為矩陣形式表示
其中\(W^Q, W^K, W^V\)是我們模型訓練過程學習到的合適的參數(也就是說,\(Key,Value,Query\)都是學習來的)。上述操作即可簡化為矩陣形式
Multihead Attention
multihead就是我們可以有不同的Q,K,V表示,最后再將其結果結合起來,如下圖所示:
這就是基本的Multihead Attention單元,對於encoder來說就是利用這些基本單元疊加,其中key, query, value均來自前一層encoder的輸出,即encoder的每個位置都可以注意到之前一層encoder的所有位置
Decoder部分
上圖是Transformer整體架構圖。左框是encoder,右框是decoder。對於decoder來講,我們注意到有兩個與encoder不同的地方,一個是第一級的Masked Multi-head,另一個是第二級的Multi-Head Attention不僅接受來自前一級的輸出,還要接收encoder的輸出,下面分別解釋一下是什么原理。
第一級decoder的key, query, value均來自前一層decoder的輸出,但加入了Mask操作,即我們只能attend到前面已經翻譯過的輸出的詞語,因為翻譯過程我們當前還並不知道下一個輸出詞語,這是我們之后才會推測到的。
而第二級decoder也被稱作encoder-decoder attention layer,即它的query來自於之前一級的decoder層的輸出,但其key和value來自於encoder的輸出,這使得decoder的每一個位置都可以attend到輸入序列的每一個位置。
總結一下,k和v的來源總是相同的,q在encoder及第一級decoder中與k,v來源相同,在encoder-decoder attention layer中與k,v來源不同。
其他細節
Position Encoding
注意由於該模型沒有recurrence或convolution操作,所以沒有明確的關於單詞在源句子中位置的相對或絕對的信息,為了更好的讓模型學習位置信息,所以添加了position encoding並將其疊加在word embedding上。該論文中選取了三角函數的encoding方式,其他方式也可以。
Add & Norm
其中Add代表了Residual Connection,是為了解決多層神經網絡訓練困難的問題,通過將前一層的信息無差的傳遞到下一層,可以有效的僅關注差異部分,這一方法之前在圖像處理結構如ResNet等中常常用到
而Norm則代表了Layer Normalization,通過對層的激活值的歸一化,可以加速模型的訓練過程,使其更快的收斂