繼 Seq2seq model 之後,真正可以做到 end-to-end 翻譯的,很多都是用了 attention model。

Attention model,正確來說,不是指特定的一個模型,他是模型的一個部份或是一種設計,所以有人叫他 attention mechanism。

Attention model 被用在機器翻譯、語句的摘要、語音辨識、影像理解(image caption),算是用途非常廣泛。

有幾篇論文算是開始用這樣的機制:

  1. Neural Machine Translation by Jointly Learning to Align and Translate
  2. A Neural Attention Model for Abstractive Sentence Summarization
  3. Reasoning about Entailment with Neural Attention

Attention model 在很多模型當中都是做為 encoder-decoder 之間的橋樑,原本的 encoder 跟 decoder 之間是只有一個 vector 來傳遞所有的訊息,但是多了 attention mechanism 就不一樣了。

Attention mechanism 主要可以動態的去抓到 encoder 中傳遞的訊息,並且將這些訊息與 decoder 輸出的前一個訊息互相比對之後,透過線性組合之後輸出。這樣的輸出有什麼效果呢?他可以動態地去找到兩邊最相符的資訊,並且將他重要的部份以權重的方式凸顯出來,所以這部份是做線性組合。

我看到一個廣義的描述方法,他是這樣說的,我們可以把 attention model 想成是一個函數,這個函數會吃兩種東西,一種是 query,另一種是 key-value 的資料結構,讓 query 去比對所有的 key 找到吻合的,會透過一個 compatibility function 去計算吻合的程度,並且作為權重,最後將權重與相對應的 value 做內積。在這邊 query、key、value 三者都是向量。

在這邊 query 會是 decoder 的 $z_0$,而 key 就是 encoder 的 $h^1, h^2, …$。每一個 key 都會去跟 query 個別通過 compatibility function 算一次吻合程度 $\alpha_0^1, \alpha_0^2, …$。這些 $\alpha_0^1, \alpha_0^2, …$ 就是權重,會去跟 value $h^1, h^2, …$ 做線性組合。在這邊為了簡單所以讓 value 跟 key 是一樣的,其實可以是不同的東西。計算出來的結果 $c^1$ 就是 context vector,會作為 decoder 的輸入,與 $z_0$ 一起計算出 $z_1$。

這樣就算是完成一輪 attention mechanism 了。下一次再繼續用 $z_1$ 當成 query 進行比對。

如此一來,就可以以動態的方式去產生序列了。Encoder 負責的是將輸入的序列轉成固定大小的向量,decoder 將這樣的向量轉換回序列,而中間需要動態調整的部份就像人的注意力一樣,會去掃視跟比對哪個部份的翻譯是最吻合的,然後將他做一個線性組合的調整。

今天的解析就到這邊啦!