Transformer模型中重點結構詳解

Transformer模型中各結構的理解

最近學習Transformer模型的時候,並且好好讀了一下Google的《Attention is all you need》論文。論文地址如下: Attention is All you need。同時學習了一下其github的代碼,代碼地址如下:github code. 在網上查資料的過程中,還找到了一個好像也用的比較多的版本:[Transformer demo]
(https://github.com/princewen/tensorflow_practice/tree/master/basic/Basic-Transformer-Demo).
Transformer模型由Encoder和Decoder兩部分組成。網絡上詳細講解Transformer中各部分基礎的內容也都比較多了,所以本次寫博客主要還是想更細緻的把模型梳理一遍,想一想各部分在模型中的功能作用,以及其意義。
包括但不限於:

1.Multi-Head Attention的意義及其作用,爲什麼要進行Multi-Head
2.Residual Network 和 Layer Normalizaiton在模型中的作用
3.爲什麼要添加Feed Forward層
4.Decoder中的Mask Mulit-Head Attention的結構
5.Decoder中最後的linear 和 softmax

這裏稍微講一下我對其中某些模型結構的可能的一點理解(如有錯誤,還希望大家指正)。

整體的Transformer框架的模型結構如圖:
The Transformer - model architecture

Encoder

Stage 1 - Encoder input

Encoder的輸入即是原始的word embedding。由於在Transformer模型中,沒有遞歸,也沒有卷積,所以序列中每個標記的絕對(或相對)位置的信息用“位置編碼”來表示,因此編碼器的輸入爲:

*positional embeddings added + embedded inputs*

更多關於position_embedding的內容可以參考:
position embedding 和segment embedding解釋?

接下來是由6個相同的層連接組成的,每一層中又包含了兩個子層。其中,第一個子層是Multi-Head Attention層,該子層利用多頭注意力機制,利用線性變換將Q、K、V映射到不同的子空間(論文中num_heads = 8),從而希望可以學習到單詞的不同表示。例如如下圖所示:該圖中,"it"在兩句話中分別於代表不同的名詞。

stage 2 - Multi-Head Attention

Transformer模型使用了多層注意力機制來代替了single self-attention,以此來提升模型的效果。Multi-Head Attention的效果體現在以下兩個方面:
(1)擴展了模型關注不同位置的能力。如上圖所示,在不同的context中,使得單詞"it"關注到不同的target word。
(2)增強了Attention機制對關注句子內部單詞之間作用的表達能力。相比於single self-attention, Multi-Head Attention中的each head都維持了一個自己的Q、K、V矩陣,實現不同的線性轉換,這樣每個head也就有了自己特殊的表達信息。

這種思想背後的原理即是,當你翻譯一個單詞的時候,你會基於你所問的問題的類型來對每個單詞給予不同的關注程度。例如,當你在“I kick the ball”這個句子中翻譯“kick”時,你可以問“Who kick”。根據答案的不同,把這個單詞翻譯成另一種語言可能會發生變化。或者問其他問題,比如“做了什麼?”等等。
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
即例如你可以把所設置的每個head(論文中num_heads=8),看做是一個問題,比如Who、Did what、To whom…(假設有8個不同的問題)。而這時根據不同的問題,單詞"kicked"會與不同的詞進行關聯,也就相當於是每個head都會產生一個獨立的由該head下Q、K、V所生成的word representation. 不同的representation表達了該context中的不同單詞之間的語法結構、依賴關係。比如在對單詞"kicked"進行Attention時,第一個問題Who(相當於第一個head),即使得"kicked"與"I"的Attention score更高,表明"I"即是"kicked"的主語,第二個問題Did what(相當於第二個head), 即使得"kicked"與"kicked"的attention score更高,表明"kicked"即是所做的動作,第三個問題To whome(相當於第三個head),即使得"kicked"與"ball"的attention score更高,表明"ball"即是"kicked"所做的對象,賓語。以此類推。即對每個詞都學習了num_heads個不同的representation(當然正如論文中所說,每個head下的representation的維度爲d_model / num_heads,因爲後續還要拼接成d_model的大小),學習到了該詞在context中對其他詞的依賴關係(相比於single self-attention則只能學習一次),更好的學習到了每個單詞的representation,從而提升了模型Attention機制的表達能力。

Layer Normalization & Residual Network

Multi-Head Attention層後跟了一個Layer Normalizaiton用來對Attention輸出的新的word representation進行標準化處理,以及一個Residual Network。
詳細的殘差網絡的結構特點在這裏就不詳細介紹了,有興趣的可以參考以下鏈接:
殘差網絡(Deep Residual Learning for Image Recognition)
resnet(殘差網絡)的F(x)究竟長什麼樣子?
詳解殘差網絡

這裏採用了Residual Network的作用我認爲是利用了殘差網絡可以當層數加深時仍然能進行很好的訓練一個特性。因爲在模型結構中,首先每個層都重複6次,且每個層都有兩個子層,這就總共相當於有了12層。同時,Multi-Head Attention層和Feed Forward層內部又都有自己的結構,比如Feed Forward層就有兩層的fully-connection layers。所以爲了使當模型中的層數較深時仍然能得到較好的訓練效果,使得梯度不至於在層數加深時產生消失,所以添加了Residual Network.

添加Layer Normalizaiton處理的作用則是對數據進行標準化處理,方便後續在Feed Forward中的ReLU激活函數對數據進行非線性處理。通過Normalizaition將數據標準化到ReLU激活函數的作用區域,可以使得激活函數更好的發揮作用(實際應用中也是在ReLU激活函數前往往會加入batch normalizaiton或者layer normalizaiton)。
關於layer normalizaiton和batch normalizaiton之間的作用方式和區別可以參考:
BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm總結
【AI數學】Batch-Normalization詳細解析

stage 3 - Feed Forward

而在Multi-Head Attention層之後還添加了一層Feed Forward層。Feed Forward層是一個兩層的fully-connection層,中間隱藏層的單元個數爲d_ff = 2048。這裏在學習到representation之後,還要再加入一個Feed Forward的作用我的想法是:
注意到在Multi-Head Attention的內部結構中,我們進行的主要都是矩陣乘法(scaled Dot-Product Attention),即進行的都是線性變換。而線性變換的學習能力是不如非線性變化的強的,所以Multi-Head Attention的輸出儘管利用了Attention機制,學習到了每個word的新representation表達,但是這種representation的表達能力可能並不強,我們仍然希望可以通過激活函數的方式,來強化representation的表達能力。比如context:The animal didn’t cross the road because it was too tired,利用激活函數,我們希望使得通過Attention層計算出的representation中,單詞"it"的representation中,數值較大的部分則進行加強,數值較小的部分則進行抑制,從而使得相關的部分表達效果更好。(這也是神經網絡中激活函數的作用,即進行非線性映射,加強大的部分,抑制小的部分)。我覺得這也是爲什麼在Attention層後加了一個Layer Normalizaiton層,通過對representation進行標準化處理,將數據移動到激活函數的作用區域,可以使得ReLU激活函數更好的發揮作用。同時在fully-connection中,先將數據映射到高維空間再映射到低維空間的過程,可以學習到更加抽象的特徵,即該Feed Forward層使得單詞的representation的表達能力更強,更加能夠表示單詞與context中其他單詞之間的作用關係。

整個過程的數學公式表達爲:其中max即代表了ReLU激活函數
FFN(x) = max(0, xW1 + b1)W2 + b2

Decoder

接下來分析一下Decoder中的模型結構。Decoder不僅處理以前生成的其他單詞,而且處理編碼器生成的最終表示形式。

stage 1 - decoder_input

每一時刻Decoder的輸出都會作爲下一時刻的輸入,這與Seq2Seq模型中解碼器的部分差不多。輸入是輸出的embedding 表示,偏移一個位置,以確保位置i的預測只依賴於i之前(小於)i 的位置。

stage 2 - Mask Multi-Head Attention

在Decoder模型中的大部分結構與Encoder中的想法類似,主要要注意的一個是Mask Multi-Head Attention。

Mask Multi-Head Attention的結構主要基於的思想就是,由於在解碼器中,我們仍然是按序列化的方式來進行(而不像編碼器中可以以並行的形式對句子中的所有單詞進行Attention計算),即同Seq2Seq模型中解碼器部分一樣需要一個單詞一個單詞的進行輸入,即我們只有在某一時刻預測出了某一單詞後,才能繼續預測後面的詞。所以根據這種思想,在預測輸出的sentence中,某一單詞只能跟其之前的單詞產生聯繫(因爲當預測到某一單詞時,其後的單詞還是未知的)。所以在利用Attention score對矩陣V中單詞的token進行加權求和時,Attention score只能是一個下三角的矩陣。這一點在模型代碼中可以比較好的進行分析理解。綜合來說就是,這裏的masked decoder self attention, 就是爲了防止當前的生成的單詞對未來的單詞產生依賴性
下三角Attention score矩陣

stage 3 - Multi-Head Attention

Mask Multi-Head Attention層之後是一個Multi-Head Attention層。該層與Encoder的輸出相連,其中K、V矩陣由Encoder的輸出提供,Q由Mask Multi-Head Attention的輸出提供。這裏的Attention思想與傳統的Seq2Seq模型解碼器部分的Attention思想類似。即將解碼器的輸入與編碼器中編碼好的每個單詞的representation計算Attention score,然後計算Attention score與V的矩陣乘法,從而得到編碼器中編碼單詞在解碼器中待翻譯單詞中的表達。Transformer模仿了經典的注意機制,其中encoder-decoder的注意層queries來自於之前的解碼器層,(memory) keysvalues來自編碼器的輸出。因此,解碼器中的每個位置都可以參加輸入序列中的所有位置。

這裏,對流程中各矩陣維度的變化舉例爲:假設此時decoder_input的輸入單詞爲2個,則下三角的Attention score的矩陣爲shape:(2,2),與V相乘後的輸出維度爲shape:(2,d_model)。然後輸入到Multi-Head Attention中作爲矩陣Q,此時編碼器的輸出維度爲shape : (n, d_model)並作爲矩陣K、V。在Multi-Head Attention中,Q*K轉置的維度爲shape : (2,n).結果再與矩陣V相乘得到的維度爲shape (2, d_model).即可得到這兩個單詞的表達。

接下來仍然是一個Feed Forward全連接層,與Encoder中的相同。

stage 5 - Linear & Softmax

Decoder最後是一個線性變換和softmax層。解碼組件最後會輸出一個實數向量。我們如何把浮點數變成一個單詞?這便是線性變換層要做的工作,它之後就是Softmax層。
線性變換層是一個簡單的全連接神經網絡,它可以把解碼組件產生的向量投射到一個比它大得多的、被稱作對數機率(logits)的向量裏。不妨假設我們的模型從訓練集中學習一萬個不同的英語單詞(我們模型的“輸出詞表”)。因此對數機率向量爲一萬個單元格長度的向量——每個單元格對應某一個單詞的分數(相當於做vocaburary_size大小的分類)。接下來的Softmax 層便會把那些分數變成概率(都爲正數、上限1.0)。概率最高的單元格被選中,並且它對應的單詞被作爲這個時間步的輸出。
這張圖片從底部以解碼器組件產生的輸出向量開始。之後它會轉化出一個輸出單詞。
整個Transformer中的Encoder和Decoder的模型結構大致就是這樣組成的。其模型內除了主要的Attention部分,還添加了諸如Residual Network、Layer Normalizaition、Feed Forward部分來使模型得到更好的效果,所以在學習論文的過程中,也是對這些方面的內容進行了一定時間的學習,也是需要理解到添加這些部分的意義才能更好的理解Transformer模型在運行時候的機制

整體的運行流程如下圖所示:
在這裏插入圖片描述

在看完論文之後,針對論文中一些細節和疑惑的地方,對Transformer的源碼進行了一定的分析,來學習整個構建模型的過程以及Transformer模型的實現細節。後續會再進行補充。

源碼部分的內容有興趣的可以查看Attention is all you need 源碼解析

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