Categories
程式開發

神經機器翻譯的訓練改進和解碼提速


導讀:當前機器翻譯模型通常採用自註意力機制進行編碼,訓練時直接將Ground Truth詞語用作上文,並行生成所有的目標詞語,極大的提升了訓練速度。但測試的時候卻面臨以下難題:

首先,模型得不到Ground Truth,從而只能用自己生成的詞作為上文,使得訓練和測試的分佈不一致,影響了翻譯質量;

其次,由於每個目標詞語的生成依賴於其之前生成的詞,所以目標詞語只能順序生成,不能並行,從而影響了解碼速度。

本次分享將針對以上問題,介紹他們的解決方法。

具體分享內容如下

  1. 改進訓練和測試的分佈不一致問題:
    • 採用計劃採樣的方法 (ACL 2019 best paper)
    • 採用可導的序列級損失函數進行貪心搜索解碼
  2. 解碼速度提升:
    • 基於Cube Pruning解碼算法
    • 融入序列信息的非自回歸翻譯模型

背景

神經機器翻譯的訓練改進和解碼提速 1

當前,自然語言處理方向的生成任務主要包括:機器翻譯,人機對話,文章寫作,文章摘要等等。目前這些問題主要是通過序列到序列模型來解決的。序列到序列模型的主要架構是一個帶有註意力機制的編碼器-解碼器架構。這個架構基於一個重要的假設:即“源端的輸入和目的端的輸出之間是可以找到一個共同的語義空間。編碼器的任務就是對輸入進行各種變換,映射到共同語義空間上的一個點。解碼器的任務是對共同語義空間的這個點進行一些反操作,將其映射到目標端空間,從而生成相應的詞語。考慮到在每一步進行翻譯的時候不需要關注所有的源端輸入,而是僅僅關註一部分,注意力機制主要目的就是將當前步需要關注的部分找出來。

神經機器翻譯的訓練改進和解碼提速 2

目前主流的序列到序列模型主要包括兩種: 一個是RNNSearch,一個是Transformer。

RNNSearch通過RNN來將源端的輸入編碼成一個表示,通常源端採用的是雙向RNN,這樣對於每一個源端Token的編碼表示都能考慮到其上下文信息。在目標端同樣是使用一個RNN,它可以將翻譯的歷史信息給串起來,這樣在當前步翻譯的時候就能考慮到上文的信息。

Google在2017年提出了Transformer結構,該結構經過無數人的驗證,發現非常好用,所以Transformer就成為了當前主流的序列到序列模型。 Transformer主要的機制是:在生成源端表示的時候並沒有使用RNN,而是使用自註意力機制來生成每一個Token的表示。這樣做的好處是,在訓練的時候可以並行,因為每個詞都可以並行的和其它詞計算attention ( RNN則只能串行 )。同樣在解碼端的時候,也是使用的自註意力機制。

神經機器翻譯的訓練改進和解碼提速 3

這種模型在訓練的時候都是採用的TeacherForcing形式。模型在解碼當前步的時候,通常會有三個輸入:解碼器當前的狀態,attention和上一步解碼的結果。在訓練的過程中,我們通常使用上一步的真實輸出而非模型輸出作為當前步解碼的結果,這就是所謂的Teacher Forcing。

神經機器翻譯的訓練改進和解碼提速 4

在Inference的時候通常採用Beam-Search +順序生成的方式,在每一步都保存Top-K個最優結果。

神經機器翻譯的訓練改進和解碼提速 5

在介紹了訓練和推斷之後,我們來看一下目前面臨的問題,因為在訓練的時候我們使用Teacher Forcing的方式,但是我們在推斷的時候並不知道上一步的GroundTruth是什麼,所以,我們只能將上一步預測的結果來近似為Ground Truth。這樣,訓練和推斷在生成分佈的條件上就產生了差異(Ground Truth vs Predicted),這個問題被稱作為 Exposure Bias。

神經機器翻譯的訓練改進和解碼提速 6

