这里是Tensorflow教程中的代码:一个多层感知器的实现实例
当批数= 100时,准确度为94.59%。
如果我将批次大小设为1,那么训练需要十倍的时间,但准确率仅为9%。
我在没有运气的情况下测试了不同的学习率。SGD的性能对于小批量来说是很糟糕的。我们可以预期SGD的性能会更低,但不会少十倍!性能损失的原因是什么?
发布于 2017-02-10 15:24:25
为什么对于MNIST任务,随机梯度下降比批GD差得多?
这并不是天生的更糟。相反,只需自行更改一个参数,就可以将示例调整到“调优”到工作的地方以外,因为它是一个简化的示例,用于学习,而且它缺少大多数NNs用户认为标准的一些特性。
1的批次大小很好。事实上,尽管处理相同数量的历元需要花费更长的时间,但每个时期实际上都有更多的权重更新。您得到100倍的重量更新,虽然每一个都有更多的噪音比批次大小为100。正是这些额外的权重更新,加上运行解释Python代码的额外时间是批次的100倍,这就增加了大量的时间。
精确性的问题是示例网络没有过度拟合的保护。通过运行更多的重量更新,训练开始学习精确的图像数据来匹配每一个数字,以获得最好的分数。通过专门这样做,它学习了一些规则,这些规则在训练数据上非常有效,但却非常糟糕地推广到了测试集中的新数据。
试一批大小为1,周期数为3(我试过,准确率为94.32%)。基本上,这是利用早期停止作为一种形式的正规化。这并不是最好的规范形式,但尝试起来很快,而且通常是有效的--问题是如何判断何时停止,因此您需要在任何潜在的停止点度量测试集(通常独立于最终测试集,称为交叉验证集),并保存到目前为止最好的模型。这显然需要调整示例代码。
在最初的示例中,可能是精心选择了15个时期,以避免将批大小为100的问题过度拟合,但一旦您更改批处理大小,而没有任何其他形式的规范,网络很可能会过度适应。一般来说,神经网络倾向于过度适应,你必须花费时间和精力来理解和防范这一点。
查看一下TensorFlow中的正则化的其他选项。对于这类问题,强烈推荐使用辍学 (在链接中解释较低的页面),这并不是纯粹的正则化,而是致力于改进许多神经网络问题的泛化。
https://datascience.stackexchange.com/questions/16881
复制相似问题