从0训练LLM · 现代大模型体系 导读 5 课 + 1 节实验课 ≈ 3.5 小时
C8 稳定性:放大后为什么会炸 章导读

稳定性:放大后为什么会炸

优化器、规模、数据都定了,把模型放大,训练就会以各种方式出事:一初始化就溢出、离不开 warmup、开着裁剪还 spike、注意力 logit 长到上千、小模型调好的学习率到大模型上不能用。这一章把每一种「炸」对应到一个能测的量,再看 2017 到 2026 年各家怎样给它装上仪表、设上限。

主线定位

累计数据流 · 从文字到下一个 token 的概率 已学本课新增还没学
解码层

点任一已学环节,看这一步的输入 → 输出形状、参数量,以及它解决了什么问题(数字取自 Qwen/Qwen3.8-27B 真实 config)。

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

Google 的 Deep Learning Tuning Playbook 有一句话可以当本章的入口:任何模型,学习率大到一定程度都会不稳定;不稳定只有在它逼你用更小的学习率时,才是问题。本章每一课都是在回答「怎样不降学习率,也不炸」。

本章问题链

每一课只回答一个问题;上一课留下的缺口,就是下一课的问题。

课这一课的问题朴素方案在哪个真数字上失败一句话
第 1 课深网为什么一初始化就炸?N(0,1) 初始化:4,096 维时每层 ×64,第 22 层超过 FP32 上限方差逐层累乘;现代 LLM 把它交给归一化,初始化只管残差写回与开局 logits(loss ≈ ln V)
第 2 课原版 Transformer 为什么离不开 warmup?Post-LN 对参数扰动的放大随层数线性增长;我们的 Post-LN 在学习率 1e-3 下不 warmup 卡在 unigram,加 100 步 warmup 就训得动Post-LN 越深越放大扰动,只能靠 warmup 起步;Pre-LN 主路只剩加法,于是稳,代价是深层被稀释
第 3 课开着梯度裁剪,为什么还会 loss spike?PaLM 开着裁剪仍约 20 次 spike;同一批数据换早 checkpoint 不 spike裁剪管步长,不管走到哪;spike 是数据 × 参数状态,要盯状态
第 4 课怎么按住 logit?分数 8/7/9 放大 10 倍 → 99.995%;K2 原版 Muon 的 max logit 超过 1,000÷√d 只管初始化那一刻;QK-Norm 钉住 q、k 长度,z-loss 拉回 log Z,QK-Clip 超标后缩权重
第 5 课小模型上调好的学习率,大模型能用吗?SP 下 Adam 一步的改动 ∝ 宽度 × η:宽 20 倍就大 20 倍μP 按宽度缩放每层的初始化与学习率,让每步改动与宽度无关
实验课给我们自己的模型装上稳定性仪表—一次只改一项、先写预测、连同条件报告

演进地图

本章给训练装的五块仪表,每块都有一个上限:

仪表量什么上限怎么来在哪一课
初始化方差 / 开局 loss第 0 步每层的 RMS;开局 loss − ln Vfan-in 缩放;归一化;残差写回 1/√(2L)第 1 课
残差流与梯度尺度参数扰动对输出的放大;逐层梯度归一化放进支路(Pre-LN)或放大残差(DeepNet)第 2 课
梯度范数趋势裁剪前的梯度范数:突刺与缓慢上涨裁剪只管单步;趋势用来提前报警第 3 课
注意力 logit 与 log Z逐层最大 q·k/√d;输出 logit 的整体水平QK-Norm(锚点每头 256 维,上界 16·g²)、QK-Clip(τ = 100)、z-loss第 3、4 课
每一步的更新量随宽度一步更新后隐层输出的相对变化μP:隐层学习率 ∝ 1/fan_in第 5 课

贯穿例句

全章沿用「小明把苹果给了小王」(C3 起用锚点 Qwen3.8 的真 tokenizer 切成 5 个 token)。它在每一课的用法不同,都写在那一课的「从已有出发」里:第 1 课让这 5 个位置的向量穿过 64 层随机初始化的网络;第 2 课让它们穿过 Post-LN / Pre-LN 两种堆叠;第 3 课看「给了」这一行注意力在两个候选间的取舍;第 4 课用 C3 那一行分数 8 / 7 / 9;第 5 课把 5 个 token 在隐层的输入当成一个 batch。向量本身都是随机数代替的(页面写明),要看的只是尺度。实验课回到我们自己在《三國志演義》上训练的模型,例句不在它的训练分布里,所以那里换成看整个验证集。

