为什么过拟合不会破坏 MNIST 分类的神经网络?

数据挖掘 机器学习 神经网络 分类 过拟合
2021-10-06 10:53:32

我有一个用于 MNIST 分类的简单神经网络(NN)。它包括 2 个隐藏层,每个隐藏层有 500 个神经元。因此,NN 的尺寸为:784-500-500-10。ReLU用于所有神经元,softmax用于输出,交叉熵是损失函数。

令我困惑的是,为什么过度拟合似乎不会破坏神经网络?

考虑 NN 的参数(权重)数量。大约是

784×500+500×500+500×10=647000。
但是,在我的实验中,我只使用了6000示例(MNIST 训练集的十分之一)来训练 NN。(这只是为了缩短运行时间。如果我使用更多的训练示例,训练和测试误差都会大大降低。)我重复了这个实验 10 次。使用普通随机梯度下降(无 RMS 道具或动量);没有使用正则化/退出/提前停止。报告的训练错误和测试错误为:

不。12345678910r一个一世n(%)7.810.39.111.08.79.29.38.310.38.6es(%)11.713.913.214.112.113.213.311.913.412.7

请注意,在所有 10 个实验中(每个实验都具有独立的随机参数初始化),测试误差与训练误差仅相差大约。4%,即使我使用 6K 示例来训练 647K 参数。神经网络的 VC 维数为(||lG(||))至少,在哪里||是边数(权重)。那么为什么测试错误没有比训练错误高得多(例如 30% 或 50%)呢?如果有人能指出我错过的地方,我将不胜感激。非常感谢!

[ 编辑 2017/6/30]

为了阐明提前停止的影响,我再次进行了 10 个实验,现在每个实验都有 20 个 epoch 的训练。错误率如下图所示:

在此处输入图像描述

随着训练中使用更多的时期,测试和训练误差之间的差距确实增加了。然而,在训练误差被驱动为零后,测试误差的尾部几乎保持平坦。此外,我看到其他大小的训练集也有类似的趋势。20 个训练周期结束时的平均错误率与训练集的大小对比如下:

在此处输入图像描述

所以确实会发生过拟合,但它似乎并没有破坏神经网络。考虑到我们需要训练的参数数量(647K)和我们拥有的训练样本数量(<60K),问题仍然存在:为什么过拟合不容易使 NN 变得无用?此外,对于所有具有 softmax 输出和交叉熵目标函数的分类任务,ReLU NN 是否如此?有人见过反例吗?

2个回答

我已经使用 Keras 复制了您的结果,并且得到了非常相似的数字,所以我认为您没有做错任何事情。

出于兴趣,我跑了很多次,看看会发生什么。测试和训练结果的准确性保持相当稳定。然而,随着时间的推移,损失值的差距越来越大。大约 10 个 epoch 后,我得到了 100% 的训练准确率和 94.3% 的测试准确率——损失值分别在 0.01 和 0.22 左右。在 20,000 个 epoch 之后,准确率几乎没有变化,但我的训练损失为 0.000005,测试损失为 0.36。损失也仍在分化,尽管速度非常缓慢。在我看来,网络显然是过度拟合的。

所以这个问题可以重新表述:为什么尽管过度拟合,训练到 MNIST 数据集的神经网络在准确性方面仍然可以很好地概括?

值得将这 94.3% 的准确率与使用更简单的方法可能实现的准确率进行比较。

例如,一个简单的线性 softmax 回归(本质上是相同的没有隐藏层的神经网络),提供了 95.1% 训练和 90.7% 测试的快速稳定准确度。这表明许多数据是线性分离的——您可以在 784 维中绘制超平面,并且 90% 的数字图像将位于正确的“盒子”内,无需进一步细化。由此,您可能期望过拟合非线性解决方案得到比 90% 更差的结果,但可能不会比 80% 更差,因为直观地形成了一个过于复杂的边界,例如在“3”框内找到的“5”只会错误地分配少量这种天真的 3 流形。但我们比线性模型的 80% 下限猜测要好。

另一种可能的朴素模型是模板匹配或最近邻。这是一个合理的类比,过度拟合正在做什么——它在每个训练示例附近创建一个局部区域,它将预测相同的类别。过度拟合的问题发生在中间的空间中,激活值将遵循网络“自然”所做的任何事情。请注意最坏的情况,以及您在解释图中经常看到的情况,将是一些高度弯曲的几乎混沌的表面,它穿过其他分类。但实际上,神经网络在点之间更平滑地插值可能更自然——它实际上所做的取决于网络组合成近似值的高阶曲线的性质,以及这些曲线与数据的拟合程度。

我从这个关于 MNIST with K Nearest Neighbors 的博客中借用了 KNN 解决方案的代码使用 k=1 - 即仅通过匹配像素值从 6000 个训练示例中选择最接近的标签,可提供 91% 的准确度。考虑到 k=1 的 KNN 所做的像素匹配计数的简单性,过度训练的神经网络实现的 3% 额外效果似乎并不那么令人印象深刻。

我尝试了一些网络架构的变体、不同的激活函数、不同的层数和大小——没有一个使用正则化。但是,对于 6000 个训练示例,我无法让它们中的任何一个过度拟合,从而导致测试准确度急剧下降。即使将训练样本减少到 600 个,也只会降低平台期,准确率约为 86%。

我的基本结论是,MNIST 示例在特征空间中的类之间具有相对平滑的转换,并且神经网络可以适应这些并以“自然”方式在类之间进行插值,给定用于函数逼近的 NN 构建块 - 无需添加高频分量在过拟合情况下可能导致问题的近似值。

尝试使用“嘈杂的 MNIST”集可能是一个有趣的实验,其中在训练和测试示例中都添加了一定量的随机噪声或失真。预计正则化模型在该数据集上表现良好,但在这种情况下,过度拟合可能会导致更明显的准确性问题。


这是在更新之前由 OP 进行的进一步测试。

从您的评论中,您说您的测试结果都是在运行一个时期后获得的。尽管您没有写过,但您实际上已经使用了提前停止,因为您已经根据您的训练数据尽早停止了训练。

如果您想了解网络是如何真正融合的,我建议您运行更多的 epoch。从 10 个 epoch 开始,考虑增加到 100 个。对于这个问题,一个 epoch 并不多,尤其是在 6000 个样本上。

尽管不能保证增加迭代次数会使您的网络过度拟合比现有情况更糟,但您并没有真正给它太多机会,而且到目前为止您的实验结果还没有定论。

事实上,我有一半希望您的测试数据结果在第二个、第三个 epoch 之后有所改善,然后随着 epoch 数量的增加开始偏离训练指标。随着网络趋于收敛,我还希望您的训练误差接近 0%。

一般来说,人们认为过拟合是模型复杂度的函数。这很好,因为模型复杂性是您可以控制的事情之一。实际上,还有许多其他因素与过度拟合问题有关: - 训练样本的数量 - 迭代次数 - 输入的维度(在你的情况下,我相信这就是你没有过度拟合的原因) -问题难度:如果你有简单的问题,线性可分的,那么你不必太担心过度拟合。

google tensorflow 提供了一个可视化演示,可让您更改所有这些参数。 http://playground.tensorflow.org 您可以更改输入问题、样本数量、输入维度、网络、迭代次数。

我喜欢将过度拟合视为过度拟合 = 大型模型 + 不相关的特征