(OpenNMT)西班牙语到英语的模型改进

2024-06-06 17:16:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使用yaml脚本训练一个西班牙语到英语的模型。我的数据集相当大,但仅作为初学者,我试图首先让10000个训练集和1000-2000个验证集运行良好。然而,在尝试了几天之后,我认为我需要帮助,因为我的验证准确度会随着训练次数的增加而下降,而训练准确度则会上升

我的数据来自ModelFront的ES-EN冠状病毒评论数据集,在这里找到https://console.modelfront.com/#/evaluations/5e86e34597c1790017d4050a。我发现这些平行句相当准确。我使用数据集中的前10000条平行线,跳过包含任何数字的句子。然后,我取下一个1000或2000作为我的验证集,下一个1000作为我的测试集,只包含没有数字的句子。在查看数据时,它看起来很干净,句子在各自的行中相互排列

然后,我使用sentencepiece构建了一个词汇模型。使用spm_train命令,我输入我的英语和西班牙语训练集,在参数中用逗号分隔,并输出单个esen.model。此外,我选择使用Unigram和16000的vocab大小

至于我的yaml配置文件:这里是我指定的

我的源和目标培训数据(我在transforms[]中用“sentencepiece”为英语和西班牙语提取的10000个数据)

我的源和目标验证数据(2000年,英语和西班牙语,在转换[]中带有“句子片段”)

My vocab model esen.model用于我的Src和目标vocab model

编码器:rnn 解码器:rnn 类型:LSTM 层数:2 比迪尔:是的

擎天柱:亚当 学习率:0.001

培训步骤:5000 有效步数:1000

其他测井数据

在使用onmt_translate开始训练时,我的训练准确度从7.65开始,到5000步结束时,我的训练准确度降到70分。但是,在这个时间范围内,我的验证精度从24提高到19

然后我用bleu给我的测试集打分,它得到了~0.67的BP

我注意到,在以1的学习率尝试sgd后,我的验证准确率不断提高,但最终困惑又开始回升

我想知道我是否做错了什么,这会使我的验证准确度下降,而我的训练准确度上升?我需要多训练吗?有人能推荐其他东西来改进这个模型吗?我已经盯着它看了几天了。任何事都值得感激。谢谢

!spm_train --input=data/spanish_train,data/english_train --model_prefix=data/esen --character_coverage=1 --vocab_size=16000 --model_type=unigram

## 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

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

...

Tags: 数据srcyamldatamodeltrainsp句子
1条回答
网友
1楼 · 发布于 2024-06-06 17:16:24

my validation accuracy goes down the more I train while my training accuracy goes up.

这听起来像是过度装修

10万句话并不多。所以你所看到的是预期的。当验证集上的结果停止改善时,您可以停止培训

同样的基本动力也可以在更大的范围内发生,只需要更长的时间

如果您的目标是培养自己的相当好的模型,我会看到以下几种选择:

  1. 将大小增加到1M左右
  2. 从预先训练好的模型开始,进行微调
  3. 两者

对于1来说,至少有100万行英语:西班牙语,即使过滤掉最嘈杂的语言,你也可以从ModelFront获得

对于2,我知道埃里温的团队在WMT20上取得了胜利,从Fairseq模型开始,使用了大约300K的翻译。他们能够用相当有限的硬件做到这一点

相关问题 更多 >