今天给你们介绍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