【问题标题】:Overfitting training data but still improving on test data过度拟合训练数据,但仍在改进测试数据
【发布时间】:2019-11-07 17:04:01
【问题描述】:

我的机器学习模型严重过度拟合了训练数据,但在测试数据上仍然表现良好。当使用神经网络方法时,每次迭代都会略微提高测试集的准确度,但会更多地提高训练集的准确度(过拟合)。

将 spacy 与 CNN 架构一起使用时,问题得到了很好的证明,我得到了以下结果

ITER    LOSS      P       R       F      TF  
 0      29.305  0.733   0.342   0.466   0.525
 1      10.410  0.811   0.443   0.573   0.650
 2      4.361   0.722   0.548   0.623   0.757
 3      2.265   0.764   0.563   0.648   0.811
 4      1.449   0.748   0.613   0.674   0.877

TF 是训练数据上的 f1 分数。

测试分数不断提高,而与训练集的差异只是增加到在第 20 次迭代中模型在训练数据上的表现几乎完美的程度,而测试准确度从未降低以证明提前停止是合理的。

我尝试了许多正则化选项,包括不同的 dropout、权重衰减、L2,但似乎没有一个可以避免记住部分训练数据,并且在测试集上的表现都更差。

这个问题并不是 spacy 和我所遵循的方法所独有的,它也发生在 scikit 和参数较少的模型上。

手头的数据集是一个少于 2000 个示例的小数据集,是一个多标签文本分类任务。一些标签的样本少于 100 个,但在检查发生过拟合的位置时,所有标签似乎都受到同样的影响。

我想我的主要问题是,只要模型在测试数据上表现良好,我是否应该担心模型正在记忆训练数据集这一事实,以及是否还有其他我没有考虑过的事情来解决这个问题我看到的记忆问题。

【问题讨论】:

  • train_acc vs test_acctrain_loss vs test_loss 的图会很有用。无论如何,如果test_losstest_acc 不断改进,我认为这不是一个糟糕的过拟合问题。
  • 澄清一下,您在这里描述的内容肯定没有过拟合。
  • 你能详细说明一下吗?还有,你怎么称呼它?

标签: neural-network spacy bert-language-model


【解决方案1】:

为了澄清,您的损失函数始终是在训练集上计算的,因此在训练集上可能会发生过度拟合。要观察是否存在过度拟合,请使用 DEV 集(它不应该是训练集的一部分。)。在每个 epoch 结束时,分别计算训练集和开发集的损失。减少开发集上的损失函数显示了模型的良好拟合。同时,增加的损失揭示了过度拟合。 (此时您可以使用提前停止,但要有一定的耐心。但始终可以使用检查点来节省发挥最佳表现的权重)。并且收敛所需的 epoch 数取决于学习率,因此非常低的学习率可能需要很多 epoch 才能拟合模型。

【讨论】:

  • 你认为在 train vs dev 上观察准确率的结果会不同于比较 dev/train 上的损失函数。我的意思是我确实有一个开发集,我在其中计算 f1 并观察到过度拟合,因为我在训练集中的 f1 分数远高于开发集。
  • 训练集的F1分数高于开发集,这就是损失函数的目标。
  • 在你已经很好概括的情况下,你会期望这些分数是相同的,但我理解你的观点,在一定程度上,它有望在一定程度上改善训练,因为这就是损失函数正在优化。
  • 是的,你会期望它是一样的,这就是你会在验证损失开始增加时使用提前停止的原因。
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 2021-03-04
  • 2017-02-20
  • 2018-07-19
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多