训练神经网络的批量大小和迭代次数之间的权衡是什么?

机器算法验证 神经网络 火车
2022-01-28 10:32:23

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

  • 批量大小为和迭代次数为ab
  • 与批量大小为和迭代次数为cd

在哪里ab=cd

换句话说,假设我们用相同数量的训练样例训练神经网络,如何设置最优的batch size和迭代次数?(其中批量大小 * 迭代次数 = 显示给神经网络的训练示例数,相同的训练示例可能会显示多次)

我知道批处理大小越大,需要的内存空间就越多,而且它通常会使计算速度更快。但就训练后的网络的性能而言,它有什么不同呢?

4个回答

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

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

[…]

缺乏泛化能力是由于大批量方法倾向于收敛到训练函数的急剧最小化中具有较大的正特征值, 并且往往泛化能力较差。相反,小批量方法收敛到以的小正特征值为特征的平面最小化器。我们观察到,深度神经网络的损失函数景观是这样的,即大批量方法几乎总是被具有尖锐最小值的区域所吸引,并且与小批量方法不同,它们无法逃脱这些最小值的盆地。2f(x)2f(x)

[…]

在此处输入图像描述

此外,Ian Goodfellow的一些很好的见解 回答了为什么不使用整个训练集来计算梯度? 在知乎上:

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

当您将 m 个示例放入一个 minibatch 中时,您需要进行 O(m) 计算并使用 O(m) 内存,但是您将梯度中的不确定性减少了仅 O(sqrt(m)) 的一个因子。换句话说,在 minibatch 中放置更多示例会导致边际收益递减。您可以在深度学习教科书的第 8 章中了解更多关于深度学习的优化算法:http: //www.deeplearningbook.org/contents/optimization.html

此外,如果您考虑一下,即使使用整个训练集也不能真正为您提供真正的梯度。真正的梯度将是预期梯度,其对所有可能的示例都具有期望,并由数据生成分布加权。使用整个训练集只是使用非常大的 minibatch 大小,其中 minibatch 的大小受到您在数据收集上花费的数量的限制,而不是您在计算上花费的数量。

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

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

Andrew Ng 在他关于 ML 和神经网络的在线课程中对此进行了很好的讨论,并提供了一些视觉效果。所以这篇文章的其余部分主要是对他那堂课的教义的反刍。

让我们采取两个极端,一方面每个梯度下降步骤都使用整个数据集。您正在计算每个样本的梯度。在这种情况下,您可以准确地直接了解局部最小值的最佳值。你不会浪费时间走错方向。因此,就数字梯度下降步骤而言,您将以最少的速度到达那里。

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

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

就计算能力而言,虽然单样本随机 GD 过程需要更多的迭代,但您最终会以比“通常”全批处理模式更低的成本到达那里。这就是吴恩达所说的。

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

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

准确决定何时停止迭代通常是通过针对未经训练的验证集监控泛化错误并选择验证错误处于最低点的点来完成的。训练过多的迭代最终会导致过度拟合,此时验证集上的错误将开始攀升。当您看到这种情况发生时,请重新开始并停在最佳点。

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

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

速度有两个概念:

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

计算速度只是在硬件中执行数值计算的速度。正如您所说,通常使用较大的 mini-batch 会更高。这是因为线性代数库对向量和矩阵运算使用向量化来加速它们,但代价是使用更多内存。在某种程度上,收益可能很大。根据我的经验,在某个时间点之后,速度只会有边际增长(如果有的话)。这一点取决于数据集、硬件和用于数值计算的库(在后台)。

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

首先,我们的算法收敛意味着什么?好吧,由我们来定义和决定何时对我们在验证集上计算得到的准确性或错误感到满意。我们可以提前定义它并等待算法到达该点,或者我们可以监控训练过程并在验证错误开始显着上升时决定停止它(模型开始过度拟合数据集)。我们真的不应该立即停止它,如果我们使用小批量,错误开始上升的第一刻,因为我们使用随机梯度下降,SGD。在(全批次)梯度下降的情况下,在每个 epoch 之后,算法将稳定在最小值,无论是局部的还是全局的。新元从来没有真正稳定在最低限度。它一直在它周围摆动。它可以无限期地持续下去,

现在,在所有这些理论之后,我们需要注意一个“问题”。当使用较小的批大小时,误差的计算比我们使用较大的批大小时有更多的噪音。有人会说,嗯,那很糟糕,不是吗?问题是,噪声可以帮助算法跳出糟糕的局部最小值,并有更多机会找到更好的局部最小值,或者希望找到全局最小值。

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

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

或者,如果我们决定保持与以前相同的训练时间,我们可能会以较小的批大小获得稍高的准确率,而且我们很可能会,特别是如果我们适当地选择了我们的学习率。

如果您有时间,请查看这篇论文: Systematic evaluation of CNN Advances on the ImageNet 特别是查看“3.7. Batch size and learning rate”和图 8。您会看到大的 mini-batch 会导致更差的准确度,即使将学习率调整为启发式。

一般来说,32 的批大小是一个很好的起点,您还应该尝试使用 64、128 和 256。对于某些数据集,其他值(更低或更高)可能没问题,但给定的范围通常是最好的开始尝试。但是,在 32 岁以下,由于计算速度显着降低,由于没有充分利用矢量化,它可能会变得太慢。如果您收到“内存不足”错误,则无论如何都应该尝试减小小批量大小。

因此,这不仅仅是使用适合内存的最大可能小批量大小。

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

不要忘记,较高的噪声可以帮助它跳出糟糕的局部最小值,而不是让它陷入困境。

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

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

https://arxiv.org/abs/1711.00489

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

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