Transformer 詳解


感謝:

https://blog.csdn.net/longxinchen_ml/article/details/86533005(此篇解釋的更詳細,本篇自愧不如)

https://www.jianshu.com/p/04b6dd396d62

 

 

Transformer模型由《Attention is all your need》論文中提出,在seq2seq中應用,該模型在Machine Translation任務中表現很好。

動機

常見的seq2seq問題,比如摘要提取,機器翻譯等大部分采用的都是encoder-decoder模型。而實現encoder-decoder模型主要有RNN和CNN兩種實現;

CNN

cnn 通過進行卷積,來實現對輸入數據的特征提取,不同的卷積核對應於不同的特征,通過CNN的層級鏈接實現對目標從局部到整體的感知。

 

CNN主要用在圖像領域,nlp里也有應用,但是不是主流。
cnn很成熟,也有一些缺陷,比如學習一句話中任意兩個詞語的關系時,需要多層來實現,這樣關系的學習需要對數次

 

RNN

深度學習最早在cnn上實現了大躍進,但是在一些場景下,比如系統的輸出和系統之前的狀態也有關系,這就需要網絡有一定的記憶功能,這時引入了RNN。RNN在進行預測時,會將系統的歷史狀態也作為一個輸入參與,從而實現利用歷史信息進行預測。
RNN 擅長處理變長序列, 在nlp中用的較多。

 

 

 

但是rnn也存在一些問題

  • 訓練和預測數據依次送入模型,並行化難度大
  • 長程依賴雖然通過lstm等有所解決,但是還是不夠。
  • 對於層次化信息的效果建模不佳

核心問題

針對rnn和cnn的缺陷,怎么解決這些問題呢?(問題如下)

  • 並行化
  • 提升長程依賴的學習能力
  • 層次化建模

Transformer結構

針對於上面rnn和cnn的問題,google的人提出了一種新的網絡結構用來解決他們的問題。

 
在上圖的下面部分,訓練用的輸入和輸出數據的embedding,都會先加上一個position encoding來補充一下位置信息。
  • encoder
    途中左側部分是encoder塊,encoder中6層相同結構堆疊而成,在每層中又可以分為2個子層,底下一層是multihead self-attention層,上面是一個FC feed-forward層,每一個子層都有residual connection,,然后在進行Layer Normalization. 為了引入redisual connenction簡化計算,每個層的輸入維數和embedding層保持一致。
  • decoder
    同樣是一個6層的堆疊,每層有三個子層,其中底下兩層都是multihead self-attention層,最底下一層是有mask的,只有當前位置之前的輸入有效,中間層是encode和decode的連接層,輸出的self-attention層和輸入的encoder輸出同時作為MSA的輸入,實現encoder和decoder的連接,最上層和encoder的最上層是一樣的,不在單說,每個子層都有有residual connection,和Layer Normalization

亮點

self-Attention

傳統的encoder-decoder實現

 


傳統的編解碼結構中,將輸入輸入編碼為一個定長語義編碼,然后通過這個編碼在生成對應的輸出序列。它存在的一個問題在於:輸入序列不論長短都會被編碼成一個固定長度的向量表示,而解碼則受限於該固定長度的向量表示。
針對這個問題,《NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE》這個論文引入了attenion。他的網絡結構和傳統的區別在與,encoder的輸出不是一個語義向量,是一個語義向量的序列,然后在解碼階段,會有選擇的從向量序列中選擇一個子集,這個子集怎么選取,子集元素占比的多少就是attention解決的問題。
 

 

 

 

Attention本質可以被描述為一個查詢(query)到一系列(鍵key-值value)對的映射,如下圖

 

 


在計算attention時主要分為三步,第一步是將query和每個key進行相似度計算得到權重,常用的相似度函數有點積,拼接,感知機等;然后第二步一般是使用一個softmax函數對這些權重進行歸一化;最后將權重和相應的鍵值value進行加權求和得到最后的attention。目前在NLP研究中,key和value常常都是同一個,即key=value。
 

 


但是在Transformer的Attenion函數稱為scaled dot-Product Attention,
 

 


是在點積attension的基礎上除了一個 √d k.論文中提到點積和Additive Attension的復雜度差不多,但是借助於優化的Matrix乘法,dot-Product在內存占用和運行速度上更優。之所以引入 √d k, 論文認為如果 key的維數 d k 特別大的話,那么有可能點積有可能變的很大,導致后面的softmax函數進入一個梯度很小的范圍,不利於訓練。

 

MultiHead Attention

上面討論了Transformer中的Attentioin的原理,但是會有一個問題,就是計算時會分為兩個階段,第一個階段計算出softmax部分,第二部分是在乘以 Value部分,這樣還是串行化的,並行化不夠。

 

 

論文中采用MultiHeadAttention,對query,key,value各自進行一次不同的線性變換,然后在執行一次softmax操作,這樣可以提升並行度,論文中的head數是8個。
同時不同的head學習到詞語間的不同關系
 

 

 

position Encoding

語言是有序的,在cnn中,卷積的形狀包含了位置信息,在rnn中,位置的先后順序其實是通過送入模型的先后來保證。transformer拋棄了cnn和rnn,那么數據的位置信息怎么提供呢?
Transformer通過position Encoding來額外的提供位置信息,每一個位置對應一個向量,這個向量和word embedding求和后作為 encoder和decoder的輸入。這樣,對於同一個詞語來說,在不同的位置,他們送入encoder和decoder的向量不同。
Transformer中的

PE(pos,2i) = sin(pos / 100002i/dmodel )

PE(pos,2i+i) = cos(pos / 100002i/dmodel )

總結一下

  • 最后在看一下整個Transformer
     

     

  • 整體的訓練過程
     

     


    self-attension的一個效果

     

  • 從效果上來看it在兩個很相似的句子中,能夠發現自己和不同的詞語關系的變化。




免責聲明!

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



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