GNMT-谷歌的神經(jīng)網(wǎng)絡(luò)翻譯系統(tǒng)
一、前言
2016年9月份,谷歌發(fā)布了基于神經(jīng)網(wǎng)絡(luò)的翻譯系統(tǒng)(GNMT),并宣稱(chēng)GNMT在多個(gè)主要語(yǔ)言對(duì)的翻譯中將翻譯誤差降低了55%-85%以上,并將此翻譯系統(tǒng)的技術(shù)細(xì)節(jié)在論文(
)在展示,在閱讀之后收益匪淺。
二、概要
一般來(lái)說(shuō),NMT【神經(jīng)網(wǎng)絡(luò)翻譯系統(tǒng)】通常會(huì)含用兩個(gè)RNN【遞歸神經(jīng)網(wǎng)絡(luò)】,一個(gè)用來(lái)接受輸入文本,另一個(gè)用來(lái)產(chǎn)生目標(biāo)語(yǔ)句,與此同時(shí),還會(huì)引入當(dāng)下流行的注意力機(jī)制【attention mechanism】使得系統(tǒng)處理長(zhǎng)句子時(shí)更準(zhǔn)確高效。但谷歌認(rèn)為,通常這樣的神經(jīng)網(wǎng)絡(luò)系統(tǒng)有三個(gè)弱點(diǎn):
- 訓(xùn)練速度很慢并且需要巨大的計(jì)算資源,由于數(shù)量眾多的參數(shù),其翻譯速度也遠(yuǎn)低于傳統(tǒng)的基于短語(yǔ)的翻譯系統(tǒng)【PBMT】。
- 對(duì)罕見(jiàn)詞的處理很無(wú)力,而直接復(fù)制原詞在很多情況下肯定不是一個(gè)好的解決方法。
- 在處理長(zhǎng)句子的時(shí)候會(huì)有漏翻的現(xiàn)象。
而且GNMT致力于解決以上的三個(gè)問(wèn)題,在GNMT中,RNN使用的是8層(實(shí)際上Encoder是9層,輸入層是雙向LSTM。)含有殘差連接的神經(jīng)網(wǎng)絡(luò),殘差連接可以幫助某些信息,比如梯度、位置信息等的傳遞。同時(shí),attention層與decoder的底層以及encoder的頂層相連接,如圖:
GNMT結(jié)構(gòu)圖
- 為了解決翻譯速度問(wèn)題,谷歌在翻譯過(guò)程中使用了低精度的算法(將模型中的部分參數(shù)限制為8bit)以及使用了TPU。
- 為了更好的處理低詞頻的詞,谷歌在輸入和輸出中使用了sub-word units也叫wordpieces,(比如把’higher‘拆分成‘high’和‘er’,分別進(jìn)行處理)
*在beamsearch中,谷歌加入了長(zhǎng)度規(guī)范化和獎(jiǎng)勵(lì)懲罰(coverage penalty)使對(duì)翻譯過(guò)程中產(chǎn)生的長(zhǎng)度不同的句子處理更高效并且減少模型的漏翻。
在進(jìn)行了這么多改進(jìn)之后,谷歌宣稱(chēng),在英-法,英-中,英-西等多個(gè)語(yǔ)對(duì)中,錯(cuò)誤率跟之前的PBMT系統(tǒng)相比降低了60%,并且接近人類(lèi)的平均翻譯水平。
接下來(lái)就詳細(xì)的看一下神奇的GNMT模型的細(xì)節(jié)。
三、模型結(jié)構(gòu)
如上圖所示,GNMT和通常的模型一樣,擁有3個(gè)組成部分 -- 一個(gè)encoder,一個(gè)decoder,和一個(gè)attention network 。encoder將輸入語(yǔ)句變成一系列的向量,每個(gè)向量代表原語(yǔ)句的一個(gè)詞,decoder會(huì)使用這些向量以及其自身已經(jīng)生成的詞,生成下一個(gè)詞。encoder和decoder通過(guò)attention network連接,這使得decoder可以在產(chǎn)生目標(biāo)詞時(shí)關(guān)注原語(yǔ)句的不同部分。
此外,如我們所想,要使翻譯系統(tǒng)有一個(gè)好的準(zhǔn)確率,encoder和decoder的RNN網(wǎng)絡(luò)都要足夠深,以獲取原句子和目標(biāo)語(yǔ)句中不容易被注意的細(xì)節(jié),在谷歌的實(shí)驗(yàn)中,沒(méi)增加一層,會(huì)使PPL降低約10%。
關(guān)于模型中的attention機(jī)制,采用了如下的公式來(lái)計(jì)算:
attention的公式
其實(shí)在此我有一個(gè)疑問(wèn),這里***的a i 是一個(gè)向量呢?還是一個(gè)標(biāo)量(一個(gè)數(shù)值)。從式中看似乎是一個(gè)標(biāo)量,但我在之前理解的是attention是一個(gè)跟輸入語(yǔ)句單詞數(shù)量等長(zhǎng)的向量。
3.1殘差連接
如上面提到的,多層堆疊的LSTM網(wǎng)絡(luò)通常會(huì)比層數(shù)少的網(wǎng)絡(luò)有更好的性能,然而,簡(jiǎn)單的錯(cuò)層堆疊會(huì)造成訓(xùn)練的緩慢以及容易受到剃度爆炸或梯度消失的影響,在實(shí)驗(yàn)中,簡(jiǎn)單堆疊在4層工作良好,6層簡(jiǎn)單堆疊性能還好的網(wǎng)絡(luò)很少見(jiàn),8層的就更罕見(jiàn)了,為了解決這個(gè)問(wèn)題,在模型中引入了殘差連接,如圖,
殘差連接示意圖
將第i層的輸入與第i層LSTM的隱狀態(tài)一起,作為第i+1層LSTM的輸入,

