技术博客

大 batch 的学习率缩放律:linear scaling 与 sqrt scaling 各自的适用区

第 138 / 147 篇 · 2026-04-09 · ai · 优化器学习率训练工程

把 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 的地盘。

达到目标损失的优化步数 vs batch size:临界 batch 之后,并行收益饱和 batch size B(对数轴) 优化步数 临界 batch size B* 理想区:步数反比于 B,加卡近乎线性加速 饱和区:步数趋于常数 超过 B* 后新增算力浪费

临界 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% 的坑:

  1. 先固定归一化语义:梯度必须是全体样本的平均(上一篇的梯度累积坑),否则后面所有缩放都在错误的基准上做。
  2. lr 从保守值开始:用 $\eta' = \sqrt{k}\,\eta$ 起步,观察前几百步 loss;若明显欠拟合速度(和原曲线对比 token 效率),往 $k$ 的方向试。
  3. warmup 跟着加长:大 batch 下初期梯度的噪声占比高,线性 warmup 的步数要随 batch 增大而增加,否则初期 loss spike。
  4. 看梯度范数曲线:扩 batch 后若梯度范数曲线整体下移且 loss 走得更平,说明 lr 加得不够;若 spike 变频繁,说明加得过头。
  5. 逼近临界点时用质量换规模:超过 $B^*$ 后,同样的算力预算投到更多步数(更小 batch)或更多数据上,收益都比硬堆 batch 高。

小结

linear scaling 和 sqrt scaling 的分界不在某个固定 batch 数字上,而在"梯度估计的噪声是否主导了更新"——分界点由梯度噪声尺度 $G$ 决定,且随训练进程移动。batch 从小扩到大,正确的 lr 倍数从 $\sqrt{k}$ 连续过渡到 $k$,越过临界 batch size 之后,任何缩放规则都救不了并行效率的饱和。扩容前先估算自己处在哪个区,比盲目信奉任何一条规则都重要。