多输出深度学习的早期停止

数据挖掘 深度学习 分类 喀拉斯 多类分类
2021-09-16 13:04:10

当使用具有多个输出的神经网络时,通常建议什么作为尽早停止训练过程的最佳策略?

鉴于我目前正在监控净验证损失(来自 n 个不同输出神经元的验证损失加在一起),并且已经注意到我的训练在收敛之前的一个或多个损失之前提前停止,我很好奇什么是最佳实践这种情况。

  • 是否应该监控净验证损失,或​​者是否有任何方法可以实现提前停止,以便监控 n 个输出中的 m 个(m 从 1 到 n)输出的验证损失,并且在某个范围内的所有/振荡收敛时停止训练临界点。
  • 如何在避免过度训练某些输出节点同时防止其他节点训练不足的情况下实现这一点?

我是这个领域的新手,如果你还没有猜到,如果这个问题没有很好地放在一起,请多多包涵!

2个回答

如何在避免过度训练某些输出节点同时防止其他节点训练不足的情况下实现这一点?

这不是通过提前停止来完成的。还有其他一些技术可以防止在您的模型中训练某些主要节点,例如Dropout通过使用 Dropout,您的模型不能依赖某些主节点,因为它们可能随时关闭。因此,使用 Dropout,模型应该学会平衡整个节点的权重。

是否应该监控净验证损失,或​​者有什么方法可以实现提前停止,以便监控 n 中的 m 个(m 从 1 到 n)输出的验证损失,并且在某个范围内的所有/振荡收敛时停止训练临界点。

您注意到n在您的情况下是指输出节点的数量。通常,这是分类器中的类数,主要用 表示c因此,在多类分类中,您不会有c不同的验证损失,而是将它们平均以获得整个模型的一个平均验证损失。

一个人将如何实现...

如何实施早停没有金科玉律。最简单的方法如下:

  • 设置一个所谓的patienceie,如果损失没有改善,我们会在多少个 epoch 之后停止(通常设置为 10)
  • 在每个时期检查您的验证损失
  • 然后在你停止之前选择模型patience时期,因为那是表现最好的模型。

您会发现这不是最好的方法,可能会有更好的方法。本文中,提出了其中的一些建议。

...训练在某个阈值内停止所有/振荡

可能是另一个想法,必须检查。不过我不推荐它,因为在使用SGD时,你仍然会在一开始就出现波动。

我知道这是一个已有 4 年历史的问题,但无论如何。
如果您使用的是 Keras loss_weights=,则模型编译方法中会调用一个参数。因此,如果您有 output_1 和 output_2 并且 output_1 首先收敛,您可以尝试loss_weights=[0.2, 0.8]. IIRC Keras 中的默认损失是输出损失的总和,而不是平均损失,所以在这里我还对损失进行了归一化处理,因此它在具有可变输出数量的模型之间具有可比性(例如,如果你想使用标准值作为学习率但是这些适用于具有单输出的模型,并且您有一百个输出)。