今天給大家介紹EMNLP2020的一篇關于多語言翻譯新范式的工作multilingual Random Aligned Substitution Pre-training (mRASP)[1],核心思想就是打造“機器翻譯界的BERT”,通過預訓練技術再在具體語種上微調即可達到領先的翻譯效果,其在32個語種上預訓練出的統一模型在47個翻譯測試集上取得了全面顯著的提升。
目錄
機器翻譯預訓練的挑戰
mRASP發明的動機和方法
mRASP實際效果和分析
En-De和En-Fr Benchmark
預訓練階段沒見過的語言擴展
案例分析
效果分析
手把手教你用mRASP快速得到任意翻譯模型
附注:相關技術已經被應用于火山翻譯[2]
1. 機器翻譯預訓練的挑戰
目前絕大多數AI任務都是建立在數據的基礎之上的統計學習,模型的表現效果很大程度上依賴于數據的質量和數量。利用大量較易獲得的數據來預訓練模型,在具體應用場景再利用少量標注數據微調來實現實際場景可用的模型,已經成為NLP新的成功范式。例如BERT[3]在大規模純文本上預訓練后,在自然語言理解的11項任務上少量微調就能取得很好的成績。不過,在多語言的機器翻譯中,通過預訓練再微調的范式還未取得普遍的成功。以前的NLP預訓練方式例如BERT、GPT[4]訓練目標與翻譯關注的目標之間差距過大,不易直接使用。mRASP提出了全新的思路,利用多個語言已經積累的大量雙語平行語料,合并起來聯合訓練一個統一的模型,之后再基于此微調,讓預訓練和微調目標盡可能接近,這樣才能更大發揮預訓練模型作用。
BERT和GPT的示意圖
MASS和機器翻譯示意圖對比
上圖對比分析了之前NLP預訓練方法在機器翻譯場景直接應用的限制。BERT和GPT分別對應了Transformer[5] 編碼器部分和解碼器部分的預訓練,而機器翻譯用的是序列生成模型。這種模型結構的不一致會導致翻譯模型只有一部分參數被初始化,有效發揮預訓練作用會比較困難,因此需要很多特殊的技巧才能得到提升[6]。
針對序列模型,很快也有研究者提出了MASS[7]和BART[8]等框架將預訓練擴展到序列生成任務,它們使用 auto-encoder(自編碼器)進行自學習,在很多下游生成任務上都取得了顯著的效果,但是在機器翻譯的應用上依然存在兩個重要的問題,第一是在資源豐富的語種(例如英德和英法)上沒有觀察到提升,第二是沒有辦法擴展到多語種翻譯任務上。這種局限性,很大一部分原因就是自編碼相對是簡單任務,很難學習到更深層次的表示,而機器翻譯需要更復雜的語義轉化,這種預訓練目標和下游任務之間的差異,導致模型很難最大程度利用好預訓練數據。如何克服著兩個問題,成了預訓練模型在機器翻譯領域應用的重要挑戰。
2. 多語言翻譯預訓練方法mRASP的動機和方法
對于語言學習者來說,有一個非常有意思的現象,他們發現在學習了三四種語言之后,再學習一個新的語言速度會加快。一個簡單的例子,如果有人分別學習德語和法語,可能各需要一年的時間,然而他先學習了德語,再去學法語,可能只需要一年零三個月就學會了,接下來再去學習西班牙語,速度可能會更快。對于程序語言其實也是類似的道理,學習C++可能需要一年,接下來再學習 Java,Python 可能只需要一個月。一個淺顯的解釋是,人類在多語言學習的過程會自發去總結語言中比較抽象的共性,重點學習新語言的特性。因此想要提升個人的語言學習能力,往往需要學習更多的語言,能夠對語言的共性有更精確的把握,而不是拼命學習一個語言。同樣的道理,對于機器翻譯而言,能否把翻譯能力遷移到不同語言上,使得不同語言之間的信息可以互相利用,就成了一件非常有趣的問題。
mRASP的設計目標正是基于這樣的考慮,設計一個通用的預訓練模型,學習語言之間轉換的共性,接下來就被更容易遷移到新的翻譯方向。就好像語言學習者一樣,在學習了兩種語言之后,第三種語言就變得很輕松了。mRASP 的設計遵循了兩個基本原則:第一,預訓練的目標和機器翻譯基本一致,需要學習到語言的轉換能力;第二,盡可能學習語言的通用表示,跨語言的句子或詞語,如果語義接近則隱空間中的表示也應該接近。
mRASP方法,使用帶語言標識的Transformer作為翻譯網絡框架
mRASP遵循了通用的預訓練-微調框架。預訓練階段,不同于傳統預訓練模型大量堆疊無監督單語數據的方式, mRASP另辟蹊徑,采用了多語言平行數據作為預訓練的主要目標,將幾十種語言的平行數據放到同一個模型進行聯合訓練。神經網絡結構采用Transformer,加上語言標識符(Language token)標識源語言和目標語言。為了保證不同語言的句子和詞語能嵌入到同一個空間,同一個意思的句子無論中文還是英文說得都應該是對應同一個向量表示,又引入了隨機替換對齊技術RAS,來制造更豐富的上下文。
一句中文的句子“我 愛 北京 天安門”中的“愛”有一定概率被替換成“aime”(法語),“北京”也有一定概率被替換成“Pékin”(法語),于是原句就可能會變成“我 aime Pékin 天安門”。訓練集中的一對平行句對可以變為兩對(甚至三對、四對,……):
我 愛 北京 天安門 ==》 I love Beijing Tiananmen Square
我 aime Pékin 天安門 ==》 I love Beijing Tiananmen Square
而在微調階段,只需要使用預訓練階段的參數作初始化,之后采用和傳統單向機器翻譯相同的訓練方法即可。因此使用mRASP并不需要掌握任何額外的技能。
3. mRASP實際效果和分析
mRASP使用32個語言的平行語料來預訓練,在英語到法語方向上僅使用wmt14的平行語料進行微調,就達到了不需要使用費時費力的海量單語Back Translation的最佳效果(44.3 BLEU),同時,應用到新的語言方向荷蘭語(Nl)到葡萄牙語(Pt)上,僅使用1.2萬平行句對,微調了十分鐘就可以獲得一個可使用的(BLEU 10+)模型,而同等平行句對量很難從頭訓練一個可使用的MT模型(BLEU接近0)。
簡單概況,mRASP具有如下幾點優勢:
1. 模型簡單易復現
mRASP的預訓練僅使用了共1.1億對平行句對(由于同一對平行句對對兩個方向都適用,所以一共是2.2億個訓練樣本),詞表大小僅64k個bpe subword,相比于其它預訓練方法,動輒百億數據幾十層網絡,訓練難度更小,單機8卡不到一周在32個語言上就可以完成預訓練。當然在更多語言上的預訓練模型也可以簡單擴展獲得。
2. 通用性極強
mRASP在大中小規模訓練集上,相對于直接訓練的單向機器翻譯模型,效果都有一定的提升,甚至包括平行語料最多的語向英語到法語(提升了1.1BLEU)。即使對于預訓練數據中從來沒有見過的語種荷蘭語到葡萄牙語,也取得了 10+BLEU 的顯著收益。
這里摘錄了有代表性的部分實驗結果:
3.1. En-De和En-Fr Benchmark
下圖中對比了mRASP加微調在英德(En-De)和英法(En-Fr)上的效果和最近同期的其他幾個跨語言預訓練模型加微調的結果。可以看出,mRASP的效果是有一定優勢的,En-》De wmt 2016測試集上達到了30.3 (tokenized BLEU), En-》Fr wmt 2014測試集上達到了44.3 (tokenized BLEU)。CTNMT 使用了 BERT預訓練。MASS使用了大規模單語數據。mBERT是多語言 BERT 模型。mBART 是同期出現的另一種預訓練方式,引入了海量多語言單語數據,訓練時間也達到256卡20天。
3.2. 預訓練階段沒見過的語言擴展
不包含在預訓練階段平行句對中的語向,也稱作“Exotic Directions”,在Exotic Directions上是否有效果,決定了 mRASP 是否具有很好的擴展性和泛化能力。
論文中對Exotic Directions分為四種情況:
Exotic Pair: 源語言和目標語言都經過了單獨的預訓練,但模型還沒有見過它們組成的雙語對
Exotic Source: 模型在預訓練階段只見過目標端語言,源端語言完全沒見過
Exotic Target: 模型在預訓練階段只見過源端語言,目標端語言完全沒見過
Exotic Full: 模型在預訓練階段完全沒見過源端語言和目標端語言
這四種未見語對情況下訓練機器翻譯都很難。當然其中難度最大的是最后一種,相當于要求只學習了中文和英語的人,讀少量拉丁語和印地語的句子就可以從拉丁語到印地語翻譯。
Exotic Directions的四種分類
值得關注的是,法中(Fr-Zh)兩邊都單獨出現過,但是沒有作為平行語對出現過,只使用了20K平行語料就可以達到20+的BLEU score。
同時,對于兩邊語言都沒在預訓練階段出現過的語對,比如荷蘭語到葡萄牙語(Nl-Pt),只使用1.2萬句平行語料,經過大概10分鐘的訓練后,也可以達到10+ BLEU score。
3.3. 案例分析
英語-法語案例。mRASP方法訓練出來的模型比Direct方法的模型優秀的地方之一在于: Direct系統忽略了無實際意義單詞(比如冠詞,指示詞等)的傾向,而mRASP保持了冠詞和指示詞的一致。
法語-中文案例。Exotic Pair,20k平行句對。Direct 0.7 BLEU 遠弱于 mRASP 25.8 BLEU,Direct系統完全不能翻譯,而mRASP系統翻譯得很好
荷蘭語-葡萄牙語案例。Exotic Full,1.2萬平行句對。Direct 0 BLEU vs mRASP 14.1 BLEU。mRASP得到的荷葡翻譯模型的翻譯效果雖然不能成功翻譯每個細節,但是能抓住原文的一些關鍵信息。比如例子中的(1) 日期 (2) 會議記錄 -會議的消息 (3) 分發-共享。
3.4. 效果分析mRASP
作為通用的預訓練模型,它對各個MT下游任務的的提升效果從何而來?
作者認為,其提升主要來源于兩個方面:
mRASP拉近了不同語言間同義詞的向量表示
mRASP拉近了不同語言間同義句子的向量表示
單詞級別和句子級別的表示被拉近意味著: 經過預訓練階段對大量語言的平行句對的處理和學習,mRASP隱式地“掌握”了語言無關的表示,而這個表示是可以被遷移到任意語言上的,因此mRASP可以普遍地提高機器翻譯下游任務的效果。
1. mRASP拉近不同語言單詞級別的向量表示
RAS的引入通過使得不同語言的同義詞之間共享相同的上下文,而在NLP中詞義是由上下文(context)決定的,從而進一步拉近不同語言之間同義詞的表示。
左圖: w/o RAS, 右圖: w/ RAS
可以看出,加了RAS方法之后,不同語言之間的embedding分布被拉近了(角度變小)。
2. mRASP拉近不同語言句子級別的向量表示
除了拉近同義詞的向量表示之外,mRASP也拉近了語義的向量表示。
使用編碼器輸出向量作為句子的空間表征(L2 normalized averaged-pooled encoder output),從TED平行測試集(經過過濾得到的15-way 平行測試集,共2284條) 中匹配到相似度(cosine similarity)最近的句子,計算Top-1準確度(sentence retrieval accuracy)。mRASP 檢索的平均準確度達到76%。我們將mRASP和mBART[9]進行對比:
mRASP的準確度減去mBART的準確度,注意荷蘭語(Nl)在mRASP預訓練數據中完全沒出現過,其他方向上的準確度都大大超過了mBART。
mRASP的準確度減去不使用RAS的mRASP的方法的準確度。可以看出mRASP的RAS方法在預訓練階段沒出現過的語言(Nl)上有明顯收益
將句首的語種標識符(Language token)去掉以后,Nl的準確度還可以進一步提升,不過其他語言上的準確度大幅下降
總結
mRASP建立了多語言預訓練到微調到多個語種翻譯模型的成功路徑,這也會成為機器翻譯的新范式。我們很期待在這個方向上不斷有新的方法涌現出來,朝向最終目標大踏步前進。未來幾年,機器翻譯的進展可以幫助幾十上百個國家的每個人真正無語言障礙的溝通交流。
最后,附上我們的Github[10]、Paper[11]和體驗官網[12]。
4. 手把手教你用mRASP快速得到任意翻譯模型
簡單上手
下面我們就來手把手教大家如何使用作者開源的mRASP模型來快速得到一個單向的機器翻譯模型。在后面的例子中,我們選用作者提供的toy en-de數據集[13]來做示范。
環境配置
在開始正式訓練的過程之前,我們首先需要配置好環境。
由于作者的實現是基于fairseq(使用pytorch框架)的,因此你需要安裝pytorch。
將repo同步到本地,并且使用pip命令安裝requirements.txt文件里的包。
git
clone https://github.com/linzehui/mRASP.git
cd mRASP
pip install -r requirements.txt
下載mRASP模型
進入作者分享的鏈接里下載,這里我們需要下載有RAS的版本[14]。
訓練數據預處理
合并詞表(可選)
如果使用原來的詞表,跳過這一步。當你需要加入新的語種(不在原詞表支持的59個語種中)時,需要先將詞表進行合并:
python ${PROJECT_ROOT}/train/scripts/concat_merge_vocab.py --checkpoint ${CKPT} --now-vocab ${CURRENT_VOCAB} --to-append-vocab ${NEW_VOCAB} --output-dir ${OUTPUT_DIR}
預處理訓練集和測試集
對數據進行清洗、tokenize、subword操作,其中subword使用的是原來的詞表或者合并后的詞表,具體配置在yaml配置文件中展開。
# training set
bash ${PROJECT_ROOT}/preprocess/multilingual_preprocess_main.sh ${PROJECT_ROOT}/experiments/example/configs/preprocess/train_en2de.yml
# test set
bash ${PROJECT_ROOT}/preprocess/multilingual_preprocess_main.sh ${PROJECT_ROOT}/experiments/example/configs/preprocess/test_en2de.yml
配置文件如下
https://github.com/linzehui/mRASP/blob/master/experiments/example/configs/preprocess/train_en2de.yml
https://github.com/linzehui/mRASP/blob/master/experiments/example/configs/preprocess/test_en2de.yml
運行預處理腳本會產生如下輸出
==== Working directory: ====
/data00/home/panxiao.94/experiments/pmnmt/preprocess
============================
======== 1. Clean & Tokenization BEGIN ========
******** Generate config for LANGUAGE ********
******** Generate config for LANGUAGE PAIR en_de and Clean & Tokenize en_de Parallel Data ********
======== 1. Clean & Tokenization ALL DONE ========
======== 2. Subword & Vocab BEGIN ========
******** Only Apply BEGIN ********
******** Only Apply ALL DONE ********
======== 2. Subword & Vocab ALL DONE ========
======== 3. Merge BEGIN ========
======== 3. Merge ALL DONE ========
處理好的數據會出現在${merged_output_path}所指定的位置
#比如,在測試集配置文件所指定的${merged_output_path}目錄下面
dev.de dev.en
在預處理完之后,需要將上述數據進行binarize(fairseq中特定的二進制化操作),具體操作可以參考
bash ${PROJECT_ROOT}/experiments/example/bin_finetune.sh
運行時顯示如下
微調訓練
新建微調階段配置文件
作者使用的是yaml格式的配置文件,微調階段的配置參數如下面的例子,各參數的具體說明可以在作者的說明中找到。
src: en
tgt: de
model_arch: transformer_wmt_en_de_big
encoder_learned_pos: true
decoder_learned_pos: true
data_path: /data00/home/panxiao.94/experiments/mRASP/experiments/example/data/fine-tune/en2de
model_dir: /data00/home/panxiao.94/experiments/mRASP/experiments/example/models/fine-tune/transformer_big/en2de
pretrain_model_dir: /data00/home/panxiao.94/experiments/mRASP/experiments/example/models/pre-train/transformer_big
update_freq: 1
log_interval: 5
save_interval_updates: 50
max_update: 500
max_tokens: 2048
max_source_positions: 256
max_target_positions: 256
lr: 5e-4
dropout: 0.2
activation_fn: gelu
criterion: label_smoothed_cross_entropy
reset_optimizer: true
reset_lr_scheduler: true
reset_dataloader: true
reset_meters: true
lr_scheduler: inverse_sqrt
weight_decay: 0.0
clip_norm: 0.0
warmup_init_lr: 1e-07
label_smoothing: 0.1
fp16: true
seed: 9823843
開始訓練!
在準備好配置文件后,運行下面的命令
export CUDA_VISIBLE_DEVICES=0,1,2 && export EVAL_GPU_INDEX=${eval_gpu_index} && bash ${PROJECT_ROOT}/train/fine-tune.sh ${finetune_yml} ${eval_yml}
eval_gpu_index 表示被分配用于在訓練時進行評估的GPU的id,如果設置成 -1則表示在訓練過程中將使用CPU進行評估。
${finetune_yml}是上一步中配置好的yaml文件
${eval_yml} 參考https://github.com/linzehui/mRASP/blob/master/experiments/example/configs/eval/en2de_eval.yml
用模型翻譯吧!
當訓練完成后,我們就可以直接使用fairseq-interactive來實時生成翻譯了。假設將checkpoint和bpe codes文件都放在${PROJECT_ROOT}/model目錄下,那么可以運行下面的命令:
repo_dir=${PROJECT_ROOT}
fairseq-interactive
--path ${repo_dir}/model/checkpoint_last.pt
--beam 5 --source-lang en --target-lang de
--tokenizer moses
--bpe subword_nmt --bpe-codes ${repo_dir}/model/codes.bpe.32000
注意輸入文本時,一定要在句子前加上language token,比如:
LANG_TOK_EN This was also confirmed by Peter Arnold from the Offenburg District Office.
模型的輸出也會以目標端語言的language token為開頭:
LANG_TOK_DE Dies best?tigt auch Peter Arnold vom Landratsamt Offenburg.
原文標題:機器翻譯界的BERT:可快速得到任意機翻模型的mRASP
文章出處:【微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
AI
+關注
關注
87文章
31513瀏覽量
270330 -
人工智能
+關注
關注
1796文章
47666瀏覽量
240286 -
機器翻譯
+關注
關注
0文章
139瀏覽量
14946
原文標題:機器翻譯界的BERT:可快速得到任意機翻模型的mRASP
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論