开源
UnsupervisedMT:基于短语和神经无监督机器翻译库
来源:元经纪     阅读:886
网站管理员
发布于 2023-01-29 02:41
查看主页

概述

该存储库包含基于短语和神经无监督机器翻译(EMNLP 2018)中介绍的无监督 PBSMT 和 NMT 模型的原始实现。

注意:对于 NMT 方法,我们建议您查看跨语言语言模型预训练和相关的 GitHub 存储库https://github.com/facebookresearch/XLM,其中包含更好的模型和更有效的无监督机器翻译实现。

NMT 实现支持:

三种机器翻译架构(seq2seq、biLSTM+attention、Transformer) 能够跨模型/语言共享任意数量的参数 去噪自动编码器训练 并行数据训练 反向并行数据训练 反向并行数据的实时多线程生成

以及原始论文中未使用的其他功能(留待以后工作):

训练期间任意数量的语言 具有共享参数的语言模型预训练/联合训练 对抗训练

PBSMT 实现支持:

无监督短语表生成脚本 自动化摩西训练

依赖关系

[hidecontent type="logged" desc="隐藏内容:登录后可查看"]

Python 3 NumPy PyTorch (目前在 0.5 版上测试) Moses (清理和标记文本/训练 PBSMT 模型) fastBPE (生成和应用 BPE 代码) fastText (生成嵌入) MUSE (生成跨语言嵌入)

对于 NMT 实现,NMT/get_data_enfr.sh脚本将负责安装所有内容(PyTorch 除外)。还为英语-德语提供了相同的脚本:NMT/get_data_deen.sh。NMT 实现只需要 Moses 预处理脚本,不需要安装 Moses。

PBSMT 实施将需要 Moses 的有效实施,您必须自己安装它。编译 Moses 并不总是那么简单,一个好的替代方法是下载二进制可执行文件

无监督 NMT

下载/预处理数据

运行 NMT 模型要做的第一件事是下载和预处理数据。为此,只需运行:

git clone https://github.com/facebookresearch/UnsupervisedMT.git
cd UnsupervisedMT/NMT
./get_data_enfr.sh

该脚本将依次:

  • 安装工具
    • 下载 Moses scripts
    • 下载编译fastBPE
    • 下载并编译fastText
  • 下载并准备单语数据
    • 下载/提取/标记化单语数据
    • 在单语数据上生成和应用 BPE 代码
    • 提取训练词汇
    • 二值化单语数据
  • 下载并准备并行数据(用于评估)
    • 下载/提取/标记并行数据
    • 将 BPE 代码应用于具有训练词汇表的并行数据
    • 二值化并行数据
  • 训练跨语言嵌入

get_data_enfr.sh包含一些在文件开头定义的参数:

  • N_MONO每种语言的单语句子数(默认 10000000)
  • CODESBPE 代码数(默认 60000)
  • N_THREADS数据预处理线程数(默认48)
  • N_EPOCHSfastText 纪元数(默认 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

请注意,有几种方法可以训练跨语言嵌入:

  • 分别为每种语言训练单语言嵌入,并用MUSE对齐它们(请参阅原始论文以获取更多详细信息)。
  • 将源和目标单语语料库连接到一个文件中,并在生成的文件上使用 fastText 训练嵌入(这是在get_data_enfr.sh脚本中实现的)。

当源语言和目标语言相似并且共享很多常用词(例如法语和英语)时,第二种方法效果更好。然而,当源词汇和目标词汇之间的重叠太小时,对齐会很差,你应该选择第一种方法使用 MUSE 来生成你的跨语言嵌入。

训练 NMT 模型

给定二值化的单语言训练数据、并行评估数据和预训练的跨语言嵌入,您可以使用以下命令训练模型:

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'

一些参数必须遵守特定格式:

  • 语言
    • 语言列表,按语言 ID 排序。
    • en,fr对于“英语和法语”
    • de,en,es,fr对于“德语、英语、西班牙语和法语”
  • 单数据集
    • 将语言映射到训练、验证和测试文件的字典。
    • 验证和测试文件是可选的(通常我们只需要它们进行训练)。
    • en:train.en,valid.en,test.en;fr:train.fr,valid.fr,test.fr
  • para_dataset
    • 将语言对映射到训练、验证和测试文件的字典。
    • 训练文件是可选的(在无监督 MT 中,我们仅使用并行数据进行评估)。
    • en-fr:train.en-fr.XX,valid.en-fr.XX,test.en-fr.XX指示验证和测试路径。
  • 单向
    • 我们想要训练去噪自动编码器的语言列表。
    • en,fr用英语和法语训练自动编码器。
  • 平行方向
    • 我们希望以标准监督方式训练 MT 系统的元组列表。
    • en-fr,fr-de将在en->fr和两个fr->de方向上训练模型。
    • 需要为模型提供并行数据。
  • pivo_directions
    • 我们要对其执行反向翻译的三元组列表。
    • fr-en-fr,en-fr-en将在fr->en->fren->fr->en方向上训练模型。
    • en-fr-de,de-fr-en将在en->fr->dede->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

运行 PBSMT 方法需要有一个可用的Moses版本。在某些系统上,Moses 的编译不是很简单,有时直接下载二进制文件要简单得多。

有了 Moses 的工作版本后,编辑脚本中的MOSES_PATH变量PBSMT/run.sh以指示 Moses 目录的位置。然后,只需运行:

cd PBSMT
./run.sh

该脚本将依次:

  • 安装工具
    • 检查 Moses 档案
    • 下载MUSE并下载评估文件
  • 下载预训练词嵌入
  • 下载并准备单语数据
    • 下载/提取/标记化单语数据
    • 学习 truecasers 并将其应用于单语数据
    • 学习语言模型并将其二值化以进行 Moses 解码
  • 下载并准备并行数据(用于评估):
    • 下载/提取/标记并行数据
    • Truecase并行数据
  • 运行 MUSE 以生成跨语言嵌入
  • 使用 MUSE 比对生成无监督短语表
  • 跑摩西
    • 创建 Moses配置文件
    • 在测试语句上运行 Moses
    • Detruecase 翻译
  • 评估翻译

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][2] 。

[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]

 
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 开源
立马“再跃新山河” 向新目标出发
数字深圳建设要以产业数字化转型为抓手
天上掉下一堆黑色石头 泰国夫妻捡走后感觉身体倍棒
高职如何应对人工智能挑战
multiNetX:一款基于python的网络分析工具包

首页

分类

定制方案

消息

我的