openNMT转换命令产生垃圾结果

问题描述

我正在运行以下命令

parent_id

文件'pred.txt'中的结果与翻译所提供的源句子完全不同

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

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

培训是在演示模型上

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

解决方法

即使在“可见”的数据上,也无法获得令人满意的翻译,因为:

  • 您的模型受过很少的句子对训练(实际上3000个太少了,培训一个好的模型也太少了)。使用4M +语料库,您只能获得或多或少有意义的翻译(越多越好)。
  • onmt_train -data EMMT/demo -save_model demo-model训练一个小的(2层x 500个神经元)单向RNN模型(请参阅documentation)。建议使用transformer模型类型以获得最新的结果。

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

变压器型号非常 对超参数敏感。要有效运行它,您需要设置一个 一堆模仿Google设置的不同选项。我们有 确认以下命令可以复制其WMT结果。

python  train.py -data /tmp/de2/data -save_model /tmp/extra \
        -layers 6 -rnn_size 512 -word_vec_size 512 -transformer_ff 2048 -heads 8  \
        -encoder_type transformer -decoder_type transformer -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 adamdecay_method noamwarmup_steps 8000:使用特殊学习 率。

batch_type tokensnormalization tokensaccum_count 4:批处理和 根据记号而不是句子进行归一化。计算 基于四个批次的渐变。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...