GPT-3 训练时用了几百万 token 的批量,MNIST 训练时只需要几十个样本的批量。差了整整六个数量级——这不是随便设的,背后有一套数学在算账。

故事从这里开始

假设你现在有 512 张 GPU,钱包也够厚。你要训练一个大模型,第一反应大概是:”那还等什么,把 batch size 拉满,让所有卡一起干活,训练时间不就压缩到极限了吗?”

这个直觉在一定范围内是对的。如果你把 batch size 从 32 加到 64,用两倍的机器同时算两倍的数据,理论上训练时间能砍半——这就是数据并行的全部意义。但如果你继续加倍,从 64 到 128,从 128 到 256……在某个点上,你会发现一件很反直觉的事:训练时间不再随之减半了。你花了两倍的算力,只换来快了 10% 的训练速度。再往后甚至连这 10% 都没有了——同样的总算力预算,你的模型反而收敛到了更差的最终效果。

这不是 GPU 通信瓶颈,不是数据加载跟不上,是一个更根本的统计学问题:当 batch size 大到一定程度后,你多花的算力,买到的信息量已经趋近于零。

2018 年,OpenAI 的 Sam McCandlish、Jared Kaplan、Dario Amodei(后来 Kaplan 写出了 Scaling Laws 论文,Amodei 后来创立了 Anthropic)在训练 Dota 2 智能体和一系列常规模型的过程中,发现了一个简单却贯穿几乎所有任务的规律——他们叫它”梯度噪声尺度”(Gradient Noise Scale)。这个数字,后来被 GPT-3 团队原样拿去指导自己那 1750 亿参数模型的批量大小选择。

这篇文章就是要把这个数字的来龙脉络讲清楚:它是什么、为什么存在、怎么算、以及七年后的今天,人们又发现了这套理论哪里不够用。

训练速度 vs Batch Size 的两个阶段 Batch Size → 训练速度提升 噪声尺度 B_noise 线性提速区 (小批量,噪声主导) 收益饱和区 (大批量,信号主导)

为什么会有这个天花板

问题是什么

训练神经网络时,我们其实从来没有真正拿到过”真实梯度”。真实梯度是在无穷多数据点上求出来的期望值,但我们每一步只能从数据集里随机抽一小撮样本(一个 batch),算出这一小撮的梯度平均值,拿它当作真实梯度的替身去更新参数。

这个替身当然不精确。它带着噪声。batch 越小,这撮样本就越不能代表整体数据分布,噪声就越大;batch 越大,这撮样本就越接近”全体数据的平均画像”,噪声就越小。

那么问题来了:如果我加大 batch,梯度估计更准了,是不是每一步都能”迈更大更自信的步子”,从而用更少的步数走到终点?答案是”是的,但有限度”。因为——即便你有全世界所有的 GPU 去凑一个无限大的 batch,把噪声完全消除,你得到的也只是”真实梯度”本身。而”真实梯度”能带你迈的最大步子,是有物理上限的(受损失函数曲率也就是二阶导数——Hessian 矩阵限制)。换句话说,消灭噪声这件事本身的价值,是有一个封顶的。

直觉:核心想法

想象你要往一个目标方向射箭,但每次瞄准都会有随机的手抖误差。你可以选择:

  • 射一箭就出手(小 batch):手抖误差很大,箭经常偏得离谱,但成本低,一秒钟就能射一箭。
  • 先瞄准 10 秒钟综合平均手抖误差再出手(大 batch):瞄得更准,但花的时间也长了 10 倍。

如果你的目标特别远、特别小(误差敏感型任务),多花时间瞄准非常划算——每多瞄一秒,准确率提升都很可观。但如果你的目标就在眼前、很宽很好命中,那瞄准 1 秒钟基本上已经稳了,再多瞄 9 秒钟纯属浪费时间。

“梯度噪声尺度”这个数字,量化的正是这个转折点在哪里 ——手抖误差(梯度噪声)和”瞄准本身该有的精度需求”(真实梯度信号大小)达到平衡的那个位置。低于这个 batch,加大 batch 几乎是纯赚(噪声还占主导,消它有意义);高于这个 batch,加大 batch 几乎是纯浪费(信号已经主导,噪声已经不重要了)。

技术细节(选读)

先把这个直觉钉在数学上。设模型参数为 θ,损失函数 L(θ) 是对所有数据点损失的期望。用一个大小为 B 的 batch 估计梯度:

