从0训练LLM · 现代大模型体系 岔路 阅读 + 实验 ≈ 25 分钟 页内实验 ×1
C5 优化:参数怎么更新得又快又稳 岔路课

batch 能无限加大吗?

batch 大小与梯度噪声
batch 越大,平均梯度越准,但准到一定程度再加就是浪费。梯度噪声尺度量的就是这个「够用的 batch」:浏览器里的小模型刚初始化时只有约 26 个样本,训练 100 步后涨到一千多。所以 GPT-3、DeepSeek-V3 让 batch 从小到大渐增;可 Qwen3.8-Flash-Next 报告取消渐增反而更好——这里有分歧。
↳

岔路课 · 挂在第 5 课旁边。第 5 课讲学习率随步数怎么变;这一课问同一类问题的另一半:batch 要不要也随训练变?

❓

本课一问:batch 越大,平均梯度越准。那 batch 能不能无限加大?

这一课先不碰:大 batch 怎么分到多张卡上(C10);最优 batch 与学习率怎么随模型规模变化(C6)。

从已有出发

第 1 课说过:每一步用一小批数据的平均梯度代替全量梯度。「小明把苹果给了小王」只是一条样本,一批里有成千上万条这样的序列。批越大,平均出来的梯度越接近全量梯度。

从已有出发 · 训练的一步(点任一环节看它在 Qwen/Qwen3.8-27B 上有多大) 本课本章后面的课

B 条样本的平均梯度,方差是单条样本梯度方差的 1/B 。所以 batch 翻倍,噪声的方差减半——但「方向」本身并不会因此变得更好,它只是更接近那个本来就在的全量梯度。

先自己设计:batch 越大越好,开局就用最大的

最直接的想法:显存允许多大就用多大,从第 1 步用到最后。要判断值不值,得先量一个数:这一刻,多大的 batch 才算「够准」?McCandlish et al. 2018 给了一个容易测的量——梯度噪声尺度 Bsimple = tr(Σ) ÷ |G|²:分子是单条样本梯度的方差(噪声),分母是全量梯度的长度平方(信号)。batch 远小于它时,加大 batch 几乎是白赚;远大于它时,再加就是在重复同一个方向 。

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案batch 越大越好,从第 1 步起就用最大的 batch
梯度噪声尺度:batch 多大才不浪费 字级 MLP · 24,896 参数 · 《三國志演義》24,000 字 · 浏览器内真训练
等待开始(滚动到这里会自动开始)

数字来源:浏览器实时训练(纯 JS,Float64)。模型、语料、种子写在上方;同一组对照里所有 run 共用初始化和取批顺序,只改被比较的那一项。换种子重跑可以看到噪声有多大——差异小于种子间波动时不下结论。

🎯

试三件事:① 读表格第一行:第 0 步 |G|² 约 1.3,tr(Σ) 约 33,Bsimple ≈ 26——比本实验的 batch(32)还小。② 看第 50、100 步:|G|² 掉了一个多数量级(模型学会了「大方向」,剩下的梯度彼此不太一致),Bsimple 升到上千。③ 把种子切到 2 再跑:开局约 24,第 100 步约 1,800;后期几个点上下跳得厉害——那时 |G|² 已经小到和 tr(Σ) ÷ N 同一量级,估计本身有噪声,只看量级。

真实做法:渐增,还是一开始就大

模型batch 的做法出处
GPT-3训练中测梯度噪声尺度来指导 batch 选择;前 4–12B token 内从 32K token 线性增大到满值;而且模型越大 batch 越大、学习率越小(125M:0.5M token、6.0×10−4;175B:3.2M token、0.6×10−4)论文 §2.3、附录 B、表 2.1
DeepSeek-V3前 469B token 内从 3,072 条增加到 15,360 条(每条 4K,即 12,582,912 → 62,914,560 token)报告 §4.2
DeepSeek-V4-Flash从较小的值增加到 75.5M token,之后保持报告 §4.2.2
Llama 3 405B4M → 8M → 16M token 分段增大论文(R4 摘录)
Qwen3.8-Flash-Next取消 batch warmup:从 6.3M 逐步升到 25.2M,不如一开始就用 25.2M,还多花 18.8% 的优化步数技术报告(R2 摘录,官方自报)
DeepSeek-V4.1-Flash全程固定 100.6M,不做 batch warmup技术报告(R3 摘录)

