Transformer模型通俗理解


目錄

Transformer

1. 前言

正如論文的題目所說的,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框架。

說明:該筆記總結的圖片來源於Jay Alammar的博客,前言部分來自知乎劉岩的總結, 謝謝兩位大佬的分享。本篇是結合自己的理解翻譯中文,有錯誤的地方,請在評論區中留言。

2. Transformer詳解

2.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’的模塊得到一個加權之后的特征向量$Z$,這個便$Z$是論文公式1中的$Attension(Q,K,V)$:

$Attension(Q,K,V)=softmax(\frac{QK^T}{d_k^{1/2}})V$

第一次看到這個公式你可能會一頭霧水,在后面的文章中我們會揭開這個公式背后的實際含義,在這一段暫時將其叫做$Z$ 。得到$Z$之后,它會被送到encoder的下一個模塊,即Feed Forward Neural Network。這個全連接有兩層,第一層的激活函數是ReLU,第二層是一個線性激活函數,可以表示為:

​ $$FFN=max(0,ZW_1+b_1)W_2+b_2$$

Encoder的結構如圖4所示

​ 圖4:Transformer由self-attention和Feed Forward neural network組成

Decoder的結構如圖5所示,它和encoder的不同之處在於Decoder多了一個Encoder-Decoder Attention,兩個Attention分別用於計算輸入和輸出的權值

  1. Self-Attention:當前翻譯和已經翻譯的前文之間的關系;
  2. Encoder-Decoder Attention:當前翻譯和編碼的特征向量之間的關系。

​ 圖5:Transformer的解碼器由self-attention,encoder-decoder attention以及FFNN組成

2.2 輸入編碼

1.1節介紹的就是Transformer的主要框架,下面我們將介紹它的輸入數據。如圖6所示,首先通過Word2Vec等詞嵌入方法將輸入語料轉化成特征向量,論文中使用的詞嵌入的維度為$d_{model}=512$


​ 圖6:單詞的輸入編碼

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


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

2.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向量($Q$),Key向量($K$)和Value向量($V$),長度均是64。它們是通過3個不同的權值矩陣由嵌入向量 $X$ 乘以三個不同的權值矩陣$W^Q$, $W^K$, $W^V$ 得到,其中三個矩陣的尺寸也是相同的。均是$512\times 64$


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

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

  1. 如上文,將輸入單詞轉化成嵌入向量;
  2. 根據嵌入向量得到$q$, $k$, $v$ 三個向量;
  3. 為每個向量計算一個score:$score=q*k$
  4. 為了梯度的穩定,Transformer使用了score歸一化,即除以$d_k^{1/2}$
  5. 對score施以softmax激活函數;
  6. softmax點乘Value值$v$ ,得到加權的每個輸入向量的評分$v$
  7. 相加之后得到最終的輸出結果$z=\sum v$

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


​ 圖10:Self-Attention計算示例圖

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

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

如圖12所示的矩陣形式,這個softmax分數決定了每個單詞對編碼當下位置(“Thinking”)的貢獻。顯然,已經在這個位置上的單詞將獲得最高的softmax分數,上述第三步和第四步是將分數除以8(8是論文中使用的鍵向量的維數64的平方根,這會讓梯度更穩定。這里也可以使用其它值,8只是默認值),然后通過softmax傳遞結果。softmax的作用是使所有單詞的分數歸一化,得到的分數都是正值且和為1。

​ 圖12:Self-Attention的矩陣表示

這里也就是公式1的計算方式。在self-attention需要強調的最后一點是其采用了殘差網絡中的short-cut結構,目的當然是解決深度學習中的退化問題,得到的最終結果如圖13。

​ 圖13:Self-Attention中的short-cut連接

2.4 Multi-Head Attention

Multi-Head Attention相當於$h$個不同的self-attention的集成(ensemble),在這里我們以$h=8$舉例說明。Multi-Head Attention的輸出分成3步:

  1. 將數據$X$分別輸入到圖13所示的8個self-attention中,得到8個加權后的特征矩陣$Z_i, i\in {1,2,...,8}$
  2. 將8個$Z_i$按列拼成一個大的特征矩陣$512, 64\times8$
  3. 特征矩陣經過一層全連接后得到輸出$Z$

整個過程如圖14所示:

​ 圖14:Multi-Head Attention

同self-attention一樣,multi-head attention也加入了short-cut機制。現在我們已經觸及了注意力的頭,讓我們重新審視我們之前的例子,看看不同的注意力頭在哪里聚焦,因為我們在我們的例句中編碼“it”這個詞:

