培训损失减少而开发人员损失增加

时间:2018-07-06 14:37:51

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

我正在观察一层CNN二进制分类模型中的以下模式:

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

根据过去的SO问题和文献综述,这些模式似乎表明过度拟合(该模型在训练中表现良好,但不能推广到新的例子)。

以下图形说明了训练中步数的损失和准确性。

两者都

  • 橙色行代表开发集性能的摘要。
  • 蓝色行代表训练集表现的摘要。

损失: Loss

精度: enter image description here

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

  • 添加L2正则化:我尝试了许多L2正则化系数-从0.0到4.5;所有这些测试在损失和准确度上都达到了第5,000步。
  • 交叉验证:似乎交叉验证的作用在网上被广泛误解了。根据{{​​3}}的回答,交叉验证是用于模型检查,而不是模型构建。确实,交叉验证将是一种检查模型是否泛化的方法。实际上,我显示的图表是4倍交叉验证的1倍。如果我在所有方面都观察到相似的损失/准确性模式,那么除了确认模型不能很好地泛化之外,交叉验证还能提供什么其他见解?
  • 尽早停止:这似乎是最直观的,但是损失图似乎表明损失仅在观察到开发集损失发生分歧后才趋于平稳;因此,似乎很难决定这个提前停止的起点。
  • 数据:我可用的标签数据数量有限,因此目前无法选择更多数据。

所有这些,我要问的是:

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

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

1 个答案:

答案 0 :(得分:3)

我认为您完全正确。看起来像经典的过拟合。

一个选择是添加辍学(如果您还没有的话)。它属于正则化类别,但现在比L1和L2正则化更常用。

更改模型架构可能会获得更好的结果,但是很难说具体是什么。它可能有助于通过增加更多的层(可能还有一些合并层)来使其更深。它可能仍会过拟合,但在此之前您可能会获得更高的开发集准确性。

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

您最终可能希望尝试设置超参数优化搜索。但是,这在神经网络上可能要花费一些时间,而神经网络需要花费一些时间进行训练。确保在进行超参数调整之前删除测试集。