注意:对于 NMT 方法,我们建议您查看跨语言语言模型预训练和相关的 GitHub 存储库https://github.com/facebookresearch/XLM,其中包含更好的模型和更有效的无监督机器翻译实现。
NMT 实现支持:
三种机器翻译架构(seq2seq、biLSTM+attention、Transformer) 能够跨模型/语言共享任意数量的参数 去噪自动编码器训练 并行数据训练 反向并行数据训练 反向并行数据的实时多线程生成以及原始论文中未使用的其他功能(留待以后工作):
训练期间任意数量的语言 具有共享参数的语言模型预训练/联合训练 对抗训练PBSMT 实现支持:
无监督短语表生成脚本 自动化摩西训练[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
对于 NMT 实现,NMT/get_data_enfr.sh
脚本将负责安装所有内容(PyTorch 除外)。还为英语-德语提供了相同的脚本:NMT/get_data_deen.sh
。NMT 实现只需要 Moses 预处理脚本,不需要安装 Moses。
PBSMT 实施将需要 Moses 的有效实施,您必须自己安装它。编译 Moses 并不总是那么简单,一个好的替代方法是下载二进制可执行文件。
运行 NMT 模型要做的第一件事是下载和预处理数据。为此,只需运行:
git clone https://github.com/facebookresearch/UnsupervisedMT.git
cd UnsupervisedMT/NMT
./get_data_enfr.sh
该脚本将依次:
get_data_enfr.sh
包含一些在文件开头定义的参数:
N_MONO
每种语言的单语句子数(默认 10000000)CODES
BPE 代码数(默认 60000)N_THREADS
数据预处理线程数(默认48)N_EPOCHS
fastText 纪元数(默认 10)添加更多的单语数据将提高性能,但需要更长的时间进行预处理和训练(1000 万个句子是 NMT 论文中使用的句子)。该脚本应输出一个数据摘要,其中包含开始实验所需的所有文件的位置:
Monolingual training data:
EN: ./data/mono/all.en.tok.60000.pth
FR: ./data/mono/all.fr.tok.60000.pth
Parallel validation data:
EN: ./data/para/dev/newstest2013-ref.en.60000.pth
FR: ./data/para/dev/newstest2013-ref.fr.60000.pth
Parallel test data:
EN: ./data/para/dev/newstest2014-fren-src.en.60000.pth
FR: ./data/para/dev/newstest2014-fren-src.fr.60000.pth
Concatenated data in: ./data/mono/all.en-fr.60000
Cross-lingual embeddings in: ./data/mono/all.en-fr.60000.vec
请注意,有几种方法可以训练跨语言嵌入:
get_data_enfr.sh
脚本中实现的)。当源语言和目标语言相似并且共享很多常用词(例如法语和英语)时,第二种方法效果更好。然而,当源词汇和目标词汇之间的重叠太小时,对齐会很差,你应该选择第一种方法使用 MUSE 来生成你的跨语言嵌入。
给定二值化的单语言训练数据、并行评估数据和预训练的跨语言嵌入,您可以使用以下命令训练模型:
python main.py
## main parameters
--exp_name test # experiment name
## network architecture
--transformer True # use a transformer architecture
--n_enc_layers 4 # use 4 layers in the encoder
--n_dec_layers 4 # use 4 layers in the decoder
## parameters sharing
--share_enc 3 # share 3 out of the 4 encoder layers
--share_dec 3 # share 3 out of the 4 decoder layers
--share_lang_emb True # share lookup tables
--share_output_emb True # share projection output layers
## datasets location
--langs 'en,fr' # training languages (English, French)
--n_mono -1 # number of monolingual sentences (-1 for everything)
--mono_dataset $MONO_DATASET # monolingual dataset
--para_dataset $PARA_DATASET # parallel dataset
## denoising auto-encoder parameters
--mono_directions 'en,fr' # train the auto-encoder on English and French
--word_shuffle 3 # shuffle words
--word_dropout 0.1 # randomly remove words
--word_blank 0.2 # randomly blank out words
## back-translation directions
--pivo_directions 'en-fr-en,fr-en-fr' # back-translation directions (en->fr->en and fr->en->fr)
## pretrained embeddings
--pretrained_emb $PRETRAINED # cross-lingual embeddings path
--pretrained_out True # also pretrain output layers
## dynamic loss coefficients
--lambda_xe_mono '0:1,100000:0.1,300000:0' # auto-encoder loss coefficient
--lambda_xe_otfd 1 # back-translation loss coefficient
## CPU on-the-fly generation
--otf_num_processes 30 # number of CPU jobs for back-parallel data generation
--otf_sync_params_every 1000 # CPU parameters synchronization frequency
## optimization
--enc_optimizer adam,lr=0.0001 # model optimizer
--group_by_size True # group sentences by length inside batches
--batch_size 32 # batch size
--epoch_size 500000 # epoch size
--stopping_criterion bleu_en_fr_valid,10 # stopping criterion
--freeze_enc_emb False # freeze encoder embeddings
--freeze_dec_emb False # freeze decoder embeddings
## With
MONO_DATASET='en:./data/mono/all.en.tok.60000.pth,,;fr:./data/mono/all.fr.tok.60000.pth,,'
PARA_DATASET='en-fr:,./data/para/dev/newstest2013-ref.XX.60000.pth,./data/para/dev/newstest2014-fren-src.XX.60000.pth'
PRETRAINED='./data/mono/all.en-fr.60000.vec'
一些参数必须遵守特定格式:
en,fr
对于“英语和法语”de,en,es,fr
对于“德语、英语、西班牙语和法语”en:train.en,valid.en,test.en;fr:train.fr,valid.fr,test.fr
en-fr:train.en-fr.XX,valid.en-fr.XX,test.en-fr.XX
指示验证和测试路径。en,fr
用英语和法语训练自动编码器。en-fr,fr-de
将在en->fr
和两个fr->de
方向上训练模型。fr-en-fr,en-fr-en
将在fr->en->fr
和en->fr->en
方向上训练模型。en-fr-de,de-fr-en
将在en->fr->de
和de->fr->en
方向上训练模型(假设fr
是未知语言,并提供英德平行数据)。其他参数:
--otf_num_processes 30
表示 30 个 CPU 线程将使用当前模型参数动态生成回译数据--otf_sync_params_every 1000
表示每 1000 个训练步骤将同步 CPU 线程上的模型--lambda_xe_otfd 1
表示与反向翻译损失相关的系数固定为常数 1--lambda_xe_mono '0:1,100000:0.1,300000:0'
意味着与去噪自动编码器损失相关的系数最初设置为 1,将在前 100000 步线性减小到 0.1,然后在接下来的 200000 步中变为 0,最后在剩余的步骤中等于 0实验(即我们只训练反向翻译)将所有这些放在一起,训练命令变为:
python main.py --exp_name test --transformer True --n_enc_layers 4 --n_dec_layers 4 --share_enc 3 --share_dec 3 --share_lang_emb True --share_output_emb True --langs 'en,fr' --n_mono -1 --mono_dataset 'en:./data/mono/all.en.tok.60000.pth,,;fr:./data/mono/all.fr.tok.60000.pth,,' --para_dataset 'en-fr:,./data/para/dev/newstest2013-ref.XX.60000.pth,./data/para/dev/newstest2014-fren-src.XX.60000.pth' --mono_directions 'en,fr' --word_shuffle 3 --word_dropout 0.1 --word_blank 0.2 --pivo_directions 'fr-en-fr,en-fr-en' --pretrained_emb './data/mono/all.en-fr.60000.vec' --pretrained_out True --lambda_xe_mono '0:1,100000:0.1,300000:0' --lambda_xe_otfd 1 --otf_num_processes 30 --otf_sync_params_every 1000 --enc_optimizer adam,lr=0.0001 --epoch_size 500000 --stopping_criterion bleu_en_fr_valid,10
在 newstest2014 en-fr 上,上述命令应在 25 个时期后(即在 V100 上训练一天后)给出 23.0 BLEU 以上。
运行 PBSMT 方法需要有一个可用的Moses版本。在某些系统上,Moses 的编译不是很简单,有时直接下载二进制文件要简单得多。
有了 Moses 的工作版本后,编辑脚本中的MOSES_PATH
变量PBSMT/run.sh
以指示 Moses 目录的位置。然后,只需运行:
cd PBSMT
./run.sh
该脚本将依次:
run.sh
包含一些在文件开头定义的参数:
MOSES_PATH
包含 Moses 安装的文件夹N_MONO
每种语言的单语句子数(默认 10000000)N_THREADS
数据预处理线程数(默认48)SRC
源语言(默认英文)TGT
目标语言(默认法语)该脚本应返回如下内容:
BLEU = 13.49, 51.9/21.1/10.2/5.2 (BP=0.869, ratio=0.877, hyp_len=71143, ref_len=81098)
End of training. Experiment is stored in: ./UnsupervisedMT/PBSMT/moses_train_en-fr
如果你在你的语言模型中使用 50M 而不是 10M 的句子,你应该得到BLEU = 15.66, 52.9/23.2/12.3/7.0
. 使用更大的语言模型以及短语而不是单词,将进一步改善结果。
[1] G. Lample、M. Ott、A. Conneau、L. Denoyer、MA。Ranzato基于短语和神经无监督机器翻译
@inproceedings{lample2018phrase,
title={Phrase-Based \& Neural Unsupervised Machine Translation},
author={Lample, Guillaume and Ott, Myle and Conneau, Alexis and Denoyer, Ludovic and Ranzato, Marc'Aurelio},
booktitle = {Proceedings of the 2018 Conference on Empirical Methods in Natural Language Processing (EMNLP)},
year={2018}
}
[2] G. Lample、A. Conneau、L. Denoyer、MA。仅使用单语数据的 Ranzato无监督机器翻译
@inproceedings{lample2017unsupervised,
title = {Unsupervised machine translation using monolingual corpora only},
author = {Lample, Guillaume and Conneau, Alexis and Denoyer, Ludovic and Ranzato, Marc'Aurelio},
booktitle = {International Conference on Learning Representations (ICLR)},
year = {2018}
}
[/hidecontent]