每日最新頭條.有趣資訊

基於PaddlePaddle的機器翻譯教程

本文轉載自PaddlePaddle

量子位 編輯 | 公眾號 QbitAI

機器翻譯(machine translation, MT)是用計算機來實現不同語言之間翻譯的技術。需要翻譯的語言通常稱為源語言(source language),翻譯成的結果語言稱為目標語言(target language)。機器翻譯即實現從源語言到目標語言轉換的過程,是自然語言處理的重要研究領域之一。

本文將帶領大家了解經典的端到端神經網絡機器翻譯Seq2Seq模型,以及如何用PaddlePaddle來訓練。如果想要實踐效果更佳的翻譯模型,請參考GitHub模型庫中Transformer實現。

Seq2Seq項目地址:https://github.com/PaddlePaddle/book/blob/develop/08.machine_translation/README.cn.md

Transformer項目地址:https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/neural_machine_translation/transformer

背景介紹

早期機器翻譯系統多為基於規則的翻譯系統,需要由語言學家編寫兩種語言之間的轉換規則,再將這些規則錄入計算機。該方法對語言學家的要求非常高,而且我們幾乎無法總結一門語言會用到的所有規則,更何況兩種甚至更多的語言。因此統計機器翻譯(Statistical Machine Translation, SMT)技術應運而生。

在統計機器翻譯技術中,轉化規則是由機器自動從大規模的語料中學習得到的,而非我們人主動提供規則。因此,它克服了基於規則的翻譯系統所面臨的知識獲取瓶頸的問題,但仍然存在許多挑戰:

人為設計許多特徵(feature),但永遠無法覆蓋所有的語言現象;

難以利用全局的特徵;

依賴於許多預處理環節,如詞語對齊、分詞或符號化(tokenization)、規則抽取、句法分析等,而每個環節的錯誤會逐步累積,對翻譯的影響也越來越大。

近年來,深度學習技術的發展為解決上述挑戰提供了新的思路。將深度學習應用於機器翻譯任務的方法大致分為兩類:

仍以統計機器翻譯系統為框架,只是利用神經網絡來改進其中的關鍵模塊,如語言模型、調序模型等(見圖1的左半部分);

不再以統計機器翻譯系統為框架,而是直接用神經網絡將源語言映射到目標語言,即端到端的神經網絡機器翻譯(End-to-End Neural Machine Translation, End-to-End NMT)(見圖1的右半部分),簡稱為NMT模型。作為經典模型的實現,可以幫助大家更好的理解機器翻譯。

圖1:基於神經網絡的機器翻譯系統

效果展示

以中英翻譯(中文翻譯到英文)的模型為例,當模型訓練完畢時,如果輸入如下已分詞的中文句子:

如果設定顯示翻譯結果的條數為3,生成的英語句子如下:

左起第一列是生成句子的序號;左起第二列是該條句子的得分(從大到小),分值越高越好;左起第三列是生成的英語句子。

另外有兩個特殊標誌:表示句子的結尾,表示未登錄詞(unknown word),即未在訓練字典中出現的詞。

模型概覽

本節依次介紹雙向循環神經網絡(Bi-directional Recurrent Neural Network),NMT模型中典型的編碼器-解碼器(Encoder-Decoder)框架以及柱搜索(beam search)算法。

雙向循環神經網絡

我們這裡介紹Bengio團隊在論文[2,4]中提出的另一種結構。該結構的目的是輸入一個序列,得到其在每個時刻的特徵表示,即輸出的每個時刻都用定長向量表示到該時刻的上下文語義信息。

具體來說,該雙向循環神經網絡分別在時間維以順序和逆序——即前向(forward)和後向(backward)——依次處理輸入序列,並將每個時間步RNN的輸出拚接成為最終的輸出層。這樣每個時間步的輸出節點,都包含了輸入序列中當前時刻完整的過去和未來的上下文信息。下圖展示的是一個按時間步展開的雙向循環神經網絡。該網絡包含一個前向和一個後向RNN,其中有六個權重矩陣:輸入到前向隱層和後向隱層的權重矩陣(W1,W3),隱層到隱層自己的權重矩陣(W2,W5),前向隱層和後向隱層到輸出層的權重矩陣(W4,W6)。注意,該網絡的前向隱層和後向隱層之間沒有連接。

圖2:按時間步展開的雙向循環神經網絡

