一、前言
2016年9月份,谷歌發(fā)布了基于神經(jīng)網(wǎng)絡(luò)的翻譯系統(tǒng)(GNMT),并宣稱GNMT在多個(gè)主要語言對(duì)的翻譯中將翻譯誤差降低了55%-85%以上寸宵,并將此翻譯系統(tǒng)的技術(shù)細(xì)節(jié)在論文(Google’s Neural Machine Translation System: Bridging the Gap
between Human and Machine Translation)在展示,在閱讀之后收益匪淺元咙。
二梯影、概要
一般來說,NMT【神經(jīng)網(wǎng)絡(luò)翻譯系統(tǒng)】通常會(huì)含用兩個(gè)RNN【遞歸神經(jīng)網(wǎng)絡(luò)】庶香,一個(gè)用來接受輸入文本甲棍,另一個(gè)用來產(chǎn)生目標(biāo)語句,與此同時(shí)脉课,還會(huì)引入當(dāng)下流行的注意力機(jī)制【attention mechanism】使得系統(tǒ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)的基于短語的翻譯系統(tǒng)【PBMT】戳寸。
- 對(duì)罕見詞的處理很無力呈驶,而直接復(fù)制原詞在很多情況下肯定不是一個(gè)好的解決方法。
- 在處理長句子的時(shí)候會(huì)有漏翻的現(xiàn)象疫鹊。
而且GNMT致力于解決以上的三個(gè)問題袖瞻,在GNMT中,RNN使用的是8層(實(shí)際上Encoder是9層拆吆,輸入層是雙向LSTM聋迎。)含有殘差連接的神經(jīng)網(wǎng)絡(luò),殘差連接可以幫助某些信息枣耀,比如梯度霉晕、位置信息等的傳遞。同時(shí)捞奕,attention層與decoder的底層以及encoder的頂層相連接牺堰,如圖:
- 為了解決翻譯速度問題,谷歌在翻譯過程中使用了低精度的算法(將模型中的部分參數(shù)限制為8bit)以及使用了TPU颅围。
- 為了更好的處理低詞頻的詞伟葫,谷歌在輸入和輸出中使用了sub-word units也叫wordpieces,(比如把’higher‘拆分成‘high’和‘er’院促,分別進(jìn)行處理)
*在beamsearch中筏养,谷歌加入了長度規(guī)范化和獎(jiǎng)勵(lì)懲罰(coverage penalty)使對(duì)翻譯過程中產(chǎn)生的長度不同的句子處理更高效并且減少模型的漏翻斧抱。
在進(jìn)行了這么多改進(jìn)之后,谷歌宣稱撼玄,在英-法夺姑,英-中,英-西等多個(gè)語對(duì)中掌猛,錯(cuò)誤率跟之前的PBMT系統(tǒng)相比降低了60%盏浙,并且接近人類的平均翻譯水平。
接下來就詳細(xì)的看一下神奇的GNMT模型的細(xì)節(jié)荔茬。
三废膘、模型結(jié)構(gòu)
如上圖所示,GNMT和通常的模型一樣慕蔚,擁有3個(gè)組成部分 -- 一個(gè)encoder丐黄,一個(gè)decoder,和一個(gè)attention network 孔飒。encoder將輸入語句變成一系列的向量灌闺,每個(gè)向量代表原語句的一個(gè)詞,decoder會(huì)使用這些向量以及其自身已經(jīng)生成的詞坏瞄,生成下一個(gè)詞桂对。encoder和decoder通過attention network連接,這使得decoder可以在產(chǎn)生目標(biāo)詞時(shí)關(guān)注原語句的不同部分鸠匀。
此外蕉斜,如我們所想,要使翻譯系統(tǒng)有一個(gè)好的準(zhǔn)確率缀棍,encoder和decoder的RNN網(wǎng)絡(luò)都要足夠深宅此,以獲取原句子和目標(biāo)語句中不容易被注意的細(xì)節(jié),在谷歌的實(shí)驗(yàn)中爬范,沒增加一層父腕,會(huì)使PPL降低約10%。
關(guān)于模型中的attention機(jī)制青瀑,采用了如下的公式來計(jì)算:
其實(shí)在此我有一個(gè)疑問侣诵,這里最后的ai是一個(gè)向量呢?還是一個(gè)標(biāo)量(一個(gè)數(shù)值)狱窘。從式中看似乎是一個(gè)標(biāo)量杜顺,但我在之前理解的是attention是一個(gè)跟輸入語句單詞數(shù)量等長的向量。
3.1殘差連接
如上面提到的蘸炸,多層堆疊的LSTM網(wǎng)絡(luò)通常會(huì)比層數(shù)少的網(wǎng)絡(luò)有更好的性能躬络,然而,簡單的錯(cuò)層堆疊會(huì)造成訓(xùn)練的緩慢以及容易受到剃度爆炸或梯度消失的影響搭儒,在實(shí)驗(yàn)中穷当,簡單堆疊在4層工作良好提茁,6層簡單堆疊性能還好的網(wǎng)絡(luò)很少見,8層的就更罕見了馁菜,為了解決這個(gè)問題茴扁,在模型中引入了殘差連接,如圖汪疮,
將第i層的輸入與第i層LSTM的隱狀態(tài)一起峭火,作為第i+1層LSTM的輸入,
3.2Encoder的第一層雙向LSTM
一句話的譯文所需要的關(guān)鍵詞可能在出現(xiàn)在原文的任何位置智嚷,而且原文中的信息可能是從右往左的卖丸,也可能分散并且分離在原文的不同位置,因?yàn)闉榱双@得原文更多更全面的信息盏道,雙向RNN可能是個(gè)很好的選擇稍浆,在本文的模型結(jié)構(gòu)中,只在Encoder的第一層使用了雙向RNN猜嘱,其余的層仍然是單向RNN衅枫。
可以看到,粉色的LSTM從左往右的處理句子朗伶,綠色的LSTM從右往左弦撩,二者的輸出先是連接,然后再傳給下一層的LSTM腕让。
3.3模型的平行訓(xùn)練
這一部分主要是介紹模型在訓(xùn)練過程中一些加速的方法孤钦。
谷歌同時(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的方法來更新參數(shù)捐康。
除了數(shù)據(jù)平行仇矾,實(shí)驗(yàn)中還采用了模型平行,即解总,將每一層網(wǎng)絡(luò)部署在一個(gè)GPU上贮匕,如最上方的圖所示,這樣在Encoder的第一層雙向RNN計(jì)算完之后花枫,下一時(shí)間步不需要等本時(shí)間步完全運(yùn)行完就可以開始刻盐,并行計(jì)算加速了訓(xùn)練速度掏膏。
而之所以不在每一層都是用雙向RNN是因?yàn)椋绻@樣會(huì)大幅度降低訓(xùn)練速度敦锌,因?yàn)槠渲荒苁褂脙蓚€(gè)GPU馒疹,一個(gè)作前向信息處理,一個(gè)作后向的信息處理乙墙,降低平行計(jì)算的效率颖变。
在attention的部分,將encoder的輸出層與decoder的底層對(duì)齊(我的理解應(yīng)該是輸出的tensor緯度一致)來最大化平行計(jì)算的效率伶丐。(具體是什么原理我還沒理解太明白)悼做。
四、數(shù)據(jù)預(yù)處理
神經(jīng)網(wǎng)絡(luò)翻譯系統(tǒng)在運(yùn)行過程中通常有一個(gè)字?jǐn)?shù)有限的字典哗魂,而可能遇到的詞是無數(shù)的肛走,這就可能造成OOV(out-of-vocabulary)問題,由于這些未知詞通常是日期录别,人名朽色,地名等,所以一個(gè)簡單的方法就是直接復(fù)制這些詞组题,顯然在處理非人名等詞時(shí)著不是最好的解決方案葫男,在谷歌的模型中,采用更好的wordpiece model崔列,也叫sub-word units梢褐,比如在“Turing’s major is NLP .”一句經(jīng)過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)
通常來說鱼响,在N對(duì)語句對(duì)中,訓(xùn)練的目標(biāo)是使下式最大化:
但這里面有一個(gè)問題组底,翻譯中的BLEU值中不能反映對(duì)單句翻譯質(zhì)量好壞的獎(jiǎng)懲丈积,進(jìn)一步,因?yàn)槟P驮谟?xùn)練過程中從來沒有見過錯(cuò)誤的譯句债鸡,當(dāng)模型有一個(gè)較高的BLEU值時(shí)江滨,那些錯(cuò)誤的句子仍然會(huì)獲得較高的概率,所以上式不能明確的對(duì)翻譯中的錯(cuò)誤句子進(jìn)行懲罰厌均。(對(duì)原論文中此處不是完全理解唬滑,存疑。)
因此需要對(duì)模型有進(jìn)一步的refinement,但BLEU值是針對(duì)兩個(gè)語料庫進(jìn)行的評(píng)測(cè)標(biāo)準(zhǔn)间雀,在對(duì)單句的評(píng)測(cè)上效果并不理想悔详,所以谷歌提出了GLEU值,GLEU值的大體意思就是分別計(jì)算目標(biāo)語句和譯句的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)變成了下式:
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é)合吻氧,也就是下式:
? α在訓(xùn)練中去0.017.
在實(shí)際的訓(xùn)練過程中,先使用Oml的標(biāo)準(zhǔn)訓(xùn)練使模型收斂咏连,然后使用Omixd的標(biāo)準(zhǔn)進(jìn)一步提升模型的表現(xiàn)盯孙。
六、可量化的模型和翻譯過程中的量化
(坦白的說祟滴,我并不知道原文中Quantizable Model and Quantized Inference應(yīng)該怎么翻譯更好振惰。)
這一部分主要講的是,由于模型較深且計(jì)算量較大垄懂,在翻譯過程會(huì)產(chǎn)生一些問題骑晶,所以谷歌在不影響模型收斂和翻譯效果的前提下,采取了一系列的優(yōu)化措施草慧。
帶有殘差連接的LSTM網(wǎng)絡(luò)桶蛔,有兩個(gè)值是會(huì)不斷傳遞計(jì)算的,在時(shí)間方向上傳遞的cit和在深度方向上傳遞的xit冠蒋,在實(shí)驗(yàn)中過程我們發(fā)現(xiàn)這些值都是非常小的羽圃,為了減少錯(cuò)誤的累積乾胶,所以在翻譯的過程中抖剿,明確的這些值限制在[-δ,δ]之間识窿,因此原LSTM的公式調(diào)整如下:
在翻譯的過程中斩郎,谷歌將6.1和6.2式中所有浮點(diǎn)數(shù)運(yùn)算替代為8位或16位定點(diǎn)整數(shù)運(yùn)算,其中的權(quán)重W像下式一樣改用8位整數(shù)表示:
所有的cit和xit限制在[-δ喻频,δ]之間且改用16位整數(shù)表示缩宜。
在6.2中的矩陣乘法(比如W1xt)改用8位定點(diǎn)整數(shù)乘法,而其他的所有運(yùn)算,比如sigmoid,tanh锻煌,點(diǎn)乘妓布,加法等,改用16位整數(shù)運(yùn)算宋梧。
假設(shè)decoder RNN的輸出是yt匣沼,那在softmax層,概率向量pt改為這樣計(jì)算:
將logit vt'限制在[-γ,γ]之間且權(quán)重Ws和6.2式中的權(quán)重W同樣使用8位整數(shù)表示并在運(yùn)算過程中使用8位矩陣乘法捂龄。
但在softmax層和attention層不采取量化措施释涛。
值得一提的是,除了將cit和xit限制在[-δ倦沧,δ]和將logit vt'限制在[-γ,γ]唇撬,在訓(xùn)練過程中一直使用的是全精度的浮點(diǎn)數(shù)。其中γ取25.0展融,δ在訓(xùn)練剛開始取8.0然后逐漸變?yōu)?.0 窖认。(在翻譯時(shí),δ取1.0 告希。)
紅線代表采用了量化措施的訓(xùn)練過程耀态,藍(lán)線代表普通的訓(xùn)練,可以看到將一些值限制在一定范圍內(nèi)作為額外的規(guī)劃化措施可以改善模型的質(zhì)量暂雹。
七首装、Decoder
在翻譯的過程中,使用了常規(guī)的beam search算法杭跪,但引入了兩個(gè)重要的優(yōu)化方案仙逻,即GNMT中的α和β值。
- α值的作用是對(duì)譯句進(jìn)行長度規(guī)范化涧尿,因?yàn)檫x取一個(gè)句子的可能性是由劇中每個(gè)詞的概率取log后相加得到的系奉,這些個(gè)對(duì)數(shù)概率都是負(fù)值,因此某種程度上姑廉,長句會(huì)取得更小的對(duì)數(shù)概率缺亮,這顯然是不合理的,因此需要對(duì)譯句進(jìn)行長度規(guī)劃化桥言。
- β值的作用是促使模型更好的翻譯全句萌踱,不漏翻。
其中s(Y,X)代表譯文最終獲得的分?jǐn)?shù)号阿,pij表示在翻譯第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
normalized score so far. ***
額,其實(shí)我沒看懂這跟常規(guī)的beam search算法有什么不同扔涧,望大神指點(diǎn)园担。届谈。。
當(dāng)α和β值取0時(shí)相當(dāng)于不做長度規(guī)劃化和覆蓋范圍懲罰艰山,算法退回到最原始的beam search算法,值得一提的是咏闪,得到上述BLEU的模型并沒有進(jìn)行只使用了ML進(jìn)行訓(xùn)練程剥,沒有使用RL優(yōu)化。因?yàn)镽L refinement已經(jīng)促使模型不漏翻汤踏,不過翻织鲸。
在谷歌實(shí)驗(yàn)中,α=0.2和β=0.2溪胶,但在我們的實(shí)驗(yàn)中搂擦,在中英翻譯中,還是α=0.6~1和β=0.2~0.4會(huì)取得更好的效果
實(shí)驗(yàn)過程以及實(shí)驗(yàn)結(jié)果
模型部分基本介紹完了,剩下的第八部分關(guān)于實(shí)驗(yàn)以及實(shí)驗(yàn)結(jié)果先貼張圖,會(huì)繼續(xù)不定時(shí)補(bǔ)充霞势,下一篇文章應(yīng)該會(huì)介紹一下Facebook發(fā)布并開源的宣稱比GNMT更好更快的FairSeq模型...
論文中提到但未使用的方法
另有一種方法處理OOV問題是將罕見詞標(biāo)記出來婿奔,比如柬批,假設(shè)Miki這個(gè)詞沒有出現(xiàn)在詞典中,經(jīng)過標(biāo)記后,變成<B>M<M>i<M>k<E>i,這樣在翻譯過程中棘劣,將罕見詞替換為特殊符號(hào)。