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

如何解决(OpenNMT) 西班牙语到英语模型改进

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

我的数据来自 ModelFront 的 ES-EN 冠状病毒评论数据集,此处https://console.modelfront.com/#/evaluations/5e86e34597c1790017d4050a。我发现平行句子非常准确。我使用数据集中的前 10,000 条平行线,跳过包含任何数字的句子。然后我将接下来的 1000 或 2000 作为我的验证集,接下来的 1000 作为我的测试集,只包含没有数字的句子。查看数据,看起来很干净,句子在各自的行中相互排列。

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

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

我的源和目标训练数据(我为英语和西班牙语提取的 10,000 个,在转换中使用“句子”[])

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

我的 Src 和目标词汇模型的词汇模型 esen.model

编码器:rnn 解码器:rn 类型:LSTM 层数:2 比迪尔:真实

优化:亚当 学习率: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

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

...

解决方法

我训练的越多,我的验证准确度就会下降,而我的训练准确度却上升了。

听起来像过度拟合

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

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

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

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

对于 1,即使过滤掉最嘈杂的内容,您也可以从 ModelFront 获得至少 100 万行英语:西班牙语。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?