在訓練的時候,我們還存在另一個問題。訓練的時候由於我們使用的交叉熵損失函數,該損失函數只對Ground Truth友好,對於非Ground Truth的結果一視同仁。但是對於翻譯任務來說,並不是只有一種翻譯方式,從slides中可以看到,Output1和Ground Truth表示的是同一個意思,但是Output2和Ground Truth表示的含義就是不同了,但是在訓練的時候,交叉熵損失函數會將Output1和Output2一視同仁,這樣是不合理的。

神經機器翻譯的訓練改進和解碼提速 7

在推斷階段解碼的時候同樣存在兩個問題,在每一個解碼step我們都要執行n各預測,每個預測都要得到整個詞表的一個分佈,所以在每一個step都要生成n*|V |個詞語。而且每個時間步還必須串行,這大大影響了解碼速度。

訓練

神經機器翻譯的訓練改進和解碼提速 8

1. 計劃採樣

對上面提到的問題進行一個小總結:

① 訓練

  • 預測過程中Ground Truth的未知導致的Exposure Bias 問題
  • 交叉熵損失函數的逐詞匹配所導致對於所有的非Ground Truth 一視同仁的問題。

② 解碼

  • Beam Search 的Beam Size 會引入大量的計算成本
  • 自回歸解碼導致的無法並行問題。

神經機器翻譯的訓練改進和解碼提速 9

神經機器翻譯的訓練改進和解碼提速 10

首先,針對於Exposure Bias問題,我們採用的是進化採樣的方法,這個就是我們2019ACL Best Paper的工作。針對與訓練和測試時context不一致的情況,我們的解決方法的主要思想是,在訓練的時候模仿測試時候可能會碰到的情況,這樣在測試的時候就會發現,當前碰到的情況在訓練的時候都碰到過,這樣模型就可以應對了。

具體的做法是我們在每一步,模擬上一步的翻譯結果,就是slides中的oracle,其中帶*的是就是Ground Truth,在每一步,我們都會隨機的選擇是Oracle還是Ground Truth來作為當前步的上一步詞輸入。

使用上述方法,我們需要解決的 三個關鍵問題 是:

  • 如何生成Oracle翻譯
  • Oracle和Ground Truth如何對上文進行採樣
  • 如何訓練模型

神經機器翻譯的訓練改進和解碼提速 11

對於Oracle的生成,我們有兩種方法,一個是生成詞級別的Oracle,另一個是生成句級別的Oracle。詞級Oracle即每一步都會選擇最優,句子級別Oracle需要考慮到整個句子的最優。

神經機器翻譯的訓練改進和解碼提速 12

由於RNN Search會在生成oracle的算法中會用到。在講生成oracle的算法之前,先大體介紹一下RNN Search模型。 RNN Search在當前步翻譯的時候,會輸入歷史的隱狀態信息,同時也會將上一步翻譯的結果輸入進去,經過一系列的變換,會得到當前步的一個隱狀態${rm S_j}$ ,該隱狀態再經過幾層全連接的計算,最終輸入到softmax層得到詞表中每一個詞的歸一化的分數。

神經機器翻譯的訓練改進和解碼提速 13

在生成詞級oracle的時候,我們會在softmax歸一化分佈之前加上一個Gumble Noise。 Gumble Noise 的公式如slides中所示,其中 表示一個均勻分佈。式子中的 表示溫度,當非常大的時候,相當於argmax,當 比較小的時候,相當於均勻分佈。

神經機器翻譯的訓練改進和解碼提速 14

對於句級Oracle,我們首先採用Beam Search生成前K個候選譯文,然後對選定的K個候選譯文進行排序,這裡的排序可以根據K個候選譯文和Ground Truth計算一個BLUE值,還可以用一些其它的方法進行排序,最終選取得分最高的譯文作為句級的Oracle。詞級Oracle和句級Oracle 是一個局部最優和全局最優的一個區別。

神經機器翻譯的訓練改進和解碼提速 15

