論文地址: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相關算法只能從左向右依次計算或者從右向左依次計算,這種機制帶來了兩個問題:
- 時間片
的計算依賴
時刻的計算結果,這樣限制了模型的並行能力;
- 順序計算的過程中信息會丟失,盡管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’的模塊得到一個加權之后的特征向量 ,這個
便是論文公式1中的
:
第一次看到這個公式你可能會一頭霧水,在后面的文章中我們會揭開這個公式背后的實際含義,在這一段暫時將其叫做 。
得到 之后,它會被送到encoder的下一個模塊,即Feed Forward Neural Network。這個全連接有兩層,第一層的激活函數是ReLU,第二層是一個線性激活函數,可以表示為:
Encoder的結構如圖4所示:
圖4:Transformer由self-attention和Feed Forward neural network組成
Decoder的結構如圖5所示,它和encoder的不同之處在於Decoder多了一個Encoder-Decoder Attention,兩個Attention分別用於計算輸入和輸出的權值:
- Self-Attention:當前翻譯和已經翻譯的前文之間的關系;
- Encoder-Decnoder Attention:當前翻譯和編碼的特征向量之間的關系。
圖5:Transformer的解碼器由self-attention,encoder-decoder attention以及FFNN組成
1.2 輸入編碼
1.1節介紹的就是Transformer的主要框架,下面我們將介紹它的輸入數據。如圖6所示,首先通過Word2Vec等詞嵌入方法將輸入語料轉化成特征向量,論文中使用的詞嵌入的維度為 。
圖6:單詞的輸入編碼
在最底層的block中, 將直接作為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向量( ),Key向量(
)和Value向量(
),長度均是64。它們是通過3個不同的權值矩陣由嵌入向量
乘以三個不同的權值矩陣
,
,
得到,其中三個矩陣的尺寸也是相同的。均是
。
圖9:Q,K,V的計算示例圖
那么Query,Key,Value是什么意思呢?它們在Attention的計算中扮演着什么角色呢?我們先看一下Attention的計算方法,整個過程可以分成7步:
- 如上文,將輸入單詞轉化成嵌入向量;
- 根據嵌入向量得到
,
,
三個向量;
- 為每個向量計算一個score:
;
- 為了梯度的穩定,Transformer使用了score歸一化,即除以
;
- 對score施以softmax激活函數;
- softmax點乘Value值
,得到加權的每個輸入向量的評分
;
- 相加之后得到最終的輸出結果
:
。
上面步驟的可以表示為圖10的形式。
圖10:Self-Attention計算示例圖
實際計算過程中是采用基於矩陣的計算方式,那么論文中的 ,
,
的計算方式如圖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相當於 個不同的self-attention的集成(ensemble),在這里我們以
舉例說明。Multi-Head Attention的輸出分成3步:
- 將數據
分別輸入到圖13所示的8個self-attention中,得到8個加權后的特征矩陣
。
- 將8個
按列拼成一個大的特征矩陣;
- 特征矩陣經過一層全連接后得到輸出
。
整個過程如圖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中, 來之與解碼器的上一個輸出,
和
則來自於與編碼器的輸出。其計算方式完全和圖10的過程相同。由於在機器翻譯中,解碼過程是一個順序操作的過程,也就是當解碼第
個特征向量時,我們只能看到第
及其之前的解碼結果,論文中把這種情況下的multi-head attention叫做masked multi-head attention。
1.5 損失層
解碼器解碼之后,解碼的特征向量經過一層激活函數為softmax的全連接層之后得到反映每個單詞概率的輸出向量。此時我們便可以通過CTC等損失函數訓練模型了。
而一個完整可訓練的網絡結構便是encoder和decoder的堆疊(各 個,
),我們可以得到圖15中的完整的Transformer的結構(即論文中的圖1):
圖15:Transformer的完整結構圖
2. 位置編碼
截止目前為止,我們介紹的Transformer模型並沒有捕捉順序序列的能力,也就是說無論句子的結構怎么打亂,Transformer都會得到類似的結果。換句話說,Transformer只是一個功能更強大的詞袋模型而已。
為了解決這個問題,論文中在編碼詞向量時引入了位置編碼(Position Embedding)的特征。具體地說,位置編碼會在詞向量中加入了單詞的位置信息,這樣Transformer就能區分不同位置的單詞了。
那么怎么編碼這個位置信息呢?常見的模式有:a. 根據數據學習;b. 自己設計編碼規則。在這里作者采用了第二種方式。那么這個位置編碼該是什么樣子呢?通常位置編碼是一個長度為 的特征向量,這樣便於和詞向量進行單位加的操作,如圖16。
圖16:Position Embedding
論文給出的編碼公式如下:
在上式中, 表示單詞的位置,
表示單詞的維度。
作者這么設計的原因是考慮到在NLP任務重,除了單詞的絕對位置,單詞的相對位置也非常重要。根據公式 以及
,這表明位置
的位置向量可以表示為位置
的特征向量的線性變化,這為模型捕捉單詞之間的相對位置關系提供了非常大的便利。
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