想要上手機器翻譯?飛槳教你用Transformer 一戰到底

PaddlePaddle發表於2019-09-26

1.  機器翻譯概述

 

1.1.機器翻譯是什麼

 

機器翻譯(Machine Translation, MT)是指用計算機來實現不同語言之間翻譯的技術。被翻譯的語言稱為源語言(Source),翻譯成的結果語言稱為目標語言(Target)。機器翻譯實現了從源語言到目標語言的轉換,是自然語言處理領域的重要研究方向之一。

 

一箇中英翻譯的示例:

Source:我在週日讀了一本書。

Target:I read abook on Sunday.

 

機器翻譯的應用場景非常廣泛:

 

(1)境外旅遊:我國是世界上第一大出境旅遊客源國,在語言不通的境外,無論是餐館點餐、商場購物,還是問路叫車、酒店諮詢,都需要機器翻譯的幫助。

 

(2)外語教育:學習外語對中國人來說是一件難事,藉助機器翻譯技術,可以做到“哪裡不會點哪裡”,讓外語學習變得簡單高效。

 

(3)文學作品翻譯:閱讀外國名著等文學作品時,可以藉助機器翻譯技術,消除語言障礙,帶來更流暢的閱讀體驗。

 

(4)影視作品翻譯:觀看外國電影時,如果沒有中文字幕,往往不知道劇中的人物都說了些什麼,藉助機器翻譯技術,可以實現人物對話實時翻譯,優化觀影體驗。

 

1.2.機器翻譯的發展歷程

 

機器翻譯技術的發展大致經歷了三個階段:

 

(1)基於規則的機器翻譯

早期的機器翻譯系統多為基於規則的翻譯系統,翻譯知識來自人類專家。找人類語言學家來寫規則,這一個詞翻譯成另外一個詞。這個成分翻譯成另外一個成分,在句子中的出現在什麼位置,都用規則表示出來。這種方法的優點是直接用語言學專家知識,準確率非常高。缺點是什麼呢?它的成本很高,比如說要開發中文和英文的翻譯系統,需要找同時會中文和英文的語言學家。要開發另外一種語言的翻譯系統,就要再找懂另外一種語言的語言學家。因此,基於規則的系統開發週期很長,成本很高。

 

(2)基於統計的機器翻譯

大約到了上世紀九十年代出現了基於統計的方法,稱之為統計機器翻譯。在統計機器翻譯技術中,轉化規則是由機器自動從大規模的語料中學習得到的,而非人類主動提供規則。因此,它克服了基於規則的翻譯系統所面臨的知識獲取瓶頸的問題,但仍然存在許多挑戰:1)人為設計許多特徵(feature),但永遠無法覆蓋所有的語言現象;2)難以利用全域性的特徵;3)依賴於許多預處理環節,如詞語對齊、分詞或符號化(tokenization)、規則抽取、句法分析等,而每個環節的錯誤會逐步累積,對翻譯的影響也越來越大。

 

(3)基於神經網路的機器翻譯

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


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


b)   不再以統計機器翻譯系統為框架,而是直接用神經網路將源語言對映到目標語言,即端到端的神經網路機器翻譯(End-to-End Neural MachineTranslation, End-to-End NMT)(見下圖的右半部分),簡稱為NMT模型。

想要上手機器翻譯?飛槳教你用Transformer 一戰到底

2.  Transformer模型介紹

 

Transformer是目前神經網路翻譯中效果最好的模型,是在論文AttentionIs All You Need[1]中提出的針對序列到序列(sequence to sequence, Seq2Seq)學習任務的一種全新網路結構。

 

Transformer沿用了 Seq2Seq 任務中典型的編碼器-解碼器(Encoder-Decoder)的框架結構,但相較於此前廣泛使用的迴圈神經網路(Recurrent Neural Network,RNN),Transformer完全使用注意力(Attention)機制來實現序列到序列的建模。

 

Transformer整體的網路結構如下:

想要上手機器翻譯?飛槳教你用Transformer 一戰到底

