Attention is all you need.


Posted by Mars.Su on 2021-01-11

接下來,我們要進入到更深一層的NLP境界了,也就是『Transformers』。paper link如下:

Introduction

先前我們提到了許多attention,seq2seq等架構,幾乎都是圍繞在RNN這樣的神經網路去做一個提出與實作。但其實我們都知道在RNN的架構當中,他的特性就是Sequence計算,而這樣的特型卻也形成無法做到平行化的計算,進而遇到效能上與長句子等相關問題。
而在這篇paper當中就是透過Transformers這樣的架構來避開像是RNN這樣的model,而是採用全Attnention的方式來做到序列以及平行化的計算。

Background

作者在這部分提到了self-attention,如果各位讀者還有印象的話,在前一篇我們有針對Attention分類做了一些探討,其中就有提到了self-attention。該類別也稱之為intra-attention,簡單來說就是與同句子的其他word做attention的機制,而不是過往兩個sequenece互相做attention的機制。然而透過self-attention這樣的作法,我們可以理解到在不同位置的word對於該單序列的重要程度關係,利用這個方式計算出representation。

然而本篇所要提出的Transformers架構則是建立於全attention且不需要透過RNNCNN等相關model來實作的Seq2Seq模型。在接下來的章節會在個別探討Transformers, self-attention是如何做到的。

Model Architecture

Seq2Seq這樣的架構當中,我們得知到了EncoderDecoder這樣的概念。Encoder 將輸入sequence (𝑥1,𝑥2,⋯,𝑥𝑛) 對應到一個連續的表達序列 z=(𝑧1,𝑧2,⋯,𝑧𝑛) 。而再由 Decoder 生成一個sequence作為輸出 (𝑦1,𝑦2,⋯,𝑦𝑚) 。 模型的每一個步驟都是自迴歸(Auto-Regressive) 的,利用先前的輸出作為輸入來預測下一個輸出。而Transformers則遵循這樣的架構利用self-attention,fully-connected, point-wise等方式來做到EncoderDecoder,架構呈現如下:

3.1 Encoder and Deocder Stack

Encoder


Encoder是由N=6所堆疊出來的,其中一次堆疊會包含2個sublayer,分別是multi-head attentionposition-wise FFN,其中在每一個sublayer之間會在加入了一個Residual Connection,在透過layer normalization,因此在每一格sublayer的output都會是

LayerNorm(𝑥+Sublayer(𝑥))
[補充]Residual Connection(殘差連接)

簡單來說為了在深度學習的架構中,一般的認知會是深度越深效果越好(identity-mapping),但事實上有可能當深度增加時,反而會使準確度退化(Training Error增加),可能是參數量太大難以優化之原因,所以必須要改用其他方式來做處理。根據Deep Residual Learning for Image Recognition這篇paper的內容,可以簡單理解成如下圖:

最左邊的圖是一般我們在做神經網路傳遞的狀態,我們把中間的layer想像成H(),所以output就會是H(x),但如同前面所提到的,有可能會造成error增加進而退化,所以後來改成中間的圖,扣除掉inputx,但其實這樣還不太夠,後來改變成shortcut connection,就是跨層傳遞,來讓資訊做傳遞 - F(x)+x = H(x),如此一來一方面不會增加額外計算複雜度,同時也可以避免不會被其他的layer所影響output,最重要的是在backprpagation更容易回到source layer,也就是保留原先的input,避免產生梯度消逝之問題。這樣的架構就可以在TransformerEncoder & Decoder內部看到。

[補充] Layer Normalization

在說明Layer Normalization之前,先快速提一下他的始祖Batch Normalization的問題,詳細paper內容在Batch Normalization: Accelerating Deep Network Training byReducing Internal Covariate Shift
Batch Normalization主要是根據每一個batch-data去計算平均值標準差,在進而normalize,所以可能會有幾個缺點:

1. 依賴batch_size: batch_size小的時候,效果會很差
2. 不適用序列化資料(若採用用在RNN stack之間)
3. 只能再訓練階段使用,原因在於若在使用到『predict階段』,model學習到的是最後一個batch的平均值與標準差,如果該batch是偏離原本母體的話,就會造成在predict會有影響與誤差。
sol: 有學者說額外紀錄每一次batch 的 平均值與標準差,最後在平均,只是就需要額外的空間作紀錄。

