詳解Transformer (論文Attention Is All You Need)


論文地址:https://arxiv.org/abs/1706.03762

正如論文的題目所說的,Transformer中拋棄了傳統的CNN和RNN,整個網絡結構完全是由Attention機制組成。更准確地講,Transformer由且僅由self-Attenion和Feed Forward Neural Network組成。一個基於Transformer的可訓練的神經網絡可以通過堆疊Transformer的形式進行搭建,作者的實驗是通過搭建編碼器和解碼器各6層,總共12層的Encoder-Decoder,並在機器翻譯中取得了BLEU值得新高。

作者采用Attention機制的原因是考慮到RNN(或者LSTM,GRU等)的計算限制為是順序的,也就是說RNN相關算法只能從左向右依次計算或者從右向左依次計算,這種機制帶來了兩個問題:

  1. 時間片 t 的計算依賴 t-1 時刻的計算結果,這樣限制了模型的並行能力;
  2. 順序計算的過程中信息會丟失,盡管LSTM等門機制的結構一定程度上緩解了長期依賴的問題,但是對於特別長期的依賴現象,LSTM依舊無能為力。

Transformer的提出解決了上面兩個問題,首先它使用了Attention機制,將序列中的任意兩個位置之間的距離是縮小為一個常量;其次它不是類似RNN的順序結構,因此具有更好的並行性,符合現有的GPU框架。

1. Transformer 詳解

1.1 高層Transformer

論文中的驗證Transformer的實驗室基於機器翻譯的,下面我們就以機器翻譯為例子詳細剖析Transformer的結構,在機器翻譯中,Transformer可概括為如圖1:

                                                圖1:Transformer用於機器翻譯

Transformer的本質上是一個Encoder-Decoder的結構,那么圖1可以表示為圖2的結構:

                    圖2:Transformer的Encoder-Decoder結構

如論文中所設置的,編碼器由6個編碼block組成,同樣解碼器是6個解碼block組成。與所有的生成模型相同的是,編碼器的輸出會作為解碼器的輸入,如圖3所示:

                圖3:Transformer的Encoder和Decoder均由6個block堆疊而成

我們繼續分析每個encoder的詳細結構:在Transformer的encoder中,數據首先會經過一個叫做‘self-attention’的模塊得到一個加權之后的特征向量 Z ,這個 Z 便是論文公式1中的 \text{Attention}(Q,K,V) :

\text{Attention}(Q,K,V)=\text{softmax}(\frac{QK^T}{\sqrt{d_k}})V \tag1

第一次看到這個公式你可能會一頭霧水,在后面的文章中我們會揭開這個公式背后的實際含義,在這一段暫時將其叫做 Z 。

得到 Z 之后,它會被送到encoder的下一個模塊,即Feed Forward Neural Network。這個全連接有兩層,第一層的激活函數是ReLU,第二層是一個線性激活函數,可以表示為:

\text{FFN}(Z) = max(0, ZW_1 +b_1)W_2 + b_2 \tag2

Encoder的結構如圖4所示:

           圖4:Transformer由self-attention和Feed Forward neural network組成

Decoder的結構如圖5所示,它和encoder的不同之處在於Decoder多了一個Encoder-Decoder Attention,兩個Attention分別用於計算輸入和輸出的權值:

  1. Self-Attention:當前翻譯和已經翻譯的前文之間的關系;
  2. Encoder-Decnoder Attention:當前翻譯和編碼的特征向量之間的關系。

      圖5:Transformer的解碼器由self-attention,encoder-decoder attention以及FFNN組成

1.2 輸入編碼

1.1節介紹的就是Transformer的主要框架,下面我們將介紹它的輸入數據。如圖6所示,首先通過Word2Vec等詞嵌入方法將輸入語料轉化成特征向量,論文中使用的詞嵌入的維度為 d_{model}=512 。

 

                                              圖6:單詞的輸入編碼

在最底層的block中, x 將直接作為Transformer的輸入,而在其他層中,輸入則是上一個block的輸出。為了畫圖更簡單,我們使用更簡單的例子來表示接下來的過程,如圖7所示:

                                        圖7:輸入編碼作為一個tensor輸入到encoder中

1.3 Self-Attention

Self-Attention是Transformer最核心的內容,然而作者並沒有詳細講解,下面我們來補充一下作者遺漏的地方。回想Bahdanau等人提出的用Attention,其核心內容是為輸入向量的每個單詞學習一個權重,例如在下面的例子中我們判斷it代指的內容,

The animal didn't cross the street because it was too tired 

通過加權之后可以得到類似圖8的加權情況,在講解self-attention的時候我們也會使用圖8類似的表示方式

             圖8:經典Attention可視化示例圖

在self-attention中,每個單詞有3個不同的向量,它們分別是Query向量( Q ),Key向量( K )和Value向量( V ),長度均是64。它們是通過3個不同的權值矩陣由嵌入向量 X 乘以三個不同的權值矩陣 W^Q , W^K , W^V 得到,其中三個矩陣的尺寸也是相同的。均是 512\times 64 。

                                          圖9:Q,K,V的計算示例圖

