於是這世界就出現了一個大能發明了 Transformer 這種可以有 RNN 的特性以及超快的訓練速度與不輸(甚至更好)的準度。
在注意力機制出現之前,這種模型(Encoder 和 Decoder)幾乎都是用 RNN 來實作的,你也可以從上圖發現到如果要得到一段 context vector 給 Decoder 的話,你必須把整段 sequence 都看過一次才生的出來,可以很直覺想像的到,這樣一段 context vector 並不能很完整的把原本的資訊給打包起來,尤其是當 sequence 很長的情況下更是如此,而解決這種問題的方法就稱作注意力機制。
注意力機制說白了就是把中間所有的 hidden_state 都提出來給 Decoder 看,然後讓 Decoder 決定哪段需要多注意一點 (就是權重高一點),用注意力機制更改一下上面的圖,它看起來應該會像這樣。
數字跟英文我都懂,但湊起來怎摸就看不懂了
我們假設現在有辦法取得各個 Encoder 跟 Decoder 的 hidden_state,其中:
Encoder 的 hidden_state 定義為 h_s
Decoder 的 hidden_state 定義為 h_t
前面有提到要讓 Decoder 決定哪段需要多注意一點,具體的做法就是要算一個權重
Step_1:
選一個 attention function 來計算當前 h_t 對每一個 h_s 的相關程度,這個 function 常見的算法像是 dot product,這邊就先叫它 score(h_t,h_s)
Step_2:
計算 attention weight,就是用 softmax 把 score 轉成 probability distribution
這個 "attention vector" 也會是下一個時間點的輸入
而之所以被稱為權重,是因為 "attention vector" 它是可以被訓練的,訓練過後的權重值可以讓當下的 Decoder 知道哪個 Encoder 的 hidden_state 比較重要,並依此從它們身上取得上下文資訊。
(Seq2Seq + 注意力機制) 看起來水平很高,但其實還是有地方可以更好,那就是我們需要平行運算才可以更快,而"自"注意力機制就克服了 RNN 不能平行運算的問題,比較下兩個的差異。
注意力機制:
Decoder 在生成輸出時關注 Encoder 的輸出,從中獲得上下文資訊
"自"注意力機制:
Encoder 在生成輸入時關注"自己"序列中的其他元素,從中獲得上下文資訊
Decoder 在生成輸出時關注"自己"序列中的其他元素,從中獲得上下文資訊
下面做的事情,跟上面的概念上是一樣的,最後 Attention Is All You Need 的論文作者們用 "自"注意力機制加上注意力機制打造了一個完全不用 RNN 的 Seq2Seq 模型,下面這張圖就是一個非常簡化的 Transformer,Encoder 跟 Decoder 各自利用"自"注意力機制關注自己處理的 sequence,變成是可以平行運算的。
今天我們簡單的介紹了一部分的 Transformer,後面還有很多細節要說明 (努力理解中),最後祝大家中秋愉快 XD。
淺談神經機器翻譯 & 用 Transformer 與 TensorFlow 2 英翻中