0%

Attention is all you need 筆記

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)。

ConvS2S

圖 1、 ConvS2S

圖 1 中, ConvS2S 運用 CNN window 概念建立 word 和 word 之間的關係,並且學習到之間的 dependency。

CNN 沒辦法包括較遠的 word 資訊,因此使用 multi-layer 機制,疊多層 CNN 來解決這個問題。第二層計算第一層計算完的資訊……以此類推 (如圖 2),不過缺點是記憶體使用量太多。

Multi-layer ConvS2S

圖 2、Multi-layer ConvS2S

Self-attention

本篇論文只使用 attention 機制和 fully connected layer 來計算 sequence 的 representation。

attention 機制是一堆矩陣的運算,不僅可以平行運算,記憶體使用量也很少。

Model

圖 3 是本篇論文所提出的 transformer 架構圖,紅色框框為 encoder,綠色框框為 decoder。

transformer

圖 3、transformer 架構圖

Definition of Attention

本篇論文將 attention 分成 Q、K、V 三個要素

  • Q : 去 match 別人
  • K : 被 match
  • V : 要提取的資訊

而計算公式如下:

與 ConvS2S 的 attention 做比較

ConvS2S attention 公式

圖 4、ConvS2S attention 公式

圖五是 attention 結構圖,對照公式可以更清楚的理解
其中 mask 是 decoder 才需要因為 decoder 並不需要知道未來的訊息

Scale Dot-product Attention

圖 5、attention 結構

以台大李宏毅老師的影片圖解 transformer attention 的公式,attention 的概念 都跟 attention model[3] 差不多

如圖 6

  1. 每個 x 都各自分成 Q、K、V 三個要素
  2. Q 與每個 K (包含自己的)相乘得到 $\alpha$

attention 公式圖解 1

圖 6、Q 與 K match

圖 7
將 $\alpha$ 做 softmax 得 attention score,代表 X 在 target word 占多少比例

attention 公式圖解 2

圖 7、attention score

圖 8

將 attention score 與 V 做 weighted sum 得 context vector

attention 公式圖解 3

圖 8、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$ 做內積

平行計算-QK
平行計算-QK

圖 9、平行計算-QK

再來 ${Q K^{T}}$ 的結果與 $V$ 做矩陣相乘(等同於 weighted sum)得到 context vector

平行計算 context vector

圖 10、平行計算-context vector

Self-attention

運用 attention,Q、K、V 都是自己,也就是 $Attention(X,X,X)$, 來計算 sequence 中彼此之間的關係。(如圖 11)

self-attention

圖 11、self-attention

這個架構有點像 ConvS2S (如圖 12)

ConvS2S

圖 12、 ConvS2S

Multi-head attention

如之前講的 self-attention 類似 ConvS2S 的架構,但是 CNN 能學習到 word 和 word 之間的關係,像是哪個字代表 who 等等 (如圖 13)

CNN 能學習到 word 和 word 之間的關係

圖 13、 CNN 能學習到 word 和 word 之間的關係

但是 self-attenion 由於是學習 attend 到哪一個 word,也就是說,self-attention 只能學習到單項程度上的差異而已,像是哪個 word 對於 who 的程度比較多 (如圖 14),並不能學到多項關係。

self-attention word 和 word 之間的程度關係
self-attention word 和 word 之間的程度關係

圖 14、 self-attention word 和 word 之間的程度關係,顏色最灰的代表 who

因此我們需要 multi-head self-attention。每一個 head 都代表著某一項關係,像是 who、where,再以 self-attention 選擇最好的那一個 (圖 15)

multi-head self-attention

圖 15、multi-head self-attention

(如圖 16) Multi-head 將 K、Q、V 經過 fully connected layer 分成多個 head input ,之後將 multi-head 的結果 concate 起來再丟入 fully connected layer, 這裡的 fully connected layer 我當作是一個 size 的轉換器。

multi-head 架構圖

圖 16、multi-head 架構圖

公式如下
multi-head 公式

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)。

position embedding

圖 17、Position embedding

concate 在 input 到 fully connected layer ,可以拆成 $W^Ix^i+ W^pp^i$,結果與原先方法 $a^i+e^i$ 差不多。

Encoder

Encoder

圖 18、Encoder

結構上,一個 encoder layer 有一個 multi-layer 和一個 fully connected layer。encoder 總共有 6 層 encoder layer,目的是把 source sentence 的句意學出來。

Decoder

Decoder

圖 19、Decoder

結構上,和 encoder 差不多,一個 Decoder layer 有一個 multi-head attention 和一個 fully connected layer,但多加了一個 multi-head attention 用來計算 encoder output 與 decoder 的關係。decoder 也總共有 6 層 decoder layer,

Result

transformer result

圖 20、transformer result

transformer 分析

圖 21、transformer 參數分析

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

Website

  1. 台大李弘毅老師
  2. 台大陳蘊儂老師