對於採樣,具體是怎麼操作的呢?首先考慮到一點就是在剛開始訓練的時候,模型的效果不怎麼好,這樣,無論是詞級oracle的生成還是句級oracle的生成效果肯定都不是很理想,如果這時候使用oracle來引導模型訓練的話, 可能會使得模型收斂的比較慢。一個比較合理的做法是,剛開始我們盡量選用Ground Truth的詞,當模型快收斂的時候,我們再加大Oracle翻譯的採樣比例。這裡的採樣概率公式如slides所示,其中,隨著epoch的增長,系統越來越傾向於選擇oracle label。

神經機器翻譯的訓練改進和解碼提速 16

對於訓練的話,同樣的採用最大化log likelihood的方式。

神經機器翻譯的訓練改進和解碼提速 17

實驗結果:除了對比Transformer 和 RNN-Search,也對比了另外兩個系統,SS-NMT 和 MIXER。其中,SS-NMT也是通過計劃採樣的方式。 MIXER的loss分為兩個部分,一個部分是傳統的Transformer使用的交叉熵損失函數,另外一部分是將BLEU值作為reward,然後通過policy gradient的方法對模型進行訓練。

神經機器翻譯的訓練改進和解碼提速 18

這個是在中英文新聞數據上的結果,可以看到,在RNN-Search的系統上, 我們相比於Baseline能夠提升2.3個點。在Transformer系統上,相比於Baseline能夠提升1.5個點。

神經機器翻譯的訓練改進和解碼提速 19

在英德新聞數據結果上,基於RNN-Search的系統比baseline高了1.6個點,基於Transformer的系統比baseline高了1.3個點。

2. 可導的序列級目標

神經機器翻譯的訓練改進和解碼提速 20

接下來介紹如果解決詞級匹配的對於好一點的匹配和差的匹配一視同仁的問題。

神經機器翻譯的訓練改進和解碼提速 21

這個是我們在EMNLP 2018上所做的工作。通過使用可導的序列級目標來解決詞級匹配的問題。

神經機器翻譯的訓練改進和解碼提速 22

首先介紹一下傳統的序列級損失函數。傳統的序列級損失函數基本上都是基於N-gram正確率的損失函數,比如,BLEU,GLEU等等。計算方法為,命中n-gram的個數/總共的n-gram的個數(candidate),其中n-gram的個數為其每個詞語出現頻次的乘積。

神經機器翻譯的訓練改進和解碼提速 23

直接使用BLEU不可到的原因是因為操作中有argmax,為了使其可導,我們使用token的預測概率,而非使用argmax。這個方法和直接用BLEU作為Score,然後reinforce算法直接訓練對比有啥優勢?由於reinforce算法的方差比較大,所以在訓練的時候是很難收斂的。而使用傳統的梯度下降的方法,訓練過程就會平穩的多。

神經機器翻譯的訓練改進和解碼提速 24

這裡是3-gram的例子,其中output是概率最高的詞,3-gram概率的是由獨立Token的輸出概率相乘得到結果,然後求和會得到The total probabilistic count of 3-grams。將匹配上的3-gram的概率拿出來求和作為分子,Total probabilistic count作為分母,計算得到 Precision of 3-grams。這就是我們的loss。

神經機器翻譯的訓練改進和解碼提速 25

這個例子用來展示整個的訓練過程,這裡需要注意的一點就是,和傳統的teacher forcing方式不同,這里當前步輸入的為上一步預測的結果(貪心搜索得到的結果),而不是ground truth的值。剩下的就是按照上頁slides介紹的來計算loss。對於loss採用傳統的梯度下降算法即可。下面貼的是在數據集上的結果。

神經機器翻譯的訓練改進和解碼提速 26

從結果中可以看出,2-gram比4-gram的效果要好,這裡我們給出的解釋是,過多的使用自己生成的去計算的話,會存在一定程度上的錯誤累積。

神經機器翻譯的訓練改進和解碼提速 27

