我应该使用损失或准确性作为提前停止指标吗?

Posted

技术标签:

【中文标题】我应该使用损失或准确性作为提前停止指标吗?【英文标题】:Should I use loss or accuracy as the early stopping metric? 【发布时间】:2016-09-05 14:45:51 【问题描述】:

我正在学习和试验神经网络,希望得到更有经验的人对以下问题的意见:

当我在 Keras 中训练自动编码器('mean_squared_error' 损失函数和 SGD 优化器)时,验证损失逐渐下降。并且验证准确性正在上升。到目前为止一切顺利。

然而,一段时间后,损失不断减少,但准确率突然回落到低得多的低水平。

准确度上升非常快并保持高位突然回落是“正常”行为还是预期行为? 即使验证损失仍在减少,我是否应该以最大准确度停止训练?换句话说,使用 val_acc 或 val_loss 作为指标来监控提前停止?

查看图片:

损失:(绿色 = val,蓝色 = train]

准确度:(绿色 = val,蓝色 = train]

更新: 下面的 cmets 为我指明了正确的方向,我想我现在更好地理解了。如果有人能确认以下内容是正确的,那就太好了:

准确度指标衡量 y_pred==Y_true 的百分比,因此仅对分类有意义。

我的数据是真实和二元特征的组合。准确率图上升非常陡峭然后回落,而损失继续下降的原因是因为在 epoch 5000 左右,网络可能正确预测了 +/- 50% 的二进制特征。当训练继续时,在 epoch 12000 左右,对真实和二元特征的预测一起得到改善,因此损失减少,但单独对二元特征的预测不太正确。因此准确率下降,而损失减少。

【问题讨论】:

您是否使用 MSE 进行分类任务? 这是一个有趣的情节。虽然我没有使用自动编码器的经验,但我想知道这是否只是过度拟合的一些极端情况。您是否尝试过降低网络复杂性(更小或更多规范化)(也许还检查增加的验证子集?)我可以想象,它看起来会有所不同。 @MarcinMożejko:我使用的是 mse,但它是自动编码器,而不是分类。 取决于计算的损失(不知道它们是否始终相同;MSE 与准确度听起来不同)。并且在监管方面也存在差异(我认为验证会停用 dropout 和 l1/l2 regs)。如果计算量不太大,我会尝试这些更改。一般来说:你可以在调试类似的东西时使用更小的数据集。 我也认为,这个情节看起来很奇怪(向上、稳定、向下;相当对称;但我不是专家)。但是训练损失减少(甚至单调)和验证损失增加的一般观察并没有什么特别的。每个太大的神经网络最终都会这样做(它记住了样本)。 【参考方案1】:

如果预测是实时的或数据是连续的而不是离散的,则使用 MSE(均方误差),因为这些值是实时的。

但在离散值(即分类或聚类)的情况下,使用准确度,因为给定的值要么仅为 0,要么仅为 1。所以,这里不适用MSE的概念,而是使用accuracy= no of error values/total values * 100。

【讨论】:

以上是关于我应该使用损失或准确性作为提前停止指标吗?的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost:在默认指标上提前停止,而不是自定义评估函数

如何同时使用交叉验证和提前停止?

LightGBM 错误:ValueError:对于提前停止,评估需要至少一个数据集和评估指标

满足复杂条件时提前停止 ray.tune 实验?

使用提前停止 - gridsearchcv - kerasregressor

我的验证损失为1.86,我应该如何减少它?