验证显示巨大的波动。可能是什么原因?

数据挖掘 图像分类 美国有线电视新闻网 损失函数
2021-10-04 09:03:50

我正在为 3 类图像分类问题训练 CNN。我的训练损失平稳减少,这是预期的行为。但是,我的验证损失显示出很大的波动。

在此处输入图像描述

这是我应该担心的事情,还是应该只选择在我的性能指标(准确性)上得分最高的模型?

附加信息:我正在微调 Resnet-18 的最后一层,该层在 PyTorch 中的 ImageNet 数据上进行了预训练。我必须注意,我在训练阶段使用了加权损失函数,因为我的数据高度不平衡。然而,为了绘制损失,我使用未加权损失来比较验证损失和训练损失。如果不是训练数据集和验证数据集的分布有些不同(但是它们都高度不平衡),我会使用未加权损失。

2个回答

通过对您的情节的简单检查,我可以得出一些结论并列出要尝试的内容。(这是在不了解您的设置的情况下:训练参数和模型超参数)。

看起来损失正在减少(通过验证损失放置一条最佳拟合线)。看起来你可能可以训练更长时间来改善结果,因为曲线仍然向下。

首先,我将尝试回答您的标题问题:

验证损失波动的原因是什么?

我能想到三种可能:

  1. 正则化- 帮助平滑学习过程并使模型权重更加稳健。添加/增加您的正则化将防止引入对权重的大量更新。
  2. 批量大小- 它是否相对较小(例如 < 20?)。这意味着在网络末端测量的平均误差仅使用几个样本来计算。假设批量大小为 ,8那么在查看损失时,获得4/8正确与获得正确相比6/8具有较大的相对差异。对如此小批量的误差取平均值将导致损失曲线不太平滑。如果您有足够的 GPU 内存/RAM,请尝试增加批量大小。
  3. 学习率- 可能太大。这类似于关于正则化的第一点。为了更顺利地进行改进,您可能需要在接近损失最小值时放慢学习速度。6你可以让它按计划运行,每次验证损失没有改善时,例如时期,它就会减少一些因素(例如,将其乘以 0.5) 。这将阻止您迈出大步,然后可能会超过最小值并在它周围弹跳。

针对您的任务,我还建议您尝试解冻另一层,以增加微调的范围。根据您的数据,这将为 Resnet-18 提供更多的学习自由。

关于你的最后一个问题:

这是我应该担心的事情,还是应该只选择在我的性能指标(准确性)上得分最高的模型?

你应该担心吗?简而言之,没有。像你这样的验证损失曲线可以非常好并提供合理的结果;但是,在解决之前,我会尝试上面提到的一些步骤。

你应该只选择性能最好的模型吗?如果您的意思是将模型置于具有最佳验证损失(验证准确性)的位置,那么我会说要更加小心。在你上面的情节中,这可能相当于第 30 个时期左右,但我个人会采取一个训练得更多的点,曲线变得不那么不稳定。同样,在尝试了上述一些步骤之后。

我还建议您使用数据增强和过采样方法来补偿类的不平衡。这篇斯坦福论文解释了一些想法,您可以使用深度学习来实现图像分类中数据增强的有效性

我希望这有帮助!