Transformer


Transformer是谷歌團隊在2017年提出的一個模型,其舍棄了先前在NLP中使用最廣泛的RNN,全面使用Attention機制最為模型的核心,而Transformer模型是后續bert模型的核心。本文部分參考了台大李宏毅老師的教學視頻

視頻地址:李宏毅老師機器學習視頻

論文地址:《Attention Is All You Need》

Background

圖1 Seq2Seq Model

Transformer是一種典型的Seq2Seq模型(輸入是一個序列,輸出也是一個序列的模型),如圖1是一個Seq2Seq Model的基本結構,由Encoder處理輸入的Sequence,然后丟給Decoder將其處理后產生一個Sequence並輸出,而Transformer的核心機制attention相比於RNN最大的優點就是可並行處理,訓練速度快。

RNN(循環神經網絡)

圖2 Seq2Seq with RNN[李宏毅老師transformer]

如圖2是一個簡單的RNN模型,輸入是由四個向量組成的序列,輸出也是由四個向量組成的序列(但是Seq2Seq不一定都是輸入輸出序列長度相同,也可能有一對多、多對一等)。當輸出\(b^4\)的時候RNN已經將$a^1 $ ~ \(a^4\)的信息都看過了,因此RNN常用來處理序列模型,但是RNN有一個最大的缺點就是不可並行處理,其后一層的信息必須依賴於前一層神經網絡的輸出導致RNN的訓練速度緩慢。

CNN(卷積神經網絡)

而在處理序列模型問題時有人將卷積神經網絡引入來解決RNN不能並行處理的缺點

圖3 Seq2Seq with CNN[李宏毅老師transformer]

通過不同的filter來對輸入向量進行處理,之后將第一層filter的輸出合並送入第二層filter,以此來擴大filter的感受野,使其能看到更多的全局信息,但是這就犧牲了模型的序列處理能力來提高訓練速度。而self-attention機制則完美地解決了這個問題,其既能很好地處理序列信息,又可以被並行計算。

Attention機制

Self-attention

圖4 self-attention and RNN[李宏毅老師transformer]

在transformer中使用的self-attention,而self-attention機制的\(b^1 \to b^4\)可以並行計算出來,而且每個輸出向量也可以看到輸入序列中所有的向量。

圖5 self-attention

圖5中列出的為其中一個輸出向量\(b^1\)的計算方法,其中\(q^i,k^i,v^i\)的計算公式如下:

\[q^i = a^i \times W^q, \quad k^i = a^i \times W^k, \quad v^i = a^i \times W^v \]

