首页 > 解决方案 > openNMT 翻译命令产生垃圾结果

问题描述

我正在运行以下命令

onmt_translate  -model demo-model_step_100000.pt -src data/src-test.txt -output pred.txt -replace_unk -verbose

文件“pred.txt”中的结果与为翻译给出的源句完全不同

语料库大小为 3000 个平行句子。预处理命令是 -

onmt_preprocess -train_src EMMT/01engParallel_onmt.txt -train_tgt EMMT/01maiParallel_onmt.txt -valid_src EMMT/01engValidation_onmt.txt -valid_tgt EMMT/01maiValidation_onmt.txt -save_data EMMT/demo

培训在演示模型上

onmt_train -data EMMT/demo -save_model demo-model

标签: pythonopennmt

解决方案


即使在“可见”数据上也无法获得体面的翻译,因为:

  • 你的模型只训练了太少的句子对(3000 真的太少了,无法训练一个好的模型)。您只能使用 4M+ 的语料库获得一些或多或少有意义的翻译(并且越多越好)。
  • onmt_train -data EMMT/demo -save_model demo-model训练一个小型(2 层 x 500 个神经元)单向 RNN 模型(参见文档)。建议使用transformer模型类型以获得最先进的结果。

常见问题解答说明了如何运行变压器模型训练:

Transformer 模型对超参数非常敏感。为了有效地运行它,您需要设置一堆模仿 Google 设置的不同选项。我们已经确认以下命令可以复制他们的 WMT 结果。

python train.py -data /tmp/de2/data -save_model /tmp/extra \
        -层 6 -rnn_size 512 -word_vec_size 512 -transformer_ff 2048 -heads 8 \
        -encoder_type 转换器 -decoder_type 转换器 -position_encoding \
        -train_steps 200000 -max_generator_batches 2 -dropout 0.1 \
        -batch_size 4096 -batch_type tokens -normalization tokens -accum_count 2 \
        -optim adam -adam_beta2 0.998 -decay_method noam -warmup_steps 8000 -learning_rate 2 \
        -max_grad_norm 0 -param_init 0 -param_init_glorot \
        -label_smoothing 0.1 -valid_steps 10000 -save_checkpoint_steps 10000 \
        -world_size 4 -gpu_ranks 0 1 2 3

以下是每个参数的含义:

param_init_glorot -param_init 0: 正确初始化参数

position_encoding:为每个嵌入添加正弦位置编码

optim adam, decay_method noam, warmup_steps 8000: 使用特殊的学习率。

batch_type tokens, normalization tokens, accum_count 4: 根据标记的数量而不是句子的数量进行批处理和规范化。基于四个批次计算梯度。

label_smoothing 0.1:使用标签平滑损失。


推荐阅读