Encoder部分由若干相同的 layer 堆疊組成,每個layer 主要由多頭注意力(Multi-Head Attention)和全連線的前饋(Feed-Forward)網路這兩個 sub-layer 構成。


  • Multi-HeadAttention 在這裡用於實現 Self-Attention,相比於簡單的 Attention 機制,其將輸入進行多路線性變換後分別計算 Attention 的結果,並將所有結果拼接後再次進行線性變換作為輸出。參見圖2,其中 Attention 使用的是點積(Dot-Product),並在點積後進行了 scale 的處理以避免因點積結果過大進入 softmax 的飽和區域。


  • Feed-Forward 網路會對序列中的每個位置進行相同的計算(Position-wise),其採用的是兩次線性變換中間加以 ReLU 啟用的結構。

 

此外,每個 sub-layer 後還施以 Residual Connection[2] 和 LayerNormalization[3] 來促進梯度傳播和模型收斂。

想要上手機器翻譯?飛槳教你用Transformer 一戰到底

Decoder 具有和 Encoder 類似的結構,只是相比於組成 Encoder 的 layer ,在組成 Decoder 的 layer 中還多了一個 Multi-Head Attention 的 sub-layer 來實現對 Encoder 輸出的 Attention,這個 Encoder-Decoder Attention 在其他 Seq2Seq 模型中也是存在的。

 

3.  飛槳Transformer快速上手

 

飛槳開源的Transformer 模型是基於WMT'16 EN-DE 資料集訓練的,提供了Base和Big兩種版本,在測試集上的評測結果如下:

測試集

newstest2014

newstest2015

newstest2016

Base model

26.35

29.07

33.30

Big model

27.07

30.09

34.38

 

下面為大家介紹飛槳Transformer的上手教程。


專案地址:

https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleNLP/neural_machine_translation/transformer

 

3.1.環境安裝


(1)PaddlePaddle安裝

本專案依賴於 PaddlePaddle Fluid 1.3.1 及以上版本。

 

(2)克隆程式碼

克隆開原始碼庫到本地。

git clone https://github.com/PaddlePaddle/models.gitcd models/PaddleNLP/neural_machine_translation/transformer


3.2.資料準備


執行gen_data.sh指令碼進行WMT'16 EN-DE 資料集的下載和預處理(時間較長,建議後臺執行)。

 

資料處理過程主要包括Tokenize 和BPE 編碼(byte-pair encoding)。執行成功後,將會生成資料夾gen_data,其目錄結構如下:

.

├──wmt16_ende_data              # WMT16 英德翻譯資料

├──wmt16_ende_data_bpe          # BPE 編碼的 WMT16 英德翻譯資料

├──mosesdecoder                 # Moses 機器翻譯工具集,包含了 Tokenize、BLEU評估等指令碼

└──subword-nmt                  # BPE 編碼的程式碼

 

另外我們也整理提供了一份處理好的 WMT'16 EN-DE 資料以供使用(包含訓練所需 BPE 資料和詞典以及預測和評估所需的 BPE 資料和 tokenize 的資料)。

 

3.3.模型下載


我們開源了基於 WMT'16 EN-DE 資料訓練好的Base、Big兩種配置的Tranformer模型,您可以直接下載使用。


  • Base model 下載連結:

    https://transformer-res.bj.bcebos.com/base_model.tar.gz 

  • Big model下載連結:

    https://transformer-res.bj.bcebos.com/big_model.tar.gz

 

3.4.模型預測


使用以上提供的資料和模型,可以按照以下程式碼進行預測,翻譯結果將列印到標準輸出。

# base modelpython -u infer.py \--src_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \--trg_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \--special_token'<s>''<e>''<unk>' \--test_file_patterngen_data/wmt16_ende_data_bpe/newstest2014.tok.bpe.32000.en-de \--token_delimiter' ' \--batch_size32 \model_pathtrained_models/iter_100000.infer.model \beam_size 5 \max_out_len255 # big modelpython -u infer.py \--src_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \--trg_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \--special_token'<s>''<e>''<unk>' \--test_file_patterngen_data/wmt16_ende_data_bpe/newstest2014.tok.bpe.32000.en-de \--token_delimiter' ' \--batch_size32 \model_pathtrained_models/iter_100000.infer.model \n_head 16 \d_model 1024 \d_inner_hid4096 \prepostprocess_dropout0.3 \beam_size 5 \max_out_len255

 

3.5.模型評估


預測結果中每行輸出是對應行輸入的得分最高的翻譯,對於使用BPE 的資料,預測出的翻譯結果也將是 BPE 表示的資料,要還原成原始的資料(這裡指 tokenize 後的資料)才能進行正確的評估。評估過程具體如下(BLEU 是翻譯任務常用的自動評估方法指標):