在訓練的時候,也是可以通過teacher forcing的方式來訓練的,但是從圖中可以看出,teacherforcing的方式收斂的比較快,但是效果不如greedy search的方式好。

解碼

1. CubePruning

神經機器翻譯的訓練改進和解碼提速 28

下面介紹在解碼方面的兩個工作,第一個工作要解決的是beam search每一步要計算BeamSize*|V|的問題,這個計算量大大降低了inference時候解碼的速度。

神經機器翻譯的訓練改進和解碼提速 29

神經機器翻譯的訓練改進和解碼提速 30

這是解碼過程中每個步驟的時間消耗,對於GPU來說,大部分的時間消耗在的計算上,其它三個步驟比較節省時間,對於CPU來說,最耗費時間的是最後兩個步驟,因為|V|比較大。

神經機器翻譯的訓練改進和解碼提速 31

傳統的方法使用的是Beam Search,傳統的 Beam Search其實是一個二維的搜索方法。其中第一維就是已經生成的部分的譯文,假設Beam Size = 4,那麼就是四個譯文。第二維度是這四個譯文都要進行下一步的Token預測計算。總共就需要計算4*|V|的概率。因為|V|的個數通常是幾千上萬級別的,所以這個部分的計算量就非常大。

神經機器翻譯的訓練改進和解碼提速 32

我們的做法是將二維的搜索擴展成三維的搜索,具體的做法分為以下幾步:

① Beam分組:假設我們要解碼第11步,我們就將第10步解碼出來相同Token的候選序列歸為一組。
② 分組預測第11步的候選Token:只用每個組得分最高的哪個候選序列來計算當前的Token分佈。
③ 近似組員的Token分佈:由上一步已經知道本組最優的候選序列的下一個token的預測分佈,對於組員來說,也將共享其老大計算出來的Token分佈score,然後和自身的序列score相加,得到自身擴展一個Token後的score。這個score作為自身的近似分。
④ 查找Top-K:經過上面的計算之後,這樣每個組就是得分其實是一個二維矩陣,我們將矩陣橫軸作為每個組員,縱軸表示當前步預測的token,然後保證右上角score最大,往右,往下都是減小。這樣便於我們查找Top-K。具體請看下一張slides。

神經機器翻譯的訓練改進和解碼提速 33

對於近似的score這裡有兩個選擇:

  • 如果取到的candidate是預測的score,那麼用真實的狀態來重新計算一下這個score,這時候也順便更新了一下自己的隱狀態
  • 直接用預測的score,不使用更新的方式,這時候和老大哥共享隱狀態

神經機器翻譯的訓練改進和解碼提速 34

這個是GPU上的結果,橫軸是速度,縱軸是BLEU值,可以看出在取得最優的BLEU值的情況下,我們的方法所用的時間是更短的。速度可以提升3.3倍。在CPU下,提速可以達到3.5倍。

神經機器翻譯的訓練改進和解碼提速 35

在Beam Size=40的情況下,GPU上速度提升3.8倍,CPU上提升4.2倍。

2. 非自回歸解碼

神經機器翻譯的訓練改進和解碼提速 36

最後介紹一下基於非自回歸的解碼方法,傳統的解碼方法是順序生成的。如果能夠使得解碼的時候並行的方式生成,這速度將會大大的提升。

神經機器翻譯的訓練改進和解碼提速 37

神經機器翻譯的訓練改進和解碼提速 38

傳統的非自回歸模型的做法是,在Transformer Encoder端頭部加一個Fertility預測,用來預測每個源端Token能翻譯成一個目標端的Token,然後根據預測的結果,將源端的Token拷貝到Decoder的輸入,如果一個源端Token能夠翻譯兩個目標Token,那就拷貝兩次,如果源端Token不會翻譯成目標端Token,那就不拷貝。由於每一步輸出的譯文是沒有給到下一步的,所以是可以並行的。對於Fertility的訓練是採用某種對齊模型,通過計算源端和目標端的對齊關係,然後就可以得到源端和目標端的對齊結果,就可以採用監督的方式來訓練Fertility分支。

