Transformers in NLP (一):圖說transformer結構

從transformer開始,nlp的模型漸漸開始成爲了transformer一族的天下,所以想寫一個系列聊一聊在nlp中那些運用transformer的模型。

作爲這個系列的第一篇,就從大名鼎鼎的transformer結構開始。

一、編碼器(encoder)與解碼器(decoder)

最早提出transformer的文章是attention is all you need,研究的nlp的任務是翻譯,自然而然就借鑑了seq2seq的翻譯結構,有了編碼器(encoder)和解碼器(decoder)。

正如下面的圖所展示的那樣,一個完整的transformer結構是由六個解碼器和六個解碼器組成,其中六個編碼器堆疊而成,最後一層的編碼器會將輸出輸入到每個解碼器中。

  • 解碼器的輸入有兩部分組成:上一層的解碼器的輸入(如果是第一層解碼器的話是之前翻譯的token的embedding)& 最後一層編碼器的輸入
  • 編碼器的輸入就是上一層的編碼器的輸出(如果是第一層的編碼器的話就是embedding)
    在這裏插入圖片描述

1、編碼器的結構

六個編碼器的結構都是一樣的,主要是由:

  • 多頭自注意力機制(multi-head self-attention mechanism)(下圖左框橘色)
  • 全連接前饋層(feed forward)(下圖左框藍色)
  • 殘差網絡
  • 以及每層都有的層標準化(下圖左框黃色)

後面會一個個來介紹。
在這裏插入圖片描述

2、解碼器的結構

六個解碼器的結構都是一樣的,主要是由:

  • 多頭自注意力機制(multi-head self-attention mechanism)(下圖左框橘色),解碼器會有兩種多頭自注意力機制,一種是有masked,一種是沒有masked
  • 全連接前饋層(feed forward)(下圖左框藍色)
  • 殘差網絡
  • 以及每層都有的層標準化(下圖左框黃色)
    在這裏插入圖片描述

二、注意力機制

從上面的介紹可以直觀看到,整個transformer模型中,大量出現了一個結構:多頭自注意力機制(multi-head attention),爲什麼叫他“多頭”呢,因爲他是由很多相似結構的scaled dot-product attention 拼接起來的,直觀的展開如下圖。
在這裏插入圖片描述

1、scaled dot-product attention

首先,我們來介紹最基本的組成單元:scaled dot-product attention。這部分的輸入會有三個:q (query),k (key),v (value)。

假設我們的任務是將 亞熱帶(中文) 翻譯成 아열대 (韓文),scaled dot-product attention的計算流程如下:
在這裏插入圖片描述

  • 第一個框:首先,經過embedding的部分,可以得到“亞熱帶”三個詞對應的embedding,一個seq_length X embedding_dim的矩陣,這裏的話就是3X5的矩陣。
  • 第二個框:seq_length X embedding_dim的矩陣,分別乘以三個映射(project)矩陣(三個灰色的矩陣WVi,WKi,WQi),三個矩陣分別對應了三個輸入k,v,q(在我們的例子中k,q,v都是同一個東西,即第一個框的輸出)。結果是得到映射後的表示矩陣,維度分別是:seq_length X dv,seq_length X dk,seq_length X dk。(圖裏的dmodel就是embedding_dim)
  • 第三個框:映射後的k矩陣和q矩陣相乘,得到一個 seq_length X seq_length 的矩陣,通過除以dk\sqrt{dk}和softmax進行歸一,這裏要注意的是,softmax之前有一個可選的操作mask,也就是之前說的解碼器會有的特別的masked多頭自注意力層有的機制,目的是將還沒預測的序列的信息mask掉。可以看到,這裏的矩陣是 seq_length X seq_length ,我們可以將之近似看作是 輸入的sequence的所有token之間相關關聯繫數的矩陣,更準確的說該矩陣的Aij可以理解爲是對i對應的token,第j個對應token的權重。
  • 第四個框:將第三個框的結果與第二個框中v的映射相乘,簡單理解的話,就是基於token和token之間的權重來重新計算這個token投射後的新表徵。之前有說法說bert可以學習到基於上下文的單詞表徵,應該主要也是因爲這個結構。

將整個過程用公式表示的話,如下:
在這裏插入圖片描述

2、multi-head attention

既然已經知道了scaled dot-product attention的結構,那麼多頭自注意力機制是如何由前者構成的呢?很簡單,我們會有h個scaled dot-product attention結構,每個結構中的映射(project)矩陣(三個灰色的矩陣WVi,WKi,WQi)不共享,這樣就可以得到h個最終的表示矩陣,將這些結果拼接起來,得到一個seq_length X h dv的矩陣,然後乘以矩陣Wo(維度是h dv X dmodel ),這樣就可以得到一個多頭自注意力輸出矩陣,維度大小爲:seq_length X dmodel。在attention is all you need中,h的設置是8,dmodel=512,dk=dv=dmodel/h=64。這樣即可以學習到h個不同的映射矩陣,同時計算消耗也和只有一個單頭的dk=dv=512的計算複雜度一致。
在這裏插入圖片描述