Layer Normalization則是對同一layer的output做normalize,因此不會受到Batch_size影響,也可以很好地應用到序列性資料。詳細paper可以看此Layer Normalization

Decoder


然而Decoder也是由N=6所堆疊出來的,與Encoder差別不一樣在地方是在原本的2個sublayer中間插入一個新的sublayer,其連接Encoder的output進行multi-head attention。其餘都與 Encoder 部分相同,每一個子層均有 Residual Connection,並進行 Layer Normalization。
此外,作者們也在Decoder修改了第一個sublayer的input,加上一個Mask,來確保對位置 𝑖 的預測只能依賴位置 < 𝑖 的已知output來做預測。

3.2 Attention

Attention這個部分,我們先知道會有三個vector,分別是Query, Key 和 Value。簡單來說作者提到透過Compatibility Function可將Query, Key計算出Value的權重值,再經由value的加權總和求出output。接著作者在此提出了其中Transformers運用到了兩個attentionn。如下圖:

Scaled dot-product Attention

這個部分是將Query, 每個維度d之Key, Value做input,也就是將Query與每個維度Key做Dot-Product(時間複雜度 n^2),接著除上√‾‾‾𝑑𝑘,再使用 Softmax 函數得到 Value 的權重。對應的矩陣運算公式如下:

作者在此有提到Additive AttentionDot-Product Attention。在Dot-Product Attention除上√‾‾‾𝑑𝑘的原因在於因為dot-product後的數值,有些很大有些很小,所以透過縮放因子可以促使大者更大,小者更小進而使區分更加明顯。

[補充]Additive Attention

Additive Attention是將Query與Key做concat再輸入計算,假設Key由[k1,k2....kn]組合而成,就會變成先concatQ-k1,在concatQ-k2最後計算出來後再套用到softmax得權重值。

[補充]Dot-Product Attention

Dot-Product Attention則用於矩陣運算,Query,Key,Value為三個矩陣,Dot-Product Attention想做的是一樣拿Query與key做關聯(Query, key維度要相同),在與矩陣Value做權重和。

簡單的流程架構如下:

拿Query與每一個Key去做attention,求出權重

再經由softmax來獲得權重值

接著再拿權重值與Value做權重和來取得output
Multi-head Attention

作者們認為將 Queries, Keys, Values 分別進行 ℎ 次線性映射到維度 𝑑𝑘, 𝑑𝑘 與 𝑑𝑣 是有利的。因此利用每一次 Queries, Keys, Values 的project都會平行計算 Attention function,各產生一個維度 𝑑𝑣 。最後將這 ℎ 個向量concat在一起再做一次線性得到最終的結果值。而這樣的做法就是允許模型在不同的位置上可以同時關聯Representation Subspace。

作者們以 ℎ=8 個平行計算,且 𝑑𝑘=𝑑𝑣=𝑑𝑚𝑜𝑑𝑒𝑙 / ℎ,這可以降低每一個注意力機制的維度,進而減少運算成本,保持跟Single-Head Attention一樣的維度。

簡單的架構流程如下(h=2):

將原先的Query, Key與value 降維到個別維度上。

個別求出每一個維度的output

最後再concat成整體的output
3.2.3 Applications of Attention in our Model
  • Encoder & Decoder
    將先前Decoder的輸出作為 Query,以Encoder的輸入作為 Key 與 Value,使每一個位置在Decoder中都可以得到輸入序列的其它位置的訊息。
  • Encoder
    Encoder 中包含了一個Self-Attention Layer,所有的 Queries, Keys, Values 都來自於同一個位置,這能使每一個位置在Encoder中都可以得到先前layer中所有輸出。
  • Decoder
    Decoder 中的Mask Self-Attention Layer,只允許 Decoder 可以關注到包含自身位置之前所有位置的訊息。該目的為了因為每一個位置的預測都應該只與前面的位置有關,不該讓後面位置的資訊影響到當下位置的預測。在論文中,便將非法連接 (後向前傳遞) 的 Softmax 值均設置為 −∞,達成 Mask 的效果。

