在今天的文章中,自然語言處理又更邁進一步拉。今天要介紹的兩大重點,一個是在神經機器翻譯 (Neural Machine Translation) 表現得很好的模型 - Sequence to Sequence ,另一個則是讓這個模型進步許多,後來也在其他模型上取得成功的機制 - 注意力機制 (Attention)
Seq2Seq
2014 年,第一篇 Seq2Seq 論文被發表。
2016 年, Google 翻譯將原本使用的 Statistical Machine Translation 系統,換成以機器學習為基底的 Neural Machine Translation 系統。
Seq2Seq 模型的問世,讓神經機器翻譯無疑是自然語言處理演進史上的一大成功。現在,讓我們來深入看看 Seq2Seq 是怎麼進行翻譯的。
圖片出處:李宏毅教授 sequence-to-sequence learning 課程
Seq2Seq 基本上可以分成兩大部分: Encoder 和 Decode 。 Encoder 在做的事情有點像是降低維度,把原本一個句子的資訊壓縮成一個向量,Decoder 則是利用這個向量來預測下一個詞,產生新的文字內容。值得一提的是,這兩者是直接組裝起來訓練,輸入給定句子輸出翻譯,我們並不會看到中間產物的向量。
像這樣根據給定的條件生成內容的行為,就稱為 Conditional Generation 。而 Seq2Seq 這個模型,也是一種 Conditional Language Model , Language Model 指的是 Seq2Seq 預測並生成文字, Conditional 則代表他是根據給定的句子來生成翻譯文字的。
再來說說 Encoder 跟 Decoder ,其實他們的結構都是前面提到的 RNN, Encoder RNN 吃進輸入的句子後,會產生一串 Cell States 和 Hidden States ,我們取最後一個步驟的輸出來當作壓縮後的向量(以 LSTM 為例,可能是取 Cell State 或是 Hidden State ),並假設這個向量含有整個句子的資訊。
在深入講解 Decoder 之前,來看看 RNN 模型是如何生成文字的。通常我們會給模型一個特殊的符號 <BOS>
(Begin of the Sentence) 當做第一個詞,模型吃進這第一個詞後,會輸出各個詞彙的機率分佈 y1 ,我們從這個機率分佈隨機取樣或是取最高機率,來當作輸出的詞,也是模型下一個輸入的詞。除了 <BOS>
外還有一個特殊的詞 <EOS>
(End of the Sentence) ,當模型預測出這個詞的時候,句子的生成便結束。
圖片出處:李宏毅教授 sequence-to-sequence learning 課程
Decoder RNN 的輸入除了這一個個預測出的詞以外,也包括 Encoder RNN 得出的向量, Decoder RNN 就由這兩者組合而成的輸入 ,得到下一個詞的機率分佈,藉此生成其後的一整個句子。
Attention
Seq2Seq 看似強大,也取得了不錯的成果,但不知道大家有沒有覺得他的架構可能有一些問題?在我們取最後一個狀態的輸出當作 Encode 的向量時,假設這個向量可以包含整個句子的資訊,但之前提過, RNN 可能會忘記太遠的資訊,即使 LSTM / GRU 等模型改善了這個問題,仍然無法完全解決。
於是,這最後的輸出就成了資訊的瓶頸,我們無法保證他到底包含了多少輸入句子的資訊。這時候,有人提出了一個機制試圖解決這個問題,這個機制就是我們接下來要介紹的 - 注意力機制 (Attention) 。
注意力機制的核心概念是,在 Decoder 的每一個步驟,都直接與 Encoder 相連,透過權重加權 Encoder 輸出的序列當作 Decoder 的輸入。如此一來, Decoder 的每個步驟,都好像是專注在輸入的句子權重高的部分,於是對於每個翻譯出的詞,我們可以知道他是專注在輸入的哪些詞而得出的結果。
那要如何得到這些權重呢?一個很機器學習風格的答案 - 機器自己學的。
看看下面的圖,在計算 Decoder 第一步驟輸入的時候我們會有一組模型的參數 z0 ,z0 與每個 Hidden State 進行 Match 的運算,這個運算是可以自己定義的,可以是 z, h 兩者的相似度,或是直接丟進一個小 NN 得出分數,最後得到的結果就是 Attention Score α1(0)
圖片出處:李宏毅教授 sequence-to-sequence learning 課程
讓 z0 對每個 Hidden State h 進行運算,我們可以得到和 Hidden States 數量一樣多的 α ,取 Softmax 轉換成機率,就得到了 Attention Distribution。將這些機率乘以 Hidden States ,有如取 Hidden States 的加權,加權後相加就得到了 Decoder 的輸入 - c0 。
圖片出處:李宏毅教授 sequence-to-sequence learning 課程
重複這個步驟,利用模型的參數 z0, z1, z2, ... 求出 Attention Scores, Attention Distribution ,計算 Decoder 輸入與輸出,直到模型輸出 <EOS>
就得到了我們要的結果。
小結
以上介紹完了在 Seq2Seq 模型上的注意力機制,其實注意力機制在其他深度學習的模型、或是其他的任務,都可以派上用場!
More general definition of attention:
Given a set of vector values, and a vector query, attention is a technique to compute a weighted sum of the values, dependent on the query. - Abigail See, Matthew Lamm, Stanford NLP with DL
筆者的英文能力實在很難把它翻得通順,不過注意力機制可以看作是對於一堆 Values (像是每個 Decoder Hidden State),我們試圖利用權重來選出這些值的重點,而 Query (像是所有的 Encoder Hidden States) 可以來幫助我們來決定要專注於哪些值。
在明天的文章,我們會介紹注意力機制催生的強大模型 - Transformer,我們明天見!