編碼器-解碼器框架

編碼器-解碼器(Encoder-Decoder)[2]框架用於解決由一個任意長度的源序列到另一個任意長度的目標序列的變換問題。即編碼階段將整個源序列編碼成一個向量,解碼階段通過最大化預測序列概率,從中解碼出整個目標序列。編碼和解碼的過程通常都使用RNN實現。

圖3:編碼器-解碼器框架

編碼器

編碼階段分為三步:

one-hot vector表示:將源語言句子x={x1,x2,…,xt}的每個詞xi表示成一個列向量,i=1,2,…,T。這個向量Wi的維度與詞匯表大小|V| 相同,並且只有一個維度上有值1(該位置對應該詞在詞匯表中的位置),其余全是0。

映射到低維語義空間的詞向量:one-hot vector表示存在兩個問題,1)生成的向量維度往往很大,容易造成維數災難;2)難以刻畫詞與詞之間的關係(如語義相似性,也就是無法很好地表達語義)。因此,需再one-hot vector映射到低維的語義空間,由一個固定維度的稠密向量(稱為詞向量)表示。記映射矩陣為,用表示第i個詞的詞向量,K為向量維度。

用RNN編碼源語言詞序列:這一過程的計算公式為,其中h是一個全零的向量,?θ是一個非線性激活函數,最後得到的h={h1,…,hT}就是RNN依次讀入源語言T個詞的狀態編碼序列。整句話的向量表示可以採用h在最後一個時間步T的狀態編碼,或使用時間維上的池化(pooling)結果。

第3步也可以使用雙向循環神經網絡實現更複雜的句編碼表示,具體可以用雙向GRU實現。前向GRU按照詞序列(x1,…,xT)的順序依次編碼源語言端詞,並得到一系列隱層狀態。類似的,後向GRU按照(xT,…,x1)的順序依次編碼源語言端詞,得到。最後對於詞xi,通過拚接兩個GRU的結果得到它的隱層狀態,即hi=。

圖4:使用雙向GRU的編碼器

解碼器

機器翻譯任務的訓練過程中,解碼階段的目標是最大化下一個正確的目標語言詞的概率。思路是:

每一個時刻,根據源語言句子的編碼信息(又叫上下文向量,context vector)c、真實目標語言序列的第i個詞ui和i時刻RNN的隱層狀態zi,計算出下一個隱層狀態zi+1。計算公式如下:

其中?θ’是一個非線性激活函數;c是源語言句子的上下文向量,在不使用注意力機制時,如果編碼器的輸出是源語言句子編碼後的最後一個元素,則可以定義c=ht;ui是目標語言序列的第i個單詞,u是目標語言序列的開始標記,表示解碼開始;zi是i時刻解碼RNN的隱層狀態,z是一個全零的向量。

將zi+1通過softmax歸一化,得到目標語言序列的第i+1個單詞的概率分布pi+1。概率分布公式如下:

其中WsZi+1+bz是對每個可能的輸出單詞進行打分,再softmax歸一化就可以得到第i+1個詞的概率pi+1。

根據pi+1和ui+1計算代價。

重複步驟1~2,直到目標語言序列中的所有詞處理完畢。

機器翻譯任務的生成過程,通俗來講就是根據預先訓練的模型來翻譯源語言句子。生成過程中的解碼階段和上述訓練過程的有所差異,具體介紹請見柱搜索算法。

柱搜索算法

柱搜索(beam search)是一種啟發式圖搜索算法,用於在圖或樹中搜索有限集合中的最優擴展節點,通常用在解空間非常大的系統(如機器翻譯、語音識別)中,原因是記憶體無法裝下圖或樹中所有展開的解。如在機器翻譯任務中希望翻譯“你好”,就算目標語言字典中只有3個詞(,, hello),也可能生成無限句話(hello循環出現的次數不定),為了找到其中較好的翻譯結果,我們可採用柱搜索算法。

柱搜索算法使用廣度優先策略建立搜索樹,在樹的每一層,按照啟發代價(heuristic cost)(本教程中,為生成詞的log概率之和)對節點進行排序,然後僅留下預先確定的個數(文獻中通常稱為beam width、beam size、柱寬度等)的節點。只有這些節點會在下一層繼續擴展,其他節點就被剪掉了,也就是說保留了質量較高的節點,剪枝了質量較差的節點。因此,搜索所佔用的空間和時間大幅減少,但缺點是無法保證一定獲得最優解。

