天天看點

Transformer自下而上了解(5) 從Attention層到Transformer網絡

本文參考Wang Shusen老師的教學視訊:https://www.youtube.com/watch?v=aJRsr39F4dI&list=PLvOO0btloRntpSWSxFbwPIjIum3Ub4GSC&index=2

1. Multi-Head (Self-)Attention Layer

在上一篇文章中我們介紹了Attention層和Self-Attention層,計算邏輯大同小異。隻不過之前介紹的都隻是Single-Head Self-Attention Layer,如下圖示。

Transformer自下而上了解(5) 從Attention層到Transformer網絡

而Transformer中的Multi-Head的意思就是我們把多個Single-Head的結果拼接在一起,具體看下面的示意圖:

可以看到,每個Single-Head的輸出是一個次元為\(d\times m\)的矩陣\(C^{i}\),其中\(m\)表示輸入的詞向量個數,\(d\)每個詞向量的長度。這裡的\(C\)等價于上圖中的\(\{c_{:1},c_{:2},...,c_{:m}\}\)。下圖中是三個Head拼接在一起的例子,其實你也可以拼接更多。

Transformer自下而上了解(5) 從Attention層到Transformer網絡

每個Head之間的權重是不共享的。另外,所謂拼接其實是對每個Head的輸出\(C^{i}\)拼接,而其是在特征(即\(d\))這個次元做拼接。是以假如有\(n\)個Head,那麼最後這個Multi-Head的輸出矩陣\(C\)的次元就是\((nd)\times m\)。是以簡化後的Multi-Head Self-Attention Layer示意圖如下:

Transformer自下而上了解(5) 從Attention層到Transformer網絡

上面畫的是Self-Attention的Multi-Head,那麼Attention的Multi-Head其實類似,如下圖示:

Transformer自下而上了解(5) 從Attention層到Transformer網絡

2. 堆疊Multi-Head Self-Attention Layer

上一節中介紹的是單個Multi-Head Self-Attention Layer,其實我們可以堆疊多個,細節如下。

Transformer自下而上了解(5) 從Attention層到Transformer網絡

上圖給出的是單個Multi-Head Self-Attention Layer,其實類似地我們可以把這\(m\)個\(\{c_{:j},j\in[1,m]\}\)看成是下一個Multi-Head的輸入。不過這一般還會額外加一個全連接配接層對每一個\(c\)做一個映射,如下圖示:

Transformer自下而上了解(5) 從Attention層到Transformer網絡

之後,我們再添加一個Multi-Head Self-Attention Layer,如下圖示

Transformer自下而上了解(5) 從Attention層到Transformer網絡

3. Transformer's Encoder

知道了Multi-Head以及如何将多個Multi-Head做堆疊,我們就能很自然的知道Transformer的Encoder的構造原理。

下圖的左邊就是Transformer的Encoder結構示意圖,可以看到它有兩個特點:

  • 輸入和輸出的次元是一樣的,都是\(512\times m\),其中512表示單個詞向量的長度,\(m\)表示詞數量
  • Encoder由6個Block堆疊而成,每個Block的結構如下圖右邊所示,可以看到每個Block的輸入和輸出的次元大小也是保持一緻的,每一個Block其實就是一個(Multi-Head) Self-attention Layer 加一個Dense Layer
Transformer自下而上了解(5) 從Attention層到Transformer網絡

4. 堆疊Attention Layers

注意第2節和第3節介紹的知識對Self-Attention Layer做堆疊,由Self-Attention這個名字我們也能知道它是隻計算子產品内部各個資料之間的關系,而本節要介紹的Attention Layer則是用來計算不同子產品(即Encoder和Decoder)的資料之間的關系。下面我們逐漸介紹Encoder和Decoder如何連接配接在一起。

首先下圖分出來互相之間還沒建立聯系的Encoder和Decoder,其中Encoder由6個堆疊的Block組成,這在前面剛剛介紹過,而Decoder其實還沒有畫全,目前隻有一個Multi-Head Self-Attention層。

Transformer自下而上了解(5) 從Attention層到Transformer網絡

而要建立Encoder和Decoder之間的聯系,就需要加上一個Attention Layer,如下圖所示。可以看到Multi-Head Attention-Layer的輸入有兩個:

  • Encoder最後一層的輸出\(\{u_{:j},j\in[1,m]\}\),總的次元是\(\mathbb{R}^{512\times m}\)
  • Decoder第一個Multi-Head Self-Attention的輸出\(\{c_{:j},j\in[1,t]\}\),總的次元是\(\mathbb{R}^{512\times t}\)