沒(méi)有引入殘差連接的LSTM示意圖

引入殘差連接的LSTM示意圖
3.2Encoder的***層雙向LSTM
一句話的譯文所需要的關(guān)鍵詞可能在出現(xiàn)在原文的任何位置,而且原文中的信息可能是從右往左的,也可能分散并且分離在原文的不同位置,因?yàn)闉榱双@得原文更多更全面的信息,雙向RNN可能是個(gè)很好的選擇,在本文的模型結(jié)構(gòu)中,只在Encoder的***層使用了雙向RNN,其余的層仍然是單向RNN。
Bi-directions RNN示意圖
可以看到,粉色的LSTM從左往右的處理句子,綠色的LSTM從右往左,二者的輸出先是連接,然后再傳給下一層的LSTM。
3.3模型的平行訓(xùn)練
這一部分主要是介紹模型在訓(xùn)練過(guò)程中一些加速的方法。
谷歌同時(shí)采用了數(shù)據(jù)平行和模型平行兩種方式以加速訓(xùn)練,數(shù)據(jù)平行很直接,就是把模型復(fù)制并部署n份,每份的參數(shù)是共享的,每份訓(xùn)練時(shí)都以Batch的形式訓(xùn)練,即同時(shí)訓(xùn)練batch-size句話。在谷歌實(shí)驗(yàn)中,n通常是10,而batch-size通常是128,然后用Adam和SGD的方法來(lái)更新參數(shù)。
除了數(shù)據(jù)平行,實(shí)驗(yàn)中還采用了模型平行,即,將每一層網(wǎng)絡(luò)部署在一個(gè)GPU上,如最上方的圖所示,這樣在Encoder的***層雙向RNN計(jì)算完之后,下一時(shí)間步不需要等本時(shí)間步完全運(yùn)行完就可以開(kāi)始,并行計(jì)算加速了訓(xùn)練速度。
而之所以不在每一層都是用雙向RNN是因?yàn)?,如果這樣會(huì)大幅度降低訓(xùn)練速度,因?yàn)槠渲荒苁褂脙蓚€(gè)GPU,一個(gè)作前向信息處理,一個(gè)作后向的信息處理,降低平行計(jì)算的效率。
在attention的部分,將encoder的輸出層與decoder的底層對(duì)齊(我的理解應(yīng)該是輸出的tensor緯度一致)來(lái)***化平行計(jì)算的效率。(具體是什么原理我還沒(méi)理解太明白)。
四、數(shù)據(jù)預(yù)處理
神經(jīng)網(wǎng)絡(luò)翻譯系統(tǒng)在運(yùn)行過(guò)程中通常有一個(gè)字?jǐn)?shù)有限的字典,而可能遇到的詞是無(wú)數(shù)的,這就可能造成OOV(out-of-vocabulary)問(wèn)題,由于這些未知詞通常是日期,人名,地名等,所以一個(gè)簡(jiǎn)單的方法就是直接復(fù)制這些詞,顯然在處理非人名等詞時(shí)著不是***的解決方案,在谷歌的模型中,采用更好的wordpiece model,也叫sub-word units,比如在“Turing’s major is NLP .”一句經(jīng)過(guò)WPM模型處理之后應(yīng)該是"Turing ‘s major is NLP ." 另外為了直接復(fù)制人名等詞,使source language和target language共享wordpiece model,WPM在單詞的靈活性和準(zhǔn)確性上取得了一個(gè)很好的均衡,也在翻譯有更好的準(zhǔn)確率(BLEU)和更快的翻譯速度。
五、訓(xùn)練標(biāo)準(zhǔn)
通常來(lái)說(shuō),在N對(duì)語(yǔ)句對(duì)中,訓(xùn)練的目標(biāo)是使下式***化:

