天天看點

Seq2Seq模型 與 Attention 政策

Seq2Seq模型

傳統的機器翻譯的方法往往是基于單詞與短語的統計,以及複雜的文法結構來完成的。基于序列的方式,可以看成兩步,分别是 Encoder 與 Decoder,Encoder 階段就是将輸入的單詞序列(單詞向量)變成上下文向量,然後 decoder根據這個向量來預測翻譯的結果。

encoder 階段

encoder 階段面臨的一個問題是,對于輸入語句,語句的長度往往是不固定的,但是我們訓練神經網絡往往都是要固定長度的向量。是以如何解決這個問題是 encoder階段的關鍵。我們通常使用多層的 LSTM,上一層的輸出将作為下一層的輸入。

Seq2Seq模型 與 Attention 政策

在 Google 提出 Seq2Seq 的時候,提出了将輸出的語句反序輸入到 encoder中,這麼做是為了在 encoder階段的最後一個輸出恰好就是 docoder階段的第一個輸入。

decoder階段

這一階段要稍微與encoder階段要複雜一點點。首先是一個 Token, 一般是一個 <EOS> 表示輸入的結束,也就是下圖中的 "Go",表示 decoder 階段的開始,還有一點不一樣就是,我們期望用以及正确預測的資料作為下一次的上下文參考,是以也就是上一節講到的 \(C_i\) 的資訊,作用到下一個時間點。橫向可以看成 序列的,縱向可以看成是并行的(但是實際上不是并行的)。

Seq2Seq模型 與 Attention 政策

雙向 RNN

上面的方法面臨這樣一個問題,那就是單詞向量往往是與上下文有關的,而不僅僅隻于前面的文字有關,是以需要改進單向 RNN,這裡我們使用雙向 RNN來解決這個問題:

Seq2Seq模型 與 Attention 政策

上圖是一個雙向 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 Layer[Not supported by viewer]Context vector[Not supported by viewer]Global align weights[Not supported by viewer]$\boldsymbol{C}_{t}$$\boldsymbol{C}_{t}$$\boldsymbol{a}_{t}$[Not supported by viewer]$\tilde{\boldsymbol{h}}_{t}$<font style="font-size: 14px">$\tilde{\boldsymbol{h}}_{t}$</font>$y_{t}$[Not supported by viewer]$\boldsymbol{h}_{t}$[Not supported by viewer]

$\overline{\boldsymbol{h}}_{\boldsymbol{s}}$<font style="font-size: 14px">$\overline{\boldsymbol{h}}_{\boldsymbol{s}}$</font>

基于局部的 Attention 政策

Attention Layer[Not supported by viewer]Context vector[Not supported by viewer]Local weights[Not supported by viewer]$\boldsymbol{C}_{t}$$\boldsymbol{C}_{t}$$\boldsymbol{a}_{t}$[Not supported by viewer]$\tilde{\boldsymbol{h}}_{t}$<font style="font-size: 14px">$\tilde{\boldsymbol{h}}_{t}$</font>$y_{t}$[Not supported by viewer]$\boldsymbol{h}_{t}$[Not supported by viewer]

Aligned position[Not supported by viewer]

$p_{t_{1}}$[Not supported by viewer]

Attention 機制

在翻譯的模型中,舉個簡單的例子,

"the ball is on the field,"

其中關鍵的單詞就那麼幾個,而且很多情況下,如果将所有的單詞都考慮進來的話,會導緻過拟合,反而會導緻語義的不準确,是以提出了attention 的機制,主要思想作用在 decoder階段,每次觀察整個句子,在每一步可以決定那些單詞是重要的。

Bahdanau et al.提出的 神經網絡翻譯模型

encoder階段使用一個雙向 LSTM,

神經網絡隐含層的使用的機制:

\[s_{i}=f\left(s_{i-1}, y_{i-1}, c_{i}\right)

\]

