章节导航 第 6 章 / 共 16 章
预训练配方
学习率、Batch Size、数据配比、训练稳定性——工业级预训练的完整配方
什么是”预训练配方”
预训练配方(pre-training recipe)是一个完整的训练方案,包括:
- 优化器选择和超参数:Adam/AdamW 的
- 学习率调度:warmup、decay 策略、最终学习率
- Batch size 调度:是否使用渐进式增大
- 数据配比和采样策略:不同来源数据的混合比例
- 训练稳定性措施:loss spike 处理、梯度裁剪等
- 检查点策略:保存频率、恢复方法
看似简单的超参数选择,背后是大量的 ablation 实验和工程经验积累。本章将详细拆解每一项。
优化器
AdamW
几乎所有现代 LLM 都使用 AdamW(Loshchilov & Hutter, 2019)优化器,即带解耦权重衰减的 Adam:
常见超参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 0.9 | 一阶矩衰减 | |
| 0.95 | 二阶矩衰减(LLM 中通常用 0.95 而非默认 0.999) | |
| 1e-8 | 数值稳定性 | |
| 0.1 | 权重衰减。数据充裕区制的通用默认;数据受限、需要多 epoch 重复训练时,近期 scaling-law 工作(arXiv:2605.01640,COLM 2026)实测更强的 weight decay()可把过拟合系数降低约 70%——见第五章 |
为什么 而不是 0.999? 更小的 意味着二阶矩估计对最近的梯度更敏感,对于 LLM 训练中可能出现的 loss spike 响应更快。LLaMA 和 PaLM 都使用 0.95。
新一代优化器
AdamW 的一个痛点是内存开销大——需要为每个参数存储两个状态( 和 ),加上 FP32 的参数副本,总共需要 16 bytes/参数(模型 4B + 梯度 4B + 4B + 4B)。
一些新优化器致力于降低内存使用:
- Adafactor:通过矩阵分解将二阶矩从 压缩到
- CAME:结合了 Adam 和 Adafactor 的优点
- Sophia:使用 Hessian 对角线的近似来做自适应学习率
- LION:只使用 sign 更新,内存减半(不需要 )
SOAP:二阶预条件优化器
SOAP(Shampoo with Adam in the Orthogonalized And Preconditioned eigenbasis,NVIDIA,2026-07)是 Shampoo 类二阶优化器的最新进化。与 Muon 在原始梯度空间做正交化不同,SOAP 在 Shampoo 预条件子的特征基中运行 Adam 风格的逐元素自适应更新:
其中 、 是梯度协方差矩阵的特征向量,Adam 在旋转后的特征空间中应用。SOAP 的核心洞察:在特征基中,不同方向已被解耦,Adam 的自适应机制可以更精确地调节每个方向的更新步长。
NVIDIA 的工业级验证(arXiv:2607.20548,2026-07-13):NVIDIA 团队首次在 72B 参数、3T tokens 规模联合验证了 SOAP 和 Muon 的性能。关键发现:
- 大批次稳定性:在 100M token 批次规模下 SOAP 和 Muon 保持稳定,而 AdamW 出现退化——这对 GPU 集群利用率至关重要
- “slingshot”不稳定性:SOAP 在大批次下有梯度范数周期性爆炸倾向,通过每步 QR 分解 + KL-Shampoo 协方差估计修复
- 层级分布式优化器:开发了与 Megatron-LM 兼容的实现,代码已开源
与 Muon 的统一视角:在 SVD 分解下,SOAP、Shampoo 和 Muon 都收敛于提取梯度矩阵的 polar factor。区别在于预条件子的构造方式:Muon 用 Newton-Schulz 迭代做正交化,SOAP 用协方差矩阵的特征分解做预条件。
当前定位:SOAP 的 72B/3T 验证使其从”学术优化器”升级为”工业级候选”。与 Muon 家族形成”双雄格局”——Muon 在计算效率上领先(2× vs AdamW),SOAP 在大批次稳定性和内存效率上有独特优势。对于 100M+ token 大批次训练场景,SOAP 是目前唯一经过大规模验证的二阶选项。
Muon:从实验到工业级验证
Muon 使用矩阵正交化替代 Adam 的逐元素自适应学习率,核心操作是对梯度矩阵做正交化投影(Newton-Schulz 迭代替代 SVD 以获得 GPU 上的高效实现)。
MoonshotAI 的 Moonlight-16B-A3B(MoE 模型,5.7T tokens)首次在 Scaling Law 实验中严格验证了 Muon 相比 AdamW 约 2 倍计算效率——即达到同等 loss 所需的 FLOPs 减半。这将 Muon 从”在部分实验中超越 Adam”升级为有 Scaling Law 指导的可靠选择。
Distributed Muon 的工程要点:
- 采用 ZeRO-1 风格分布式实现,消除内存和通信瓶颈
- Newton-Schulz 迭代替代 SVD,避免 GPU 上 SVD 的低效
- Embedding 层和 LM Head 仍使用 AdamW(Muon 在 1D 参数上退化为 SignSGD)
- 矩阵量共享方案实现通信与计算重叠
⚠️ distributed Muon 的性能瓶颈:传统 Muon 在分片训练中因需重建完整矩阵,端到端步时间可达 AdamW 的 2.2 倍。DMuon(自变量机器人,2026-07)通过细粒度通信优化、计算感知负载均衡和高性能内核消除冗余,将步时间拉近 AdamW 水平。但 DMuon 目前为工业界发布,非同行评审论文,大规模验证数据尚不充分。
Muon 家族生态
自 Muon 的原始论文以来,一系列改进方案已形成”Muon 家族”,分别从不同维度优化正交化过程。
先看验证规模,再看机制。 本章列出的 Muon 变体中,除 Kimi K2 使用的 MuonClip(1T 参数工业验证,厂商自评)外,其余全部在 ≤7B 规模验证,多数仅到 1.1B 或 1.2B。若你的目标规模在 7B 以上,本章任何”一致优于 Muon”的结论都不构成选型依据,应优先参考 Kimi K2 的 MuonClip 路线(注意其为厂商一手 tech report,非同行评审)。若目标在 1B 以下,可按改进对象(正交化前 / 后 / 范围)选择。
Muon+:修复 post-polar 不平衡
Muon+ 发现 polar 迭代后存在 post-polar imbalanced update 问题——正交化后列/行范数不平衡被放大。解决方案极简:在正交化后插入一步归一化,无需额外优化器状态。60M 到 7B 参数实验中一致优于原始 Muon。
Teon:跨层联合正交化
Teon 将 Muon 的逐层独立正交化推广为跨层联合正交化(tensor-level),捕获层间相关性。理论分析证明 Teon 比 Muon 有更强收敛保证。在 GPT/LLaMA 各规模上一致优于 Muon。
Muon²:自适应二阶矩预条件
Muon² 在正交化前应用 Adam 风格的自适应二阶矩预条件,改善动量矩阵的条件数,Newton-Schulz 迭代次数减少 40%。还有内存高效变体 Muon²-F,可降低内存开销。60M 到 1.3B 参数验证。
Muon-NSR / Muon-VS:方差自适应正交化
Muon-NSR 受”Adam 本质上是方差自适应 sign 更新”的视角启发,提出在正交化前对动量应用方差自适应归一化。LLaMA-1.2B 上达到目标 loss 的迭代次数减少 1.36x。
Muon-VS 是同一篇论文的第二个变体,此前本段只解释了 NSR。两者的区别在于方差调制的形式:NSR 用噪信比(noise-to-signal ratio)调制,VS 用方差缩放,且不引入任何超出 Muon 本身的超参数。两者都保留 Muon 的谱归一化结构,只需额外一份方差缓冲。当前版本摘要明确给出:Muon-VS 在 Llama-1.2B 上以 Muon 的最终验证损失为目标,取得 1.33× 的 step-to-target 加速;实验覆盖 125M–1.2B。NSR 与 VS 同属”正交化前方差自适应”这一类。
MuonClip:万亿参数工业验证
MoonshotAI 的 Kimi K2(1T 总参数 / 32B 激活参数 MoE,15.5T tokens)使用 MuonClip 优化器完成万亿参数预训练,全程零 loss spike。MuonClip 通过 QK-Clip 技术解决大模型训练中 attention logits 偏大的问题,将 Muon 的适用范围从 16B 扩展到 1T 参数。这是 Muon 从”Scaling Law 验证”到”万亿参数工业验证”的关键里程碑。
证据等级提示:本段来源为 MoonshotAI 官方技术文章(厂商一手 tech report),非同行评审论文,其中的”全程零 loss spike”属厂商自评数据。引用时请按厂商自评对待——事实层面可采信,效果强度可能与独立复现存在差异。本章对 Qwen 系列改动(QSA、Qwen 版 PLE、Qwen 版 Gated Residual、Qwen 的 Muon 改动)同样适用此原则:这些改动均无独立论文,仅见于官方 blog 与 tech report。
MuonEq:正交化前均衡
MuonEq(中科院深先院/鹏城实验室,2026-05)在 Newton-Schulz 正交化前应用行/列归一化,改善正交化输入的几何条件数。LLaMA2 预训练 130M~1B 参数一致优于原始 Muon。实现极简——仅在 NS 迭代前插入一步归一化。
OrScale:层级信任比缩放
OrScale(2026-05)为 Muon 添加层级信任比(trust-ratio)缩放,解决全局学习率无法适应不同层梯度分布差异的问题。125M~1.1B 参数上一致优于 Muon+Moonlight。核心洞察:不同层的权重矩阵在训练中梯度范数差异可达 10×,统一学习率对某些层过约束、对另一些层欠约束。
⚠️ 以上两个方法目前仅在 ≤1.1B 参数规模验证,工业级可用性待确认。
NorMuon:正交化 + 自适应是互补而非竞争
NorMuon(Neuron-wise Normalized Muon,arXiv:2510.05491,ICML 2026 Spotlight)是同一方向上一条独立路线。与 MuonEq / OrScale”改进正交化过程本身”不同,NorMuon 的核心论点是正交化与自适应学习率是互补关系,而非竞争关系:它先沿用 Muon 的正交化,再对每个神经元维护二阶动量统计并做行级归一化,在保留 Muon 条件数优势的同时让各神经元的步长更均衡。论文在 1.1B 预训练设置下报告训练效率比 Adam 高 21.74%、比 Muon 高 11.31%,且内存占用与 Muon 相当。工程上提供了 FSDP2 分布式实现,开源见 zichongli5/NorMuon,已被 karpathy/nanochat 采用。
⚠️ 与前述 MuonEq / OrScale 一样,NorMuon 的验证规模仍偏小:论文覆盖 124M / 350M / 1.1B / 5.4B 四个尺度,但上文的 21.74% / 11.31% 这组数字出自 1.1B 设置;即便最大的 5.4B 距工业级预训练规模仍有距离,可用性待确认。
QSD:从线性局部模型到二次局部模型
上面这些变体可以按改进对象分为三类:正交化前(MuonEq 均衡、Muon-NSR / Muon-VS 方差自适应、Muon² 预条件)、正交化后(Muon+ 归一化、OrScale 信任比缩放、NorMuon 神经元级归一化)、正交化范围(Teon 跨层联合)。
QSD(Quadratic Spectral Descent)(华中科技大学,2026-09)不属于任何一类——它改的是局部模型的阶数。Muon 等价于在谱范数球上优化线性局部目标,其解是矩阵符号更新:保持梯度的奇异方向,并给所有活跃奇异模赋予相同幅度。QSD 问的是把局部曲率考虑进来后这两个性质还最优吗。做法是保持谱范数约束不变、把线性局部模型换成二次模型,用 Kronecker 因子化统计量近似曲率,用少量 Frank-Wolfe 步求解带约束二次问题(每步的子问题仍有闭式矩阵符号解),并给出最优性证书与 的内求解收敛率。曲率对最优更新的奇异值和奇异方向都有影响——这正是那两个性质在考虑曲率后不再最优的原因。GPT 预训练上一致优于 Muon 及近期变体,匹配验证损失下 wall-clock 训练时间最多减少 8.49%。
⚠️ QSD 为 2026-09 新预印本,3 位作者、GPT 规模验证,无独立复现,工业级可用性待确认。
优化器状态也能量化
上面所有讨论针对权重、激活与梯度的数值格式,但优化器状态本身同样占显存——而 Muon 相对 AdamW 的一大卖点恰恰是只用一阶矩、显存友好。这个方向此前少有人做,原因是 Muon 的正交化会丢弃奇异值的幅度、只保留方向信息,奇异向量方向上的微小量化误差会在更新中被放大,通用量化方法直接套用会失效。
MuonQ(COLM 2026)以”方向保真”为原则给出一套 4-bit Muon 训练框架,三步组合:① 量化前归一化,使每一步引入的量化误差幅度一致,避免累积误差产生偏好方向;② 结构分解,用幂迭代单独量化主导奇异分量,使量化误差只扰动奇异值幅度而不旋转奇异向量方向;③ -law 压扩量化,把分辨率分配给分布密集的动量值——量化目标从”保住离群点”转为”区分密集区”。GPT 风格与 LLaMA 风格的预训练实验显示,4-bit MuonQ 能恢复全精度 Muon 的大部分训练损失与下游精度,优化器状态显存最高降低 7.3×。
⚠️ 本章此前完全未讨论优化器状态的数值格式,本条是补这个结构缺口;具体的 7.3× 为论文自评,且恢复”大部分”而非全部精度——实际落地需按你的精度预算权衡。
优化器对比
⚠️ 读表须知:下表”相对训练效率”是各方法在其原始实验设置下测得的比值,不是跨场景常数。2025–2026 年优化器综述(arXiv:2608.28557,blog 形式的综述,非同行评审)给出的核心经验结论是:矩阵感知方法(Muon / Shampoo / SOAP 家族)代表真正的进步,但不存在”上下文无关”的 AdamW 替代品——排名会随模型规模、数据-参数比(D/N)、批次大小、学习率调度、参数划分方式、调优预算,以及目标指标究竟是 token 数、FLOPs、挂钟时间还是显存而变化,同一个优化器在这四种目标下的排序可能完全不同。
因此本表应作为候选集与量级参考,而非选型决策表。实际选型请在自己的规模 / 批次 / 调度下做小规模对照。
🔴 上面那串并列因素里,“批次大小”这一项的证据等级高于其余各项。 其余(模型规模、D/N、调度、参数划分、调优预算、目标指标)是综述给出的定性列举;而”最优优化器随 batch size 改变”是一条被测过的否定性结论——arXiv:2610.08975(2026-10-06)在充分超参调优后仍观察到排名反转,并证明 Muon 不存在可跨设置稳定生效的有原则缩放规则。详见 §「Critical Batch Size」。
另:本表右列的 OmniOpt 分层同样不是静态全局答案。该论文明确要求读者把它当作基于约束的决策坐标系——三档随主要约束(稳定性/长序列质量/短序列内存/每步成本)而重排。
OmniOpt 的分层对照(OmniOpt,arXiv:2607.04033,2026-07-04,12 位作者;91 页统一 survey + benchmark,覆盖 100+ 优化器)。它把评测过的优化器分成三档,下表右列标出本章各方法所处档位:
| 优化器 | 参数状态内存 | 相对训练效率 | 适用场景 | OmniOpt 分层 |
|---|---|---|---|---|
| AdamW | 16 bytes/参数 | 1.0× (基线) | 通用默认选择 | Tier I |
| Adafactor | ~12 bytes/参数 | ~0.95× | 内存受限、超大模型 | Tier III |
| 8-bit Adam | ~12 bytes/参数 | ~0.98× | 内存受限、需兼容 Adam 生态 | Tier III |
| LION | ~12 bytes/参数 | ~1.0× | 内存受限、简洁实现 | Tier II |
| Muon | ~16 bytes/参数 | ~2.0× | 追求计算效率、有工程能力 | Tier I |
| SOAP | ~24 bytes/参数 | ~>2.0× | 二阶预条件,大批次稳定性优于 AdamW,72B 工业验证 | Tier II |
| Muon+ / Teon / Muon² / MuonClip | ~16–20 bytes/参数 | ~>2.0× | Muon 家族变体(见上节) | 未参与该基准 |
| —— | —— | —— | RMNP(行归一化的矩阵结构方法,本章未收录) | Tier I |
完整的三档名单(Table 17):
- Tier I(primary candidates):Muon、RMNP、AdamW。论文定义为”对实践基线与后续机制分析最重要的优化器”。
- Tier II:MARS-Lion、MARS-Shampoo、APOLLO、Conda、AdamP、MARS-AdamW、SOAP、Adan、Lion。论文称其为”重要的条件性基线,适用性取决于具体训练场景”。
- Tier III(diagnostic failure cases):RAdam、NAdam、Prodigy、AdaBelief、GaLore、Shampoo、8-bit Adam、CAME、AdaFactor、Adam-mini、LAMB、Sophia。
⚠️ 三档不是排行榜,且论文自己这么说。 原文:“将其解读为严格的全局排行榜会产生误导(Interpreting them as a strict global leaderboard would be misleading)。” 它是基于约束的决策框架:排名随主要约束(稳定性/极致长序列质量/短序列内存/每步成本)而改变。Tier III 也不是”没用”——论文点名 Adafactor 的 optimizer-state 显存极低、GaLore 的低秩子空间压缩、8-bit Adam 的状态精度压缩都是真实存在的单点优势,只是这些优势没有换来质量/效率/迁移性上的一致有利权衡。
两处需要改写本章原判断的地方:
- “内存是首要瓶颈就上 Adafactor / 8-bit Adam” → 应降级为兜底而非首选。 在 OmniOpt 的基准协议下两者属 Tier III。论文给出的短序列内存受限高收益方案是 APOLLO(Tier II),但须额外验证长序列性能。
- SOAP 的定位要补上成本那一半。 保留”NVIDIA 72B/3T 验证、大批次稳定性”这一事实;同时补上 OmniOpt 的口径——论文原话是”SOAP 是长上下文训练的质量上限,也是跨架构迁移性最好的方法;它太昂贵以至于不能作为默认选项,只在最终质量压倒一切、算力与内存不是瓶颈时才有价值”。本章此前只写了”能力上限”这一半,读者会低估其成本。
实战选择(2026-10 修订):AdamW 仍然是最广泛使用的默认选择,OmniOpt 也把它放在 Tier I 作为”任何其他方法都应以它为起点衡量额外价值”的参考基准。Muon 家族已从 Scaling Law 实验验证(Moonlight-16B-A3B 的 2x 效率)升级为万亿参数工业验证(Kimi K2 的 MuonClip,全程零 loss spike),且同样位于 Tier I。对于新项目,Muon/Muon+ 值得作为首选之一纳入评估;如果训练中出现 attention logits 爆炸问题,MuonClip 是针对性解决方案。SOAP 的定位是”极致长序列质量的上限参考”,不是日常默认——它的代价是极高的运行时间与内存。内存作为首要瓶颈时,Adafactor / 8-bit Adam 只能算兜底:它们的单点优势真实但没有换来一致的权衡收益,短序列场景应一并评估 APOLLO。
优化器的叠加原则:本章一直在问”选哪个”,但没人问”能不能一起用”
上面的对比表(以及「Muon 家族生态」里那一长串按正交化前/后/范围分的变体)留下一个读者必然会问、本章此前答不了的问题:这些方法能不能叠加?
OmniOpt 用一个五阶段元流水线来回答这个问题:S0 梯度信号获取 → S1 参数分块路由 → S2 梯度变换 → S3 状态演化 → S4 更新重构 → S5 更新正则化。关键在于两个机制落在哪个阶段,而不是它们叫什么名字。
可以叠的(落在不同阶段 / 不同轴):
- 方差缩减信号(S0)可以喂给 AdamW、Lion 或 Shampoo——它改的是输入,不占用任何后续的变换槽位;
- 低秩投影(S2/S4)可以与状态量化(S3/S4)叠加;
- 后处理滤波器、trust-ratio 包装器(S5)可以包在任何基础优化器外面。
不能自由叠的(争用同一个槽位):
两个强 S2 矩阵约束——谱正交化与低秩投影——会争抢同一个位置。 组合它们不是免费的:必须先规定是”先投影再正交化”还是”先正交化再投影”,两种顺序给出不同的更新方向与不同的状态显存占用。
另一条同类冲突:LOMO 式的反向-更新融合流式处理(T4.4)缩短了梯度的生命周期,因此与任何需要在更新前读完整梯度的机制冲突。
判据的一句话版本:
坐标差异越大的两个方法越容易叠加;在同一轴上都有强非默认操作的,叠加时要先定顺序。
这条与 §「Muon 家族生态」已有的三分法(正交化前/后/范围)是同一套语言:那一节告诉你每个变体改在哪,这一节告诉你哪两个能一起改。另外值得记一笔——论文在 Muon 的机制消融里确认:Muon 内部的对称双向学习率缩放与 post-orthogonalization 的 Nesterov 动量,两者是可跨模型规模稳定叠加的(在标准 Transformer 上)。
学习率调度
学习率调度可能是预训练配方中最关键的超参数。传统上,学习率调度被视为必须精确设计的时间函数——从 cosine 到 WSD,每种方案都需要在训练开始前确定衰减曲线。但近期的 WSM 框架揭示了一个更深层的理解:衰减的本质是对不同训练阶段的模型做加权平均,这可以在训练结束后通过检查点合并实现。这一认知更新将在本节末尾详述。
Cosine Schedule
LLaMA 系列使用经典的 cosine decay:
其中 是 warmup 步数, 是总训练步数。
典型配置:
- Peak LR (): (7B 模型)到 (70B 模型)
- Min LR (): Peak LR 的 1/10
- Warmup: 2000 步
WSD Schedule(Warmup-Stable-Decay)
MiniCPM 和 DeepSeek V3 使用了一种更灵活的三阶段调度:
LR
^
| ___________________________
| / \
| / \
|/ \____
+---+-----------------------------+----→ steps
warmup stable decay
优势:
- stable 阶段使用恒定学习率,不需要预先知道总训练步数
- 可以灵活决定何时开始 decay
- 适合”训到什么时候满意就停”的场景
- 方便 mid-training 的接续训练
WSM Schedule(Warmup-Stable-Merge)
WSM(ICLR 2026 正式接收)在 WSD 基础上更进一步——完全消除了学习率衰减阶段:
LR
^
| ___________________________
| /
| / ← 训练全程恒定 LR
|/
+---+-----------------------------→ steps
warmup stable
↓
训练结束后合并多个检查点 → 最终模型
核心洞察:WSM 在理论上证明了学习率衰减与检查点合并的数学等价性——cosine decay 的效果本质上等价于在恒定学习率下保存多个检查点后做加权平均。
三步流程:
- Warmup:常规线性预热
- Stable:全程使用恒定高学习率(不衰减)
- Merge:训练结束后,对多个 stable 阶段的检查点做加权平均
相比 WSD 的优势:
| 特性 | Cosine | WSD | WSM |
|---|---|---|---|
| 需要预设总步数 | 是 | 否 | 否 |
| 需要 decay 阶段 | 是 | 是 | 否 |
| 训练随时可停 | 否 | 部分 | 完全 |
| 训练可无缝续训 | 困难 | 容易 | 最容易 |
Ling-2.0(灵犀 2.0)在工业级预训练中采用了 WSM 风格的无衰减策略,验证了其在大规模训练中的实用性——训练全程不需要预设总步数,随时可停、随时可续,最终通过合并多个检查点获得高质量模型。
独立第三方验证:除 Moonlight-16B-A3B 之外,Essential AI 的系统性研究”Practical Efficiency of Muon for Pretraining”提供了独立验证结论:Muon 在大批量训练时效率保持能力优于 AdamW,达到相同训练目标可节省 10-15% 数据处理量。这补充了 Moonlight 在中小批量场景之外的验证。
学习率与模型大小的关系
Yang et al. (2022) 的 μP(Maximal Update Parameterization)理论给出了一个优雅的结论:
可以在小模型上调好超参数,然后直接迁移到大模型。
具体来说,当模型宽度从 扩展到 时,μP 建议:
- 学习率缩放为原来的
- 输出层权重初始化缩放为
- 其他层权重保持不变
这使得在 100M 模型上调好的学习率可以直接外推到 70B,大幅节省 hyperparameter search 的成本。
Batch Size
固定 vs 渐进 Batch Size
GPT-3 论文 使用了渐进式增大 batch size:从 32K tokens 开始,逐步增大到 3.2M tokens。
渐进 batch size 的直觉:
- 训练初期,梯度方向变化大,小 batch 提供更多更新次数
- 训练后期,梯度方向趋于一致,大 batch 更高效且更稳定
Critical Batch Size
McCandlish et al. (2018) 定义了 critical batch size :
其中 是梯度噪声尺度。当 时,增大 batch size 可以几乎线性加速训练;当 时,增大 batch 的收益递减。
经验值:对于 7B 模型, 通常在 2-4M tokens 左右。
换 batch size,就要重选优化器——这不是提醒,是被测过的否定性结论。
本节讲的是”batch size 多大合适”,但还有一个连带后果此前没写:batch size 变了,上一轮调优出来的优化器可能就不再是最优的。
The Best Optimizer Depends on Batch Size(Dang、Wen、Malladi,2026-10-06)直接挑战了”某个 batch size 下的最优优化器在另一个 batch size 下仍最优”这一隐含假设,给出两条结论:
- 没有任何有原则的 Muon 缩放规则能在不同训练设置下稳定生效。
- 即便经过极其充分的超参数调优,语言模型预训练的最优优化器仍然会随 batch size 改变。
机制上,作者用噪声二次模型证明:保持性能的 batch size 缩放规则是方向依赖的——随着某个方向的曲率/噪声比升高,缩放规则会从平方根型转向线性型;梯度噪声在预条件中驱动了一个偏差-方差权衡,即便学习率与动量都调到最优,优化器排名也会在不同 batch size 间反转。
论文还给出一个可操作的补救:把 batch size 在中途放大 16× 时,只在最尖锐的 0.001% 方向上保留小 batch 更新,可在随后 8% 的训练中消除由此产生的 loss gap 的最多 59.5%;而同样大小的随机子空间几乎没有帮助。
实践含义(写进训练 runbook 的那一条):当全局 batch size 因集群规模、并行策略或硬件配置而调整时,不能沿用旧 batch size 下调优出的优化器与超参组合,应在目标 batch size 下重新验证。这一点与下面 Batch Size warmup 的调参预算要一并考虑。
⚠️ 别和 μP 搞混——这是两条不同的轴。 §「学习率与模型大小的关系」里的 μP 解决的是跨模型规模迁移超参;本条讲的是跨 batch size 迁移失败。μP 在小模型上调好超参放大模型这件事上成功,并不保证 batch size 方向上同样可迁移。 两个方向都要迁移时,两条约束要同时满足。
训练稳定性
大模型训练最痛苦的问题之一是训练不稳定——loss spike、loss divergence、NaN 等。
Loss Spike
Loss spike 是训练过程中 loss 突然飙升的现象。常见原因:
- 数据问题:某个 batch 包含异常数据(如超长序列、乱码)
- 学习率过高:模型进入 loss landscape 的不稳定区域
- 数值溢出:FP16 训练中梯度超过表示范围
- Adam 状态异常:二阶矩估计在训练初期不准确
应对策略
1. 梯度裁剪(Gradient Clipping)
典型裁剪阈值 。几乎所有 LLM 训练都使用。
2. z-loss
PaLM 引入了 z-loss 正则化:
其中 是 logits。z-loss 惩罚过大的 logits 值,从而抑制 softmax 的数值不稳定。
3. QK-Norm
对 Attention 的 和 做 LayerNorm:
Dehghani et al. (2023) 证明 QK-Norm 可以显著提升训练稳定性,尤其是在使用 ViT 或深层 Transformer 时。
4. 检查点回滚 + 数据跳过
当 loss spike 发生时:
- 回滚到 spike 前的检查点
- 跳过导致 spike 的数据 batch
- 降低学习率重新开始
这需要频繁保存检查点(如每 100 步),以及记录每个 batch 的数据索引。
训练监控实战
在工业级预训练中,你需要一套完整的监控系统来及时发现和处理问题:
核心监控指标:
from dataclasses import dataclass
from typing import List, Optional
import math
@dataclass
class TrainingMetrics:
"""每步训练指标收集"""
step: int
loss: float
lr: float
grad_norm: float
throughput_tokens_per_sec: float
gpu_memory_used_gb: float
mfu: float # Model FLOPs Utilization
# 可选的细粒度指标
loss_by_domain: Optional[dict] = None # 分域 loss
max_logit: Optional[float] = None # 最大 logit 值
embedding_norm: Optional[float] = None # embedding 层参数范数
def is_anomaly(self, history: List['TrainingMetrics'], window: int = 100) -> dict:
"""检测异常"""
alerts = {}
if len(history) < window:
return alerts
recent_losses = [m.loss for m in history[-window:]]
mean_loss = sum(recent_losses) / len(recent_losses)
std_loss = (sum((l - mean_loss)**2 for l in recent_losses) / len(recent_losses)) ** 0.5
# Loss spike: 超过 3 sigma
if self.loss > mean_loss + 3 * std_loss:
alerts["loss_spike"] = {
"severity": "HIGH",
"value": self.loss,
"threshold": mean_loss + 3 * std_loss,
"action": "检查当前 batch 数据质量,考虑跳过"
}
# Loss 发散: 连续上升
if len(history) >= 5:
last_5 = [m.loss for m in history[-5:]] + [self.loss]
if all(last_5[i] < last_5[i+1] for i in range(len(last_5)-1)):
alerts["loss_diverging"] = {
"severity": "CRITICAL",
"action": "立即停止训练,回滚到最近检查点"
}
# Grad norm 异常
recent_gnorms = [m.grad_norm for m in history[-window:]]
mean_gnorm = sum(recent_gnorms) / len(recent_gnorms)
if self.grad_norm > mean_gnorm * 5:
alerts["grad_explosion"] = {
"severity": "HIGH",
"value": self.grad_norm,
"action": "检查梯度裁剪是否生效"
}
# MFU 下降 (硬件问题)
if self.mfu < 0.25:
alerts["low_mfu"] = {
"severity": "MEDIUM",
"value": f"{self.mfu:.1%}",
"action": "检查 GPU 通信/数据加载瓶颈"
}
return alerts
训练日志看板:
实践中,一个训练 run 通常需要监控以下面板:
| 看板 | 关键曲线 | 关注点 |
|---|---|---|
| Loss 面板 | 总 loss + 分域 loss | 整体下降趋势,有无 spike |
| 学习率 | LR schedule | 是否按预期调度 |
| 梯度范数 | Global grad norm | 有无爆炸/消失 |
| 吞吐量 | Tokens/sec + MFU | 有无掉速,是否稳定 |
| GPU | 显存/利用率/温度 | 有无 OOM 风险 |
| 数据 | 各域 loss + 数据消耗量 | 数据是否不均匀消耗 |
实战建议:务必设置自动告警。半夜 3 点的 loss spike 如果没有自动告警,第二天早上你可能已经浪费了 8 小时的 GPU 时间。建议 loss 超过移动平均 2 倍时触发告警,连续 10 步上升时触发紧急告警。
混合精度训练
BF16 vs FP16
| 格式 | 指数位 | 尾数位 | 范围 | 精度 |
|---|---|---|---|---|
| FP32 | 8 | 23 | ±3.4e38 | 高 |
| FP16 | 5 | 10 | ±65504 | 中 |
| BF16 | 8 | 7 | ±3.4e38 | 低 |
BF16 是当前 LLM 训练的标准选择——与 FP32 相同的数值范围(不容易溢出),虽然精度较低但对训练影响不大。
FP8 训练
FP8 是下一代训练精度:
- E4M3(4 位指数 + 3 位尾数):用于前向传播
- E5M2(5 位指数 + 2 位尾数):用于反向传播的梯度
DeepSeek V3 成功使用 FP8 训练了 671B 参数的 MoE 模型,将训练成本大幅降低。关键技术包括 block-wise quantization 和 high-precision accumulation。
模型初始化
正确的初始化对训练稳定性至关重要。
标准初始化
大多数 LLM 使用 截断正态分布 初始化:
(即 Xavier/Glorot 初始化)
残差层特殊处理
GPT-2 引入了对残差连接输出层的特殊处理:
其中 是层数。这确保了即使在很深的网络中,残差连接的贡献也不会随层数增大而失控。
数据配比策略
数据配比(data mixing)是预训练配方中投入产出比最高的调参项之一。同样的计算预算,不同的配比策略可以带来显著的性能差异。
各大模型的配比对比
| 模型 | Web | Code | 书籍 | 学术 | 百科 | 数学 | 对话 |
|---|---|---|---|---|---|---|---|
| LLaMA 1 | 67% | 4.5% | 4.5% | 2.5% | 4.5% | - | - |
| LLaMA 3 | 50% | 17% | 6% | 6% | 6% | 5% | 5% |
| DeepSeek V3 | ~45% | ~20% | - | - | - | ~10% | - |
| Qwen 2.5 | ~45% | ~18% | ~5% | ~5% | ~5% | ~8% | ~5% |
趋势观察:从 LLaMA 1 到 LLaMA 3,代码比例从 4.5% → 17%,数学从 0% → 5%。这反映了业界对代码和数学增强通用推理能力的共识。
配比搜索方法
1. 小模型 proxy 实验(最常用)
# 配比搜索的评估框架
def evaluate_mix(mix_config: dict, model_size: str = "1B", tokens: int = 10e9):
"""评估一组配比的效果
Returns:
综合得分 = Σ(benchmark_score × weight)
"""
benchmark_weights = {
"mmlu": 0.20, # 世界知识
"hellaswag": 0.15, # 常识推理
"gsm8k": 0.20, # 数学推理
"humaneval": 0.20, # 代码能力
"arc": 0.10, # 科学推理
"winogrande": 0.15, # 语言理解
}
# 1. 用 mix_config 配比训练 model_size 模型 tokens 步
# 2. 在所有 benchmark 上评估
# 3. 计算加权综合得分
scores = train_and_eval(mix_config, model_size, tokens)
composite = sum(scores[b] * w for b, w in benchmark_weights.items())
return composite
2. 动态配比调整
一些前沿工作尝试在训练过程中动态调整配比:
- 训练初期:更多通用数据(Web, 书籍),建立基础能力
- 训练中期:增加代码和数学比例,增强推理
- 训练后期:上采样高质量数据,退火(Annealing)
实战建议:先用默认配比开始训练,每隔 100B tokens 评估一次,根据各 benchmark 的相对提升速度调整。如果某项明显落后,适当增加对应域的数据比例。
完整配方示例
以一个 7B dense 模型的训练为例:
# 模型配置
model:
hidden_size: 4096
num_layers: 32
num_attention_heads: 32
num_kv_heads: 8 # GQA
ffn_hidden_size: 11008
vocab_size: 128256
max_seq_len: 8192
activation: swiglu
norm: rmsnorm
pos_encoding: rope (base=500000)
# 优化器
optimizer:
type: adamw
lr: 3e-4
beta1: 0.9
beta2: 0.95
eps: 1e-8
weight_decay: 0.1
grad_clip: 1.0
# 学习率调度
lr_schedule:
type: cosine
warmup_steps: 2000
min_lr: 3e-5 # peak_lr / 10
# Batch & 序列
batch_size: 4M tokens # ~500 sequences × 8192 tokens
seq_len: 8192
# 训练数据 (2T tokens → ~500K steps)
data:
total_tokens: 2T
mix:
web: 0.70
code: 0.12
books: 0.04
wikipedia: 0.04
arxiv: 0.03
math: 0.03
stackexchange: 0.02
conversations: 0.02
# 精度
precision: bf16
# 检查点
checkpoint:
save_interval: 500 steps
keep_last: 5
下一章预告:介于预训练和后训练之间,Mid-training(中训练)正在成为大模型训练流水线中不可或缺的新阶段。第七章我们将深入中训练的动机、方法和最佳实践。