权衡批次大小与迭代次数以训练神经网络


221

训练神经网络时,设置有什么区别:

  • 批处理大小为,迭代次数为一种b
  • vs.批处理大小为和迭代次数为Cd

其中?一种b=Cd

换句话说,假设我们使用相同数量的训练示例训练神经网络,那么如何设置最佳批处理大小和迭代次数?(其中批处理数量*迭代次数=向神经网络显示的训练示例的数量,同一训练示例可能多次显示)

我知道批处理大小越大,所需的内存空间就越大,并且通常可以使计算速度更快。但是,就训练有素的网络的性能而言,这有什么不同?


1
请查看此博客,该博客描述了如何选择正确的批次大小,同时比较了不同批次大小对Cifar-10数据集准确性的影响。
Teja Sreenivas

Answers:


207

来自Nitish Shirish Keskar,Dheevatsa Mudigere,Jorge Nocedal,Mikhail Smelyanskiy,Ping Tak Peter Tang。关于深度学习的大批量培训:泛化差距和夏普最小值。https://arxiv.org/abs/1609.04836

随机梯度下降方法及其变体是许多深度学习任务的首选算法。这些方法以小批量方式运行,其中一部分训练数据(通常为32--512个数据点)被采样以计算梯度的近似值。在实践中已经观察到,当使用较大批次时,通过模型的泛化能力来衡量,模型的质量会显着下降。已经进行了一些尝试来研究大批量生产中这种普遍性下降的原因,但是迄今为止,这种现象的确切答案尚不清楚。在本文中,我们提供了足够的数值证据来支持这样的观点,即大批量方法趋向于收敛到训练和测试功能的最小化极小点-最小的极小点导致较差的泛化。相反,小批量方法始终收敛于平面最小化器,并且我们的实验支持一种普遍认为的观点,这是由于梯度估计中的固有噪声所致。我们还将讨论一些经验策略,这些策略可帮助大批量方法消除普遍性差距,并以一组未来的研究思路和未解决的问题作为结论。

[…]

泛化能力的缺乏是由于大批量方法趋向于收敛到训练函数的尖锐最小化这一事实。这些最小化器的特征在于的大正特征值, 而且推广的趋势往往较差。相反,小批量方法收敛到以的小的正特征值为特征的平坦极小值。我们已经观察到,深度神经网络的损失函数态势如此,使得大批量方法几乎总是吸引到具有尖锐最小值的区域,并且与小批量方法不同,它无法逃脱这些最小化方法的处理。2FX2FX

[…]

在此处输入图片说明

另外,伊恩·古德费洛Ian Goodfellow) 回答了一些很好的见解,他们为何不使用整个训练集来计算梯度? 在Quora上:

学习率的大小主要受成本函数弯曲程度等因素的限制。您可以将梯度下降视为对成本函数进行线性近似,然后沿该近似成本下降。如果成本函数是高度非线性(高度弯曲)的,则近似值在很远的范围内都不会很好,因此只有较小的步长是安全的。您可以在有关数值计算的深度学习教科书的第4章中了解有关此内容的更多信息:http : //www.deeplearningbook.org/contents/numerical.html

将m个示例放入一个最小批处理中时,您需要进行O(m)计算并使用O(m)内存,但是您可以将梯度中的不确定性量减少O(sqrt(m))。换句话说,边际收益递减,在微型批次中放置更多示例。您可以在深度学习教科书的第8章中了解更多有关深度学习的优化算法的信息:http : //www.deeplearningbook.org/contents/optimization.html

另外,如果您考虑一下,即使使用整个训练集也无法真正为您提供真正的渐变。真实的梯度将是预期的梯度,并在所有可能的示例中获得预期值,并由数据生成分布加权。使用整个训练集只是使用非常大的小批量,而小批量的大小受数据收集量而不是计算量限制。

相关:批量梯度下降与随机梯度下降


