感謝:
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很成熟,也有一些缺陷,比如學習一句話中任意兩個詞語的關系時,需要多層來實現,這樣關系的學習需要對數次
RNN
深度學習最早在cnn上實現了大躍進,但是在一些場景下,比如系統的輸出和系統之前的狀態也有關系,這就需要網絡有一定的記憶功能,這時引入了RNN。RNN在進行預測時,會將系統的歷史狀態也作為一個輸入參與,從而實現利用歷史信息進行預測。
RNN 擅長處理變長序列, 在nlp中用的較多。

但是rnn也存在一些問題
- 訓練和預測數據依次送入模型,並行化難度大
- 長程依賴雖然通過lstm等有所解決,但是還是不夠。
- 對於層次化信息的效果建模不佳
核心問題
針對rnn和cnn的缺陷,怎么解決這些問題呢?(問題如下)
- 並行化
- 提升長程依賴的學習能力
- 層次化建模
Transformer結構
針對於上面rnn和cnn的問題,google的人提出了一種新的網絡結構用來解決他們的問題。

- 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部分,這樣還是串行化的,並行化不夠。

同時不同的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在兩個很相似的句子中,能夠發現自己和不同的詞語關系的變化。