三层交互

层本章里的组件在哪一课
概念动画同一个块两种归一化位置的逐步动画(C4 的 BlockFlow);演进地图第 2 课、各课
算法模拟器(真算法、小数据)64 层随机网络的逐层 RMS 与真溢出;Post / Pre-LN 的手写反向传播与扰动放大;悬崖一步;softmax 饱和、q/k 对齐、四种按法与 z-loss;Adam 第 1 步随宽度的改动第 1–5 课
真模型 / 真数据我们自己从 0 训练的模型:Post / Pre × 学习率 × warmup、QK-Norm × 学习率、初始化四档的真实日志,带最大注意力 logit 探针;锚点与前沿模型的官方 config第 1–5 课与实验课

项目推进:给我们的模型装上稳定性仪表

对应 04-实践项目/MILESTONES.md 的「C8 稳定性」。分工照旧:代码 AI 来写,决策你来做。norm_pos、qk_norm、init_std 三个开关与最大注意力 logit 探针已经实现,实验脚本 experiments/exp_c8_stability.py 导出本章组件读取的 c08-stability.json。

🧭
你要拍板的三件事
  1. 要不要 QK-Norm?依据:QK-Norm 开 / 关在三档学习率下的最大注意力 logit 终值与 val loss(第 4 课、实验课)。
  2. warmup 能不能省?依据:Pre-LN 不 warmup 在学习率 1e-2 与 3e-2 下的 val 与最大 logit,对照有 warmup 的基线(第 2 课、实验课)。归一化放在哪,C4 已经选了 Pre-LN;本章的数据给出了「为什么」。
  3. 初始化标准差取多少?依据:四档 init_std 的开局 loss − ln V 与最终 val(第 1 课、实验课)。

验收标准(全部可测,取自 MILESTONES):

项目实测 · C8 验收表

坑与带走

坑症状后果怎么办
权重直接用 N(0,1)第 0 步就出现 inf / NaN一步都训不了按 fan-in 缩放,或固定小标准差 + Pre-Norm(第 1 课)
共享 embedding 用大 σ 却不缩放 logits开局 loss 远高于 ln V(σ = 1 时约 55)前几百步白训,最终 val 也更差开局自检 loss ≈ ln V;PaLM 的做法是 logits 乘 1/√n(第 1 课)
Post-LN + 大学习率不 warmup我们的项目里 loss 卡在 unigram 附近,不发散也不下降模型只学到字频用 Pre-Norm + 最终 norm;坚持 Post-LN 就要小学习率 + 长 warmup(第 2 课)
只看 loss,不看梯度范数与注意力 logitspike 来得毫无预兆回滚、跳数据、浪费算力记录裁剪前梯度范数、逐层最大注意力 logit、输出 logit;算 spike score(第 3 课)
以为 ÷√d 就管住了注意力 logit高学习率下 max logit 涨到上千softmax 饱和、梯度传不回、spikeQK-Norm / QK-Clip;输出端 z-loss(第 4 课)
小模型调好的学习率直接搬到宽模型大模型开局不稳或学得慢反复重调,算力浪费μP,或拟合超参缩放律(第 5 课、C6 第 4 课)

这一章你应该带走的(各课「一句话」):

深入这一章

每条都实际打开核对过(2026-09-26):写清它讲清了什么、对应哪一课、为什么推荐。外部链接都需要联网;论文有本地 PDF 的直接链本地。spaces.ac.cn 对脚本访问返回 403,四篇苏剑林的文章按 Wayback 存档核对了标题、日期与小节。

🎮 想更直观 10–30 分钟