使用柱搜索算法的解碼階段,目標是最大化生成序列的概率。思路是:

每一個時刻,根據源語言句子的編碼信息cc、生成的第ii個目標語言序列單詞ui和i時刻RNN的隱層狀態zi,計算出下一個隱層狀態zi+1。

將zi+1通過softmax歸一化,得到目標語言序列的第i+1個單詞的概率分布pi+1。

根據pi+1采樣出單詞ui+1。

重複步驟1~3,直到獲得句子結束標記或超過句子的最大生成長度為止。

注意:zi+1和pi+1的計算公式同解碼器中的一樣。且由於生成時的每一步都是通過貪心法實現的,因此並不能保證得到全局最優解。

數據介紹

本教程使用WMT-14數據集中的bitexts(after selection)作為訓練集,dev+test data作為測試集和生成集。

數據預處理

我們的預處理流程包括兩步:

將每個源語言到目標語言的平行語料庫文件合並為一個文件:

合並每個XXX.src和XXX.trg文件為XXX。

XXX中的第i行內容為XXX.src中的第i行和XXX.trg中的第i行連接,用’t’分隔。

創建訓練數據的“源字典”和“目標字典”。每個字典都有DICTSIZE個單詞,包括:語料中詞頻最高的(DICTSIZE - 3)個單詞,和3個特殊符號(序列的開始)、(序列的結束)和(未登錄詞)。

示例數據

該數據集有193319條訓練數據,6003條測試數據,詞典長度為30000。因為數據規模限制,使用該數據集訓練出來的模型效果無法保證。

模型配置說明

下面我們開始根據輸入數據的形式配置模型。首先引入所需的庫函數以及定義全局變量。

然後如下實現編碼器框架:

再實現訓練模式下的解碼器:

實現推測模式下的解碼器:

進而,我們定義一個train_program來使用inference_program計算出的結果,在標記數據的幫助下來計算誤差。我們還定義了一個optimizer_func來定義優化器。

訓練模型

定義訓練環境

定義您的訓練環境,可以指定訓練是發生在CPU還是GPU上。

定義數據提供器

構造訓練器(trainer)

訓練器需要一個訓練程序和一個訓練優化函數。

提供數據

事件處理器

回調函數event_handler在一個之前定義好的事件發生後會被調用。例如,我們可以在每步訓練結束後查看誤差。

開始訓練

最後,我們傳入訓練循環數(num_epoch)和一些別的參數,調用 trainer.train 來開始訓練。

應用模型

定義解碼部分

使用上面定義的 encoder 和 decoder 函數來推測翻譯後的對應id和分數。

定義數據

我們先初始化id和分數來生成tensors來作為輸入數據。在這個預測例子中,我們用wmt14.test數據中的第一個記錄來做推測,最後我們用”源字典”和”目標字典”來列印對應的句子結果。

測試

現在我們可以進行預測了。我們要在feed_order提供對應參數,放在executor上運行以取得id和分數結果。

總結

端到端的神經網絡機器翻譯是近幾年興起的一種全新的機器翻譯方法。在本文中,我們介紹了NMT中典型的“編碼器-解碼器”框架。由於NMT是一個典型的Seq2Seq(Sequence to Sequence,序列到序列)學習問題,因此,Seq2Seq中的query改寫(query rewriting)、摘要、單輪對話等問題都可以用本教程的模型來解決。

參考文獻

Koehn P. Statistical machine translation[M]. Cambridge University Press, 2009.

Cho K, Van Merri?nboer B, Gulcehre C, et al. Learning phrase representations using RNN encoder-decoder for statistical machine translation[C]//Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP), 2014: 1724-1734.

Chung J, Gulcehre C, Cho K H, et al. Empirical evaluation of gated recurrent neural networks on sequence modeling[J]. arXiv preprint arXiv:1412.3555, 2014.

Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[C]//Proceedings of ICLR 2015, 2015.

Papineni K, Roukos S, Ward T, et al. BLEU: a method for automatic evaluation of machine translation[C]//Proceedings of the 40th annual meeting on association for computational linguistics. Association for Computational Linguistics, 2002: 311-318.

小程序|全類別AI學習教程

獲得更多的PTT最新消息
按讚加入粉絲團