如何知道是不是发生了欠拟合或过拟合?

Posted

技术标签:

【中文标题】如何知道是不是发生了欠拟合或过拟合?【英文标题】:How to know if underfitting or overfitting is occuring?如何知道是否发生了欠拟合或过拟合? 【发布时间】:2019-01-31 06:01:09 【问题描述】:

我正在尝试使用两个类进行图像分类。我有 1000 张具有平衡类的图像。当我训练模型时,我得到较低的恒定验证准确度,但验证损失会减少。这是过拟合还是欠拟合的迹象?我还应该注意,我正在尝试使用新类和不同的数据集重新训练 Inception V3 模型。

Epoch 1/10
2/2 [==============================]2/2 [==============================] - 126s 63s/step - loss: 0.7212 - acc: 0.5312 - val_loss: 0.7981 - val_acc: 0.3889

Epoch 2/10
2/2 [==============================]2/2 [==============================] - 70s 35s/step - loss: 0.6681 - acc: 0.5959 - val_loss: 0.7751 - val_acc: 0.3889

Epoch 3/10
2/2 [==============================]2/2 [==============================] - 71s 35s/step - loss: 0.7313 - acc: 0.4165 - val_loss: 0.7535 - val_acc: 0.3889

Epoch 4/10
2/2 [==============================]2/2 [==============================] - 67s 34s/step - loss: 0.6254 - acc: 0.6603 - val_loss: 0.7459 - val_acc: 0.3889

Epoch 5/10
2/2 [==============================]2/2 [==============================] -  68s 34s/step - loss: 0.6717 - acc: 0.5959 - val_loss: 0.7359 - val_acc: 0.3889

Epoch 6/10
2/2 [==============================]2/2 [==============================] - 107s 53s/step - loss: 0.6633 - acc: 0.5938 - val_loss: 0.7259 - val_acc: 0.3889

Epoch 7/10
2/2 [==============================]2/2 [==============================] - 67s 33s/step - loss: 0.6674 - acc: 0.6411 - val_loss: 0.7160 - val_acc: 0.3889

Epoch 8/10
2/2 [==============================]2/2 [==============================] - 105s 53s/step - loss: 0.6296 - acc: 0.6562 - val_loss: 0.7099 - val_acc: 0.3889

Epoch 9/10
2/2 [==============================]2/2 [==============================] - 67s 34s/step - loss: 0.5717 - acc: 0.8273 - val_loss: 0.7064 - val_acc: 0.4444

Epoch 10/10
2/2 [==============================]2/2 [==============================] - 103s 52s/step - loss: 0.6276 - acc: 0.6875 - val_loss: 0.7035 - val_acc: 0.4444

【问题讨论】:

批量大小是多少?看来它已经被设置为非常高的价值了! 您在训练集上的准确度会急剧上升和下降。尝试降低学习率。 过拟合的特征是训练和验证损失(或准确性)之间的差异;您在此处报告的内容(“恒定验证准确度较低,但验证损失减少”)与此无关,它本身并不奇怪 - 请参阅 Loss & accuracy - Are these reasonable learning curves? 了解详细原因。 【参考方案1】:

什么是过拟合

当模型对训练数据过于具体(或不够具体)并且不能很好地推断到真实领域时,就会发生过度拟合(或欠拟合)。从现在开始我只会说过度拟合以拯救我打字不好的手指 [*]

我觉得wikipedia的图片不错:

很明显,绿线 decision boundary 试图将红色类与蓝色类分开,是“过拟合”,因为虽然它在训练数据上表现良好,但它缺少我们喜欢的“regularized”形式看看什么时候generalizing [**]。

These CMU slides on overfitting/cross validation也把问题说清楚了:

And here's some more intuition for good measure


一般什么时候会出现过拟合?

当测试误差不反映训练误差时,会在数值上观察到过度拟合

显然,测试误差总是(在预期中)比训练误差差,但在一定数量的迭代中,测试损失将开始增加,即使训练损失继续下降。


如何在视觉上判断模型何时过度拟合?

可以通过绘制决策边界来观察过度拟合(如 上面的***图片)当维度允许时,或者通过查看 在拟合过程中除了训练损失之外的测试损失

您没有给我们足够的分数来制作这些图表,但这里有一个示例 (from someone asking a similar question) 显示了这些损失图表的样子:

虽然损失曲线有时更漂亮和对数,但请注意这里的趋势是训练误差仍在下降,但测试误差在上升。这是过度拟合的一个大危险信号。 SO discusses loss curves here

稍微干净和更真实的例子来自this CMU lecture on ovefitting ANN's:

上面的图和以前一样是过拟合的。下图不是。


什么时候发生?

当模型的参数过多时,它很容易过度拟合(例如 n 次多项式到 n-1 个点)。同样,参数不足的模型也可能欠拟合。

Certain regularization techniques 喜欢 dropout 或批量归一化,或者传统上的 l-1 正则化与此作斗争。我相信这超出了您的问题范围。

延伸阅读:

    A good statistics-SO question and answers Dense reading: bounds on overfitting with some models Lighter reading: general overview The related bias-variance tradeoff

脚注

[*] 没有理由继续写“过拟合/欠拟合”,因为两者的推理是相同的,但指标显然是颠倒的(决策边界没有充分锁定到真实边界,如反对过于紧密地包裹在各个点上)。一般来说,过拟合更容易避免,因为“更多迭代/更多参数”是当前的主题。如果你有很多数据而不是很多参数,也许你真的担心拟合不足,但我对此表示怀疑。

[**] 将***第一张图片中黑线比绿线更可取的想法形式化的一种方法是在模型选择期间由您的模型penalize the number of parameters required

【讨论】:

非常感谢,帮了大忙!

以上是关于如何知道是不是发生了欠拟合或过拟合?的主要内容,如果未能解决你的问题,请参考以下文章

过拟合及其解决方式

判断模型是不是过拟合、欠拟合、数据问题?

过拟合与对策

如何诊断长短期记忆网络模型的过拟合和欠拟合?

模型评估之过拟合和欠拟合

我如何从均方根误差中理解我的模型过拟合或欠拟合?