由于batch_size仅将训练数据集分为多个批次,因此重新安排数据集(非临时性)以在所有批次之间具有统一方差是否有意义?这样做可以减少对批量大小优化的需求,这仅是找到更快的收敛性的好方法。如果是这样,将如何进行?我以为它可能无法提供一个更平坦的最小值。希望能得到详细的指导。
user12348

@ user12348您将如何重新排列数据集?您如何估计给定的数据维度在训练后将产生特定的特征向量?
Cloud Cho

46

我假设您正在谈论的是在小型批次随机梯度下降算法中减小批次大小,并将其与需要较少迭代的较大批次大小进行比较。

吴安德 在ML和神经网络的在线课程中,他对此进行了很好的讨论,并提供了一些视觉效果。因此,这篇文章的其余部分主要是对他在那堂课上的教导的反驳。

让我们考虑两个极端,一方面,每个梯度下降步骤都使用整个数据集。您正在计算每个样本的梯度。在这种情况下,你知道确切直接向当地最低最好的。您不会浪费时间走错方向。因此,就数字梯度下降步骤而言,您将在最少的时间内到达那里。

当然,计算整个数据集的梯度非常昂贵。所以现在我们去另一个极端。批量大小仅为1个样品。在这种情况下,该样品的梯度可能会使您完全走错方向。但是,嘿,计算一个梯度的成本是微不足道的。当您针对一个样本采取步骤时,您会“徘徊”一点,但平均而言,您将朝着与整个批次梯度下降相同的合理局部最小值行进。

现在可能要指出这一点,我已经看到一些文献表明,也许这种围绕1样本随机梯度下降的反弹确实可以帮助您摆脱局部最小值,而这种局部最小值无法避免全批处理模式,但这值得商bat。这里有一些其他好的答案比我更直接地解决了这个问题。

在计算能力方面,虽然单样本随机GD过程需要进行许多次迭代,但最终获得的成本要比完整批处理模式的成本低(通常是)。吴安德(Andrew Ng)就是这样说的。

现在,让我们找到您所问的中间立场。我们可能会意识到,现代的BLAS库使向量数学的计算非常有效,因此,假设您已正确地向量化了代码,一次计算10或100个样本将比计算1个样本的工作量大得多(您可以获得内存调用效率以及最有效的数学库中内置的计算技巧)。而且,将一批10、100、1000个样本的平均值平均会产生一个梯度,该梯度是真实的完整批处理模式梯度的更合理近似值。因此,我们的步骤现在更加准确,这意味着我们需要进行收敛的步骤更少,并且成本仅比单样本GD高一点。

优化您应该使用的微型批次的确切大小通常需要反复试验。在数据集的样本上运行一些测试,这些样本的数量从几十到几千不等,然后看看哪个收敛最快,然后进行下去。这些范围内的批次大小在整个文献中似乎很常见。而且,如果您的数据确实是IID,则关于随机过程变化的中心极限定理也将表明这些范围是整个梯度的合理近似值。

通常,通过针对未经训练的验证集监视泛化错误并选择验证错误的最低点来确定确切的停止迭代时间。进行过多的迭代训练最终将导致过度拟合,这时您在验证集上的错误将开始攀升。当您看到这种情况时,请备份并停在最佳位置。


22

TL; DR:最小批量大小通常会导致精度降低

对于那些感兴趣的人,这里有一个解释。

速度有两个概念:

  • 计算速度
  • 算法的收敛速度

计算速度就是在硬件中执行数值计算的速度。就像您说的那样,小批量生产时通常更高。这是因为线性代数库对向量和矩阵运算使用矢量化来加快它们的速度,但要占用更多的内存。收益可以达到一定程度。根据我的经验,有一点是,在此之后,速度只有边际收益(如果有的话)。这一点取决于数据集,硬件和用于数值计算(在后台)的库。

但是,别忘了还有另一个速度概念,它告诉我们算法收敛的速度。

