第 6 章 第二部分:预训练

预训练配方

学习率、Batch Size、数据配比、训练稳定性——工业级预训练的完整配方

预训练 学习率 训练稳定性 优化器

什么是”预训练配方”

预训练配方(pre-training recipe)是一个完整的训练方案,包括:

  • 优化器选择和超参数:Adam/AdamW 的 β1,β2,ϵ\beta_1, \beta_2, \epsilon
  • 学习率调度:warmup、decay 策略、最终学习率
  • Batch size 调度:是否使用渐进式增大
  • 数据配比和采样策略:不同来源数据的混合比例
  • 训练稳定性措施:loss spike 处理、梯度裁剪等
  • 检查点策略:保存频率、恢复方法

看似简单的超参数选择,背后是大量的 ablation 实验和工程经验积累。本章将详细拆解每一项。

优化器

AdamW

几乎所有现代 LLM 都使用 AdamW(Loshchilov & Hutter, 2019)优化器,即带解耦权重衰减的 Adam:

mt=β1mt−1+(1−β1)gtm_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t vt=β2vt−1+(1−β2)gt2v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 m^t=mt1−β1t,v^t=vt1−β2t\hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} θt=θt−1−η(m^tv^t+ϵ+λθt−1)\theta_t = \theta_{t-1} - \eta \left(\frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} + \lambda \theta_{t-1}\right)

常见超参数:

参数典型值说明
β1\beta_10.9一阶矩衰减
β2\beta_20.95二阶矩衰减(LLM 中通常用 0.95 而非默认 0.999)
ϵ\epsilon1e-8数值稳定性
λ\lambda0.1权重衰减。数据充裕区制的通用默认;数据受限、需要多 epoch 重复训练时,近期 scaling-law 工作(arXiv:2605.01640,COLM 2026)实测更强的 weight decay(λ≈1.0\lambda \approx 1.0)可把过拟合系数降低约 70%——见第五章

为什么 β2=0.95\beta_2 = 0.95 而不是 0.999? 更小的 β2\beta_2 意味着二阶矩估计对最近的梯度更敏感,对于 LLM 训练中可能出现的 loss spike 响应更快。LLaMA 和 PaLM 都使用 0.95。

新一代优化器

AdamW 的一个痛点是内存开销大——需要为每个参数存储两个状态(mm 和 vv),加上 FP32 的参数副本,总共需要 16 bytes/参数(模型 4B + 梯度 4B + mm 4B + vv 4B)。

一些新优化器致力于降低内存使用:

  • Adafactor:通过矩阵分解将二阶矩从 O(mn)O(mn) 压缩到 O(m+n)O(m + n)
  • CAME:结合了 Adam 和 Adafactor 的优点
  • Sophia:使用 Hessian 对角线的近似来做自适应学习率
  • LION:只使用 sign 更新,内存减半(不需要 vv)

SOAP:二阶预条件优化器

SOAP(Shampoo with Adam in the Orthogonalized And Preconditioned eigenbasis,NVIDIA,2026-07)是 Shampoo 类二阶优化器的最新进化。与 Muon 在原始梯度空间做正交化不同,SOAP 在 Shampoo 预条件子的特征基中运行 Adam 风格的逐元素自适应更新:

ut=QL⋅Adam(QLTmtQR)⋅QRTu_t = Q_L \cdot \text{Adam}(Q_L^T m_t Q_R) \cdot Q_R^T

其中 QLQ_L、QRQ_R 是梯度协方差矩阵的特征向量,Adam 在旋转后的特征空间中应用。SOAP 的核心洞察:在特征基中,不同方向已被解耦,Adam 的自适应机制可以更精确地调节每个方向的更新步长。

NVIDIA 的工业级验证(arXiv:2607.20548,2026-07-13):NVIDIA 团队首次在 72B 参数、3T tokens 规模联合验证了 SOAP 和 Muon 的性能。关键发现:

  1. 大批次稳定性:在 100M token 批次规模下 SOAP 和 Muon 保持稳定,而 AdamW 出现退化——这对 GPU 集群利用率至关重要
  2. “slingshot”不稳定性:SOAP 在大批次下有梯度范数周期性爆炸倾向,通过每步 QR 分解 + KL-Shampoo 协方差估计修复
  3. 层级分布式优化器:开发了与 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 步求解带约束二次问题(每步的子问题仍有闭式矩阵符号解),并给出最优性证书与 O(1/K)O(1/K) 的内求解收敛率。曲率对最优更新的奇异值和奇异方向都有影响——这正是那两个性质在考虑曲率后不再最优的原因。GPT 预训练上一致优于 Muon 及近期变体,匹配验证损失下 wall-clock 训练时间最多减少 8.49%。

⚠️ QSD 为 2026-09 新预印本,3 位作者、GPT 规模验证,无独立复现,工业级可用性待确认。

优化器状态也能量化

上面所有讨论针对权重、激活与梯度的数值格式,但优化器状态本身同样占显存——而 Muon 相对 AdamW 的一大卖点恰恰是只用一阶矩、显存友好。这个方向此前少有人做,原因是 Muon 的正交化会丢弃奇异值的幅度、只保留方向信息,奇异向量方向上的微小量化误差会在更新中被放大,通用量化方法直接套用会失效。