該方法有一個問題,就是在翻譯當前步的時候沒有考慮上一步的翻譯信息。這樣就可能導致翻譯結果的流暢度不夠好。我們的方法就是在該方法的基礎上添加了序列上的信息。這樣模型既能並行執行,又能考慮的到前後的序列關係。

神經機器翻譯的訓練改進和解碼提速 39

我們的工作分為兩個方面,一個是在訓練上添加序列信息,一個是在模型上面同樣也添加序列信息。序列訓練採用的是Reinforce的方法,Reinforce的方法非常難以訓練,這是因為其方差非常大,方差大的原因是強化學習episode(一條軌跡從開始到結束)的搜索空間非常大,我們每次只是採樣出一個episode,然後根據這個episode進行計算,通過大數定律,我們可以假設這最終得到的是一個梯度的無偏估計。但是在實際情況下,抖動是非常大的。

將Reinforce算法應用到我們這個場景,首先看第一個公式,由於目標端詞的概率是獨立的,所以就可以寫成連乘的形式,第二個公式就是傳統的Reinforce公式,就是翻譯的reward。是通過前向後向算法計算出來的當前步的reward。

神經機器翻譯的訓練改進和解碼提速 40

上面的slides介紹的是計算reward時候的不同,接下來看sampling機制的區別。根據生成前後詞的獨立性,每一步我們並不是採樣出一個詞,而是採樣出K+1個詞。這樣的話就可以看做我們一次更新的過程中考慮到更多的episode,而不是僅用一個episode就去訓練了。具體的做法是,每一步,我們先取Top-K,計算一下損失函數的值,然後從剩下的Token中再採樣出來一個。我們將這兩部分的loss合起來,是為了保證無偏估計。為前k個翻譯的概率的和。

神經機器翻譯的訓練改進和解碼提速 41

另外一個方法就是模型上的改進,在非自回歸層的上面加上自回歸層。具體的做法是,模型分為 Bottom Layer,Fusion Layer,Top Layer。 Bottom Layer就是之前介紹的非自回歸模型,Fusion Layer的作用是將非自回歸模型的輸出和其Embedding整合起來,Top-Layer和Transformer 的解碼器基本一致。

神經機器翻譯的訓練改進和解碼提速 42

實驗結果:AR(Transformer),NAT(非自回歸的方法),IRNAT(迭代的非自回歸方法),最後是我們提出的方法,第一種是在訓練的過程中引入序列信息,第二是在模型上進行改進。作為對比的數據集有三個,前兩個數據集比較小。主要關注第三個數據集。可以看出,使用NAT來代替AR模型的話,效果會降6個點左右,迭代的方法會帶來1到2個點的提升。我們提出的reinforce方法和傳統的reinforce方法相比,有0.6個點的提升。加上回歸層的模型已經接近Transformer的效果了。關於速度的提升,如果僅訓練的時候採用序列信息,速度可以提升10倍。如果是NAT加上自回歸層的方法,速度也可以提高4倍左右。

神經機器翻譯的訓練改進和解碼提速 43

這裡有一些翻譯實例,可以看出 NAT-base的方法流暢性不夠好,重複很多“more more …”,因為沒有考慮序列信息,所以導致結果的流暢度不行。使用我們提出的reinforce方法,能夠一定程度上的緩解流暢度的問題,但是問題還是存在。通過使用NAT+AR的方法,能夠更好的緩解流暢度的問題。

研究組主頁

http://nlp.ict.ac.cn/2017/

個人主頁

http://nlp.ict.ac.cn/~fengyang/

今天的分享就到這裡,謝謝大家。

本文來自 DataFunTalk

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247498935&idx=2&sn=ef3efa5520c85fe6de5dae235a8ab1b7&chksm=fbd74edbcca0c7cd92b0e81b16901a123a17554e1af79de2821805a58ff1c7721ada5649f294&scene=27#wechat_redirect