【问题标题】:training loss decreases while dev loss increases训练损失减少,而开发损失增加
【发布时间】:2018-12-15 04:50:58
【问题描述】:

我在单层 CNN、二元分类模型中观察到以下模式:

  1. 随着步数的增加,训练损失减少,而开发损失增加
  2. 训练精度会随着步数的增加而提高,而开发精度会随着步数的增加而降低

根据过去的 SO 问题和文献回顾,这些模式似乎表明过度拟合(模型在训练中表现良好,但无法推广到新示例)。

下图说明了与训练步数有关的损失和准确率。

在两者中,

  • 橙色线表示开发集性能的总结。
  • 蓝色线表示训练集性能的总结。

损失:

准确度:

我考虑过的传统疗法,以及我对它们的观察:

  • 添加 L2 正则化:我尝试了许多 L2 正则化系数——从 0.0 到 4.5;在第 5000 步时,所有这些测试在损失和准确率方面都产生了相似的模式。
  • 交叉验证 :交叉验证的作用似乎在网上被广泛误解。正如this 回答所述,交叉验证是用于模型检查,而不是模型构建。事实上,交叉验证将是一种检查模型是否泛化良好的方法。实际上,我展示的图表来自 4 折交叉验证中的一个。如果我在所有折叠中观察到类似的损失/准确性模式,那么除了确认模型不能很好地泛化之外,交叉验证还能提供什么其他见解?
  • 提前停止:这似乎是最直观的,但损失图似乎表明只有在观察到开发集损失的分歧后损失才会趋于平稳;那么,这个早停的起点似乎并不容易决定。
  • 数据:我可用的标记数据量是有限的,因此目前无法针对更多数据进行训练。

说了这么多,我要问的是:

  1. 如果在损失和准确率中观察到的模式确实表明过度拟合,是否还有其他方法可以抵消我没有考虑过的过度拟合?
  2. 如果这些模式不表示过度拟合,它们还意味着什么?

谢谢 - 任何见解将不胜感激。

【问题讨论】:

    标签: python tensorflow machine-learning neural-network deep-learning


    【解决方案1】:

    我认为你完全在正确的轨道上。看起来像经典的过拟合。

    如果您还没有 dropout,一个选项是添加 dropout。它属于正则化的范畴,但现在比 L1 和 L2 正则化更常用。

    更改模型架构可以获得更好的结果,但很难说具体什么是最好的。它可能有助于通过更多层和可能的一些池化层使其更深。它可能仍然会过拟合,但在此之前您可能会在开发集上获得更高的准确度。

    获取更多数据可能是您能做的最好的事情之一。如果您无法获得更多数据,您可以尝试扩充数据。您还可以尝试清理数据以消除噪声,这有助于防止模型拟合噪声。

    您最终可能想尝试设置超参数优化搜索。然而,这在需要一段时间训练的神经网络上可能需要一段时间。确保在超参数调优之前移除测试集。

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 2021-04-13
      • 2022-09-25
      • 2019-08-18
      • 1970-01-01
      • 2020-08-17
      • 2021-11-07
      • 2018-01-08
      • 1970-01-01
      相关资源
      最近更新 更多