log probabilities of the groud-truth outputs given the corresponding inputs
但這里面有一個(gè)問(wèn)題,翻譯中的BLEU值中不能反映對(duì)單句翻譯質(zhì)量好壞的獎(jiǎng)懲,進(jìn)一步,因?yàn)槟P驮谟?xùn)練過(guò)程中從來(lái)沒(méi)有見(jiàn)過(guò)錯(cuò)誤的譯句,當(dāng)模型有一個(gè)較高的BLEU值時(shí),那些錯(cuò)誤的句子仍然會(huì)獲得較高的概率,所以上式不能明確的對(duì)翻譯中的錯(cuò)誤句子進(jìn)行懲罰。(對(duì)原論文中此處不是完全理解,存疑。)
因此需要對(duì)模型有進(jìn)一步的refinement,但BLEU值是針對(duì)兩個(gè)語(yǔ)料庫(kù)進(jìn)行的評(píng)測(cè)標(biāo)準(zhǔn),在對(duì)單句的評(píng)測(cè)上效果并不理想,所以谷歌提出了GLEU值,GLEU值的大體意思就是分別計(jì)算目標(biāo)語(yǔ)句和譯句的n-grams,(n = 1,2,3,4)數(shù)量,然后計(jì)算兩個(gè)集合的交集的大小與原集大小的比值,取較小值。
我用python實(shí)現(xiàn)了一下GLEU值的計(jì)算,代碼如下:
- def get_ngrams(s,maxn):
- ngrams = {}
- size = 0
- for n in range(1,maxn+1):
- for i in range(0,len(s)):
- for j in range(i+1,min(i+n+1,len(s)+1)):
- ngram = ''
- for word in s[i:j]:
- ngram += word
- ngram += ' '
- ngram = ngram.strip()
- if ngram not in ngrams:
- ngrams[ngram] = 1
- size += 1
- return size,ngrams
- def get_gleu(orig,pred,n=4):
- orig_ = orig.split(' ')
- pred_ = pred.split(' ')
- n_orig,ngrams_orig = get_ngrams(orig_,n)
- n_pred,ngrams_pred = get_ngrams(pred_,n)
- count_match = 0
- for v in ngrams_orig:
- if v in ngrams_pred:
- count_match += 1
- return min(count_match/n_orig,count_match/n_pred)
所以,refinement之后模型的評(píng)測(cè)標(biāo)準(zhǔn)變成了下式:

refinement maximum-likelihood
r(Y, Y (i))就是GLEU值的計(jì)算部分。GLEU克服了BLEU在單句評(píng)測(cè)上的缺點(diǎn),在本實(shí)驗(yàn)中,可以和BLEU值可以很好的共同工作。
為了進(jìn)一步使訓(xùn)練穩(wěn)定,谷歌對(duì)訓(xùn)練標(biāo)準(zhǔn)作了一個(gè)線性的結(jié)合,也就是下式:

Mixed maximum-likelihood
α在訓(xùn)練中去0.017.
在實(shí)際的訓(xùn)練過(guò)程中,先使用O ml 的標(biāo)準(zhǔn)訓(xùn)練使模型收斂,然后使用O mixd 的標(biāo)準(zhǔn)進(jìn)一步提升模型的表現(xiàn)。
六、可量化的模型和翻譯過(guò)程中的量化
(坦白的說(shuō),我并不知道原文中 Quantizable Model and Quantized Inference 應(yīng)該怎么翻譯更好。)
這一部分主要講的是,由于模型較深且計(jì)算量較大,在翻譯過(guò)程會(huì)產(chǎn)生一些問(wèn)題,所以谷歌在不影響模型收斂和翻譯效果的前提下,采取了一系列的優(yōu)化措施。
帶有殘差連接的LSTM網(wǎng)絡(luò),有兩個(gè)值是會(huì)不斷傳遞計(jì)算的,在時(shí)間方向上傳遞的c i t 和在深度方向上傳遞的x i t ,在實(shí)驗(yàn)中過(guò)程我們發(fā)現(xiàn)這些值都是非常小的,為了減少錯(cuò)誤的累積,所以在翻譯的過(guò)程中,明確的這些值限制在[-δ,δ]之間,因此原LSTM的公式調(diào)整如下:
6.1 modified equation
6.2 完整的LSTM計(jì)算邏輯
在翻譯的過(guò)程中,谷歌將6.1和6.2式中所有浮點(diǎn)數(shù)運(yùn)算替代為8位或16位定點(diǎn)整數(shù)運(yùn)算,其中的權(quán)重W像下式一樣改用8位整數(shù)表示:
權(quán)重W的調(diào)整
所有的c i t 和x i t 限制在[-δ,δ]之間且改用16位整數(shù)表示。
在6.2中的矩陣乘法(比如W 1 x t )改用8位定點(diǎn)整數(shù)乘法,而其他的所有運(yùn)算,比如sigmoid,tanh,點(diǎn)乘,加法等,改用16位整數(shù)運(yùn)算。
假設(shè)decoder RNN的輸出是y t ,那在softmax層,概率向量p t 改為這樣計(jì)算:

