1. 程式人生 > >All you need is attention(Tranformer) --學習筆記

All you need is attention(Tranformer) --學習筆記

1、回顧

傳統的序列到序列的機器翻譯大都利用RNN或CNN來作為encoder-decoder的模型基礎。實際上傳統機器翻譯基於RNN和CNN進行構建模型時,最關鍵一步就是如何編碼這些句子的序列。往往第一步是先將句子進行分詞,然後每個詞轉化為對應的詞向量,那麼每個句子都可以由這些詞向量來構造對應的句子的序列表示向量。
(1)RNN遞迴進行:

yt=f(yt−1,xt)

不管是LSTM、GRU還是SRU,缺點是無法平行計算,速度慢,並且RNN無法特別好地學習到全域性的資訊,仍然無法徹底解決長距離依賴問題。
(2)CNN卷積:
視窗式遍歷,比如卷積核大小為3,那麼它的視窗就是3,可以捕獲:

yt=f(xt−1,xt,xt+1)

諸如其他卷積也一樣可以捕獲到相對應核大小的視窗資訊,還有一種空洞卷積可以使跨度增大但有間隔的方式去捕獲更多的全域性資訊。並且CNN方便並行。

2、Transformer

純注意力機制可以一步到位可以獲得全域性資訊,具體方案:

yt=f(xt,A,B)

在這裡插入圖片描述
上圖結構在原論文中是如下複述的:
Encoder: 編碼器由6個相同的層堆疊在一起,每一層又有兩個支層。第一個支層是一個多頭的內部注意機制,第二個支層是一個簡單的全連線前饋網路。在兩個支層外面都添加了一個residual的連線,然後進行了layer nomalization的操作。模型所有的支層以及embedding層的輸出維度都是dmodel = 512.

備註:
剩餘(residual)連線等同於“跳過連線”。它們被用來允許梯度通過網路直接流動,而不通過非線性啟用函式。非線性啟用函式,本質上是非線性的,導致梯度爆炸或消失(取決於權重)。

跳過連線從概念上形成了一個“匯流排”,它沿著網路向右流動,反過來,梯度也可以沿著它向後流動。

每個網路層的“塊”,如conv層、poolings等,在總線上的某個點上使用值,然後在總線上新增/減去值。這意味著塊確實會影響梯度,反過來也會影響正向輸出值。

現在,用一個直接連線替換其中一個塊。如果你喜歡,可以用一個標識塊替換,或者根本就沒有。這是一個剩餘/跳過連線。實際上,剩餘的conv單元可能是兩個系列單元,中間有一個啟用層。

Decoder: 模型的解碼器也是堆疊了六個相同的層。不過每層除了編碼器中那兩個支層,解碼器還加入了第三個支層,如圖中所示同樣也用了residual以及layer normalization。

3、Attention層

Attention層分成了一下兩種形式:
(1)Multi-Head Attention
在這裡插入圖片描述

在這裡插入圖片描述
Q的維度為ndk,K的維度為mdk,V的維度為mdv。如果忽略softmax,三個矩陣相乘的結果就是一個ndv矩陣。d為每個詞向量的維度,n為詞的個數。

不計softmax,實際上計算得到的是n×dk,dk×m,m×dv三個矩陣相乘的結果,一個n*dv的矩陣。

在這裡可以理解為將ndk的序列Q編碼成了一個新ndv序列。

接softmax結構:
在這裡插入圖片描述

在以上公式中的Q、K、V,分別可以看作是多個query,keys,values分別拼接構成的矩陣,輸出是由帶權的values加起來得到,這裡的權值也就是上面公式中的softmax的結果。

原論文裡面提到scaled的點乘attention,其實目的是為了避免softmax函式內的值過大,導致softmax要不是0要不就是1,顯然不符合常理,所以除以dk\sqrt{d_k}。總結下來就是計算query和所有keys的點乘然後除以dk\sqrt{d_k}得到values的權重,再乘以values,然後對最後得到的多個結果相加即可得到對應的那個query的Attention。

(2)Multi-Head Attention
在這裡插入圖片描述

將Q,K,V通過引數矩陣對映一下,然後再做attention,把整個過程重複做h次:
在這裡插入圖片描述
然後把這h個結果拼接起來再做一次對映:
在這裡插入圖片描述
其中:
在這裡插入圖片描述
在這裡插入圖片描述

4、Self-Attention(內部注意力)

Y=MultiHead(X,X,X)

X為輸入序列。
在具體閱讀理解應用中,Q是篇章的詞向量序列,K=V為問題的詞向量序列。

5、位置Embedding

因為純注意力機制不像CNN和RNN可以把序列順序資訊也考慮進去,在純注意力機制模型裡面不管詞的順序如何,得到的結果都是一樣,這樣顯然不現實,而且語言本身是帶有順序序列資訊的,所以要引入位置的Embedding。

這裡有很多辦法可以引入位置資訊,但是論文中用了以下函式進行位置資訊引入,分別是sin和cos函式。
在這裡插入圖片描述
pos是詞的位置,i是維度,每一個位置維度的編碼對應於正弦值。選擇這兩個函式為了方便模型學習,並且cos與sin提供了一個重要的性質:

sin(α+β)=sinαcosβ+cosαsinβ

以上性質可以表達語言中的相對位置資訊。
意思是將id為pos的位置對映為一個dmodel維的位置向量,這個向量的第i個元素的數值就是PE(pos,2i)。

備註:
位置向量和詞向量的結合可以使用直接相加的方式進行結合,也可以進行拼接,但論文中使用的是直接相加。

6、Position-wise Feed-Forward Networks(前饋網路)

每層裡面除了注意力支層以外,還包含了前饋網路這個支層。

該網路是兩個線性變換,中間加了一個ReLU啟用函式。每個位置(position)上的線性變換是一樣的,但是不同層與層的引數是不一樣的。該網路的輸入和輸出維度都是dmodel =512,不過中間層的維度是2048.
在這裡插入圖片描述

7、模型中Attention的使用

1 在encoder-decoder的attention層,queries來自於之前的decoder層,而keys和values都來自於encoder的輸出。這個類似於很多已經提出的seq-to-seq模型所使用的attention機制。

2 在encoder含有self-attention層。在一個self-attention層中,所有的keys, values以及queries都來自於同一個地方,本例中即encoder之前一層的的輸出。

3 decoder中的self-attention層也是一樣。不同的是在scaled點乘attention操作中加了一個mask的操作(設定為負無窮),這個操作是保證softmax操作之後不會將非法的values連到attention中。如上圖Scaled Dot-Product Attention所示。

8、總結

attention的方式不僅能夠完全並行(訓練階段的encoder和decoder,inference階段的encoder),和facebook的convseq2seq並行方式同理,而且計算量比convseq2seq還低,因為考慮到conv還有一個kernel的寬度k。比RNN既能減少計算量,又能增大並行方式。

文獻中的table:
在這裡插入圖片描述