Attention Is All You Need paper link
前言
Facebook 推出 Convolutional Sequence to Sequence [1] 架構使用 CNN 平行運算的效果加速運算後,Google 緊接著推出 self-attention 的機制,只需要 attention 即可。
Why we need self-attention
以往大部分 machine translation task 是採用 RNN 的架構,像是 sequence to sequence [2,3],之後 Facebook 提出 Convolutional Sequence to Sequence (ConvS2S)。以下會探討優缺點。
RNN
RNN 雖然在生成生成不固定長度的 task 非常 powerful,像是語音、語句生成等等,但是他有一個問題是不能平行運算
。
不能平行運算
是怎麼回事?
在 RNN 架構中,當產生當下的 hidden state $h_{t}$ 時,必須等待 $h_{t-1}$ 計算完畢,因為 $h_{t}$ 的計算是有參考 $h_{t-1}$ (如公式),因此才無法平行運算。
CNN
為了解決平行運算
的問題,Facebook 提出 ConvS2S。 運用 CNN 可平行運算的特性 (如圖 1)。
圖 1 中, ConvS2S 運用 CNN window 概念建立 word 和 word 之間的關係,並且學習到之間的 dependency。
CNN 沒辦法包括較遠的 word 資訊,因此使用 multi-layer 機制,疊多層 CNN 來解決這個問題。第二層計算第一層計算完的資訊……以此類推 (如圖 2),不過缺點是記憶體使用量太多。
Self-attention
本篇論文只使用 attention 機制和 fully connected layer 來計算 sequence 的 representation。
attention 機制是一堆矩陣的運算,不僅可以平行運算,記憶體使用量也很少。
Model
圖 3 是本篇論文所提出的 transformer 架構圖,紅色框框為 encoder,綠色框框為 decoder。
Definition of Attention
本篇論文將 attention 分成 Q、K、V 三個要素
- Q : 去 match 別人
- K : 被 match
- V : 要提取的資訊
而計算公式如下:
與 ConvS2S 的 attention 做比較
圖五是 attention 結構圖,對照公式可以更清楚的理解
其中 mask 是 decoder 才需要因為 decoder 並不需要知道未來的訊息
以台大李宏毅老師的影片圖解 transformer attention 的公式,attention 的概念 都跟 attention model[3] 差不多
如圖 6
- 每個 x 都各自分成 Q、K、V 三個要素
- Q 與每個 K (包含自己的)相乘得到 $\alpha$
圖 7
將 $\alpha$ 做 softmax 得 attention score,代表 X 在 target word 占多少比例
圖 8
將 attention score 與 V 做 weighted sum 得 context vector
Scale Dot-product Attention
在 self-attention 的公式中,論文將 ${Q K^{T}}$ 除以 $\sqrt{d_{k}}$ 來做 scale
原因是當 $d_{k}$ 變大時,也就是說 ${Q K^{T}}$ 計算的 element 變多,${Q K^{T}}$ 的 variance 會上升。
導致:
- distribution 變 peak
- 層數越深的,performance 越差
為什麼是 $\sqrt{d_{k}}$ 而不是 ${d_{k}}$? 論文沒有明確的說法
Parallel computing
利用矩陣運算來達到平行運算的效果
這邊也使用台大李宏毅老師的影片圖解平行運算(忽略 $\sqrt{d_{k}}$)
公式再寫一次
首先 ${Q K^{T}}$ 的部分
- 將每個 $k$ 合併在一起形成 $K$
- 再合併 $q$ 形成 $Q$,與 $K$ 做內積
再來 ${Q K^{T}}$ 的結果與 $V$ 做矩陣相乘(等同於 weighted sum)得到 context vector
Self-attention
運用 attention,Q、K、V 都是自己,也就是 $Attention(X,X,X)$, 來計算 sequence 中彼此之間的關係。(如圖 11)
這個架構有點像 ConvS2S (如圖 12)
Multi-head attention
如之前講的 self-attention 類似 ConvS2S 的架構,但是 CNN 能學習到 word 和 word 之間的關係,像是哪個字代表 who 等等 (如圖 13)
但是 self-attenion 由於是學習 attend 到哪一個 word,也就是說,self-attention 只能學習到單項程度上的差異而已,像是哪個 word 對於 who 的程度比較多 (如圖 14),並不能學到多項關係。
因此我們需要 multi-head self-attention。每一個 head 都代表著某一項關係,像是 who、where,再以 self-attention 選擇最好的那一個 (圖 15)
(如圖 16) Multi-head 將 K、Q、V 經過 fully connected layer 分成多個 head input ,之後將 multi-head 的結果 concate 起來再丟入 fully connected layer, 這裡的 fully connected layer 我當作是一個 size 的轉換器。
公式如下
Position Embedding
Position Embedding 是用來增加位置訊息,因為 self-attention 並不能項 RNN 一樣有時間序列的概念
在 ConvS2S 裡, position embedding 是用 neural network 訓練出來的,而這篇論文是以三角函式來計算,如下:
將 $id$ 為 $p$ 的位置映射到 $d_{model}$ 維度的位置向量,這個向量的第 $i$ 個位置就是 $PE_{(pos,i)}$,奇數用 cosine,偶數用 sine。
本篇論文與 neural network 訓練出來的比較過,效果大同小異,由於可以減少模型的複雜度,因此使用公式的方法。
Position Embedding 本身是一個絕對位置的信息,但在 sentence 中,相對位置也很重要。 我們可以利用三角函數來表達位置 $p+k$
最後 position embedding 與 word embedding 相加,直覺上這樣會導致訊息上有所損失,但台大李弘毅教授在課堂上說: “concate 與相加結果其實大同小異” (如圖 17)。
concate 在 input 到 fully connected layer ,可以拆成 $W^Ix^i+ W^pp^i$,結果與原先方法 $a^i+e^i$ 差不多。
Encoder
結構上,一個 encoder layer 有一個 multi-layer 和一個 fully connected layer。encoder 總共有 6 層 encoder layer,目的是把 source sentence 的句意學出來。
Decoder
結構上,和 encoder 差不多,一個 Decoder layer 有一個 multi-head attention 和一個 fully connected layer,但多加了一個 multi-head attention 用來計算 encoder output 與 decoder 的關係。decoder 也總共有 6 層 decoder layer,
Result
Reference
Paper
[1] Gehring et al. : Convolutional sequence to sequence learning link
[2] Sutskever et al. : Sequence to Sequence Learning with Neural Networks link
[3] Luong et al. : Effective Approaches to Attention-based Neural Machine Translation, link