先玩本章组件;下面是外部最好的入口
30 min英文需联网 ml-engineering 开源书
真实训练的 loss 图鉴:快速恢复、缓慢恢复、恢复不完全的 spike,没有 spike 的发散,resume 之后的假 spike;例子来自 BLOOM-176B、IDEFICS-80B、Llama-2 等。
对应第 3 课:先认得 spike 长什么样。注意它把多数 spike 归因于坏数据,和 PaLM「同一批数据换早 checkpoint 不 spike」的对照要一起读。
8 min英文需联网 B 站中英字幕:BV12s421u7sZ
章节名「model initialization: std 0.02, residual init」:在代码里写出 GPT-2 的 0.02 与按残差层数缩放的初始化。
对应第 1 课:看一遍真实代码里的初始化是怎么写的,再回来看组件里的逐层 RMS。
5 min英文需联网 §2.1 MuonClip
原版 Muon 下最大注意力 logit 冲过 1,000;加上 QK-Clip 后顶在 100,约 30% 的训练步之后自己回落。
对应第 4 课:本章最直观的一张图,也是 C5 第 7 课伏笔的出处。
23 min中文需联网 2024-09-16
按标题与简介:几种归一化的计算对比,以及 Pre-LN 与 Post-LN 的对比。
对应第 2 课的中文入门。内容只按标题与简介核对:视频简介里的配套 notebook 链接已失效(404),本章没有逐段看过。

🔬 想吃透原理 1–3 小时

唯一必看:苏剑林《模型优化漫谈:BERT 的初始标准差为什么是 0.02?》。其余按课挑
40 min中文需联网 2021-11-08
从「梯度消失说的是什么」讲起,依次问:LN 真的能缓解梯度消失吗、为什么还要加 LN、warmup 是怎样起作用的、初始标准差为什么是 0.02。
一篇串起第 1、2 课:初始化、归一化、warmup 三件事放在同一条推理链上,而且是推出来的,不是宣布的。
40 min中文需联网 2021-08-17
小节:采样分布、稳定二阶矩、激活函数、直接标准化、NTK 参数化、残差连接;开头就是「忘了除以 √d 模型训不动」的真实事故。
对应第 1、4 课:「稳定二阶矩」就是第 1 课的方差公式,「NTK 参数化」是第 5 课 μP 的前身。
20 min中文需联网 2022-03-29
结论:同一设置下 Pre Norm 更容易训练,但效果常常不如 Post Norm;直观解释是 Pre Norm 的深度有一部分被折算成了宽度。
对应第 2 课「新失败:深层被稀释」,和组件里的 β 图互相印证。
60 min中文需联网 2025-03-13
从前向传播、反向传播、损失增量、特征变化四个量推出 μP,再分别给出 Adam 版与 Muon 版。
对应第 5 课:比原论文好读得多,Muon 版和 C5 第 7 课接上。
40 min英文需联网 Google Research
区分开局不稳与中途不稳;先扫学习率找出不稳定的那一档,再用 warmup 把它变稳的操作流程;明确写「归一化要放在残差里面,Norm(x + f(x)) 已知有问题」。
对应第 2、3 课的工程侧:把本章的原理变成一套能照着做的排查步骤。
60 min英文需联网 2024-09-19
在 nanoGPT 上实现 μP 的最小改动、coordinate check 图(不同宽度下激活大小是否一致)、μTransfer 测试;注意力用 1/d_head。
对应第 5 课的工程侧:想在自己的项目里试 μP,从这里开始。

📄 想读原文 按需