\[G_{\text{est}}(\theta) = \frac{1}{B}\sum_{i=1}^{B} \nabla_\theta L_{x_i}(\theta)\]

这个估计值是随机的——每次抽的 B 个样本不同,算出来的梯度也不同。可以证明它的期望值等于真实梯度 G,但它的方差(用协方差矩阵 Σ 描述)跟 batch 大小成反比:

\[\text{cov}(G_{\text{est}}) = \frac{\Sigma(\theta)}{B}\]

翻译回人话:batch 翻倍,噪声减半——这跟统计学里”样本均值的标准误差随样本量的平方根下降”是同一件事。

接下来看这个带噪声的梯度到底能让损失下降多少。把损失函数在当前参数点附近做二阶泰勒展开(即用一个抛物面局部逼近损失曲面),求出用估计梯度 G_est 走一步能带来的期望损失改善,再对步长做最优化,推出:

\[\Delta L_{\text{opt}}(B) = \frac{\Delta L_{\max}}{1 + \mathcal{B}_{\text{noise}}/B}\]

这里 ΔL_max 是”如果你手里真有那个完美无噪声的真实梯度”,一步能获得的理论最大损失改善量。而 B_noise 就是梯度噪声尺度,它的完整定义式是:

\[\mathcal{B}_{\text{noise}} = \frac{\text{tr}(H\Sigma)}{G^T H G}\]

其中 H 是损失函数的 Hessian(曲率矩阵)。这个公式看起来吓人,但翻译回人话就是:“梯度的噪声能量,除以梯度信号沿曲率方向的能量”——本质上还是”噪声/信号比”这件事,只是加权方式考虑了损失曲面的形状。

计算完整的 Hessian 太贵,论文给出一个简化版本,假设曲面近似”处处一样圆”(Hessian 约等于单位矩阵的某个倍数),公式就简化成:

\[\mathcal{B}_{\text{simple}} = \frac{\text{tr}(\Sigma)}{|G|^2}\]

翻译回人话:梯度各个分量方差之和,除以梯度整体大小的平方。这个量在实践中容易估算(只需要对比几个不同 batch size 下算出的梯度方差和范数),而且经验上跟完整版 B_noise 差不多,所以是实际工程里真正会用到的公式。

代回上面 ΔL_opt 的公式看两个极端:

  • 当 B ≪ B_noise 时,分母里 B_noise/B 这个项占主导,ΔL_opt 近似跟 B 成正比——加倍 batch,损失改善也近似加倍,训练速度线性提升
  • 当 B ≫ B_noise 时,分母趋近于 1,ΔL_opt 趋近于常数 ΔL_max——再怎么加 batch,一步能改善的损失都封顶了,后面全是浪费算力

这就是那个转折点:B_noise 恰好是”再加一倍 batch,训练速度从满血状态跌到 50% 效率”的那个数值

用一个统一公式描述这场权衡

问题是什么

光知道有个转折点还不够。实际训练时我们更关心一个具体的问题:如果我要把模型训练到某个特定的损失值,我应该用多大的 batch,才能在”训练时长(需要多少步)”和”总算力开销(需要处理多少个样本)”之间找到最合适的平衡点?

直觉:核心想法

把这想象成搬家。你要搬 100 箱东西:

  • 用一个人搬(小 batch,慢但省油钱):要跑 100 趟,总耗时长,但汽油(算力)花的少。
  • 雇 100 个人一起搬(大 batch,快但费”人力成本”):理论上跑 1 趟就搬完,但 100 个人的”总工时”未必比 1 个人跑 100 趟省——尤其当每个人手里其实只搬了 1 箱、路上大部分时间在互相等待、协调、走空趟的时候。

关键洞察:处理”总样本数”(相当于总人力工时)和”优化步数”(相当于跑的趟数)之间存在一个此消彼长的关系,而且这个关系不是任意的——McCandlish 等人发现它满足一个非常干净的双曲线公式。

技术细节(选读)

把上面单步的分析在整个训练过程中做平均积分(具体推导在论文附录 D),可以得到一个描述”总步数 S”和”总样本数 E”的关系式:

\[\left(\frac{S}{S_{\min}} - 1\right)\left(\frac{E}{E_{\min}} - 1\right) = 1\]

S_min 是用无穷大 batch(最省步数)理论上需要的最少步数,E_min 是用极小 batch(最省样本、最费步数)理论上需要处理的最少样本数。基于这个公式,可以定义临界批量大小(critical batch size):