當我們對“它”這個詞進行編碼時,一個注意力的焦點主要集中在“動物”上,而另一個注意力集中在“疲憊” - 從某種意義上說,模型對“它”這個詞的表現形式在某些表現形式中有所表現。 “動物”和“疲倦”。

2.5 位置編碼

截止目前為止,我們介紹的Transformer模型並沒有捕捉順序序列的能力,也就是說無論句子的結構怎么打亂,Transformer都會得到類似的結果。換句話說,Transformer只是一個功能更強大的詞袋模型而已。

為了解決這個問題,論文中在編碼詞向量時引入了位置編碼(Position Embedding)的特征。具體地說,位置編碼會在詞向量中加入了單詞的位置信息,這樣Transformer就能區分不同位置的單詞了。

那么怎么編碼這個位置信息呢?常見的模式有:a. 根據數據學習;b. 自己設計編碼規則。在這里作者采用了第二種方式。那么這個位置編碼該是什么樣子呢?通常位置編碼是一個長度為 $d_{model}$的特征向量,這樣便於和詞向量進行單位加的操作,如圖16。

圖16:Position Embedding

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

$PE(pos, 2i)=sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})$

$PE(pos, 2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})$

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

作者這么設計的原因是考慮到在NLP任務重,除了單詞的絕對位置,單詞的相對位置也非常重要。根據公式$sin(\alpha+\beta)=sin{\alpha}cos{\beta}+cos{\alpha}sin{\beta}$ 以及 $cos(\alpha+\beta)=cos{\alpha}cos{\beta}-sin{\alpha}sin{\beta}$,這表明位置$k+p$的位置向量可以表示為位置$k$的特征向量的線性變化,這為模型捕捉單詞之間的相對位置關系提供了非常大的便利。

如果我們假設嵌入的維數為4,那么實際的位置編碼將如下所示:

圖17:詞嵌入大小為4的位置編碼

在下圖中,每行對應矢量的位置編碼。因此第一行將是我們添加到輸入序列中嵌入第一個單詞的向量。每行包含512個值 - 每個值介於1和-1之間。我們對它們進行了顏色編碼,使圖案可見。
圖18:位置編碼的可視化

嵌入大小為512(列)的20個字(行)的位置編碼的真實示例。你可以看到它在中心區域分成兩半。這是因為左半部分的值由一個函數(使用正弦)生成,而右半部分由另一個函數(使用余弦)生成。然后將它們連接起來以形成每個位置編碼矢量。

2.6 殘差結構

如果我們要將向量和與self-attention相關的圖層規范操作可視化,它將如下所示:
圖19:self-attention的圖層可視化

這也適用於解碼器的子層。如果我們將2個堆疊編碼器和解碼器圖層可視化,它看起來像這樣:
圖20:編碼器和解碼器的可視化

2.7 解碼器結構

既然我們已經涵蓋了編碼器方面的大多數概念,我們基本上都知道解碼器的組件是如何工作的。但是讓我們來看看它們如何協同工作。 編碼器通過處理輸入序列開始。然后將頂部編碼器的輸出變換成一組注意力向量K和V.這些將由每個解碼器在其“編碼器 - 解碼器注意力”層中使用,這有助於解碼器關注輸入序列中的適當位置:
圖21:解碼過程

完成編碼階段后,我們開始解碼階段。解碼階段中的每個步驟輸出來自輸出序列的元素(在這種情況下為英語翻譯句子)。

以下步驟重復該過程,直到到達特殊符號,表明Transformer解碼器已完成其輸出。每個步驟的輸出在下一個時間步驟中被饋送到底部解碼器,並且解碼器像編碼器那樣冒泡它們的解碼結果。就像我們對編碼器輸入所做的那樣,我們在這些解碼器輸入中嵌入並添加位置編碼,以指示每個字的位置。

​ 圖22:關注輸出序列的解碼過程

解碼器中的self-attention層以與編碼器中的self-attention層略有不同的方式操作: 在解碼器中,僅允許self-attention層關注輸出序列中的較早位置。這是通過在self-attension計算中的softmax步驟之前屏蔽未來位置(將它們設置為-inf)來完成的。 “Encoder-Decoder Attention”層就像多頭self-attention一樣,除了它從它下面的層創建其查詢矩陣,並從編碼器堆棧的輸出中獲取鍵和值矩陣。

2.8 The Final Linear and Softmax Layer

解碼器堆棧輸出浮點數向量。我們如何將其變成一個單詞?這是最終線性層的工作,其后是Softmax層。 線性層是一個簡單的全連接的神經網絡,它將解碼器堆棧產生的向量投影到一個更大的向量中,稱為logits向量。