首先,我们的算法收敛意味着什么?好吧,我们要定义并决定何时对根据验证集计算出的准确性或错误感到满意。我们可以预先定义它,然后等待算法到达该点,或者我们可以监视训练过程并决定在验证误差开始显着上升(模型开始过度拟合数据集)时停止训练。如果我们使用微型批处理,我们真的不应该在错误开始增加的第一刻就立即停止它,因为我们使用的是随机梯度下降SGD。如果是(批量)梯度下降,则在每个时期之后,该算法将稳定在最小值,无论是局部的还是全局的。SGD从未真正达到最低要求。它一直围绕着它振荡。它可以无限期地进行下去,

现在,经过所有这些理论之后,我们需要注意一个“陷阱”。当使用较小的批次大小时,与使用较大的批次大小时相比,错误的计算会带来更多的噪声。有人会说,那很不好,不是吗?问题是,噪声可以帮助算法跳出不良的局部最小值,并且有更多的机会找到更好的局部最小值或希望的全局最小值。

因此,如果我们可以通过使用较小的批次大小而不是较大的批次来更快地找到更好的解决方案,仅借助“不必要的”噪声,我们就可以在算法找到满意的总时间之间进行调整解决方案和更高的精度。

我想说的是,对于给定的准确性(或错误),较小的批次大小可能导致较短的总训练时间,而不是很多人认为的更长。

或者,如果我们决定保持与以前相同的培训时间,则在较小的批次大小下,我们可能会获得更高的准确性,而且我们很有可能会这样做,尤其是如果我们选择了适当的学习率。

如果有时间,请查看本文: 在ImageNet上对CNN进行系统评估 特别是,请查看“ 3.7。批处理大小和学习率”,以及图8。您将看到,大的小批处理大小会导致精度降低。 ,即使将学习速度调整为启发式。

通常,批处理大小为32是一个很好的起点,您还应该尝试使用64、128和256。对于某些数据集,其他值(较低或较高)可能很好,但是给定范围通常是最佳选择开始尝试。但是,在32岁以下时,由于未充分利用矢量化,计算速度可能会大大降低,因此可能会变得太慢。如果出现“内存不足”错误,则无论如何都应尝试减小迷你批处理的大小。

因此,这不仅仅是简单地使用适合内存的最大最小批处理大小。

总结一下并回答您的问题,较小的小批量(而不是太小)通常不仅会导致训练算法的迭代次数少于大批量,而且会导致总体精度更高,即在相同或更少的训练时间内表现更好的神经网络。

不要忘记,较高的噪声可以帮助它跳出不良的局部最小值,而不是停留在其中。


14

我正在为这个问题添加另一个答案,以引用Google的新(2018)ICLR会议论文,该论文几乎直接解决了这个问题。

标题:不要降低学习率,增加批量

https://arxiv.org/abs/1711.00489

上面论文的摘要复制在这里:

通常的做法是降低学习速度。在这里,我们显示了在训练和测试集上通常可以通过在训练过程中增加批次大小来获得相同的学习曲线。对于随机梯度下降(SGD),带动量的SGD,内斯特罗夫动量和Adam,此过程成功完成。在相同数量的训练时期之后,它达到了相同的测试精度,但是参数更新较少,从而导致更大的并行度和更短的训练时间。我们可以通过提高学习率ϵ和缩放批量大小B∝ϵ来进一步减少参数更新的次数。最后,尽管这会稍微降低测试精度,但可以增加动量系数m和比例B∝1 /(1-m)。至关重要的是 我们的技术使我们能够将现有培训计划重新用于大批量培训,而无需进行超参数调整。我们在30分钟内将ImageNet上的ResNet-50训练到76.1%的验证准确性。


1
更大的内存需求似乎是一个权衡取舍,因为它只能避免避免减小值。同样,恕我直言,在训练期间内存占用量会不断增长,从而导致算法的可伸缩性将有所降低,而不是更多。
P-Gn

3

在这里展示一些经验。我使用批处理大小4和批处理大小4096进行了实验。大小4096执行的反向传播减少了1024倍。因此,我的直觉是,对于最佳解,较大的批处理将执行较少且较粗糙的搜索步骤,因此,通过构造,将不太可能收敛于最佳解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.