這邊呈現Google說明的例子呈現。

這邊可以快速整體一個結論:

* Attention讓 Decoder 在生成輸出元素的 representation. 時關注 Encoder 的輸出序列,進而取得上下文資訊
* self-Attention讓 Encoder 在生成輸入元素的 representation. 時關注自己序列中的其他元素,進而取得上下文資訊
* self-Attention讓 Decoder 在生成輸出元素的 representation. 時關注自己序列中的其他元素,進而取得上下文資訊

無論是Attention或是Self-Attention都是讓Query關注Key,再計算出Value權重與Value得出整體上下文資訊,只是採用的Sequence不同。

Transformer Mask

Mask的機制當中,Transformer採用了2種技巧,分別是Padding MaskSequence Mask

  • Padding Mask
    無論是EncoderDecoder都會採用到該mask方式,用來確保input sequence的長度一致。
  • Sequence Mask
    發生在Decoder,用來確保再訓練Transformer的時候避免知道接下來要生成的token之答案,來影響訓練結果,所以需要mask。套用到生成會產生類似如下的結果:

3.3 Position-wise Feed-Forward Networks

在一開始Transformer的架構當中,我們都知道無論是EncoderDecoder都可以看出會包含一個Feed-Forward Networks,該元件包含了兩次的linear Transformation以及加入一個ReLU activation function:

其中input、output的維度都是 𝑑𝑚𝑜𝑑𝑒𝑙=512,中間層維度則是 𝑑𝑓𝑓=2048,進而促使model能夠學習更到high-level的與減少 fully-connected 的計算量。

3.4 Embeddings and Softmax

這邊簡單來說就是將 Embedding layerpresoftmax layer的參數做shared matrix處理,然而在Embedding layer除上𝑑𝑚𝑜𝑑𝑒𝑙做縮放權重。
因為在Encoder的input經過embedding的維度,與Decoder的input計算出來的維度是相同的,然而都會呈上一個weight matrix,會這樣做的原因在於要讓Decoder的output在倒傳遞時獲得最大的update,但同時也希望讓EncoderDecoder的input也能適時地去做update,因此才共享matrix。

3.5 Positional Encoding

Transformermodel架構當中,其實不包含RNN的序列關係在裡面,所以對於該model來說,ex.你,好好,你對model來說並沒有太大差別,因此如果要讓該model具備訓練sequence的順序的話,在先前我們提到,可以加入額外的embedding,來作為position的資訊,也就是Positional Encoding。然而在Transformer是如何做到這件事情的呢?其實就是採用sin&cos

𝑝𝑜𝑠 指的是這個 token 在序列中的位置,而 𝑖 代表的第i個維度,就會是這個token的第i維度。然後整個位置編碼的維度會對應到一個三角函數。使用三角函數主要是因為作者們認為這樣的函數可以有利於作者們認為這樣的函數可以有利於模型輕鬆的學習到相對位置的編碼,因為對任意的偏移量 𝑘 來說,𝑃𝐸𝑝𝑜𝑠+𝑘 都可以表示成為 𝑃𝐸𝑝𝑜𝑠 的線性組合。同時在不同的維度也採用道不同的function做位置計算。

這邊假設一個例子,若 𝑝𝑜𝑠=1,所產生的positional encoding呈現如下:

而採用三角函數主要是可以滿足幾個條件:

1.必須可以識別一個單字(詞)在不同位置上在不同位置上可能有不同的意義
2.必須可以體現不同先後順序的關係
3.編碼數值落在區間 [0,1] 之間
4.編碼維度可以不受限於文本長度

Why self-attention?

作者採用了三個觀點來提出為什麼要採用self-attention:

  1. total computational complexity per layer.
  2. the amount of computation that can be parallelized
  3. the path length between long-range dependencies in the network.
    從這三個觀點,作者拿出RNN, Convolution等model來做比較。

    簡單來說,在過往的Sequence作法,在當前的output必須仰賴之前的資訊,就會造成無法平行化的計算。而Transformer則是全部轉成矩陣運算,進而可平行化與GPU加速,也可能取得距離較遠的資訊。

