把 batch size 扩大 k 倍而保持"等效训练轨迹",学习率该怎么调?这是所有扩容训练(单机到多机、多机到集群)躲不开的第一个问题。两条经验规则流传最广:
$$ \text{linear scaling: } \eta' = k\,\eta, \qquad \text{sqrt scaling: } \eta' = \sqrt{k}\,\eta. $$
它们不是互相矛盾的经验口诀,而是两个不同假设下的结论,各自有明确的适用区。
推导:噪声主导 vs 曲率主导
把参数更新看成随机微分方程。batch size 为 $B$ 时,梯度估计的方差来自单样本梯度 $g_i$ 的方差 $\Sigma$,均值的方差是 $\Sigma / B$。一步更新里,参数位移的协方差由两部分组成:
$$ \mathrm{Cov}(\Delta\theta) \;\approx\; \underbrace{\eta^2 \,\bar g\,\bar g^\top}_{\text{信号:沿真实梯度方向}} + \underbrace{\eta^2\,\frac{\Sigma}{B}}_{\text{噪声:随机扰动}}. $$
曲率主导区($B$ 小、噪声大):梯度方向本身还不准,更新主要是噪声驱动的随机游走。这时把 $B$ 扩大 k 倍,噪声方差缩为 1/k。要让随机游走每步的位移方差保持不变(即"等温"),需要 $\eta'^2 / B' = \eta^2 / B$,即
$$ \eta' = \eta\sqrt{k} \qquad (\text{sqrt scaling}). $$
这在 SGD 的早期探索阶段和小 batch 区成立,也符合一维 OU 过程的平稳分布尺度 $\propto \sqrt{\eta/B}$。
噪声主导区的另一端,换个角度:SGD 的连续化(SGD 作为梯度流 + 噪声的 SDE)里,噪声的强度与 $\eta/B$ 成正比。想让噪声尺度 $\eta/B$ 不变,就有
$$ \frac{\eta'}{B'} = \frac{\eta}{B} \;\Longrightarrow\; \eta' = k\,\eta \qquad (\text{linear scaling}). $$
linear scaling 的严格适用区在"噪声已经小到不改变损失面的局部结构,梯度方向基本可信"的大 batch 区。Krizhevsky 2014 年的 "One weird trick" 用它在 AlexNet 上把 batch 从 128 扩到 4096 没掉点,但这个结果不可无脑外推——它要求更新方向足够准,且学习率本身远未触及稳定性的上限。
一句话记:sqrt scaling 保持"每步随机性"不变,linear scaling 保持"信噪比"不变。batch 从小往大走,先处在 sqrt 区,跨过一个过渡带后进入 linear 区,再往后就是临界 batch size 的地盘。
临界 batch size
McCandlish et al. (2018) 把这件事定量化了。梯度噪声尺度(gradient noise scale)定义为
$$ G \approx \frac{\mathrm{tr}\,\Sigma}{\lVert \bar g \rVert^2}, $$
它度量"噪声能量与信号能量之比"。临界 batch size 大约是 $B^* \approx G$:$B < B^*$ 时扩大 batch 几乎线性减少所需步数(每步的梯度信息都在涨),$B > B^*$ 时步数趋于常数(再加样本只是重复确认同一个方向)。$B^*$ 在训练过程中会变化:初期梯度大、$B^*$ 大;接近收敛时 $\bar g \to 0$,$B^*$ 暴涨——这就是为什么训练末期用超大 batch 几乎 pure 浪费。
对 Adam,分析要修正:Adam 的分母 $\sqrt{\hat v}$ 会放大噪声坐标的影响,等效噪声尺度不同,实践上 Adam 的可用 batch 上限比同设置的 SGD 低,且 lr 的有效缩放更接近 $\sqrt{k}$ 而非 $k$。LARS/LAMB 这类层wise自适应优化器(每层用 $\lVert w\rVert / \lVert g\rVert$ 缩放)则把 batch 可用上限推到很大——这解释了为什么 BERT 预训练能用 32k batch 而 ResNet 用 LARS 能上 64k,而朴素 SGD 在几千就开始劣化。
实操顺序
扩容 batch 时按这个顺序排查,能避开 90% 的坑:
- 先固定归一化语义:梯度必须是全体样本的平均(上一篇的梯度累积坑),否则后面所有缩放都在错误的基准上做。
- lr 从保守值开始:用 $\eta' = \sqrt{k}\,\eta$ 起步,观察前几百步 loss;若明显欠拟合速度(和原曲线对比 token 效率),往 $k$ 的方向试。
- warmup 跟着加长:大 batch 下初期梯度的噪声占比高,线性 warmup 的步数要随 batch 增大而增加,否则初期 loss spike。
- 看梯度范数曲线:扩 batch 后若梯度范数曲线整体下移且 loss 走得更平,说明 lr 加得不够;若 spike 变频繁,说明加得过头。
- 逼近临界点时用质量换规模:超过 $B^*$ 后,同样的算力预算投到更多步数(更小 batch)或更多数据上,收益都比硬堆 batch 高。
小结
linear scaling 和 sqrt scaling 的分界不在某个固定 batch 数字上,而在"梯度估计的噪声是否主导了更新"——分界点由梯度噪声尺度 $G$ 决定,且随训练进程移动。batch 从小扩到大,正确的 lr 倍数从 $\sqrt{k}$ 连续过渡到 $k$,越过临界 batch size 之后,任何缩放规则都救不了并行效率的饱和。扩容前先估算自己处在哪个区,比盲目信奉任何一条规则都重要。