\[\mathcal{B}_{\text{crit}} = \frac{E_{\min}}{S_{\min}}\]

论文的理论预测是 B_crit ≈ B_noise。而这个双曲线公式里最有意思的一点是:当你恰好选 B = B_crit 训练时,S/S_min = 2,E/E_min = 2 ——也就是说,你会比”最省步数”的方案多花一倍的样本,同时比”最省样本”的方案多花一倍的步数。这正是”时间效率”和”计算效率”之间最自然的折中点。

优化步数 vs 处理样本数:双曲线权衡 处理样本数 E 优化步数 S B = B_crit 2×最少步数, 2×最少样本 小 batch 省样本费步数 大 batch 省步数费样本

这个数字自己会随训练变化

问题是什么

如果 B_noise 是固定的一个常数,那问题就简单了——训练开始前测一次,用一辈子。但真实情况更麻烦:噪声尺度自己会随着训练进程、模型规模、任务难度不断变化,这意味着”该用多大 batch”这个问题本身没有唯一答案,它是个动态的靴子,得随脚长边穿边换。

直觉:核心想法

回到”射箭”的比喻。训练刚开始时,模型参数几乎是随机初始化的,损失曲面还很陡,任何一个粗糙的方向大概都能让损失往下走一截——这时候箭往哪射基本都对,不需要瞄很准,小 batch 就够用(噪声尺度小)。但训练到后期,模型已经接近最优点附近,损失曲面变得平坦,继续改善需要精准判断该往哪个细微方向调——这时候手抖误差(噪声)的相对影响就被放大了,你需要瞄得更准才有意义,所以此时的最优 batch 会变得更大(噪声尺度变大)。

同理,任务越复杂,数据点之间的相关性越弱、越”各自为战”,每个样本告诉你的信息就越发散、越像噪声——所以更复杂的任务天然需要更大的 batch 才能稳定地估计出有意义的梯度方向。

技术细节(选读)

McCandlish 等人在论文里横跨 MNIST、SVHN、CIFAR-10、ImageNet、十亿词语言模型、Atari 游戏、Dota 1v1/5v5 等一系列难度递增的任务上验证了这套框架,几个关键实证发现:

  1. 噪声尺度随训练进程单调增大——因为公式 B_simple = tr(Σ)/ G ² 的分母 G ² 会随着损失接近极小值而不断变小,分子(梯度方差)基本保持不变,所以整体比值会越来越大。ImageNet 训练中噪声尺度从主训练阶段的 2000~100000,到微调后期能涨到几十万甚至百万级别。
  2. 噪声尺度几乎不依赖模型规模,只依赖损失值——固定住”当前达到的 loss”,不同大小的 LSTM 语言模型测出来的噪声尺度几乎一样。大模型看起来噪声尺度更大,纯粹是因为它们能达到更低的 loss,而不是”更大的模型天然需要更大 batch”这个说法本身。

  3. 任务复杂度和噪声尺度正相关——Dota 5v5(整张地图、5个英雄互动、局面组合数极多)的噪声尺度超过 1000 万,远高于规则更简单的 Dota 1v1;而生成模型(VAE、Autoencoder)因为每个样本自带更丰富的信息,噪声尺度反而比分类器小。

这些发现共同指向一个结论:噪声尺度本质上是”当前训练阶段+当前任务”的梯度信息密度的量度——信息密度越低(噪声越多),就需要更多样本凑一个 batch 才能滤出可靠信号。

这套理论今天还站得住吗?

问题是什么

这篇 2018 年的论文影响力很大——GPT-3 的技术报告明确写道”我们测量梯度噪声尺度,并用它指导批量大小选择”,这说明 OpenAI 在训练那个 1750 亿参数的模型时,真的把这套理论用在了生产环境里。但七年过去,2025 年 Allen Institute for AI 的一篇论文(Merrill 等人,”Critical Batch Size Revisited”)对这个方法提出了扎实的理论质疑。

直觉:核心想法

McCandlish 那套推导的核心简化,建立在两个假设上:第一,优化器是 SGD;第二,损失曲面的曲率处处均匀(Hessian 近似单位矩阵的倍数)。这两个假设在 2018 年的很多实验设置里大致成立,但今天几乎所有大模型训练都用 Adam(或其变体),而不是朴素 SGD。

