如何正确使用提前停止来训练深度神经网络?

机器算法验证 神经网络 深度学习
2022-02-04 03:50:26

我有一个深度神经网络模型,我需要在包含大约 100,000 个示例的数据集上对其进行训练,我的验证数据包含大约 1000 个示例。因为训练每个示例需要时间(每个示例大约 0.5 秒)并且为了避免过度拟合,我想应用提前停止来防止不必要的计算。但我不确定如何通过提前停止正确训练我的神经网络,有几件事我现在不太了解:

  • 什么是好的验证频率?我应该在每个时期结束时检查我的模型验证数据吗?(我的批量大小是 1)

  • 在开始收敛到更好的价值之前,前几个时期可能会产生更差的结果吗?在这种情况下,我们是否应该在检查提前停止之前训练我们的网络几个 epoch?

  • 验证损失可能会上下波动的情况如何处理?在那种情况下,提前停止可能会阻止我的模型进一步学习,对吧?

先感谢您。

3个回答

什么是好的验证频率?我应该在每个时期结束时检查我的模型验证数据吗?(我的批量大小是 1)

没有黄金法则,在每个 epoch 之后计算验证错误是很常见的。由于您的验证集比您的训练集小得多,因此它不会大大减慢训练速度。

在开始收敛到更好的价值之前,前几个时期可能会产生更差的结果吗?

是的

在这种情况下,我们是否应该在检查提前停止之前训练我们的网络几个 epoch?

你可以,但问题是你应该跳过多少个时期。所以在实践中,大多数时候人们不会跳过任何纪元。

验证损失可能会上下波动的情况如何处理?在那种情况下,提前停止可能会阻止我的模型进一步学习,对吧?

人们通常定义一个耐心,即如果验证集没有进展,则在提前停止之前等待的 epoch 数。耐心通常设置在 10 到 100 之间(10 或 20 更常见),但这实际上取决于您的数据集和网络。

耐心 = 10 的示例:

在此处输入图像描述

我最近看到了一篇题为“早期停止——但是什么时候?”的论文。Lutz Prechelt 有很多很好的例子来说明如何使用提前停止,并清楚地解释了它们的作用和公式。

希望看看这可能会有所帮助。

要添加其他出色的答案,您还可以 - 不要停止。我通常:

  • 运行 NN 的时间要长得多,我认为这是明智的,
  • 每 N 个 epoch 保存模型权重,并且
  • 当我看到训练损失已经稳定时,我只选择验证损失最低的模型。

当然,只有当您不按分钟付费(或成本足够小)并且您可以手动停止训练时,这才有意义。好处是事后确定最低验证错误要容易得多。