有本地 PDF 的直接打开;其余链 arXiv(需联网)
Wortsman et al. 2023需联网
用小模型、高学习率复现注意力 logit 增长与输出 logit 发散两类不稳定,逐一检验 warmup、weight decay、μParam、qk-layernorm、z-loss。
本章原文主线:第 2–5 课的手段几乎都在这一篇里被放在同一把尺子上比过。
Xiong et al. 2020需联网
定理 1:初始化时 Post-LN 最后一层梯度与层数无关、Pre-LN 按 1/√L 变小;实验上 Pre-LN 去掉 warmup 仍达到可比结果。
第 2 课解释一的出处;Pre-LN 的理论,不是 Pre-LN 的发明。
Liu et al. 2020需联网
推论 1–2:参数扰动下 Pre-LN 的输出变化 O(log N)、Post-LN O(N);明确反驳「梯度不均衡是根本原因」。
第 2 课解释二的出处,也是组件 Σβ² 的来源。
Chowdhery et al. 2022需联网
§5:fan-in 初始化、embedding N(0,1) 配 logits × 1/√n、z-loss 10⁻⁴·log²Z;§5.1:约 20 次 spike、回滚跳数据、换 checkpoint 对照。
第 1、3、4 课的原文事实都在这两页里。
OLMo Team 2024需联网
重复 n-gram 与 spike、0.02 初始化对比缩放初始化、spike score、reordered norm + QK-norm、z-loss、embedding 不做 weight decay。
开源模型里把稳定性工程写得最完整的一节,每一项都有对照图。注意它把 QK-norm 的首提写成了 Dehghani 2023,实为 Henry 2020。
Kimi Team 2025需联网
MuonClip:原版 Muon 下 max logit 超过 1,000;逐头 QK-Clip、τ = 100、MLA 各分量的分法;15.5T token 无 spike。
第 4 课 QK-Clip 的出处。
DeepSeek-AI 2026
§2.3.3:对每个 query 头与唯一的压缩 KV 头做 RMSNorm;§2.4:因此不使用 QK-Clip(第 12、14 页)。
第 4 课「QKV RMSNorm 取代 QK-Clip」的出处(旧 M8 课把后一句的位置写错了)。
Dehghani et al. 2023需联网
§2:8B 参数附近注意力 logit 失控、权重几乎 one-hot;对 q、k 做 LayerNorm 后训稳。
QK-Norm 规模化的出处;Qwen3 引的就是它。
Henry et al. 2020需联网
低资源翻译:对 q、k 做 ℓ₂ 归一化、乘可学习尺度代替 ÷√d,5 个方向平均 +0.928 BLEU。
QK-Norm 的首提。
Gemma Team 2024 / 2025需联网 Gemma 3:arXiv 2503.19786
Gemma 2:soft_cap·tanh(logits/soft_cap),注意力 50、最终层 30;Gemma 3:用 QK-norm 取代 Gemma 2 的 soft-capping。
第 4 课 soft-cap 的出处与它被替换的记录。
Yang et al. 2022需联网 μP 首提:Tensor Programs IV(arXiv 2011.14522)
表 1:哪些超参能迁移;表 3:μP 的 SGD / Adam 规则;图 5:SP 下一步更新后 logits 与注意力 logit 随宽度变大;40M → 6.7B,调参成本 7%。
第 5 课的出处;脚注 8 也是第 4 课「对齐后点积按 d 长」的出处。
Radford et al. 2019
§2.3:LayerNorm 挪到每个子块的输入、最后加一个 LayerNorm;残差层初始化乘 1/√N。
第 1、2 课的归属出处:Pre-LN 至少不晚于 GPT-2。
DeepSeek-AI 2024
摘要与 §4.2:全程没有不可恢复的 loss spike、没有回滚;所有可学习参数的初始化标准差 0.006。
第 1、3 课的对照数字。
He et al. 2015 / Glorot & Bengio 2010需联网 Glorot 2010:proceedings.mlr.press/v9/glorot10a.html
逐层方差保持的两种推导:ReLU 用 2/n;前向与反向之间折中用 2/(fan_in + fan_out)。
第 1 课「改进一」的出处。
Wang et al. 2022 / Takase et al. 2023需联网 Spike No More:arXiv 2312.16903
DeepNet:放大残差的 Post-LN 训到 1,000 层;Spike No More:从子层雅可比的谱范数分析,稳定需要「小的子层 + 大的捷径」。
第 2 课「新失败」与第 3 课的延伸阅读。
🚫

排除了什么(也是筛选标准):① OPT-175B 的训练日志(metaseq chronicles,README 可访问)——日志是逐事件的 PDF,本章没有逐页核对,「多次重启」的说法只见于二手转述,不收;② Cerebras 博客上的同名 μP 指南——与 EleutherAI 博客是同一篇合写文章,只收一处;③ 五道口纳什归一化视频的配套 notebook——链接 404,只保留视频;④ 苏剑林博客导航里的《为什么梯度裁剪的默认模长是 1?》——属于 C5 的主题,本章没有核对内容;⑤ Laker Newhouse《Understanding Muon》——第 3 章讲 MuonClip 与权重约束,内容与 C5 第 7 课重合更多,放在第 4 课侧栏而不进三档;⑥ 只列「QK-Norm / z-loss / μP 是什么」、不讲它们各自在什么真数字上被逼出来的速通与转载。另注:OLMo 2 把 QK-norm 的首提写成 Dehghani 2023,旧 M8 课把 DeepSeek-V4「不用 QK-Clip」写在 §2.3.3——两处都已在正文纠正。