讓我們假設我們的模型知道從訓練數據集中學到的10,000個獨特的英語單詞(我們的模型的“輸出詞匯表”)。這將使logits向量10,000個細胞(cell)寬 - 每個細胞(cell)對應於一個唯一單詞的得分。這就是我們如何解釋模型的輸出,然后是線性層。 然后softmax層將這些分數轉換為概率(全部為正,全部加起來為1.0)。選擇具有最高概率的單元,並且將與其相關聯的單詞作為該時間步的輸出。

圖23:關注輸出序列的解碼過程

該圖從底部開始,向量的產生為解碼器堆棧的輸出。然后它變成輸出字。

2.9 損失函數

現在我們已經通過訓練有素的Transformer覆蓋了整個前向過程,看一下尋兩模型的直覺是有用的。 在訓練期間,未經訓練的模型將通過完全相同的前向過程。但是由於我們在標記的訓練數據集上訓練它,我們可以將其輸出與實際正確的輸出進行比較。 為了想象這一點,讓我們假設我們的輸出詞匯只包含六個單詞(“a”,“am”,“i”,“thanks”,“student”和“”(“句末”的縮寫)) 。

​ 圖24: 詞對應索引

在我們開始訓練之前,我們模型的輸出詞匯是在預處理階段創建的。一旦我們定義了輸出詞匯表,我們就可以使用相同寬度的向量來表示詞匯表中的每個單詞。這也稱為“one-hot”編碼。例如,我們可以使用以下向量指示單詞“am”:

圖25:輸出詞匯的編碼

在回顧一下之后,讓我們討論一下模型的損失函數 - 我們在訓練階段優化的指標,以引導一個訓練有素且令人驚訝的精確模型。

假設我們正在訓練我們的模型。說這是我們在訓練階段的第一步,我們正在訓練它的一個簡單例子 - 將“merci”翻譯成“謝謝”。 這意味着,我們希望輸出是指示“謝謝”一詞的概率分布。但由於這種模式還沒有接受過訓練,所以這種情況不太可能發生。


​ 圖26:輸出詞匯的編碼

由於模型的參數(權重)都是隨機初始化的,因此(未經訓練的)模型產生具有每個單元/單詞的任意值的概率分布。我們可以將它與實際輸出進行比較,然后使用反向傳播調整所有模型的權重,使輸出更接近所需的輸出。

你如何比較兩個概率分布?我們簡單地從另一個中減去一個。有關更多詳細信息,請查看交叉熵和Kullback-Leibler散度。

但請注意,這是一個過於簡單的例子。更現實的是,我們將使用長於一個單詞的句子。例如 - 輸入:“jesuisétudiant”和預期輸出:“我是學生”。這真正意味着,我們希望我們的模型能夠連續輸出概率分布,其中:

  1. 每個概率分布由寬度為vocab_size的向量表示(在我們的前面示例中為6,但更實際地是3,000或10,000的數字)

  2. 第一概率分布在與單詞“i”相關聯的單元處具有最高概率

  3. 第二概率分布在與單詞“am”相關聯的單元格中具有最高概率

  4. 依此類推,直到第五個輸出分布表示'<句末結束>'符號,其中還有一個與10,000元素詞匯表相關聯的單元格。

圖27: 目標詞的真實位置

我們將在一個樣本句子的訓練示例中訓練我們的模型的目標概率分布。在足夠大的數據集上訓練模型足夠的時間之后,我們希望產生的概率分布看起來像這樣:

​ 圖28: 模型預測單詞的位置

希望通過訓練,模型將輸出我們期望的正確翻譯。當然,這個短語是否是訓練數據集的一部分並不是真正的指示(參見:交叉驗證)。請注意,即使不太可能是該時間步的輸出,每個位置都會獲得一點概率 - 這是softmax非常有用的屬性,有助於訓練過程。

現在,因為模型一次生成一個輸出,我們可以假設模型從該概率分布中選擇具有最高概率的單詞並丟棄其余的單詞。這是一種方法(稱為貪婪解碼)。另一種方法是保持前兩個詞(例如,'I'和'a'),然后在下一步中,運行模型兩次:一旦假設第一個輸出位置是單詞'I',另一次假設第一個輸出位置是單詞'me',並且考慮到#1和#2位置保留的任何版本產生的錯誤都較少。我們重復這個位置#2和#3 ......等。這種方法稱為“波束搜索”,在我們的例子中,beam_size是兩個(因為我們在計算位置#1和#2的波束后比較了結果),top_beams也是兩個(因為我們保留了兩個詞)。這些都是您可以嘗試的超參數。

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結構上的固有缺陷。

4. 相關參考資料

Transformer論文及相關代碼:

Transformer相關工作:

 


免責聲明!

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



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