有一次,我在 twitter 上看到 Jeremy Howard 引用 Yann LeCun 关于 batch 大小的话:
Twitter 上关于 batch 的讨论
自从我在 Fastai 找到了一个非常好的学习率查找工具后,我就一直在想这个问题,我一直在想是否有一个有用的 batch 大小查找工具,人们可以用来快速地得到一个合适的 batch 大小来训练他们的模型。
提醒一下,Fastai 中使用的学习速率查找器通过测试不同的学习速率来确定能最大程度地减少损失的数值,从而帮助找到正确的学习速率。更详细的解释可以在这里找到:https://sgugger.github.io/how-do-you-find-A-good-learning-rate.html
在我的脑海中,做一个 bacth 大小查找器的想法已经有很长一段时间了,在得到 Jeremy 里米的激励后,我决定开始这一旅程,实现一个 batch 大小查找器来训练神经网络。
今天我想和大家分享完成一篇论文的历程,在我看来,这些文章都很有趣,也许也会激励你去尝试更多的东西!
1.一个关于大小的故事
有关 batch 大小的 OC meme
一个常见的看法是不应该使用大 batch,因为这只会导致模型过大,并且可能会耗尽内存。显然这个观点是正确的,但前者比后者更复杂,为了回答这个问题,我们将深入研究 OpenAI 论文「An Empirical Model of Large-Batch Training」。
我非常推荐这篇文章,它解释了许多易于理解、记忆的想法。
首先,我们的目标是通过随机梯度下降法将损失最小化,并且有一个真正的潜在环境,我们将在这个环境下最小化损失。然而,我们不能访问整个数据集上的真实梯度,因此我们必须用有限的 batch 大小来近似梯度。
因为我们在一个 batch 上取平均值,如果我们的 batch 很小,就会有很多噪音存在,我们可能只在噪音上训练我们的模型。尽管如此,应用几个连续的更新是正确的策略,但我们也可以直接使用更大的批处理大小,它在计算效率上更高,并直接将噪声平均化。然而,在一个特定的大小之后,如果梯度已经是精确的,就没有必要使批处理更大,因为这只是在计算上的浪费,精度几乎没有提高。
此外,通过使用更大的 batch 尺寸(达到 GPU 允许的合理数量),我们加快了训练速度,这相当于采用了几个大步骤,而不是许多小步骤。因此,对于更大的 batch 尺寸,在相同的时间段,我们有时可以在计算时间上获得 2 倍的增益!
其次,有一个称为「简单噪音等级」的统计数据,它帮助我们确定什么是好的 batch 大小,定义为:
简单噪声标度方程
G 是损