繼 Attention model 之後,由於 recurrent 架構的特性一直無法善用 GPU 的資源做加速。
這時 Google Brain 團隊就看到別人在用 self-attention 機制,也是基於 recurrent 架構,解決了不少問題,用在閱讀理解、摘要、文字蘊涵(textual entailment)及語句表示的問題上。
Google Brain 團隊就提出了史上第一個不需要依賴任何 recurrent 架構的 self-attention 機制模型,Transformer。
(跟變形金剛一樣的名字耶!帥吧!)
這個架構上延續了 encoder-decoder 的架構,encoder 會將輸入的序列 轉換成 ,而 decoder 會將 轉換成 ,一次轉換一個。在每一步當中,模型都是 auto-regressive 的,也就是說,前一次產生的結果會被當成下一次的輸入進行運算。
整個 Transformer 的架構就是在 encoder 及 decoder 上使用了 stacked self-attention 以及全連接的網路。我們來看圖,在圖的左半邊就是 encoder,右半邊就是 decoder:
Encoder 由 N 個完全一樣的層堆疊(stack)起來()。每層包含兩個子層,第一個是一個 multi-head self-attention 的機制,第二個是簡單的全連接層網路。每個子層外都包了 residual connection 以及 layer normalization,看起來就像 。
Residual connection 主要可以將前層的資訊繞過一層,直接與下一層做運算。Layer normalization 有穩定學習效果的作用。
Decoder 大致上與 encoder 相同,差別是在用了兩個 multi-head self-attention 的機制,所以總共有3個子層。
在 attention 的機制上,我們在上一篇講過了。這邊我們要進一步探討這個模型用到的 scaled dot product attention。在這邊就是分成 query、key 跟 value 三者,首先要先將 query 跟所有 key 做過一次的內積,並且除以 ,然後過一次 softmax 函數。計算到這邊就是權重的部份,最後權重再跟 value 去計算結果。其中 是 key 向量的維度。公式在這邊:
圖的左邊是 scaled dot product attention。為什麼要除以 呢?文章中有提到,內積會讓整個結果變很大,會讓梯度變得極小,這會不利於訓練,所以需要除以 。
在圖的右邊,是 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 模型,如果各位想知道這個模型的應用跟效能的話,請移駕去看論文,論文寫的還蠻簡單易懂的。
當然這麼模型當中有不少巧思在裡頭,有需要說明的話就提問囉!