今天給你們介紹EMNLP2020的一篇關於多語言翻譯新範式的工做multilingual Random Aligned Substitution Pre-training (mRASP)[1],核心思想就是打造「機器翻譯界的BERT」,經過預訓練技術再在具體語種上微調便可達到領先的翻譯效果,其在32個語種上預訓練出的統一模型在47個翻譯測試集上取得了全面顯著的提高。python
附註:相關技術已經被應用於火山翻譯[2]git
目前絕大多數AI任務都是創建在數據的基礎之上的統計學習,模型的表現效果很大程度上依賴於數據的質量和數量。利用大量較易得到的數據來預訓練模型,在具體應用場景再利用少許標註數據微調來實現實際場景可用的模型,已經成爲NLP新的成功範式。例如BERT[3]在大規模純文本上預訓練後,在天然語言理解的11項任務上少許微調就能取得很好的成績。不過,在多語言的機器翻譯中,經過預訓練再微調的範式還未取得廣泛的成功。之前的NLP預訓練方式例如BERT、GPT[4]訓練目標與翻譯關注的目標之間差距過大,不易直接使用。mRASP提出了全新的思路,利用多個語言已經積累的大量雙語平行語料,合併起來聯合訓練一個統一的模型,以後再基於此微調,讓預訓練和微調目標儘量接近,這樣才能更大發揮預訓練模型做用。github
BERT和GPT的示意圖MASS和機器翻譯示意圖對比算法
上圖對比分析了以前NLP預訓練方法在機器翻譯場景直接應用的限制。BERT和GPT分別對應了Transformer[5] 編碼器部分和解碼器部分的預訓練,而機器翻譯用的是序列生成模型。這種模型結構的不一致會致使翻譯模型只有一部分參數被初始化,有效發揮預訓練做用會比較困難,所以須要不少特殊的技巧才能獲得提高[6]。bash
針對序列模型,很快也有研究者提出了MASS[7]和BART[8]等框架將預訓練擴展到序列生成任務,它們使用 auto-encoder(自編碼器)進行自學習,在不少下游生成任務上都取得了顯著的效果,可是在機器翻譯的應用上依然存在兩個重要的問題,第一是在資源豐富的語種(例如英德和英法)上沒有觀察到提高,第二是沒有辦法擴展到多語種翻譯任務上。這種侷限性,很大一部分緣由就是自編碼相對是簡單任務,很難學習到更深層次的表示,而機器翻譯須要更復雜的語義轉化,這種預訓練目標和下游任務之間的差別,致使模型很難最大程度利用好預訓練數據。如何克服着兩個問題,成了預訓練模型在機器翻譯領域應用的重要挑戰。網絡
對於語言學習者來講,有一個很是有意思的現象,他們發如今學習了三四種語言以後,再學習一個新的語言速度會加快。一個簡單的例子,若是有人分別學習德語和法語,可能各須要一年的時間,然而他先學習了德語,再去學法語,可能只須要一年零三個月就學會了,接下來再去學習西班牙語,速度可能會更快。對於程序語言其實也是相似的道理,學習C++可能須要一年,接下來再學習 Java,Python 可能只須要一個月。一個淺顯的解釋是,人類在多語言學習的過程會自發去總結語言中比較抽象的共性,重點學習新語言的特性。所以想要提高我的的語言學習能力,每每須要學習更多的語言,可以對語言的共性有更精確的把握,而不是拼命學習一個語言。一樣的道理,對於機器翻譯而言,可否把翻譯能力遷移到不一樣語言上,使得不一樣語言之間的信息能夠互相利用,就成了一件很是有趣的問題。app
mRASP的設計目標正是基於這樣的考慮,設計一個通用的預訓練模型,學習語言之間轉換的共性,接下來就被更容易遷移到新的翻譯方向。就好像語言學習者同樣,在學習了兩種語言以後,第三種語言就變得很輕鬆了。mRASP 的設計遵循了兩個基本原則:第一,預訓練的目標和機器翻譯基本一致,須要學習到語言的轉換能力;第二,儘量學習語言的通用表示,跨語言的句子或詞語,若是語義接近則隱空間中的表示也應該接近。框架
mRASP方法,使用帶語言標識的Transformer做爲翻譯網絡框架dom
mRASP遵循了通用的預訓練-微調框架。預訓練階段,不一樣於傳統預訓練模型大量堆疊無監督單語數據的方式, mRASP另闢蹊徑,採用了多語言平行數據做爲預訓練的主要目標,將幾十種語言的平行數據放到同一個模型進行聯合訓練。神經網絡結構採用Transformer,加上語言標識符(Language token)標識源語言和目標語言。爲了保證不一樣語言的句子和詞語能嵌入到同一個空間,同一個意思的句子不管中文仍是英文說得都應該是對應同一個向量表示,又引入了隨機替換對齊技術RAS,來製造更豐富的上下文。ide
一句中文的句子"我 愛 北京 天安門"中的"愛"有必定機率被替換成"aime"(法語),"北京"也有必定機率被替換成"Pékin"(法語),因而原句就可能會變成"我 aime Pékin 天安門"。訓練集中的一對平行句對能夠變爲兩對(甚至三對、四對,……):
我 愛 北京 天安門 ==> I love Beijing Tiananmen Square
我 aime Pékin 天安門 ==> I love Beijing Tiananmen Square
而在微調階段,只須要使用預訓練階段的參數做初始化,以後採用和傳統單向機器翻譯相同的訓練方法便可。所以使用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 的顯著收益。
這裏摘錄了有表明性的部分實驗結果:
下圖中對比了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天。
不包含在預訓練階段平行句對中的語向,也稱做"Exotic Directions",在Exotic Directions上是否有效果,決定了 mRASP 是否具備很好的擴展性和泛化能力。
論文中對Exotic Directions分爲四種狀況:
這四種未見語對狀況下訓練機器翻譯都很難。固然其中難度最大的是最後一種,至關於要求只學習了中文和英語的人,讀少許拉丁語和印地語的句子就能夠從拉丁語到印地語翻譯。
Exotic Directions的四種分類
值得關注的是,法中(Fr-Zh)兩邊都單獨出現過,可是沒有做爲平行語對出現過,只使用了20K平行語料就能夠達到20+的BLEU score。
同時,對於兩邊語言都沒在預訓練階段出現過的語對,好比荷蘭語到葡萄牙語(Nl-Pt),只使用1.2萬句平行語料,通過大概10分鐘的訓練後,也能夠達到10+ BLEU score。
英語-法語案例。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) 分發-共享。
做爲通用的預訓練模型,它對各個MT下游任務的的提高效果從何而來?
做者認爲,其提高主要來源於兩個方面:
單詞級別和句子級別的表示被拉近意味着: 通過預訓練階段對大量語言的平行句對的處理和學習,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]。
下面咱們就來手把手教你們如何使用做者開源的mRASP模型來快速獲得一個單向的機器翻譯模型。在後面的例子中,咱們選用做者提供的toy en-de數據集[13]來作示範。
在開始正式訓練的過程以前,咱們首先須要配置好環境。
git
clone https://github.com/linzehui/mRASP.git
cd mRASP
pip install -r requirements.txt
合併詞表(可選)
python ${PROJECT_ROOT}/train/scripts/concat_merge_vocab.py --checkpoint ${CKPT} --now-vocab ${CURRENT_VOCAB} --to-append-vocab ${NEW_VOCAB} --output-dir ${OUTPUT_DIR}
# 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}目錄下面
dev.de dev.en
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}
用模型翻譯吧!
當訓練完成後,咱們就能夠直接使用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
LANG_TOK_EN This was also confirmed by Peter Arnold from the Offenburg District Office.
LANG_TOK_DE Dies bestätigt auch Peter Arnold vom Landratsamt Offenburg.
做者:潘小小
字節跳動AI-Lab NLP算法工程師,目前專一多語言機器翻譯,法國留學文藝女青年,現居上海。知乎id: 潘小小
mRASP: https://arxiv.org/abs/2010.03142
[2]火山翻譯: http://translate.volcengine.cn/
[3]BERT: https://arxiv.org/abs/1810.04805
[4]GPT: https://medium.com/walmartglobaltech/the-journey-of-open-ai-gpt-models-32d95b7b7fb2
[5]Transformer: https://arxiv.org/abs/1706.03762
[6]Towards-BERT: https://arxiv.org/abs/1908.05672
[7]MASS: https://arxiv.org/abs/1905.02450
[8]BART: https://arxiv.org/abs/1910.13461
[9]mBERT: https://arxiv.org/abs/2001.08210
[10]Github: https://github.com/linzehui/mRASP
[11]Paper: https://arxiv.org/abs/2010.03142
[12]體驗官網: http://translate.volcengine.cn/
[13]toy en-de數據集: https://github.com/linzehui/mRASP/tree/master/experiments/example/data/raw
[14]RAS的版本: https://www.icloud.com/iclouddrive/0qOUbmoRIUYEkIjEQ9TGyV6QQ#:~:text=Download%20a-,Copy,-Create