Training & Result

Hardware and Schedule

作者 採用了8 顆 Nvidia P100 GPU 的電腦進行訓練,對於論文中所設置超參數的Base模型,每一次訓練 ( training step ) 約 0.4 秒。對於Big模型而言,則每次訓練時間需要約 1.0 秒,一共接受了 300,000 次或約 3.5 天的訓練時間。

Optimizer

作者採用Adam+Warmup來設計optimizer,參數設定如下:

𝛽1=0.9
𝛽2=0.98
𝜖=10−9


作者根據 𝑤𝑎𝑟𝑚𝑢𝑝_𝑠𝑡𝑒𝑝𝑠 ( paper中設置為 4000 ) 線性增加學習率,再經由訓練次數的平方根倒數來降低學習率。

Regularizer

  • Residual Dropout
    每一個sublayer的output後,Normalization 前都添加 Dropout,此外,在 Encoder 與 Decoder 中,對於 token 與 position encoding加總的部分也添加 Dropout。 其中, 𝑃𝑑𝑟𝑜𝑝=0.1

  • Label Smoothing
    訓練中還進行了 𝜖𝑙𝑠=0.1 的 Label Smothing。雖然這樣會讓整個模型變得更加不穩定,但卻提高了準確度與 BLEU 分數。

Machine Translation

作者採用了英德語言資料翻譯英法語言資料翻譯之任務作為實驗,實驗結果參考如下:

作者們對Transformer-Basemodel使用的是最後 5 個 Checkpoints 之平均來得到最終的模型,而對於Transformer-Big,則是透過最後 20 個 Checkpoint 平均來取得最終模型。而作者們利用 𝐵=4 及 𝛼=0.6 來做Beam-search,這些參數的決定是經過實驗後選擇的。

Model Variations

作者們也嘗試更改了參數值,來看看在不同的設定上,Transformer所帶來的效果為何,後來整理成如下表:

在(A)不難發現作者們改變了 Head 數量、Key 與 Value 的大小使其計算量保持不變。然而Single-Head AttentionMulti-Head Attention的表現來的差,但 Head 數量過多時,整體model效果也會下降。

在(B)中,作者發現當減少 𝑑𝐾𝑒𝑦 值會損害模型的質量,這表明了決定相容性函數並非是一件容易的事情,且相較於Dot-product更複雜的相容性函數可能會有其益處。在 (C) (D) 中,可以更進一步的發現,正如期待較大的模型表現會較好,且 Dropout 有助於避免 Overfitting。在 (E) 中,作者將學習而得的位置編碼以正弦函數來做替換,可以發現結果會與基本 Transformer 的結果幾乎相同。

Conclusion

這邊最後概要一下Transformer的幾個重點作為結論:

  1. Self-Attentioninput/output都是Sequence,差別在於可平行計算。此外也會將input embedding轉換成Query,KeyValue等三個矩陣進而求出權重和,最後產生output。
  2. Multi-head Attention則是將Query,KeyValue投影到各維度的dq,dkdv來學習到每個位置在不同維度的representation
  3. Self-Attention在計算每次的位置時,都會關注其他位置的資訊。
  4. Self-Attention並沒有先後順序關係,所以才可快速平行運算。也因此要額外加入Positional Encoding來知道順序(非訓練出來)。
  5. Encoder & Decoder都包含了Multi-head AttentionFeed Forward Network,其中Decoder多了EncoderMulti-head Attention,並且把第一個sublayer改變成Masked Multi-head Attention避免受到該預測位置後的結果影響。

Reference


#AI #NLP #Paper #Transformer #Pretrained #Attention







Related Posts

如何使用 Python 和 Locust 進行 Load testing 入門教學

如何使用 Python 和 Locust 進行 Load testing 入門教學

[Release Notes] 20210419_v1 - Support Buy me a coffee donate button

[Release Notes] 20210419_v1 - Support Buy me a coffee donate button

Python Web Flask 實戰開發教學 - 簡介與環境建置

Python Web Flask 實戰開發教學 - 簡介與環境建置


Comments