问题在哪?因为 SGD 和 Adam 对”批量放大后学习率该怎么跟着调”这件事,答案是不一样的。用一个类比:如果你的车(SGD)在直路上加速,油门和车速大致成正比关系(线性缩放法则),但如果换成一辆带自适应巡航系统的车(Adam,它会自动根据每个方向历史梯度的大小做归一化),这套自适应机制本身已经在”消化”一部分批量变大带来的噪声降低,所以你不需要按线性比例踩那么深的油门——理论分析(用随机微分方程建模优化器的连续时间极限)表明,Adam 应该用平方根缩放法则:批量放大 k 倍,学习率只需要放大 √k 倍,而不是 k 倍。

McCandlish 的公式默认走的是线性缩放这条路,这意味着直接套用它算出来的”最优批量”在 Adam 训练下可能是不准的。

技术细节(选读)

2025 年的这篇论文提出了一个更直接、假设更少的测量方法——局部分支训练(local branched training):从某个训练 checkpoint 出发,用几个不同的批量大小 k·B(配合按各自优化器规则缩放的学习率)分别训练一小段固定 token 预算 Δ,直接对比各分支恢复到的 loss。哪个批量是”还能追上小批量 loss 水平”的最大值,那个就是当前阶段的临界批量,不需要计算 Hessian,也不用假设优化曲面多均匀。

用这套方法测量 OLMo 1B 和 7B 模型,得到几个新发现:

  • 临界批量在训练最开始时接近 0,随后迅速上升,最终趋于平台——这跟 McCandlish 理论”噪声尺度随训练进程增大”的整体方向是一致的,但增长曲线的具体形态有出入
  • 临界批量几乎不随模型规模变化——1B 和 7B 模型的临界批量曲线走势基本重合,意味着可以用小模型的廉价实验去指导大模型训练的批量选择,不用在大模型上反复试错
  • 基于这个发现,他们提出”批量大小热身“(batch size warmup)策略:训练开始时用小批量,随着临界批量增长逐步倍增批量。用这个策略训练 OLMo 1B,梯度步数减少了 43%,最终 loss 还略微更好

诚实的小结

这两篇论文之间七年的距离,展现的不是”谁对谁错”,而是理论模型的一个典型生命周期:2018 年的工作用一个简化但优雅的数学框架,第一次把”批量大小该怎么选”这个纯经验问题变成了一个可以定量预测的科学问题,并被 GPT-3 这样的顶级工程实践直接验证了可用性;2025 年的工作指出这个框架里藏着的简化假设(SGD、良态 Hessian)在 Adam 时代已经不完全成立,于是用更直接、假设更少的实证方法把这个问题重新测量了一遍——两者得出的宏观规律(存在一个动态变化、随训练进程增大的临界批量)是一致的,分歧只在于”具体数值该怎么估计最靠谁”。这也是为什么读研究论文最好带着时间戳去读——一个七年前的理论框架,可能今天依然指导实践,但具体的估算公式已经被更精确的方法取代。

这意味着什么

回到开头那个问题:能不能靠加 GPU、开大 batch 无限加速训练?答案现在应该很清楚了——不能,但也不是完全不能,关键在于知道那个转折点在哪。

对做工程的人来说,这套理论(不管是 2018 年的噪声尺度还是 2025 年的分支测量法)提供的实际价值是:不用靠反复试错的超参数搜索去猜”这次训练用多大 batch”,而是可以用一个廉价的统计量或小规模测量,提前算出大致范围。这直接省下了大量本该浪费在错误批量大小上的 GPU 时间和电费。

更深一层的启示是:“更多计算资源”不等于”更快的训练”,只有当你的计算资源被用在”减少噪声”这件真正稀缺的地方时才有意义;一旦噪声已经不是瓶颈,多余的算力就只是在空转。这个道理其实超出了 batch size 这个具体话题——数据并行、模型并行、专家并行,几乎所有”用更多硬件换更快训练”的策略,最终都要回答同一个问题:我买的这份额外算力,到底是在缓解一个真实的瓶颈,还是在往一个已经不缺的地方多倒水。

下一篇预告

我们在这篇文章里一直假设”梯度里的噪声是需要被消灭的敌人”。但如果这个假设反过来呢——有没有可能,恰到好处的噪声,反而是让模型找到更好的最优点、甚至逃出坏的局部结构的关键因素?这就引出了另一个关于训练动力学的有趣话题:噪声、正则化和泛化之间,究竟是敌是友。