Seq2Seq模型
傳統的機器翻譯的方法往往是基於單詞與短語的統計,以及復雜的語法結構來完成的。基於序列的方式,可以看成兩步,分別是 Encoder 與 Decoder,Encoder 階段就是將輸入的單詞序列(單詞向量)變成上下文向量,然后 decoder根據這個向量來預測翻譯的結果。
encoder 階段
encoder 階段面臨的一個問題是,對於輸入語句,語句的長度往往是不固定的,但是我們訓練神經網絡往往都是要固定長度的向量。所以如何解決這個問題是 encoder階段的關鍵。我們通常使用多層的 LSTM,上一層的輸出將作為下一層的輸入。
在 Google 提出 Seq2Seq 的時候,提出了將輸出的語句反序輸入到 encoder中,這么做是為了在 encoder階段的最后一個輸出恰好就是 docoder階段的第一個輸入。
decoder階段
這一階段要稍微與encoder階段要復雜一點點。首先是一個 Token, 一般是一個 <EOS> 表示輸入的結束,也就是下圖中的 "Go",表示 decoder 階段的開始,還有一點不一樣就是,我們期望用以及正確預測的數據作為下一次的上下文參考,所以也就是上一節講到的 \(C_i\) 的信息,作用到下一個時間點。橫向可以看成 序列的,縱向可以看成是並行的(但是實際上不是並行的)。
雙向 RNN
上面的方法面臨這樣一個問題,那就是單詞向量往往是與上下文有關的,而不僅僅只於前面的文字有關,所以需要改進單向 RNN,這里我們使用雙向 RNN來解決這個問題:
上圖是一個雙向 LSTM,圖中是一個encoder的例子,每一個隱含層的狀態都有兩個向量表示,分別表示兩個方向,\(h=\left[h^{(f)} \quad h^{(b)}\right]\)。輸出也有兩個,分別是 \(\left[ \begin{array}{ll}{o_{t}^{(f)}} & {o_{t}^{(b)}}\end{array}\right]\)。
基於全局的 Attention 策略
基於局部的 Attention 策略
Attention 機制
在翻譯的模型中,舉個簡單的例子,
"the ball is on the field,"
其中關鍵的單詞就那么幾個,而且很多情況下,如果將所有的單詞都考慮進來的話,會導致過擬合,反而會導致語義的不准確,所以提出了attention 的機制,主要思想作用在 decoder階段,每次觀察整個句子,在每一步可以決定那些單詞是重要的。
Bahdanau et al.提出的 神經網絡翻譯模型
encoder階段使用一個雙向 LSTM,
decoder階段
神經網絡隱含層的使用的機制:
其中 \(s_{i-1}\) 是神經網絡前一層的輸出,然后 \(y_{i-1}\) 是上一個時間序列,也就是預測的上一個單詞的輸出,\(C_{t}\) 於LSTM中的 \(C_t\)不太一樣,但是本質上都是用來記錄信息的。
通過神經網絡的輸出,預測的機制:
上面式子中用到的 \(y_{i-1}\) 就很容易理解了。
這個 \(C_i\) 本質上都是用來記錄信息的,這里的計算方式是:
上式中的 \(h_j\) 也不是LSTM中的隱含層的狀態,隱含層的狀態是 \(s_i\) ,而是包含了重點關注第 \(i\)個單詞的信息。所以我們很容易想到,這里獲取 \(c_i\) 的時候必須要加權,就是對每個 \(i\),進行加權,那么衡量權重的標志是什么呢?我們用 \(e_{ij}\) 來表示,
這是一個對齊模型,表示輸入的單詞 \(j\), (我們重點關注的)在輸出位置為 \(i\) 的可能性大小。然后我們將這個得分進行加權計算,就得到了
再返回去求 \(c_i\)。上面的對齊模型,我們可以直接使用一個傳統的神經網絡。attention 機制的一個好處就是可以很好的翻譯長句子,因為可以忽略不需要的信息。
Huong et al. 的神經網絡翻譯模型
全局attention 機制
對於encoder階段給出的隱藏層的狀態,\(h_{1}, \ldots, h_{n}\),對於 decoder階段的隱含層狀態,\(\overline{h_{1}}, \ldots, \overline{h_{n}}\)。我們可以計算一個得分,\(h_{i}\) 是當前時間序列已得到的隱含層輸出 ,使用下面任意一種函數:
然后就像上面的那個模型一樣,通過 \(softmax\) 函數來計算概率,將這個概率作為加權即可,
然后就得出了單詞的文本向量,
接下來就可以計算新的隱含層的狀態了:
然后通過最后的預測函數,預測出下一個單詞。這里在時間上 \(\tilde{h}_{i}\) 也會作為下一個時間點的輸入。
Local attention 的機制
Local Attention 就是使用了一個窗口表示關注的單詞,可以改變窗口的大小,說明對任意的單詞都可以關注。
Sequence model decoders
上面的例子也說明了,在 Attention 階段最重要的是 Decoder的策略。
機器翻譯起源於統計翻譯,我們從概率的角度就是對於輸入語句 \(S\) 與目標語句 \(\overline{S}\),我們的目標就是
但是對於目標語句可能性太多,也就造成了計算量太大,我們有幾種策略:
Beam search
Beam search 是使用的最多的一種策略,這種方法就是每次維持一個大小為 \(K\) 的翻譯語句集合,
當我們預測 \(t+1\) 的時刻的時候,我們依然取可能性最大的 \(K\) 個集合:
其中
表示每一種可能的組合。
機器翻譯的評估系統
Evaluation against another task
將我們翻譯的語句用於其他的系統中以查看翻譯的效果。舉個例子,我們將翻譯的語句用於問答系統,與標准的語句用於問答系統,都能得到准確的回答,那么說明我們翻譯的過程中抓住了句子的關鍵信息,在評估翻譯結果的時候,時要考慮多方面的,這是我們既不能說我們的翻譯完全正確,也不能說是失敗了。
Bilingual Evaluation Understudy (BLEU)
這個方法是通過將一個參與的翻譯系統的結果 B,與人工翻譯的結果 A,進行對比評估,使用 n-gram 的方法進行對比。其中可能會有多個參考也就是reference。
n-gram 的方法主要是關注窗口的大小。將連在一起的單詞作為一個窗口,然后計算匹配的窗口的個數。最簡單的例子就是:
對於窗口,我們用 window 來表示,出現的次數,
表示這個 window 在翻譯文本與 reference文本中出現的最低的次數,那么精度可以這樣計算:
\(H_k(c_i)\) 表示機器翻譯的結果中 \(c_i\) 出現的次數,\(H_k(s_{ij})\) 表示標准答案下 \(S_{ij}\) 出現的次數,這里為什么 \(S\) 下面有雙下標,是因為,這里我們可以有很多個 reference。
懲罰因子
考慮機器翻譯的結果為第二句,第一句為參考的情況,這個時候,計算的結果表明,翻譯的很好,因為第二個語句比較短,所以 \(H_k(s_{ij})\) 的正確率表現得比較高,但是實際上整個句子的翻譯效果沒有那么高:
there are many ways to evaluate the quality of a translation, like comparing the number of n-grams between a candidate translation and reference
the quality of a translation is evaluate of n-grams in a reference and with translation
因此我們引入一個懲罰因子:
其中分子表示 reference的長度,分母是機器翻譯結果的長度,那么最終的評分我們就可以表示成:
Dealing with the large output vocabulary
還有一個問題就是處理 vocabulary 過大的情況下,由於輸出的時候需要經過一個 \(softmax\) 函數,所以在輸出的時候,如果輸出的 vocabulary 過大的話,那么 softmax 這一過程計算量就會特別大。
在第一節課里面我們就介紹過兩種方法,分別是分層 SoftMax 與 Negative Sampling(負采樣)。傳送門:傳送門
還有一些方法可以用:
降低詞典的大小
為了限制詞典的大小,對於語句中出現的未知的單詞,我們就用 <UNK> 來表示,但是這樣可能會導致源語句失去一些關鍵信息。還有一種方法就是,
還有一種做法就是將數據集進行划分,這樣的好處是,相似關系的數據集一般在一起。每個訓練數據的子集取大小為 $ \tau=\left|V^{\prime}\right|$ 的字典。然后對整個數據集進行迭代。主要思想就是,我們在訓練的時候,將訓練數據分成很多個 Min-Batches,對每個 Min-Batches 的選取就是選取到 $ \tau$ 個單詞的時候,用來表示這個字典,然后在訓練的時候用這種數據會大大降低在 SoftMax 階段的計算量。我們假設每次訓練集的目標單詞,也就是 Min-Batches 部分的單詞,構成集合 \(V_{i}^{\prime}\),那么這個集合中每個單詞的概率就是:
基於單詞的模型與基於字母的模型
基於單詞的模型,可以選取出現概率最高的 n-gram 框,然后將這個框不斷地加到數據集中去。
簡單說下這兩種方式的混合策略,
混合策略中,首先是對於單詞的預測,使用常規的 LSTM,但是遇到輸出的單詞是 <UNK> 的時候,我們就需要使用字母級上的神經網絡了。