# 還原 predict.txt 中的預測結果為tokenize 後的資料sed -r 's/(@@ )|(@@ ?$)//g' predict.txt > predict.tok.txt# 若無 BLEU 評估工具,需先進行下載# git clone https://github.com/moses-smt/mosesdecoder.git# 以英德翻譯 newstest2014 測試資料為例perl gen_data/mosesdecoder/scripts/generic/multi-bleu.perlgen_data/wmt16_ende_data/newstest2014.tok.

完成後可以看到類似如下的結果:

BLEU = 26.35,57.7/32.1/20.0/13.0 (BP=1.000, ratio=1.013, hyp_len=63903, ref_len=63078)


4.  飛槳Transformer進階使用


如果您不滿足於直接使用訓練好的開源模型,而是想嘗試訓練自己的模型,那麼請繼續往下閱讀。

 

4.1.目錄結構說明


飛槳開源Transformer專案的目錄結構和說明如下:

.

├── images               # README 文件中的圖片

├── config.py            # 訓練、預測以及模型引數配置

├── infer.py             # 預測指令碼

├── reader.py            # 資料讀取介面

├── README.md            # 文件

├── train.py             # 訓練指令碼

└── gen_data.sh          # 資料生成指令碼


4.2.資料格式說明


本示例程式中支援的資料格式為製表符\t分隔的源語言和目標語言句子對,句子中的token之間使用空格分隔。如需使用BPE編碼,亦可以使用類似WMT'16 EN-DE 原始資料的格式,參照gen_data.sh進行處理。


4.3.訓練自己的模型


資料準備完成後,可以使用train,py指令碼進行訓練。以提供的 WMT'16 EN-DE 資料為例,具體如下:

python -u train.py \  --src_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \  --trg_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \  --special_token '<s>''<e>''<unk>' \  --train_file_patterngen_data/wmt16_ende_data_bpe/train.tok.clean.bpe.32000.en-de \  --token_delimiter ' ' \  --use_token_batch True \  --batch_size 4096 \  --sort_type pool \  --pool_size 200000

上述命令中設定了源語言詞典檔案路徑(src_vocab_fpath)、目標語言詞典檔案路徑(trg_vocab_fpath)、訓練資料檔案(train_file_pattern,支援萬用字元)等資料相關的引數和構造 batch 方式(use_token_batch 指定了資料按照 token 數目或者sequence 數目組成 batch)等 reader 相關的引數。有關這些引數更詳細的資訊可以通過執行以下命令檢視:


pythontrain.py --help

 

更多模型訓練相關的引數則在config.py中的ModelHyperParams和TrainTaskConfig內定義:


  • ModelHyperParams定義了embedding 維度等模型超引數;

  • TrainTaskConfig定義了 warmup 步數等訓練需要的引數。

 

這些引數預設使用了 Transformer 論文中 base model 的配置,如需調整可以在該指令碼中進行修改。另外這些引數同樣可在執行訓練指令碼的命令列中設定,傳入的配置會合並並覆蓋config.py中的配置,如可以通過以下命令來訓練Transformer論文中的big model :


python -u train.py \  --src_vocab_fpath gen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000\  --trg_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 \  --special_token '<s>''<e>''<unk>' \  --train_file_patterngen_data/wmt16_ende_data_bpe/train.tok.clean.bpe.32000.en-de \  --token_delimiter ' ' \  --use_token_batch True \  --batch_size 3200 \  --sort_type pool \  --pool_size 200000 \  n_head 16 \  d_model 1024 \  d_inner_hid 4096 \  prepostprocess_dropout 0.3

注:如果訓練時更改了模型配置,使用infer.py預測時需要使用對應相同的模型配置;另外,訓練時預設使用所有GPU,可以通過CUDA_VISIBLE_DEVICES環境變數來設定使用指定的GPU。

 

趕快自己動手嘗試下吧!

 

想與更多的深度學習開發者交流,請加入飛槳官方QQ群:796771754。


如果您想詳細瞭解更多飛槳PaddlePaddle的相關內容,請參閱以下文件。


官網地址:https://www.paddlepaddle.org.cn/

專案地址:

https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleNLP/neural_machine_translation/transformer


【Reference】
[1]https://arxiv.org/abs/1706.03762
[2]http://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf
[3]https://arxiv.org/pdf/1607.06450.pdf

相關文章