神經(jīng)機器翻譯 之 tensorflow seq2seq

聲明:轉(zhuǎn)載請聲明作者,并添加原文鏈接。

簡介

這篇博客主要解讀seq2seq 自然語言處理模型,重點有三部分。

1. seq2seq 模型介紹

2. seq2seq 的注意力機制

3. 實戰(zhàn)tensorflow tutoral 的實驗過程。

本文實戰(zhàn)代碼是 https://github.com/tensorflow/nmt, 參考的課程主要是stanford CS224N Lecture 9, 10 ,11. http://web.stanford.edu/class/cs224n/

Seq2seq模型

以前的統(tǒng)計翻譯法, 都是將句子分解成一段一段的, 然后每一小段進行翻譯。 但是這樣翻譯出來的句子,不夠流暢。 我們?nèi)祟愐膊皇沁@么翻譯句子的。 人類應(yīng)該是看懂了句子,再進行翻譯, 而下面的神經(jīng)機器翻譯 sequence-to-sequence (seq2seq) 模擬了這個過程。

Fig. 1 Seq2seq neural machine translation (source:CS224N Lecture 10? http://web.stanford.edu/class/cs224n/lectures/lecture10.pdf)

Fig. 1 介紹了一個標(biāo)準(zhǔn)的seq2seq模型。 其中紅色的是encoder RNN, 綠色的是decoder RNN. 他們之間 有一個連線, 也就是encoder states 傳給decoder RNN,當(dāng)做initial state.? 這個翻譯過程可以解釋如下。

Encoder 過程: 圖一就只有一個RNN cell,? 每個法語單詞都是按照時間順序輸入到這個RNN cell 里。 具體就如Fig. 2中的描述, 對于一個單詞, 比如les, 首先要通過one-hot 方法來代表它, 然后通過word embeddings, 其實就是一個全連接的乘法。 不懂得同學(xué)可以看我以前的博客。 然后計算RNN隱形層。 對于encoder 的過程是沒有輸出y的計算的。 接下來, 這樣h(t)就算出來了。 再輸入下一個單詞, h(t+1)就算出來了。 直到最后一個單詞對應(yīng)的隱形層h算出來, 這個h 會當(dāng)做初始狀態(tài)輸入另一個rnn cell 做decoding.

Fig. 2? Encoder 的過程 (output is ignored in the encoding process)

Decoder 過程: decoding 的過程與encoding的過程相似。 只是多了區(qū)分training 和inference 的狀態(tài)。 Fig. 1 描述的是Inference 的狀態(tài), decode 輸出來的每一個單詞都會當(dāng)做下一個時刻的輸入,來進行翻譯。 而在訓(xùn)練過程中, 因為知道翻譯出來的單詞是什么,就會把這個單詞當(dāng)做輸入進行訓(xùn)練。 Fig. 1 的inference的過程中用到了argmax, 這個函數(shù),也就是每次都選擇概率最大的那個單詞當(dāng)做翻譯。 這個叫做greedy decoding.? 這個不是optimal solution。 還可以使用beam searching, 就是多考慮幾個單詞,

Fig. 3 Beam search decoding (source:CS224N Lecture 10? http://web.stanford.edu/class/cs224n/lectures/lecture10.pdf)

Beam search decoding: 這個方法在每個翻譯的步驟 都保存k 個最可能的選擇, k 就是beam size, 這個方法雖然不能保證最優(yōu)解, 但是效率高了很多。? k 一般就是5-10.? Fig. 3 就是一個 beam size =2 的例子。? 在T=0 的時候, 有兩個選擇。 在T=1的時候還是兩個選擇路徑 一個是the poor, 一個是a poor.? 在T=2的時候選擇是are , don't。? 那么下面的那條路徑就可以丟掉了, 只考慮上面的路徑, 以此類推。

Fig. 4 Loss 計算

Loss 計算: 神經(jīng)網(wǎng)絡(luò)的Loss計算 就如Fig.4 一樣,把每個翻譯出來的單詞和目標(biāo)單詞對應(yīng), 算出negative log,求和 就是總的loss.

注意力機制下的seq2seq模型

Fig. 5 Seq2seq 模型缺點

Fig. 5 的圖中, 明確的標(biāo)出了,最后一個state包含了整個句子的信息。 但是問題是,一個vector 是無法包含這么多信息的。 這樣勢必導(dǎo)致比較遠(yuǎn)的單詞信息的丟失。 另一個優(yōu)化上的問題是, 求微分時,較遠(yuǎn)的單詞會受到diminishing gradient的影響, 導(dǎo)致失去了long term dependency 的關(guān)系。

Attention 注意力機制提供了一個可以和遠(yuǎn)距離單詞保持聯(lián)系的方式, 解決了一個vector保存信息不足的問題。

Fig. 6 注意力機制

注意力機制的計算發(fā)生在decoder 的每一個步驟, 他包含了四個步驟。

首先decoder state 和encoder 所有的source state 進行softmax, 計算, 算出attention weights. 比如Fig. 6 里的 "the" hidden state, 就去和原文中的"les pauvres sont demunis"對應(yīng)的state 進行softmax 計算。

基于這個attention weights? (attention distribution 在Fig. 6里), 我們算出一個上下文向量(attention output)。 這個向量是通過加權(quán)平均的 source state.

attention output 再和 decoder hidden state 拼接起來, 最后算出y2.? 下面的公式總結(jié)了這三步計算過程。


圖片發(fā)自簡書App

實戰(zhàn)

實戰(zhàn)使用的模型來自 https://github.com/tensorflow/nmt, 內(nèi)容也是基于里面代碼的介紹。

跑代碼的方式在nmt 的tutorial 里已經(jīng)解釋的比較清楚了, 就是這兩個命令。

訓(xùn)練命令


Inference 命令

訓(xùn)練代碼跑起來就會在屏幕輸出很多信息。

Fig. 7 端口Terminal output

Fig. 7 提供了很多信息, 我的這個訓(xùn)練的代碼是two layer LSTM, 然后第一個layer 是256 * 512, 這個矩陣的維度讓我思考很久。 看了下LSTM 的計算方式,就容易理解多了。 如下圖所示, LSTM 有四個 weight W? 和四個 weight U.? 這樣輸出維度就從128*4 = 512, 然后 輸入的維度 不僅僅是x, 還有上一個state, 所以 輸入維度就是128*2 = 256. 所以第一個LSTM的weight是 256*512.? 對于docoder 過程, weight矩陣維度是384*512, 這個是因為輸入端又多了一個attention vector , 也是128 維度, 所以128*3 = 384 維度。

訓(xùn)練中, Result at? 12000 steps

成功的例子

失敗的例子

如果使用剛才inference命令, 可以翻譯整本文件, 比如 我就是翻譯的tst2013.vi, 翻譯的結(jié)果還可以接受呢。 截圖顯示, 其中&apos 就是單引號。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容