OpenNMT西译英模型训练时训练准确率上升、验证准确率下降的优化问询
OpenNMT西译英模型训练异常问题求助
现有训练流程基础
当前正基于YAML配置脚本训练OpenNMT西班牙语到英语翻译模型。虽然可获取的数据集规模较大,但为了先跑通流程,计划先以10000条样本的训练集、1000-2000条样本的验证集完成效果验证。经过多日调试,遇到训练时长越久验证集准确率越低、训练集准确率持续上升的异常问题,特此求助。
数据准备情况
训练数据来自ModelFront平台的ES-EN新冠主题平行语料集,该数据集的平行句对齐质量较高。提取数据集的前10000条不含数字、无效字符的平行句作为训练集,后续1000-2000条同规则样本作为验证集,再后续1000条同规则样本作为测试集,经检查数据干净、平行句逐行对齐准确。
子词模型构建配置
使用sentencepiece构建统一词表:通过spm_train命令,将西班牙语、英语训练集以逗号分隔作为输入,输出单一的esen.model,采用unigram模式,词表大小设为16000,对应执行命令为:
!spm_train --input=data/spanish_train,data/english_train --model_prefix=data/esen --character_coverage=1 --vocab_size=16000 --model_type=unigram
YAML核心配置说明
核心配置项如下:
- 训练、验证数据均配置sentencepiece、filtertoolong类变换,源语和目标语共用前述
esen.model作为子词模型 - 模型结构:RNN编码器、RNN解码器,采用LSTM单元,共2层,双向结构
- 优化参数:采用Adam优化器,学习率0.001,总训练步5000,每1000步执行一次验证
完整YAML配置代码:
## Where the samples will be written save_data: en-sp/run/example ## Where the vocab(s) will be written src_vocab: en-sp/run/example.vocab.src tgt_vocab: en-sp/run/example.vocab.tgt ## Where the model will be saved save_model: drive/MyDrive/ESEN/model3_bpe_adam_001_layer2/model # Prevent overwriting existing files in the folder overwrite: False # Corpus opts: data: taus_corona: path_src: data/spanish_train path_tgt: data/english_train transforms: [sentencepiece, filtertoolong] weight: 1 valid: path_src: data/spanish_valid path_tgt: data/english_valid transforms: [sentencepiece] skip_empty_level: silent src_subword_model: data/esen.model tgt_subword_model: data/esen.model # General opts report_every: 100 train_steps: 5000 valid_steps: 1000 save_checkpoint_steps: 1000 world_size: 1 gpu_ranks: [0] # Optimizer optim: adam learning_rate: 0.001 # Model encoder_type: rnn decoder_type: rnn layers: 2 rnn_type: LSTM bidir_edges: True # Logging tensorboard: true tensorboard_log_dir: logs log_file: logs/log-file.txt verbose: True attn_debug: True align_debug: True global_attention: general global_attention_function: softmax
执行命令与训练结果
词表构建、模型训练的执行命令为:
onmt_build_vocab -config en-sp.yaml -n_sample -1 onmt_train -config en-sp.yaml
训练启动后,训练准确率从初始的7.65%提升至5000步结束时的70%以上,但同期验证准确率从24%逐步下降至19%;对测试集进行BLEU评分时,得到的简短惩罚BP约为0.67。此前尝试采用SGD优化器、学习率设为1,训练过程中验证准确率可持续上升,但训练后期困惑度会出现反弹。
现存疑问
- 当前操作是否存在不当设置,才会出现训练集准确率上升、验证集准确率下降的过拟合现象?
- 是否需要延长训练时长?
- 求可落地的模型改进建议。
训练过程的部分输出日志:
Step 1000/ 5000; acc: 27.94; ppl: 71.88; xent: 4.27; lr: 0.00100; 13103/12039 tok/s; 157 sec Validation perplexity: 136.446 Validation accuracy: 24.234 ... Step 4000/ 5000; acc: 61.25; ppl: 5.28; xent: 1.66; lr: 0.00100; 13584/12214 tok/s; 641 sec Validation accuracy: 22.1157 ...
内容的提问来源于stack exchange,提问作者Jose Chavez
相关产品推荐
相关产品推荐

