大Batch训练大语言模型的探索与实践
©作者 | 牛信尧
研究方向 | 大语言模型
写在前面
GPT-3
larger models can typically use a larger batch size, but require a smaller learning rate. We measure the gradient noise scale during training and use it to guide our choice of batch size.
For all models, we increase the batch size during training. For the largest model, we use batch size 512 (1M tokens) until step 50k, then double it to 1024 (2M tokens) until step 115k, and finally double again it to 2048 (4M tokens) until training is complete at step 255k. The smaller models followed similar schedules. The reason for using such batch size schedule is twofold: (1) smaller batch sizes are more sample efficient (i.e., better loss as a function of tokens seen) earlier in training, while larger batch sizes are beneficial later in training due to better gradient estimates (Smith et al., 2018; McCandlish et al., 2018), and (2) larger batch sizes result in larger matrix multiplication dimensions, which increases TPU efficiency.
If the smaller model were trained using fewer TPU chips than the larger model, this would proportionally increase the wall-clock time of training, since the total training FLOP count is the same. If it were trained using the same number of TPU chips, it would be very difficult to maintain TPU compute efficiency without a drastic increase in batch size. The batch size of PaLM 540B is already 4M tokens, and it is unclear if even larger batch sizes would maintain sample efficiency.
A large batch size can be an effective way of increasing compute efficiency, because it increases the arithmetic intensity of a kernel and helps amortize the time spent stalled on communication and synchronization. However, the batch size that a model can be trained with has an upper bound; using too large of a batch size can have negative effects on the model quality. Over the first 12 billion tokens, we started at a batch size of 32 and gradually increased the batch size in increments of 32, until we reach the final batch size of 1920.
GLM 130B
We warm-up the batch size from 192 to 4224 over the first 2.5% samples. The memory per processor is too small => Require too many pipeline stages => Batch size is too large (up to 12,000) => Harm the model’s convergency.
根据公开信息来看大家设定 batch size 的时候都是比较经验主义。然而,我们的实验结果发现显著增加 batch size 可能会引发一些问题。考虑到当前大模型超参调节成本极高,其中一个比较重点的问题是 batch size 应该如何与 learning rate(LR)一起变化。
TL;DR
OpenAI 找到了一个 function 用来指导设置模型的 batch size。代表了在不同 loss 情况下,最优的 batch size 大小。这里,最优代表平衡了训练速度和 total compute,在设置小于这个值的 batch size 时,提升 batch size 可以获得更好的训练速度,在大于这个值的时候,继续提升并不会对(达到相应的 performance)需要的训练时间带来提升。
注意,这个结论与模型大小、任务种类(CV/NLP/RL)相关性较弱,但是和 learning rate schedule 非常相关。
增大数据并行度总能提高整体的训练速度吗?
当 batch size 较小时,更新方向(即对真实梯度的近似)会具有很高的方差,导致的梯度更新主要是噪声。经过一些更新后,方差会相互抵消,总体上推动模型朝着正确的方向前进,但个别更新可能不太有用,可以一次性应用(使用更大 batch size 进行更新)。
相反,当 batch size 非常大时,我们从训练数据中抽样的任何两组数据都会非常相似(因为它们几乎完全匹配真实梯度)。因此,在这种情况下,增加 batch size 几乎不会改善性能,因为你无法改进真实的梯度预测。换句话说,你需要在每一步中处理更多的数据,但并不能减少整个训练过程中的步数,这表明总体训练时间几乎没有改善。但是更糟糕的是你增加了总体的 FLOPS。
通过观察这些线性图,我们可以发现使用更大的 batch size 通常需要较少的训练 step。然而,这将相应地增加需要处理的数据。当 batch size 从 2048 翻倍时,达到同样性能所需要的 step 几乎没有任何改善,但你需要花费两倍的计算资源。Google 的经验研究也有类似的观察,即在在固定的 epoch budget 下,当 batch size 达到临界值时,模型的性能会 batch size 的增加而降低。可以如下说明:
因此,各种结果表明似乎存在着一个关于数据并行程度的临界点,通过找到这个临界点,我们可以有效的平衡训练的效率和模型的最终效果。
Gradients, Batches, and the Gradient Noise Scale
在采用最优 step size 时,从含有噪声的梯度中获得的损失的最优改进现在变为:
从这些公式中我们可以得出两个结论:
无论我们如何准确地估计真实梯度,总存在一个最大步长
批处理大小越大,我们优化模型的步长就越大(有一个上限)
左侧的图表说明了为什么使用更大的批次模型可以取得更多提升。但是当 batch size 太大时,我们会遇到收益递减的问题(因为分母中的 1 开始占主导地位)。但是需要注意的事,这仅在学习率调整良好的情况下有效。因此,OpenAI 建议将学习率调整到一个相对接近最优值的数值是理论能有效的前提。
在进行一些其他数学计算后,OpenAI 发现噪声尺度可以通过以下方式估计:
他们经验上发现结果相当接近。该方程表明噪声尺度等于个别梯度分量的方差之和,除以梯度的 norm。OpenAI 使用以上结论在后续的 scaling law 工作中预测了模型的最优 batch size 大小。
Learning rate as temperature
前面的结论有提到一个前提,就是模型的 LR 是调的比较好的。这是因为 OpenAI 发现噪声尺度基本符合以下规律
从以上内容,我们可以得知:
高温度导致较小的噪声尺度。其中的直觉是在高温度下,相对于方差,梯度幅度较大。 当学习率以一个常数因子衰减时,噪声尺度大致以相同的因子增长。因此,如果学习率太小,噪声尺度将被放大。
Batch size v.s. LR 的实验结论
Google 在实验中发现,几乎任何关于 batch size 和 LR 的 heuristic 都只能在某个范围内有效。同时,任何只为一个 batch size 调整 LR,然后使用 heuristic 选择其他 batch size 的 LR 的研究都会使被调整的 batch size(以及附近的 batch size)获得系统性优势。
写在最后
本文只是非常简略的总结了一下上面提到的两篇工作,当做自己前段时间一些工作的总结,对于追求细节的读者还是非常推荐去阅读一下论文本身。在做相关工作的同时,出现了一篇非常有意思的文章叫做 Chinchilla's Death, 其中通过对比不同模型的等效 GPU-Hours 提供了一个非常有意思的视角来看 scaling up 这件事情。
但是,结合这篇文章,同时考虑到小模型仅能通过数据并行来 scale up,该文中的诸多结论将不再成立。并且,随着获取算力的成本不断地降低,同时,可以用来训练模型的优质数据逐渐消耗殆尽,我们可能会观察到新的 paradim shifting.
参考文献
[1] Measuring the Effects of Data Parallelism on Neural Network Training
[2] An Empirical Model of Large-Batch Training
更多阅读
#投 稿 通 道#
让你的文字被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:[email protected]
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
微信扫码关注该文公众号作者