它的輸出是\(t\)個\(z\)向量,總的次元和Decoder的輸入一樣,都是\(\mathbb{R}^{512\times t}\)

Transformer自下而上了解(5) 從Attention層到Transformer網絡

要實作堆疊,同樣需要加上\(t\)個Dense Layer對所有的\(z\)做一個映射。下圖就是Encoder和Decoder某一層建立聯系的示意圖

Transformer自下而上了解(5) 從Attention層到Transformer網絡

我們對上圖中Decoder做一個簡化可以得到下圖。

我們先看下圖左邊,可以看到輸入有兩個,\(512\times m\) matrix表示Encoder的輸出,它會作為Decoder的每一個Block的輸入,\(512\times t\)就是Decoder上一個Block的輸出,或者是最初的輸入資料,它們的次元永遠保持不變。

下圖右邊就是Decoder 的Block最簡化示意圖了,兩個輸入,一個輸出。另外輸出的次元和Decoder的輸入保持一緻。

Transformer自下而上了解(5) 從Attention層到Transformer網絡

5. Transformer: Encoder + Decoder

基于前面的内容,我們把Encoder和Decoder的所有細節都介紹了,現在我們從全局的角度看看Transformer長什麼樣,如下圖示。

Transformer自下而上了解(5) 從Attention層到Transformer網絡

根據上圖,我們可以作如下總結:

  • Encoder最後一個Block的輸出結果會被作為Decoder每個Block的輸入參與Attention Layer的計算
  • Decoder的每個Block接收兩個輸入,輸出矩陣的次元和Decoder的輸入次元保持一樣

其實,Transformer還有很多細節這裡沒有講到,這裡隻做簡短補充:

  • Position Encoding: 這個其實就是對一個句子裡每個單詞的位置做編碼,比如“請一鍵三連”,我們應該把“請”标記為0,“一”标記為1,其他同理,隻不過Transformer是通過某種算法把這些位置資訊也編碼成了和詞向量同等長度的向量,在将輸入傳入模型之前,每個單詞的詞向量都需要加上它自己的Position Encoding,如下圖(https://jalammar.github.io/illustrated-transformer/)所示
    Transformer自下而上了解(5) 從Attention層到Transformer網絡
  • Skip-connection: 前面反複提到過Encoder和Decoder的每個Block輸入輸出次元保持不變,那麼很自然地,我們可以将輸入和輸出做Skip-Connection,在前面的示意圖中就沒有畫出這個細節了。

下圖給出了基于RNN實作的Seq2Seq模型結構,我們将Transformer和它作對比的話,可以發現二者還是非常相似的,都是Decoder接收Encoder的輸出,換句話說RNN Seq2Seq能做的事情,Transformer理論上也都能做到。說到這,也可以很自然地看出Encoder的編碼能力的好壞對Decoder的結果起到至關重要的作用,而Encoder該如何訓練也是一個值得關注的問題。不過BERT技術的提出就是為了提高Encoder的編碼能力,這個會在下一篇文章中介紹~

Transformer自下而上了解(5) 從Attention層到Transformer網絡

6. 應用執行個體

介紹完了Transformer的結構,如果你還覺得模糊(應該不會了吧),可以看看下面的例子進一步加深了解。

假如這個執行個體是将英文翻譯成德文,首先我們看看Encoder的結構如下圖示,左邊是簡化圖,右邊展示了\(m\)個輸入和輸出的對應關系

Transformer自下而上了解(5) 從Attention層到Transformer網絡

下一步,我們需要做的是将Encoder的輸出傳給Decoder并做預測

可以看到Decoder的第一個輸入是一個固定的起始符号,它的embedding是固定的,它對應的輸出是\(y_1\),你可以把它了解成是一個機率分布,和分類模型類似,每個單詞都有不同的權重,我們可以根據機率随機采樣或者隻選擇機率最大的單詞作為Decoder下一個輸入單詞。

Transformer自下而上了解(5) 從Attention層到Transformer網絡

我們重複上面的步驟直到采樣到了停止符号(Stop Sign)。至此一個句子的翻譯就完成了。

Transformer自下而上了解(5) 從Attention層到Transformer網絡

微信公衆号:AutoML機器學習 MARSGGBO ♥原創

如有意合作或學術讨論歡迎私戳聯系~

郵箱:[email protected]

2021-05-24 22:33:22

繼續閱讀