首先根據輸入向量序列\(a^1 \to a^4\)計算出各自的\(q^i,k^i,v^i\)向量,用\(q^1\)分別和\(k^1 \to k^4\)做點積求出\(\alpha_{1,1}' \to \alpha_{1,4}'\),之后用\(\alpha_{1,i}'\)分別和\(v^i\)做點積,將四個計算結果相加即求得這一層self-attention layer的第一個輸出向量\(b^1\),其它\(b^2 \to b^4\)的運算方法同\(b^1\)類似。而對於矩陣\(W^q, W^k, W^v\)是神經網絡要學習的參數,可以隨機初始化或者使用其它一些方法初始化,然后通過反向傳播可以不斷對這三個矩陣進行優化。

Mutil-head Self-attention

Mutil-head self-attention是self-attention的一個進階版本,其中mutil-head指的是將\(q,k,v\)三個向量對不同矩陣做運算得到的不同的head,在李宏毅老師的視頻中說不同的head可以理解為從數據中提取不同的特征,而對於翻譯和語音識別在head較多的情況下取得的效果較好,head的數量是一個超參數,需要在具體情況根據需要設置。

圖6 Mutil-head self-attention

如圖6是mutil-head self-attention的計算方法,先由輸入向量\(a^i\)得出向量\(q^i,k^i,v^i\),和\(q^i,k^i,v^i\)的生成方式類似,\(q^{i,1}\)也是將\(q^i\)乘上一個矩陣\(W^{q,1}\)來生成,其它幾個head計算方法類似,而這個矩陣\(W^{q,1}\)也是神經網絡的參數,需要通過反向傳播來優化。需要注意的是,在計算\(b^{i,1}\)的時候,只需要將\(q^{i,1}\)\(k^{i,1},v^{i,1}\)進行計算,而不需要計算\(q^{i,2}\)

圖7 mutil-head self-attention輸出向量轉換

如圖7所示,由mutil-head self-attention生成的兩個向量\(b^{1,1}, b^{1,2}\)通過乘上一個轉換矩陣最后生成輸出向量\(b^1\)

Transformer

介紹完Transformer的核心機制self-attention,之后我們可以介紹Transformer了,其結構如圖8所示,左半部分為transformer的Encoder部分,右半部分為Transformer的Decoder部分。

圖8 Transformer

Encoder

圖9 Encoder

Encoder的結構如圖9所示,首先將Inputs嵌入一個Sequence中,再將Inputs中的位置信息編碼后與Sequence相加(注意再self-attention中並沒有嵌入位置信息,因此此處需要對位置信息進行編碼后加到Sequence中)。之后將處理好的Sequence輸入到圖中圓角矩形包裹的模塊中,此處的N×是指這個模塊重復N次。

在transformer模塊中首先對輸入的Sequence送入multi-head attention layer中進行處理,將處理好的結果送入Add & Norm中,此處的Add & Norm,是指先進行一次Residual操作,即將輸入的Sequence和multi-head attention layer進行相加,再對他們的結果進行layer normalization,即對每一個向量進行歸一化處理。經過Add & Norm后送入一個全連接網絡,最后再經過一次Add & Norm層,由此經過N次即是Transformer的Encoder的結構了,而在原論文中Encoder取N=6。

Decoder

對於Decoder可以分為兩種:Autoregressive Decoder(AT)和None-autoregressive Decoder(NAT)。

圖10 AT Decoder

在AT中會先輸入BEGIN Token和Encoder的輸出,之后輸出一個結果向量,再將結果向量作為輸入再輸入到Decoder中來計算下一個結果,可以看出在AT中計算是不可並行的,因為后一個輸入依賴於前一個輸出。

圖11 Transformer Decoder

在Transformer中的Decoder使用的是AT,可以注意到它和Encoder有兩個地方不同,第一個是模塊中加入了一個Masked Mutil-Head Attention Layer。

圖12 Masked Self-Attention

Masked self-attention與self-attention不同的地方在於其計算\(b^2\)時只會使用到\(a^1\)\(a^2\)的信息,而不會使用\(a^3,a^4\)的信息,因為在AT中,后一個輸入依賴於前一個輸出,要計算\(b^2\)\(a^3,a^4\)還沒有計算出來,因此需要忽略掉他們的信息。而在Encoder中\(a^1 \to a^4\)是一次全部輸入進來的,所以不需要使用Masked self-attention。

圖13 AT v.s. NAT

而NAT Decoder不同於AT Decoder,如圖13所示,AT的每一個輸入都依賴於前一個輸出,而NAT則是一次性輸入很多BEGIN Token進去,當遇到輸出的一個END Token時則丟棄后面的輸出,其相比於AT最大的好處就是可以並行計算,並且可以控制輸出的長度,但是如何決定輸入BEGIN Token的個數還有待研究。所以NAT的運算速度通常比AT快很多,但是其結果往往不如AT好。

對於Decoder模塊的第二個self-attention,其有兩個輸入來自於Encoder,這叫做Cross Attention,在原始論文中Decoder中的每一層都是拿Encoder中最后一層的輸出作為輸入的,但是也可以用Encoder其他層的輸出作為Decoder的輸入,在論文:Layer-Wise Multi-View Decoding for Natural Language Generation中有詳細做實驗比較如果使用Encoder中不同層的輸出作為Decoder的輸入會有什么不同的結果。

Training

在Transformer的訓練過程中,在Masked self-attention層中,我們不是將Decoder自己的輸出作為下一個輸入,而是將正確答案作為下一個輸入,這叫Teacher Forcing

圖14 Beam Search

Tips:

  • Copy Mechanism:通過復制大大降低訓練難度,將有些機器難以理解的東西直接復制過來
  • Guided Attention(Montonic Attention, Location-aware attention):固定Attention 的計算順序等,例如防止在語音合成等任務中先看到后面的信息再看前面的信息
  • Beam Search:如圖14所示,如果在AT中每次我們都選擇最大的結果,有可能只達到一個局部最優解,而想獲得全局最優解又不可能對所有解進行暴搜,這時候使用Beam Search可以幫我們獲得一個接近全局最優解的解,對於Beam Search並不適用所有任務,可能在一些需要機器發揮一下創造性的任務時Beam Search,尤其是在語音合成任務中,往往需要加入一些噪音才能訓練出更好的模型
  • mismatch:在訓練時我們給AT Decoder輸入的全是最正確的答案,而在測試時Decoder遇到一點錯誤答案往往會產生較大的誤差,一個解決方法是在訓練時故意給AT Decoder一些錯誤的答案,這樣Decoder在測試時遇到錯誤的答案時魯棒性更好


免責聲明!

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



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