我有一个四层的CNN,可以使用MRI数据预测对癌症的反应。我使用ReLU激活来引入非线性。列车精度和损耗分别单调增加和减少。但是,我的测试准确性开始出现剧烈波动。我尝试过更改学习率,减少层数。但是,这并不能阻止波动。我什至阅读了这个答案,并尝试按照该答案中的说明进行操作,但是再没有碰运气了。谁能帮我弄清楚我要去哪里错了?
我有一个四层的CNN,可以使用MRI数据预测对癌症的反应。我使用ReLU激活来引入非线性。列车精度和损耗分别单调增加和减少。但是,我的测试准确性开始出现剧烈波动。我尝试过更改学习率,减少层数。但是,这并不能阻止波动。我什至阅读了这个答案,并尝试按照该答案中的说明进行操作,但是再没有碰运气了。谁能帮我弄清楚我要去哪里错了?
Answers:
如果我正确理解精度的定义,则精度(正确分类的数据点的百分比)比MSE(均方误差)要小。这就是为什么您看到自己的数量loss
在迅速增加而准确性却在波动的原因。
从直觉上讲,这基本上意味着,示例的某些部分被随机分类,这会产生波动,因为正确的随机猜测的数量始终会波动(硬币应始终返回“正面”时的想象精度)。基本上对噪声敏感(当分类产生随机结果时)是过拟合的常见定义(请参阅维基百科):
在统计和机器学习中,最常见的任务之一是使“模型”适合一组训练数据,以便能够对一般未训练的数据做出可靠的预测。在过度拟合中,统计模型描述的是随机误差或噪声,而不是潜在的关系
过度拟合的另一个证据是您的损失在增加,损失的测量更加精确,如果没有被S形/阈值压榨(对您而言,这似乎是损失的情况),则对噪声预测更加敏感。凭直觉,您可以想象网络对输出过于确定(错误时)的情况,因此在随机分类错误的情况下,它给出的值与阈值相距甚远。
关于您的情况,您的模型未正确规范化,可能的原因是:
可能的解决方案:
这个问题很旧,但是尚未指出,因此请予以发布:
可能性1:您正在对训练集或验证集进行某种预处理(零含义,规范化等),而对另一个。
可能性2:如果您构建的某些层在训练过程中表现不同,并且从头开始推断,则模型可能未正确实现(例如,在训练过程中是否更新了用于批量归一化的移动平均值和移动标准偏差?推理?)。如果您的代码从头实现这些事情并且不使用Tensorflow / Pytorch的内置函数,则可能是这种情况。
可能性3:每个人都指出过拟合。我发现其他两种选择在您的特定情况下更可能出现,因为您的验证精度从纪元3开始就停留在50%。通常,我会更担心过度拟合是否会在以后发生(除非您遇到非常具体的问题)在眼前)。
您对二元分类问题的验证准确性(我假设)在50%左右“波动”,这意味着您的模型给出的是完全随机的预测(有时它会正确地猜出更少的样本,有时会猜到更少的样本)。通常,您的模型并不比掷硬币好。
无论如何,正如其他人已经指出的那样,您的模型正在经历严重的过度拟合。我的猜测是您的问题太复杂了,即从数据中提取所需的信息非常困难,而这种简单的经过端到端训练的4层conv-net没有学习的机会。
有几种方法可以尝试这种情况。首先,尝试增加批量大小,这有助于迷你批SGD减少不必要的游荡。其次,调整学习率,可能将其设置得较小。第三,尝试使用其他的优化器,例如Adam或RMSProp,它们可以针对wrt功能调整学习率。如果可能,请尝试扩充您的数据。最后,通过辍学逼近尝试贝叶斯神经网络,这是Yarin Gal的非常有趣的作品https://arxiv.org/abs/1506.02158