系統學習NLP(二十四)--詳解Transformer (Attention Is All You Need)

轉自:https://zhuanlan.zhihu.com/p/48508221

推薦:http://jalammar.github.io/illustrated-transformer/

前言

注意力(Attention)機制[2]由Bengio團隊與2014年提出並在近年廣泛的應用在深度學習中的各個領域,例如在計算機視覺方向用於捕捉圖像上的感受野,或者NLP中用於定位關鍵token或者特徵。谷歌團隊近期提出的用於生成詞向量的BERT[3]算法在NLP的11項任務中取得了效果的大幅提升,堪稱2018年深度學習領域最振奮人心的消息。而BERT算法的最重要的部分便是本文中提出的Transformer的概念。

正如論文的題目所說的,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框架。論文中給出Transformer的定義是:Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence aligned RNNs or convolution。

遺憾的是,作者的論文比較難懂,尤其是Transformer的結構細節和實現方式並沒有解釋清楚。尤其是論文中的Q,V,K究竟代表什麼意思作者並沒有說明。通過查閱資料,發現了一篇非常優秀的講解Transformer的技術博客[4]。本文中的大量插圖也會從該博客中截取。首先感謝Jay Alammer詳細的講解,其次推薦大家去閱讀原汁原味的文章。

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的輸出,會和每一層的decoder進行結合。

我們繼續分析每個encoder的詳細結構:在Transformer的encoder中,數據首先會經過一個叫做‘self-attention’的模塊得到一個加權之後的特徵向量Z,這個Z便是論文公式1中的attention(q,k,v)

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

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

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等詞嵌入方法將輸入語料轉化成特徵向量,論文中使用的詞嵌入的維度爲512。

 

圖6:單詞的輸入編碼

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

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

1.3 Self-Attention

Self-Attention是Transformer最核心的內容,然而作者並沒有詳細講解,下面我們來補充一下作者遺漏的地方。回想Bahdanau等人提出的用Attention\[2\],其核心內容是爲輸入向量的每個單詞學習一個權重,例如在下面的例子中我們判斷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乘以三個不同的權值矩陣Wq, Wk, Wv得到,其中三個矩陣的尺寸也是相同的。均是512*64。

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

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

  1. 如上文,將輸入單詞轉化成嵌入向量;
  2. 根據嵌入向量得到q,k,v三個向量;
  3. 爲每個向量計算一個score= q*k(其實是相似度) ;
  4. 爲了梯度的穩定,Transformer使用了score歸一化,即除以 sqrt(dk) ;
  5. 對score施以softmax激活函數(其實就是找到相似的Key對應的Querry);
  6. softmax點乘Value值v,得到加權的每個輸入向量的評分v;
  7. 相加之後得到最終的輸出結果z = \sum v 。

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

圖10:Self-Attention計算示例圖

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

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

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

圖12:Self-Attention的矩陣表示

這裏也就是公式1的計算方式。

在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個加權後的特徵矩陣Zi。
  2. 將8個Zi按列拼成一個大的特徵矩陣;
  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. 自己設計編碼規則。在這裏作者採用了第二種方式。那麼這個位置編碼該是什麼樣子呢?通常位置編碼是一個長度爲dmodel的特徵向量,這樣便於和詞向量進行單位加的操作,如圖16。

圖16:Position Embedding

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

 

在上式中,pos表示單詞的位置,i表示單詞的維度。關於位置編碼的實現可在Google開源的算法中get_timing_signal_1d()函數找到對應的代碼。

作者這麼設計的原因是考慮到在NLP任務重,除了單詞的絕對位置,單詞的相對位置也非常重要。根據公式以及,這表明位置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結構上的固有缺陷。

Reference

[1] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need [C]//Advances in Neural Information Processing Systems. 2017: 5998-6008.

[2] Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[J]. arXiv preprint arXiv:1409.0473, 2014.

[3] Devlin J, Chang M W, Lee K, et al. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding[J]. arXiv preprint arXiv:1810.04805, 2018.

[4] http://jalammar.github.io/illustrated-transformer

[5] He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章