验证准确性为何会波动?


31

我有一个四层的CNN,可以使用MRI数据预测对癌症的反应。我使用ReLU激活来引入非线性。列车精度和损耗分别单调增加和减少。但是,我的测试准确性开始出现剧烈波动。我尝试过更改学习率,减少层数。但是,这并不能阻止波动。我什至阅读了这个答案,并尝试按照该答案中的说明进行操作,但是再没有碰运气了。谁能帮我弄清楚我要去哪里错了?

屏幕截图



是的,我读了这个答案。拖延验证数据没有帮助
Raghuram'1

4
因为您尚未共享代码段,所以我不能说太多您的体系结构中的问题。但是,在屏幕截图中,看到了您的训练和验证准确性,很明显您的网络过于适合。如果您在此处共享代码段,那就更好了。
Nain

你有几个样本?也许波动不是很明显。此外,准确性是可怕的衡量标准
rep_ho

验证准确度波动时,有人可以帮助我验证使用集成方法是否很好?因为我能够通过合奏来管理波动的validation_accuracy,从而获得不错的价值。
Sri2110

Answers:


27

如果我正确理解精度的定义,则精度(正确分类的数据点的百分比)比MSE(均方误差)要小。这就是为什么您看到自己的数量loss在迅速增加而准确性却在波动的原因。

从直觉上讲,这基本上意味着,示例的某些部分被随机分类,这会产生波动,因为正确的随机猜测的数量始终会波动(硬币应始终返回“正面”时的想象精度)。基本上对噪声敏感(当分类产生随机结果时)是过拟合的常见定义(请参阅维基百科):

在统计和机器学习中,最常见的任务之一是使“模型”适合一组训练数据,以便能够对一般未训练的数据做出可靠的预测。在过度拟合中,统计模型描述的是随机误差或噪声,而不是潜在的关系

过度拟合的另一个证据是您的损失在增加,损失的测量更加精确,如果没有被S形/阈值压榨(对您而言,这似乎是损失的情况),则对噪声预测更加敏感。凭直觉,您可以想象网络对输出过于确定(错误时)的情况,因此在随机分类错误的情况下,它给出的值与阈值相距甚远。

关于您的情况,您的模型未正确规范化,可能的原因是:

  • 数据点不足,容量过多
  • 订购
  • 否/错误的特征缩放/归一化
  • ααα

可能的解决方案:

  • 获取更多数据点(或人为地扩展现有数据点集)
  • 使用超参数(例如,增加/减少容量或正则项)
  • 正则化:尝试辍学,尽早停止等

关于:“损耗的测量更加精确,它对噪声预测更为敏感,因为它不会被S形/阈值所压缩”,我同意没有阈值设置,但是如果您使用二进制交叉熵作为损失函数,则S形仍会起作用角色。
朱巴卜

1
关于学习率和sgd缺少最小值:达到最小值很可能意味着过度拟合(因为这是训练集的最小值)
Jan Kukacka

@Berkmeister是的,我改了一下(见编辑)。我的想法是,损耗增加是使用功能未压缩的迹象。
dk14 '18

@JanKukacka您的意思是全球最小值?我隐含了局部最小值(实际上接近局部最小值),这意味着如果该最小值与任何最小值都相距太远,则可能会不合适。可能,我应该更仔细地描述它(请参见编辑),谢谢。
dk14 '18

@ dk14我假设实际上无法达到全局最小值,所以我的意思是局部最小值。如果距离太远,则可能拟合不足,但如果距离太近,则很有可能拟合过度。莫里茨·哈特(Moritz Hardt)有一篇有趣的著作,“训练得更快,推广得更好:随机梯度下降的稳定性”(arxiv.org/abs/1509.01240)限制了使用SGD进行训练时训练与测试误差之间的关系。
Jan Kukacka '18

6

这个问题很旧,但是尚未指出,因此请予以发布:

可能性1:您正在对训练集或验证集进行某种预处理(零含义,规范化等),而对另一个

可能性2:如果您构建的某些层在训练过程中表现不同,并且从头开始推断,则模型可能未正确实现(例如,在训练过程中是否更新了用于批量归一化的移动平均值和移动标准偏差?推理?)。如果您的代码从头实现这些事情并且不使用Tensorflow / Pytorch的内置函数,则可能是这种情况。

可能性3:每个人都指出过拟合。我发现其他两种选择在您的特定情况下更可能出现,因为您的验证精度从纪元3开始就停留在50%。通常,我会更担心过度拟合是否会在以后发生(除非您遇到非常具体的问题)在眼前)。


我遇到的问题有点相似,但还不完全,这里有更多详细信息:stackoverflow.com/questions/55348052/… 就我而言,我确实对测试数据和培训期间的一致性确实保持了较高的准确性,“验证准确性” ”(不丢失)高于训练精度。但是,它从来不会收敛和振荡,这一事实使我想到了过度拟合,而有些人则认为情况并非如此,因此我想知道它是否成立,如果不成立,则有何道理。
dusa

1
到目前为止,这是给出答案的最合理的解释。注意,高批次归一化动量(例如0.999,甚至Keras默认0.99)与高学习率相结合,在训练和评估中也会产生非常不同的行为,因为层统计量远远落后。在那种情况下,将动量降低到0.9左右应该可以解决问题。我遇到了与OP类似的问题,这可以解决问题。
克里斯蒂安

5

通过@ dk14添加到答案。如果您仍然看到波动在正确调整模型,则可能是以下原因:

  • 在验证集中使用随机样本:这意味着每个评估步骤的验证集都不同,验证损失也是如此。
  • 使用加权损失函数(在高度不平衡的类问题中使用)。在训练步骤中,您基于类权重对损失函数进行加权,而在开发步骤中,您仅计算未加权损失。在这种情况下,尽管您的网络正在逐步趋同,但是在每个训练步骤之后,您可能会看到验证损失方面的许多波动。但是如果您等待更大的景象,您会发现您的网络实际上正在收敛到最小值,并且波动已经逐渐耗尽(有关示例,请参见所附图像)。在此处输入图片说明在此处输入图片说明

2

绝对过拟合。训练数据和测试数据的准确性之间的差距表明您已经过度适应训练。正规化可能会有所帮助。


1

您对二元分类问题的验证准确性(我假设)在50%左右“波动”,这意味着您的模型给出的是完全随机的预测(有时它会正确地猜出更少的样本,有时会猜到更少的样本)。通常,您的模型并不比掷硬币好。

{0;1}

无论如何,正如其他人已经指出的那样,您的模型正在经历严重的过度拟合。我的猜测是您的问题太复杂了,即从数据中提取所需的信息非常困难,而这种简单的经过端到端训练的4层conv-net没有学习的机会


0

有几种方法可以尝试这种情况。首先,尝试增加批量大小,这有助于迷你批SGD减少不必要的游荡。其次,调整学习率,可能将其设置得较小。第三,尝试使用其他的优化器,例如Adam或RMSProp,它们可以针对wrt功能调整学习率。如果可能,请尝试扩充您的数据。最后,通过辍学逼近尝试贝叶斯神经网络,这是Yarin Gal的非常有趣的作品https://arxiv.org/abs/1506.02158


0

您是否尝试过较小的网络?考虑到您的训练准确性可以达到> .99,您的网络似乎有足够的连接来完全建模数据,但是您可能有多余的连接在随机学习(即过度拟合)。

以我的经验,通过尝试使用各种网络(例如ResNet,VGG甚至更简单的网络),我已经获得了保持验证的准确性,可以在较小的网络上稳定下来。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.