繼 Seq2seq model 之後,真正可以做到 end-to-end 翻譯的,很多都是用了 attention model。
Attention model,正確來說,不是指特定的一個模型,他是模型的一個部份或是一種設計,所以有人叫他 attention mechanism。
Attention model 被用在機器翻譯、語句的摘要、語音辨識、影像理解(image caption)。
有幾篇論文算是開始用這樣的機制:
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 的 ,而 key 就是 encoder 的 。每一個 key 都會去跟 query 個別通過 compatibility function 算一次吻合程度 。這些 就是權重,會去跟 value 做線性組合。在這邊為了簡單所以讓 value 跟 key 是一樣的,其實可以是不同的東西。計算出來的結果 就是 context vector,會作為 decoder 的輸入,與 一起計算出 。
這樣就算是完成一輪 attention mechanism 了。下一次再繼續用 當成 query 進行比對。
如此一來,就可以以動態的方式去產生序列了。Encoder 負責的是將輸入的序列轉成固定大小的向量,decoder 將這樣的向量轉換回序列,而中間需要動態調整的部份就像人的注意力一樣,會去掃視跟比對哪個部份的翻譯是最吻合的,然後將他做一個線性組合的調整。
今天的解析就到這邊啦!