由于实验评估需要,我想尝试一下在OpenNMT中使用Transformer,不过还是遇到了一些问题,这里记录一下:
在之前的实验中,我注意到OpenNMT的Seq2Seq model的performance实际上比不上最简单的PyTorch的Seq2Seq示例代码。觉得很疑惑,稍微搜索后发现,其他网友也提出了类似的问题:
https://github.com/OpenNMT/OpenNMT-py/issues/139
不过似乎这个问题并没有引起足够的重视,OpenNMT的开发者回复说,我们已经实现了SOTA的Transformer模型,所以不需要仔细处理这个issue了(这个态度也是呵呵了,你们可是哈佛的组啊,不应该更严谨认真一点么?)
所以想试试Transformer,按照这里的介绍:
http://opennmt.net/OpenNMT-py/FAQ.html
Transformer对超参很敏感,他们通过以下参数复现了论文的结果:
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
由于我目前测试的机子上没有GPU,所以尝试一下去掉最后的参数,结果发现去掉之后,程序很快停止,也没有任何报错或者输出。呵呵,难道不应该考虑没有GPU的情况吗?看来开源项目要做到真正人性,普适,要细心测试和开发的细节还有很多啊。这篇日志就简单吐槽一下。