我已经使用 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%。