其中 \(s_{i-1}\) 是神經網絡前一層的輸出,然後 \(y_{i-1}\) 是上一個時間序列,也就是預測的上一個單詞的輸出,\(C_{t}\) 于LSTM中的 \(C_t\)不太一樣,但是本質上都是用來記錄資訊的。

通過神經網絡的輸出,預測的機制:

\[p\left(y_{i} | y_{1}, \ldots, y_{i-1}, \mathbf{x}\right)=g\left(y_{i-1}, s_{i}, c_{i}\right)

上面式子中用到的 \(y_{i-1}\) 就很容易了解了。

Seq2Seq模型 與 Attention 政策

這個 \(C_i\) 本質上都是用來記錄資訊的,這裡的計算方式是:

\[c_{i}=\sum_{j=1}^{T_{x}} \alpha_{i j} h_{j}

​ 上式中的 \(h_j\) 也不是LSTM中的隐含層的狀态,隐含層的狀态是 \(s_i\) ,而是包含了重點關注第 \(i\)個單詞的資訊。是以我們很容易想到,這裡擷取 \(c_i\) 的時候必須要權重,就是對每個 \(i\),進行權重,那麼衡量權重的标志是什麼呢?我們用 \(e_{ij}\) 來表示,

\[e_{i j}=a\left(s_{i-1}, h_{j}\right)

這是一個對齊模型,表示輸入的單詞 \(j\), (我們重點關注的)在輸出位置為 \(i\) 的可能性大小。然後我們将這個得分進行權重計算,就得到了

\[\alpha_{i j}=\frac{\exp \left(e_{i j}\right)}{\sum_{k=1}^{T_{x}} \exp \left(e_{i k}\right)}

再傳回去求 \(c_i\)。上面的對齊模型,我們可以直接使用一個傳統的神經網絡。attention 機制的一個好處就是可以很好的翻譯長句子,因為可以忽略不需要的資訊。

Huong et al. 的神經網絡翻譯模型

全局attention 機制

對于encoder階段給出的隐藏層的狀态,\(h_{1}, \ldots, h_{n}\),對于 decoder階段的隐含層狀态,\(\overline{h_{1}}, \ldots, \overline{h_{n}}\)。我們可以計算一個得分,\(h_{i}\) 是目前時間序列已得到的隐含層輸出 ,使用下面任意一種函數:

\[\operatorname{score}\left(h_{i}, \overline{h}_{j}\right)=\left\{\begin{array}{l}{h_{i}^{T} \overline{h}_{j}} \\ {h_{i}^{T} W \overline{h}_{j}} \\ {W\left[h_{i}, \overline{h}_{j}\right]}\end{array}\right.

然後就像上面的那個模型一樣,通過 \(softmax\) 函數來計算機率,将這個機率作為權重即可,

\[\alpha_{i, j}=\frac{\exp \left(\operatorname{score}\left(h_{j}, \overline{h}_{i}\right)\right)}{\sum_{k=1}^{n} \exp \left(\operatorname{score}\left(h_{k}, \overline{h}_{i}\right)\right)}

然後就得出了單詞的文本向量,

\[c_{i}=\sum_{j=1}^{n} \alpha_{i, j} h_{j}

接下來就可以計算新的隐含層的狀态了:

\[\tilde{h}_{i}=f\left(\left[\overline{h}_{i}, c_{i}\right]\right)

然後通過最後的預測函數,預測出下一個單詞。這裡在時間上 \(\tilde{h}_{i}\) 也會作為下一個時間點的輸入。

Local attention 的機制

Local Attention 就是使用了一個視窗表示關注的單詞,可以改變視窗的大小,說明對任意的單詞都可以關注。

Sequence model decoders

上面的例子也說明了,在 Attention 階段最重要的是 Decoder的政策。

機器翻譯起源于統計翻譯,我們從機率的角度就是對于輸入語句 \(S\) 與目智語句 \(\overline{S}\),我們的目标就是

\[\overline{s} *=\operatorname{argmax}_{\overline{s}}(\mathbb{P}(\overline{s} | s))

但是對于目智語句可能性太多,也就造成了計算量太大,我們有幾種政策:

Beam search

Beam search 是使用的最多的一種政策,這種方法就是每次維持一個大小為 \(K\) 的翻譯語句集合,

\[\mathcal{H}_{t}=\left\{\left(x_{1}^{1}, \ldots, x_{t}^{1}\right), \ldots,\left(x_{1}^{K}, \ldots, x_{t}^{K}\right)\right\}

當我們預測 \(t+1\) 的時刻的時候,我們依然取可能性最大的 \(K\) 個集合:

\[\tilde{\mathcal{H}}_{t+1}=\bigcup_{k=1}^{K} \mathcal{H}_{t+1}^{\tilde{k}}

其中

\[\mathcal{H}_{t+1}^{\tilde{k}}=\left\{\left(x_{1}^{k}, \ldots, x_{t}^{k}, v_{1}\right), \ldots,\left(x_{1}^{k}, \ldots, x_{t}^{k}, v_{|V|}\right)\right\}

表示每一種可能的組合。

機器翻譯的評估系統

Evaluation against another task

将我們翻譯的語句用于其他的系統中以檢視翻譯的效果。舉個例子,我們将翻譯的語句用于問答系統,與标準的語句用于問答系統,都能得到準确的回答,那麼說明我們翻譯的過程中抓住了句子的關鍵資訊,在評估翻譯結果的時候,時要考慮多方面的,這是我們既不能說我們的翻譯完全正确,也不能說是失敗了。

Bilingual Evaluation Understudy (BLEU)

這個方法是通過将一個參與的翻譯系統的結果 B,與人工翻譯的結果 A,進行對比評估,使用 n-gram 的方法進行對比。其中可能會有多個參考也就是reference。

n-gram 的方法主要是關注視窗的大小。将連在一起的單詞作為一個視窗,然後計算比對的視窗的個數。最簡單的例子就是:

Seq2Seq模型 與 Attention 政策

對于視窗,我們用 window 來表示,出現的次數,

\[Count_{clip}=\min \left(\text { Count }, \text { Max }_{-} \text { Ref }_{-} \text { Count }\right)

表示這個 window 在翻譯文本與 reference文本中出現的最低的次數,那麼精度可以這樣計算:

\[P_{n}=\frac{\sum_{i} \sum_{k} \min \left(h_{k}\left(c_{i}\right), \max _{j \in m} h_{k}\left(s_{i j}\right)\right)}{\sum_{i} \sum_{k} \min \left(h_{k}\left(c_{i}\right)\right)}

\(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

是以我們引入一個懲罰因子:

\[\beta=e^{\min \left(0,1-\frac{\operatorname{le}_{\mathrm{ref}}}{\operatorname{len}_{\mathrm{MT}}}\right)}

其中分子表示 reference的長度,分母是機器翻譯結果的長度,那麼最終的評分我們就可以表示成:

\[B L E U=\beta \times \exp \left(\sum_{n=1}^{N} w_{n} \log P_{n}\right)

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}\),那麼這個集合中每個單詞的機率就是:

\[Q_{i}\left(y_{k}\right)=\left\{\begin{array}{ll}{\frac{1}{\left|V_{i}^{\prime}\right|}} & {\text { if } y_{t} \in V_{i}^{\prime}} \\ {0} & {\text { otherwise }}\end{array}\right.

基于單詞的模型與基于字母的模型

基于單詞的模型,可以選取出現機率最高的 n-gram 框,然後将這個框不斷地加到資料集中去。

簡單說下這兩種方式的混合政策,

混合政策中,首先是對于單詞的預測,使用正常的 LSTM,但是遇到輸出的單詞是 <UNK> 的時候,我們就需要使用字母級上的神經網絡了。