为什么 MNIST 任务的随机梯度下降比批量 GD 差这么多?

数据挖掘 神经网络 张量流 梯度下降
2021-10-07 10:18:52

这里是来自 Tensorflow 教程的代码: A Multilayer Perceptron implementation example

批量大小 = 100 时,我们很快得到准确度:94.59%。

如果我将批量大小设置为 1,则训练需要十倍的时间,但准确率只有 9%。

我没有运气测试过不同的学习率。对于小批量,SGD 性能很糟糕。我们可以预期 SGD 的性能会更低,但不会低十倍!这种性能损失的原因是什么?

1个回答

为什么 MNIST 任务的随机梯度下降比批量 GD 差那么多?

它本质上并不更糟。相反,通过单独更改一个参数,您已将示例调整到超出“调整”以使其工作的位置,因为它是用于学习目的的简化示例,并且缺少大多数 NN 用户会考虑的一些功能标准。

批量大小为 1 的效果很好。事实上,虽然处理相同数量的 epoch 需要更长的时间,但每个 epoch 实际上有更多的权重更新。你得到了 100 倍的权重更新,尽管每个更新的噪声都远大于 100 的批量大小。正是这些额外的权重更新,加上运行解释 Python 代码所花费的额外时间,增加了 100 倍的批量,这增加了大量的时间。

准确性的问题是示例网络没有防止过度拟合的保护。通过运行如此多的权重更新,训练开始学习精确的图像数据以匹配每个数字,以获得最佳分数。通过专门这样做,它学习的规则在训练数据上非常有效,但对测试集中的新数据的泛化非常糟糕。

尝试批量大小为 1 和时期数 = 3(我试过这个并得到 94.32% 的准确率)。基本上,这是使用早期停止作为正则化的一种形式。这不是正则化的最佳形式,但它可以快速尝试并且通常有效 - 问题是如何判断何时停止,因此您需要测量一个测试集(通常与最终测试集分开,称为交叉验证集)在任何潜在的停止点,并保存迄今为止最好的模型。这显然将涉及调整示例代码。

可能原始示例中的 15 个 epoch 是经过仔细选择的,以免在批量大小为 100 时出现过度拟合问题,但是一旦您更改批量大小,而无需任何其他形式的正则化,网络很可能会过度拟合合身。一般来说,神经网络强烈倾向于过度拟合,你必须花费时间和精力来理解和防御这种情况。

查看TensorFlow 中的正则化以了解其他选项。对于此类问题,强烈建议使用dropout(在链接中的下方页面进行解释),这不是纯粹的正则化,而是可以提高许多神经网络问题的泛化能力。