修改后的概率向量計(jì)算公式
將 logit v t ' 限制在[-γ,γ]之間且權(quán)重W s 和6.2式中的權(quán)重W同樣使用8位整數(shù)表示并在運(yùn)算過(guò)程中使用8位矩陣乘法。
但在softmax層和attention層不采取量化措施。
值得一提的是,除了將c i t 和x i t 限制在[-δ,δ]和將logit v t ' 限制在[-γ,γ],在 訓(xùn)練過(guò)程 中一直使用的是全精度的浮點(diǎn)數(shù)。其中γ取25.0,δ在訓(xùn)練剛開(kāi)始取8.0然后逐漸變?yōu)?.0 。( 在翻譯時(shí),δ取1.0 。 )
Log perplexity vs. steps
紅線代表采用了量化措施的訓(xùn)練過(guò)程,藍(lán)線代表普通的訓(xùn)練,可以看到將一些值限制在一定范圍內(nèi)作為額外的規(guī)劃化措施可以改善模型的質(zhì)量。
七、Decoder
在翻譯的過(guò)程中,使用了常規(guī)的beam search算法,但引入了兩個(gè)重要的優(yōu)化方案,即GNMT中的α和β值。
- α值的作用是對(duì)譯句進(jìn)行長(zhǎng)度規(guī)范化,因?yàn)檫x取一個(gè)句子的可能性是由劇中每個(gè)詞的概率取log后相加得到的,這些個(gè)對(duì)數(shù)概率都是負(fù)值,因此某種程度上,長(zhǎng)句會(huì)取得更小的對(duì)數(shù)概率,這顯然是不合理的,因此需要對(duì)譯句進(jìn)行長(zhǎng)度規(guī)劃化。
- β值的作用是促使模型更好的翻譯全句,不漏翻。
關(guān)于α和β值適用的公式
其中s(Y,X)代表譯文最終獲得的分?jǐn)?shù),p i j 表示在翻譯第j個(gè)詞時(shí)其對(duì)應(yīng)第i個(gè)詞的attention值。
谷歌在文中還提到兩種優(yōu)化方法:
Firstly, at each step, we only consider tokens that have local scores that are
not more than beamsize below the best token for this step. Secondly, after a normalized best score has
been found according to equation 14, we prune all hypotheses that are more than beamsize below the best
額,其實(shí)我沒(méi)看懂這跟常規(guī)的beam search算法有什么不同,望大神指點(diǎn)。。。
在En-Fr語(yǔ)料庫(kù)上,不同α和β值對(duì)BLEU值的影響
當(dāng)α和β值取0時(shí)相當(dāng)于不做長(zhǎng)度規(guī)劃化和覆蓋范圍懲罰,算法退回到最原始的beam search算法,值得一提的是,得到上述BLEU的模型并沒(méi)有進(jìn)行只使用了ML進(jìn)行訓(xùn)練,沒(méi)有使用RL優(yōu)化。因?yàn)镽L refinement已經(jīng)促使模型不漏翻,不過(guò)翻。
在En-Fr語(yǔ)料庫(kù)上先用ML優(yōu)化在用RL優(yōu)化的到的BLEU值與上圖的比較
在谷歌實(shí)驗(yàn)中,α=0.2和β=0.2,但在我們的實(shí)驗(yàn)中,在中英翻譯中,還是α=0.6~1和β=0.2~0.4會(huì)取得更好的效果
實(shí)驗(yàn)過(guò)程以及實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)結(jié)果對(duì)比
模型部分基本介紹完了,剩下的第八部分關(guān)于實(shí)驗(yàn)以及實(shí)驗(yàn)結(jié)果先貼張圖,會(huì)繼續(xù)不定時(shí)補(bǔ)充,下一篇文章應(yīng)該會(huì)介紹一下Facebook發(fā)布并開(kāi)源的宣稱(chēng)比GNMT更好更快的FairSeq模型...
論文中提到但未使用的方法
另有一種方法處理OOV問(wèn)題是將罕見(jiàn)詞標(biāo)記出來(lái),比如,假設(shè) Miki 這個(gè)詞沒(méi)有出現(xiàn)在詞典中,經(jīng)過(guò)標(biāo)記后,變成<B> M <M> i <M> k <E> i ,這樣在翻譯過(guò)程中,將罕見(jiàn)詞替換為特殊符號(hào)。