前四家渐增,后两家(2026 年的新配方)不渐增。两者都是各自规模与配方下的实验结论,不能互相否定;Qwen 的报告同时重新拟合了「最优 batch 与学习率」的超参 scaling law,取消渐增是在新的更大 batch 下观察到的。

临界 batch 也随 loss 变:Kaplan 的一个经验式

Kaplan et al. 2020 把「临界 batch」拟合成 loss 的函数:Bcrit(L) ≈ B∗ ÷ L1/αB,B∗ ≈ 2×108 token,αB ≈ 0.21 。代入:L = 3 时约 1,069,114 token,L = 2 时约 7,371,465 token——loss 从 3 降到 2,临界 batch 变成约 6.9 倍。方向和上面小模型的测量一致:loss 越低,值得用的 batch 越大。

⚠ 常见误解

⚠

「batch 翻倍、学习率跟着翻倍,效果就一样,只是步数减半。」这条线性缩放规则(Goyal 2017)只在 batch 远小于临界 batch 时近似成立。batch 超过噪声尺度之后,再翻倍几乎不减少所需步数,却要多用一倍数据。

⚠

「Qwen 取消了 batch warmup,说明渐增是错的。」它说明的是:在 Qwen3.8-Flash-Next 的模型、数据和重新拟合的超参下,一开始就用 25.2M 更好。GPT-3、DeepSeek-V3 在各自设置下选了渐增。引用任何一个结论,都要连同条件一起引。

在演进地图上的位置

优化的演进:每一代都被上一代的某个真数字逼出来(点名字去那一课;完整版在章首页)
  1. 全量梯度下降
  2. 小批量随机梯度下降 SGD
  3. 动量(重球法)
  4. Adam:每个参数一把尺子
  5. AdamW:解耦权重衰减
  6. 学习率 warmup
  7. 学习率衰减:cosine → WSD
  8. batch 大小:渐增,还是一开始就大
  9. 全局梯度范数裁剪
  10. Muon:按矩阵的奇异方向更新
旁支batch 大小:渐增,还是一开始就大McCandlish 2018;GPT-3、DeepSeek-V3、Qwen3.8-Flash-Next你在这里
解决了梯度噪声尺度随 loss 下降而变大:微型模型从初始化时的约 25 个样本涨到 100 步后的 1,000 以上,所以 batch 可以后期再加大。
卡在有分歧:Qwen3.8-Flash-Next 报告称一开始就用 25.2M token 的 batch,比从 6.3M 渐增更好,还省 18.8% 步数(官方自报)。
数字口径:峡谷步数、Newton-Schulz 范围、DeepSeek-V3 与 WSD 的步数账在构建时现算;标「浏览器实训」的来自本章 MicroTrainer 的默认设置(种子 1,Chrome 实测);DeepSeek-V3 数字出自其报告 §4.2(本地 PDF);Moonlight「约 2 倍」出自 arXiv 2502.16982 摘要;Kimi K2「max logit > 1000」出自 arXiv 2507.20534;Qwen3.8-Flash-Next 为官方技术报告自报。

证据三问

问本课的回答
① 它解决什么问题?batch 太小,梯度噪声大;太大,多出来的样本只是在重复同一个方向,浪费数据和算力
② 数学上为什么可能有效?均值梯度的方差 ∝ 1/B ;「噪声尺度决定有用的 batch 上限」是 McCandlish 的经验模型加简化理论
③ 实验上为什么最后选了它?GPT-3、DeepSeek-V3、Llama 3 渐增;Qwen3.8-Flash-Next、DeepSeek-V4.1-Flash 不渐增

一句话

📌

batch 加大只减少噪声;噪声已经不是瓶颈时,再加 batch 就是浪费 token。

回到主线

岔路到此。回到第 5 课之后的问题:一个超大的梯度会把模型甩飞吗? → 第 6 课:梯度裁剪

你可能会问

这一课还没有收到真实提问;你的提问会记到 05-问答记录/C5-B1.md。

🔍 噪声尺度是怎么从一堆单样本梯度里算出来的?

组件每个时刻取 3,000 条训练样本,各算一个单样本梯度 gi。它们的平均 ḡ 是 G 的估计;tr(Σ) 用单样本梯度的样本方差(除以 N − 1)估计;而 |ḡ|² 的期望是 |G|² + tr(Σ)/N,所以 |G|² 的估计要扣掉 tr(Σ)/N。三个数都在表里。|G|² 越小,扣掉的那一项占比越大,估计越不稳——这就是后期几个点上下跳的原因。