3、transformer中三種多頭自注意力機制的應用

在transformer中會有三種多頭自注意力機制的應用:

  • 下圖標1處:Encoder的自注意力層,這一種的k,q,v就是上一層encoder的輸出;如果是第一層encoder的話,k,q,v就是都是embedding
  • 下圖標2處:Encoder-decoder attention,這個結構是在解碼器之中,q是同一層解碼器中mask mulit-head attention(也就是下圖標3處)的輸出,k,v是最後一層編碼器的輸出;
  • 下圖標3處:Decoder的自注意力層,基本和解碼器的自注意力層是一致的,區別是對需要加上一層Masked,將還沒預測的序列的信息遮掩掉,採用的方法就是把部分取值設置爲-∞,換而言之就是將沒預測token embedding對已經預測token embedding的權重影響設置爲負無窮,來阻止信息泄露的發生。

在這裏插入圖片描述

三、對encoder-decoder內部結構的一個梳理

看完了transformer的關鍵結構多頭自注意力的介紹,接下來,我們按照模型實際的層,一層層來看一下transformer這個encoder-decoder結構的情況。

1、embedding層

Embedding的作用和在word2vec的模型中一致,但是比較有意思的是下圖圈出來的三個部分:output embedding、input embedding以及pre-softmax linear transformation是共享參數的,也就是對於input & output而言,共享embedding意味着這是一個雙語的詞表(因爲transformer使用的是翻譯任務)。

我參考了一下其他博客的意見總結下來,共享參數的作用如下:

  • 首先,共享參數可以減少參數數目,讓模型更容易收斂
  • 再次,對於pre-softmax和input&output而言,共享意味着這三個地方的矩陣都可以得到充分訓練
    在這裏插入圖片描述

2、Positional encoding

  • 位置:在input embedding和output embedding之後
    在這裏插入圖片描述
  • 作用:爲了保存token之間的相對或者絕對的位置
  • 實現方式:在input embedding的向量基礎上,再按位相加一個positional encoding,如下圖
    在這裏插入圖片描述
  • 公式:論文中給出的計算公式如下:pos表示輸入字符的位置,2i和2i+1表示輸入字符向量的中的對應的位置。
    PE(pos,2i)=sin(pos/100002i/dmodel)
    PE(pos,2i+1)=cos(pos/100002i/dmodel)
    選擇這個公式的原因是爲了確保相對關係,PEpos+k和PEpos的Positional encoding的差是固定的,這樣可以比較好的表示相對關係。有趣的一點是,i從小到大,對應的波長是越來越長的,不知道這樣的設定有什麼特別的考慮。

3、Masked Multi-Head Attention

Embedding + postion encoding之後就輸入到多頭自注意力機制。

Decoder部分比較特別的地方是會有一個masked multi-head attention,我自己理解,這部分是在訓練的時候模仿實際推斷的場景而設計的結構。在實際的推斷過程之中,一句話的推斷會經過decoder好幾輪,比如“亞熱帶”的翻譯,會先有一個表示句首的字符(比如start)作爲outputs輸入到decoder,得到第一個翻譯的對應字符,隨後將start+對應字符輸入到decoder,得到第二個翻譯的對應字符,以此類推,一直到結束翻譯。而在訓練的過程中,爲了模仿這種效果,在masked multi-head attention中,在自注意力的過程中會對要預測的詞以及其左邊的詞做一個mask,以防信息的泄露,也就是說只能與前文的表徵進行自注意力。
在這裏插入圖片描述

4、Add&norm

上面結構圖中黃色的部分,表示的公式爲LayerNorm(x + Sublayer(x))。這裏需要關注兩個點:

  • 殘差網絡:在多頭注意力機制和feed forward機制的輸入在經過網絡結構得到輸出數據之後,會與原有的輸入相加。
  • Layer Normalization:對同一層的輸出做方差和均值的標準化

5、feed forward

也就是上面結構圖的藍色的部分。

  • 這部分的公式如下:FFN(x)=max(0,xW1+b1)W2+b2
  • 作用範圍:每個position都會做一個這樣的轉化,每一層轉化的參數是一致的,但是在不同的層,參數會不一樣。
  • 可以理解爲,每一層多頭注意力輸出之後會接一個2048層的全連接層加relu的激活函數,再接一個dmodel的全連接層,這部分被認爲是非線性的主要來源。

以上就是我對transformer結構的全部解讀。

參考資料

  • attention is all you need
  • https://www.zhihu.com/question/362131975
  • https://blog.csdn.net/longxinchen_ml/article/details/86533005
  • https://zhuanlan.zhihu.com/p/60821628
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章