在训练CNN模型时,是否有可能在每个epoch中损失和准确率都在下降?我在训练时得到了下面的结果。
有人能解释一下为什么会发生这种情况的可能原因吗?
回答:
至少有5个原因可能会导致这种行为:
-
异常值:假设你有10张完全相同的图片,其中9张属于类别A,1张属于类别B。在这种情况下,模型会开始为这个例子分配高概率的类别A,因为大多数例子都是如此。但是,来自异常值的信号可能会使模型不稳定,从而导致准确率下降。理论上,模型应该稳定在为类别A分配90%的得分,但这可能需要很多个epoch。
解决方案:为了处理这样的例子,我建议你使用梯度裁剪(你可以在优化器中添加这样的选项)。如果你想检查这种现象是否发生,你可以查看你的损失分布(训练集中各个例子的损失)并寻找异常值。
-
偏差:现在假设你有10张完全相同的图片,但其中5张被分配到类别A,5张被分配到类别B。在这种情况下,模型会尝试在这两个类别上分配大约50%-50%的分布。现在,你的模型在这里最多能达到50%的准确率——从两个有效类别中选择一个。
解决方案:尝试增加模型的容量——通常你有一组非常相似的图片——增加表达能力可能有助于区分相似的例子。不过要注意过拟合。另一种解决方案是尝试在你的训练中使用这种策略。如果你想检查这种现象是否发生,请查看各个例子的损失分布。如果分布偏向较高值,那么你可能正遭受偏差的影响。
-
类别不平衡:现在假设你的90%图片属于类别A。在训练的早期阶段,你的模型主要集中在将这个类别分配给几乎所有例子。这可能会使个别损失达到非常高的值,并通过使预测分布更加不稳定来使你的模型不稳定。
解决方案:再次使用梯度裁剪。第二件事——耐心,尝试简单地让你的模型运行更多epoch。模型应该在训练的后期阶段学习到更细微的差别。当然——尝试类别平衡——通过分配
sample_weights
或class_weights
。如果你想检查这种现象是否发生,请查看你的类别分布。 -
过强的正则化:如果你设置的正则化过于严格——训练过程主要集中在使你的权重具有较小的范数,而不是实际学习有趣的见解。
解决方案:添加
categorical_crossentropy
作为指标,并观察它是否也在下降。如果没有——那么这意味着你的正则化过于严格——尝试减少权重惩罚。 -
模型设计不当——这种行为可能是由错误的模型设计引起的。有几种好的做法可以应用以改进你的模型:
批量归一化——通过这种技术,你可以防止模型的内部网络激活发生剧烈变化。这使得训练更加稳定和高效。对于小批量大小,这也可能是正则化模型的有效方法。
梯度裁剪——这使得模型训练更加稳定和高效。
减少瓶颈效应——阅读这篇精彩的论文,并检查你的模型是否可能遭受瓶颈问题的影响。
添加辅助分类器——如果你从头开始训练你的网络,这应该会使你的特征更加有意义,并使你的训练更快、更有效。