MuonQ(COLM 2026)以”方向保真”为原则给出一套 4-bit Muon 训练框架,三步组合:① 量化前归一化,使每一步引入的量化误差幅度一致,避免累积误差产生偏好方向;② 结构分解,用幂迭代单独量化主导奇异分量,使量化误差只扰动奇异值幅度而不旋转奇异向量方向;③ μ\mu-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 分层
AdamW16 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 的状态精度压缩都是真实存在的单点优势,只是这些优势没有换来质量/效率/迁移性上的一致有利权衡。

两处需要改写本章原判断的地方:

  1. “内存是首要瓶颈就上 Adafactor / 8-bit Adam” → 应降级为兜底而非首选。 在 OmniOpt 的基准协议下两者属 Tier III。论文给出的短序列内存受限高收益方案是 APOLLO(Tier II),但须额外验证长序列性能。
  2. 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:

ηt=ηmin+12(ηmax−ηmin)(1+cos⁡(t−twT−twπ))\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})\left(1 + \cos\left(\frac{t - t_w}{T - t_w}\pi\right)\right)

其中 twt_w 是 warmup 步数,TT 是总训练步数。

典型配置:

  • Peak LR (ηmax\eta_{max}): 3×10−43 \times 10^{-4}(7B 模型)到 1.5×10−41.5 \times 10^{-4}(70B 模型)
  • Min LR (ηmin\eta_{min}): 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 的效果本质上等价于在恒定学习率下保存多个检查点后做加权平均。

三步流程:

  1. Warmup:常规线性预热
  2. Stable:全程使用恒定高学习率(不衰减)
  3. Merge:训练结束后,对多个 stable 阶段的检查点做加权平均

相比 WSD 的优势:

特性CosineWSDWSM
需要预设总步数是否否
需要 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)理论给出了一个优雅的结论:

可以在小模型上调好超参数,然后直接迁移到大模型。

具体来说,当模型宽度从 d0d_0 扩展到 dd 时,μP 建议:

  • 学习率缩放为原来的 d0/dd_0/d
  • 输出层权重初始化缩放为 d0/dd_0/d
  • 其他层权重保持不变

这使得在 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 BcritB_{crit}:

Bcrit=BnoiseLB_{crit} = \frac{B_{noise}}{L}

其中 BnoiseB_{noise} 是梯度噪声尺度。当 B<BcritB < B_{crit} 时,增大 batch size 可以几乎线性加速训练;当 B>BcritB > B_{crit} 时,增大 batch 的收益递减。

经验值:对于 7B 模型,BcritB_{crit} 通常在 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 下仍最优”这一隐含假设,给出两条结论:

  1. 没有任何有原则的 Muon 缩放规则能在不同训练设置下稳定生效。
  2. 即便经过极其充分的超参数调优,语言模型预训练的最优优化器仍然会随 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 突然飙升的现象。常见原因:

  1. 数据问题:某个 batch 包含异常数据(如超长序列、乱码)
  2. 学习率过高:模型进入 loss landscape 的不稳定区域
  3. 数值溢出:FP16 训练中梯度超过表示范围
  4. Adam 状态异常:二阶矩估计在训练初期不准确

应对策略

1. 梯度裁剪(Gradient Clipping)

g←g⋅min⁡(1,c∥g∥)g \leftarrow g \cdot \min\left(1, \frac{c}{\|g\|}\right)

典型裁剪阈值 c=1.0c = 1.0。几乎所有 LLM 训练都使用。

2. z-loss

PaLM 引入了 z-loss 正则化:

Lz=α⋅log⁡2(∑iezi)\mathcal{L}_{z} = \alpha \cdot \log^2\left(\sum_i e^{z_i}\right)

其中 ziz_i 是 logits。z-loss 惩罚过大的 logits 值,从而抑制 softmax 的数值不稳定。

3. QK-Norm

对 Attention 的 QQ 和 KK 做 LayerNorm:

Attention(Q,K,V)=softmax(LN(Q)⋅LN(K)Tdk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{\text{LN}(Q) \cdot \text{LN}(K)^T}{\sqrt{d_k}}\right)V

Dehghani et al. (2023) 证明 QK-Norm 可以显著提升训练稳定性,尤其是在使用 ViT 或深层 Transformer 时。

4. 检查点回滚 + 数据跳过

当 loss spike 发生时:

  1. 回滚到 spike 前的检查点
  2. 跳过导致 spike 的数据 batch
  3. 降低学习率重新开始

这需要频繁保存检查点(如每 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

格式指数位尾数位范围精度
FP32823±3.4e38高
FP16510±65504中
BF1687±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 使用 截断正态分布 初始化:

W∼N(0,σ2),σ=2din+doutW \sim \mathcal{N}(0, \sigma^2), \quad \sigma = \sqrt{\frac{2}{d_{in} + d_{out}}}

(即 Xavier/Glorot 初始化)

残差层特殊处理

GPT-2 引入了对残差连接输出层的特殊处理:

σresidual=12L\sigma_{residual} = \frac{1}{\sqrt{2L}}

其中 LL 是层数。这确保了即使在很深的网络中,残差连接的贡献也不会随层数增大而失控。

数据配比策略

数据配比(data mixing)是预训练配方中投入产出比最高的调参项之一。同样的计算预算,不同的配比策略可以带来显著的性能差异。

各大模型的配比对比

模型WebCode书籍学术百科数学对话
LLaMA 167%4.5%4.5%2.5%4.5%--
LLaMA 350%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(中训练)正在成为大模型训练流水线中不可或缺的新阶段。第七章我们将深入中训练的动机、方法和最佳实践。