首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(OpenNMT)西班牙语到英语模式改进

(OpenNMT)西班牙语到英语模式改进
EN

Stack Overflow用户
提问于 2021-05-01 00:09:32
回答 1查看 356关注 0票数 2

我目前正在尝试用yaml脚本训练西班牙语到英语的模型。我的数据集相当大,但仅仅对于初学者来说,我正在尝试获得一个10,000套培训集和1000-2000验证集,首先运行良好。然而,在尝试了几天之后,我想我需要帮助,因为我的验证精度越低,我训练的准确性就越高。

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

然后,我使用句子表来建立一个词汇模型。使用spm_train命令,我输入英语和西班牙语培训集,在参数中分隔逗号,并输出单个esen.model。此外,我选择使用unigram和16000的词汇表大小。

至于我的yaml配置文件:下面是我指定的

我的来源和目标培训数据(我为英语和西班牙语提取的10,000份在转换中带有“句子”的数据[])

我的源和目标验证数据(2,000份英文和西班牙文在转换中带有“句子”[])

我的声乐模型esen.model同时适用于Src和目标声乐模型。

编码器: rnn解码器: rnn类型: LSTM层:2 bidir: true

最佳:亚当学习率: 0.001

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

其他测井数据。

在使用onmt_translate开始训练时,我的训练精度从7.65开始,到5000步结束时达到70度以下。但是,在这段时间内,我的验证精度为24到19。

然后我用bleu来给我的测试集打分,它的BP值是0.67。

我注意到,在以1的速度尝试sgd之后,我的验证精度不断提高,但困惑开始在结束时再次出现。

我在想,我是否做错了什么,使我的验证准确性下降,而我的训练准确性上升?我只需要训练更多吗?有人能推荐其他什么来改进这种模式吗?我已经盯着它看了几天了。任何事情都是值得感激的。谢谢。

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

代码语言:javascript
复制
## 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

代码语言:javascript
复制
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

...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-01 18:25:36

我的验证精度越低,我训练的越多,而我的训练精度越高。

这听起来像是超值的

10K的句子不是很多。所以你所看到的都是意料之中的。当验证集上的结果停止改进时,您可以停止训练。

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

如果你的目标是培养你自己相当好的模型,我认为有几个选择:

fine-tune

  • both

  1. 的大小增加到1米左右,
  2. 从预先训练的模型开始

对于1,至少有100万行英语:西班牙语,你可以从ModelFront,即使过滤出最嘈杂的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67341777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档