那么Query,Key,Value是什么意思呢?它們在Attention的計算中扮演着什么角色呢?我們先看一下Attention的計算方法,整個過程可以分成7步:

  1. 如上文,將輸入單詞轉化成嵌入向量;
  2. 根據嵌入向量得到 q , k , v 三個向量;
  3. 為每個向量計算一個score: \text{score} = q \cdot k ;
  4. 為了梯度的穩定,Transformer使用了score歸一化,即除以 \sqrt{d_k} ;
  5. 對score施以softmax激活函數;
  6. softmax點乘Value值 v ,得到加權的每個輸入向量的評分 v ;
  7. 相加之后得到最終的輸出結果 z : z=\sum v 。

上面步驟的可以表示為圖10的形式。

                                 圖10:Self-Attention計算示例圖

實際計算過程中是采用基於矩陣的計算方式,那么論文中的 Q , V , K 的計算方式如圖11:

                     圖11:Q,V,K的矩陣表示

圖10總結為如圖12所示的矩陣形式:

                                      圖12:Self-Attention的矩陣表示

在self-attention需要強調的最后一點是其采用了殘差網絡 [5]中的short-cut結構,目的當然是解決深度學習中的退化問題,得到的最終結果如圖13。

                        圖13:Self-Attention中的short-cut連接

1.3 Multi-Head Attention

Multi-Head Attention相當於 h 個不同的self-attention的集成(ensemble),在這里我們以 h=8 舉例說明。Multi-Head Attention的輸出分成3步:

  1. 將數據 X 分別輸入到圖13所示的8個self-attention中,得到8個加權后的特征矩陣 Z_i, i\in\{1,2,...,8\} 。
  2. 將8個 Z_i 按列拼成一個大的特征矩陣;
  3. 特征矩陣經過一層全連接后得到輸出 Z 。

整個過程如圖14所示:

                                                  圖14:Multi-Head Attention

同self-attention一樣,multi-head attention也加入了short-cut機制。

1.4 Encoder-Decoder Attention

在解碼器中,Transformer block比編碼器中多了個encoder-cecoder attention。在encoder-decoder attention中, Q 來之與解碼器的上一個輸出, K 和 V 則來自於與編碼器的輸出。其計算方式完全和圖10的過程相同。由於在機器翻譯中,解碼過程是一個順序操作的過程,也就是當解碼第 k 個特征向量時,我們只能看到第 k-1 及其之前的解碼結果,論文中把這種情況下的multi-head attention叫做masked multi-head attention。

1.5 損失層

解碼器解碼之后,解碼的特征向量經過一層激活函數為softmax的全連接層之后得到反映每個單詞概率的輸出向量。此時我們便可以通過CTC等損失函數訓練模型了。

而一個完整可訓練的網絡結構便是encoder和decoder的堆疊(各 N 個, N=6 ),我們可以得到圖15中的完整的Transformer的結構(即論文中的圖1):

              圖15:Transformer的完整結構圖

2. 位置編碼

截止目前為止,我們介紹的Transformer模型並沒有捕捉順序序列的能力,也就是說無論句子的結構怎么打亂,Transformer都會得到類似的結果。換句話說,Transformer只是一個功能更強大的詞袋模型而已。

為了解決這個問題,論文中在編碼詞向量時引入了位置編碼(Position Embedding)的特征。具體地說,位置編碼會在詞向量中加入了單詞的位置信息,這樣Transformer就能區分不同位置的單詞了。

那么怎么編碼這個位置信息呢?常見的模式有:a. 根據數據學習;b. 自己設計編碼規則。在這里作者采用了第二種方式。那么這個位置編碼該是什么樣子呢?通常位置編碼是一個長度為 d_{model}的特征向量,這樣便於和詞向量進行單位加的操作,如圖16。

                                            圖16:Position Embedding

論文給出的編碼公式如下:

PE(pos, 2i) = sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}}) \tag3

PE(pos, 2i+1) = cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}}) \tag4

在上式中, pos 表示單詞的位置, i 表示單詞的維度。

作者這么設計的原因是考慮到在NLP任務重,除了單詞的絕對位置,單詞的相對位置也非常重要。根據公式 sin(\alpha+\beta) = sin \alpha cos \beta + cos \alpha sin\beta 以及cos(\alpha + \beta) = cos \alpha cos \beta - sin \alpha sin\beta ,這表明位置 k+p 的位置向量可以表示為位置 k 的特征向量的線性變化,這為模型捕捉單詞之間的相對位置關系提供了非常大的便利。

3. 總結

優點:(1)雖然Transformer最終也沒有逃脫傳統學習的套路,Transformer也只是一個全連接(或者是一維卷積)加Attention的結合體。但是其設計已經足夠有創新,因為其拋棄了在NLP中最根本的RNN或者CNN並且取得了非常不錯的效果,算法的設計非常精彩,值得每個深度學習的相關人員仔細研究和品位。(2)Transformer的設計最大的帶來性能提升的關鍵是將任意兩個單詞的距離是1,這對解決NLP中棘手的長期依賴問題是非常有效的。(3)Transformer不僅僅可以應用在NLP的機器翻譯領域,甚至可以不局限於NLP領域,是非常有科研潛力的一個方向。(4)算法的並行性非常好,符合目前的硬件(主要指GPU)環境。

缺點:(1)粗暴的拋棄RNN和CNN雖然非常炫技,但是它也使模型喪失了捕捉局部特征的能力,RNN + CNN + Transformer的結合可能會帶來更好的效果。(2)Transformer失去的位置信息其實在NLP中非常重要,而論文中在特征向量中加入Position Embedding也只是一個權宜之計,並沒有改變Transformer結構上的固有缺陷。

 

轉自:https://blog.csdn.net/yangdelong/article/details/85071072


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM