繼 Attention model 之後,由於 recurrent 架構的特性一直無法善用 GPU 的資源做加速。

這時 Google Brain 團隊就看到別人在用 self-attention 機制,也是基於 recurrent 架構,解決了不少問題,用在閱讀理解、摘要、文字蘊涵(textual entailment)及語句表示的問題上。

Google Brain 團隊就提出了史上第一個不需要依賴任何 recurrent 架構的 self-attention 機制模型,Transformer。

(跟變形金剛一樣的名字耶!帥吧!)

Transformer

這個架構上延續了 encoder-decoder 的架構,encoder 會將輸入的序列 $(x_1, x_2, …, x_n)$ 轉換成 $\mathbf{z} = (z_1, z_2, …, z_n)$,而 decoder 會將 $\mathbf{z}$ 轉換成 $(y_1, y_2, …, y_m)$,一次轉換一個。在每一步當中,模型都是 auto-regressive 的,也就是說,前一次產生的結果會被當成下一次的輸入進行運算。

整個 Transformer 的架構就是在 encoder 及 decoder 上使用了 stacked self-attention 以及全連接的網路。我們來看圖,在圖的左半邊就是 encoder,右半邊就是 decoder:

Encoder

Encoder 由 N 個完全一樣的層堆疊(stack)起來($N = 6$)。每層包含兩個子層,第一個是一個 multi-head self-attention 的機制,第二個是簡單的全連接層網路。每個子層外都包了 residual connection 以及 layer normalization,看起來就像 $LayerNorm(x + Sublayer(x))$。

Residual connection 主要可以將前層的資訊繞過一層,直接與下一層做運算。Layer normalization 有穩定學習效果的作用。

Decoder

Decoder 大致上與 encoder 相同,差別是在用了兩個 multi-head self-attention 的機制,所以總共有3個子層。

Attention

在 attention 的機制上,我們在上一篇講過了。這邊我們要進一步探討這個模型用到的 scaled dot product attention。在這邊就是分成 query、key 跟 value 三者,首先要先將 query 跟所有 key 做過一次的內積,並且除以 $\sqrt{d_k}$,然後過一次 softmax 函數。計算到這邊就是權重的部份,最後權重再跟 value 去計算結果。其中 $d_k$ 是 key 向量的維度。公式在這邊:

$$
Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V
$$

圖的左邊是 scaled dot product attention。為什麼要除以 $\sqrt{d_k}$ 呢?文章中有提到,內積會讓整個結果變很大,會讓梯度變得極小,這會不利於訓練,所以需要除以 $\sqrt{d_k}$。

在圖的右邊,是 multi-head self-attention,核心就是平行計算多個 scaled dot product attention 的結果,並把這些結果都串接起來。有了這樣的機制就可以不只注意一個地方,可以有多個關注點。

在 self-attention 的機制,意味著所有的 query、key 跟 value 都來自於自己。不像之前的 attention 橫跨 encoder 跟 decoder,所以資訊會從雙方而來。

在 Transformer 模型當中,有一個是 encoder-decoder attention layer,然後 encoder 跟 decoder 各有一個 self-attention layer,就是各自的第一個子層。

如此構成了整個 Transformer 模型,如果各位想知道這個模型的應用跟效能的話,請移駕去看論文,論文寫的還蠻簡單易懂的。

當然這麼模型當中有不少巧思在裡頭,有需要說明的話就提問囉!