如何使用Fairseq从头开始训练简单的香草变压器翻译模型

时间:2019-10-11 18:19:39

标签: nlp pytorch transformer machine-translation seq2seq

我最近已经熟悉了fairseq库,并尝试了一些预训练的模型。我认为,一个自学的好方法是使用我拥有的数据来训练一个普通的香草变压器模型,然后我可以像从那里进行预训练一样修改甚至添加钟声。 fairseq文档中有一个使用fconv架构的示例,我基本上也希望使用变压器。

下面是我尝试的代码:

在数据准备中,我使用moses脚本,标记化的单词清除了数据,然后使用subword-nmt应用BPE,其中将BPE标记的数量设置为15000。

对于预处理:

fairseq-preprocess --source-lang zh --target-lang en \
    --trainpref data/train --validpref data/valid --testpref data/test \
    --joined-dictionary \
    --destdir data-bin \
    --workers 20

培训:

CUDA_VISIBLE_DEVICES=0,1,2,3

fairseq-train data-bin \
    --clip-norm 0.1 --dropout 0.2 --max-tokens 2048 \
    --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \
    --lr 5e-4 --lr-scheduler inverse_sqrt \
    --criterion label_smoothed_cross_entropy \
    --lazy-load \
    --update-freq 4 \
    --keep-interval-updates 100 --save-interval-updates 3000  --log-interval 50 \
    --arch transformer --save-dir checkpoints/transformer

我在大约1900万个样本数据集上,在4个NVIDIA P100 GPU上训练了大约8个小时,到那时,我已经完成了1个纪元。我针对检查点进行了测试-对于更新3000中的第一个检查点,预测都是“ the the”-但这可能还可以,因为它只是第一个检查点。但是,我随后针对最后一个检查点对此进行了测试,所有测试样本的预测都是相同的句子! -一切预测都是“和平利用外层空间委员会”,而BLEU得分是0。我的测试集根本不是关于外层空间。

因此,在获得了极为令人失望的结果之后,我意识到我应该寻求有关创建基本转换器模型的一些提示:

  • 首先,我的结果是否确实在预期范围内? Transformer.py所基于的论文《联合学习对齐和翻译》指出,最新的结果是在64个Volta GPU上进行了3万次更新(!!!)-我的设置要小得多,所以也许结果是预期的?但是,我用更少的时间和更少的数据获得了更好的结果,所以我对此表示怀疑。仅仅是学习速度设置不正确,以致于卡在了一些奇怪的局部最小值中?还是我上面的设置还有其他问题?

  • 以上型号何时停止? max_epoch和max_update不是必需的参数,未指定时设置为math.inf。从train.py看来,培训一直在进行,直到学习率降至args.min_lr以下为止,但是我找不到min_lr的设置位置,并且它不是文档中的参数,所以min_lr是什么?是0吗?

  • 我正在寻找“香草”变压器模型的最佳架构是什么?

谢谢!

0 个答案:

没有答案