从0训练LLM · 现代大模型体系 导读 7 课 + 1 条岔路 + 1 节实验课 ≈ 4.5 小时
C5 优化:参数怎么更新得又快又稳 章导读

优化:参数怎么更新得又快又稳

前五章把网络从文字一路搭到下一个 token 的概率,loss 和反向传播给出了每个参数的梯度。这一章回答最后一步:拿到梯度,参数怎么动。从「沿梯度走一步」出发,被一个个真数字逼出动量、Adam、AdamW、warmup、cosine 与 WSD、梯度裁剪,最后到 2025–2026 年前沿模型换上的 Muon。所有 loss 曲线都是在你的浏览器里真训练出来的,或来自我们项目的真实日志。

主线定位

「小明把苹果给了小王」经过前五章搭好的网络,在每个位置输出下一个 token 的概率。随机初始化时每个位置的 loss ≈ ln 248,320 = 12.42;反向传播给 Qwen3.8-27B 的 27,781,427,952 个参数各算出一个梯度。前向的每一环都已经学过:

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

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

🧭

上游 · C4 一个 Transformer 块:一层才算完整,整个前向从文字算到概率;loss 与梯度的来历在 D 章地基和 C0 第 5 课。
本章(C5):拿到梯度之后,参数到底怎么动——每一步怎么走、学习率怎么随时间变、异常怎么挡。
下游 · C6 规模:优化器定了,该训多大的模型、喂多少数据?

这一章看的是训练循环。下面每一格点开,都有它在锚点模型上的真实大小(由 config 现算):

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

这一章为什么换例子。「参数怎么动」在例句上看不见:27,781,427,952 维的 loss 面画不出来,也没法手算。所以本章用三个替身,每课开头都会说清换例子的原因:① 峡谷 f = ½(x² + 100y²),一个画得出、能手算的 loss 面,所有机制先在这里浏览器实时算;② 浏览器里的微型模型,《三國志演義》24,000 字、24,896 个参数的字级语言模型,每改一次超参就真训练一遍;③ 我们项目的 3.7M 参数 Transformer 的真实日志。结论最后都回到大模型的公开配置上。锚点 Qwen3.8-27B 的优化器与超参没有公开,本章不替它编。

本章问题链

每一课只回答一个问题;上一课的失败,逼出下一课的问题。

课这一课的问题朴素方案在哪个真数字上失败一句话
第 1 课为什么梯度下降在峡谷里要走两百多步?全量梯度:DeepSeek-V3 的 14.8T token 一步就用完;单一 η:条件数 100 的峡谷里 η < 0.02,缓方向第 241 步才进 1% 圈学习率被最陡的方向卡住;动量让一致的方向越走越快、来回的方向互相抵消
第 2 课一个学习率管得了所有参数吗?同一批里梯度的 99% 分位是 1% 分位的约 900 倍,12.7% 的参数梯度恰为 0Adam 给每个参数配一把自己的尺子:步长约等于 η,与梯度大小无关
第 3 课Adam 里的 weight decay 为什么失效了?L2 进梯度被 √v̂ 除:同一个 λ,衰减力度差 1,000 倍;真训练里 λ 从 0.01 换到 0.3,行范数几乎不变衰减应该作用在参数上,不应该混进梯度再被 √v̂ 除掉
第 4 课为什么一开局就用峰值学习率会炸?η = 0.3 直接开局:第 1 步每个权重都走满 η,第 2 步 loss 从 5.55 跳到 35.4Adam 第一步每个参数都走满 η;warmup 让「第一步」先小下来
第 5 课不知道要训多久,学习率该怎么降?常数学习率在谷底来回跳(600 步:3.815 对 cosine 3.677);cosine 又必须先定总长大学习率负责走远,小学习率负责落底;WSD 把「何时落底」推迟到决定停下的时候
岔路batch 能无限加大吗?刚初始化时梯度噪声尺度只有约 26 个样本,开局用大 batch 是浪费batch 加大只减少噪声;噪声已经不是瓶颈时,再加 batch 就是浪费 token
第 6 课一个超大的梯度会把模型甩飞吗?注入一次异常 batch:‖g‖ 是平时的 40 倍,验证 loss 从 3.70 跳到 4.52裁剪只缩长度、不改方向:把一次离谱的梯度变成一次普通的步子
第 7 课Adam 把一个权重矩阵当成一堆独立的数,浪费了什么?隐层矩阵的一阶矩,最大的一个奇异方向独占 57% 的能量Adam 看坐标,Muon 看矩阵的奇异方向:把更新的奇异值都拉到 1 附近
实验课同样的模型和数据,换优化器、换调度,真实曲线差多少?—每个优化器在自己的最佳点比,差距要大于种子间的波动才算数

表里标「浏览器实训」性质的数字(梯度分位数、loss、奇异值占比)都来自本章组件的默认设置、种子 1,在 Chrome 中实测;换浏览器末位可能略有不同,换种子会有波动,各课都给了第二个种子的结果。

演进地图

优化的演进:每一代都被上一代的某个真数字逼出来
  1. 起点 全量梯度下降 经典做法
    解决了每一步都沿全部数据的真实梯度方向走。
    卡在DeepSeek-V3 训练 14.8T token:一步就要把全部数据前向、反向算一遍,整个训练预算只够走 1 步。
  2. 第一代 小批量随机梯度下降 SGD Robbins & Monro 1951
    解决了随机一小批的梯度是全量梯度的无偏估计;按 DeepSeek-V3 的满 batch(15,360 条 × 4K),同样的数据能走约 235,240 步。
    卡在条件数 100 的峡谷里 η 必须小于 0.02,缓方向每步只缩到 0.981 倍:241 步才进 1% 圈(第 1 课浏览器实算)。
  3. 第二代 动量(重球法) Polyak 1964
    解决了一致的方向累积、来回的方向抵消;β = 0.9 时同一峡谷 87 步,稳定上限放宽到 2(1+β)/λ。
    卡在全体参数共用一个 η:微型模型同一批里,非零梯度的 99% 分位是 1% 分位的约 900 倍(第 2 课浏览器实训)。
  4. 第三代 Adam:每个参数一把尺子 Kingma & Ba 2014
    解决了每个参数除以自己梯度的均方根;第 1 步每个参数的位移恰好是 ±η。峡谷上 η = 0.3 时 83 步。
    卡在weight decay 以 L2 形式混进梯度,也被 √v̂ 除:同一个 λ,梯度均方根 10 与 0.01 的两个参数,衰减力度差1,000 倍(R4 算例)。
  5. 第四代 AdamW:解耦权重衰减 Loshchilov & Hutter 2017
    解决了衰减放在 Adam 之外:每个矩阵参数每步乘 (1 − ηλ),与梯度大小无关。
    卡在开局第 1 步,每个参数都走满一个 η:微型模型峰值 η = 0.3 时,第 2 步的 loss 从 5.55 跳到35.4(第 4 课浏览器实训)。
  6. 时间维 ① 学习率 warmup Goyal 2017;RAdam 2019 给出方差解释
    解决了前 W 步让 η 线性爬升;同样的峰值与种子,warmup 30 步时第 2 步 loss 为 5.35。
    卡在warmup 只管开局:之后若一直用常数学习率,Adam 在谷底附近来回跳;cosine 又必须事先定好总步数。
  7. 时间维 ② 学习率衰减:cosine → WSD SGDR 2016 → MiniCPM 2024
    解决了WSD 用一条常数主线分叉出任意长度:三个长度的模型共训练 732 步,cosine 各跑一遍要 1,260 步。
    卡在一次异常 batch:动量 SGD 注入 ×30 输入后,验证 loss 从 3.70 跳到4.52(第 6 课浏览器实训)。
  8. 旁支 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% 步数(官方自报)。
  9. 稳定 全局梯度范数裁剪 Pascanu et al. 2012
    解决了‖g‖ 超过 c 就整体乘 c/‖g‖,方向不变;GPT-3、DeepSeek-V3 都取 c = 1.0。
    卡在Adam 把一个权重矩阵当成一堆独立标量:微型模型隐层矩阵的一阶矩,最大的一个奇异方向占57%的能量(第 7 课浏览器实训)。
  10. 第五代 Muon:按矩阵的奇异方向更新 Keller Jordan 2024 → Moonlight 2025
    解决了Newton-Schulz 把更新的奇异值拉进 [0.68, 1.13];Moonlight 报告在算力最优训练下约为 AdamW 的2 倍算力效率。
    卡在Kimi K2 在中等规模 run 中用原版 Muon,注意力 max logit 很快超过1,000——稳定性问题留到 C8 兑现。
数字口径:峡谷步数、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 为官方技术报告自报。

三层交互

层本章里的组件在哪一课
概念动画一维抛物线上的跳点与 ηλ 数轴(先预测再揭示);2×2 矩阵把单位圆变成椭圆、Newton-Schulz 把椭圆变圆第 1 课、第 7 课
算法模拟器(真算法、小数据)峡谷上的 GD / 动量 / Adam 真实轨迹与按方向分解;(η, β) 收敛速度热力图;旋转峡谷;Adam 逐坐标账本;L2 与解耦衰减的计算器;五条公开学习率调度的公式曲线;Newton-Schulz 标量与矩阵两种迭代的对照第 1、2、3、5、7 课
真模型 / 真数据浏览器内真训练的字级语言模型(梯度尺度、衰减、warmup、调度与 WSD 分叉、注入异常 batch、真实动量矩阵的奇异值、梯度噪声尺度、9 个 run 的优化器比较);我们项目 3.7M 参数模型的真实日志回放;DeepSeek-V3/V4、Kimi K3、GPT-3 报告原文里的配置第 2–7 课、岔路、实验课

项目推进:给我们的模型选优化器与学习率计划

对应 04-实践项目/MILESTONES.md 的「C7 优化与稳定」(项目沿用旧章号,就是本章)。分工照旧:代码 AI 来写,决策你来做。minillm/optim.py 已经实现 SGD(动量、Nesterov)、AdamW、Muon(隐藏层矩阵用 Muon,embedding / 输出头 / 归一化 / MoE router 用 AdamW),constant / cosine / WSD 三种调度(都带线性 warmup)和梯度裁剪;minillm/train.py 有注入异常 batch 的 inject_step、inject_kind、inject_loss_scale。

🧭

你要拍板的三件事

  1. 用哪个优化器?每个优化器都要在各自的最佳学习率下比较(至少 3 点扫描:SGD 0.1 / 0.3 / 1.0,AdamW 10−3 / 3×10−3 / 10−2,Muon 0.01 / 0.02 / 0.05),不许共用一个学习率(第 2 课、实验课)。
  2. 调度用 cosine 还是 WSD?WSD「能从稳定段任意一点接着训」的好处,值不值它在同一长度上可能略高的 loss(第 5 课)?
  3. warmup 多少步?梯度裁剪阈值多少?阈值要引用基线日志里 grad_norm 的典型值,取在它之上(第 4、6 课)。

验收标准(全部可测):

坑与带走

坑症状后果怎么办
学习率太大loss 震荡后飙升,甚至 NaN训练报废上限由最陡的方向决定;先小数据扫几个学习率(第 1 课、实验课)
学习率太小几百步 loss 几乎不动烧算力同上,往大扫;看各组扫描表而不是一条曲线
没加 warmup、峰值又大开头几步 loss 突然跳到几十一步把输出层推飞,之后要花很多步爬回来Adam 第 1 步每个参数都走满 η;前 W 步线性升温(第 4 课)
用 torch.optim.Adam(weight_decay=…) 以为是 AdamWweight decay 调了几档,结果差不多正则化没按设计起作用用 AdamW,或新版 Adam 的 decoupled_weight_decay=True(第 3 课)
常数学习率一直训到底loss 后段停在一个平台附近抖白白少降一截末段衰减:cosine 或 WSD(第 5 课)
用同一组超参比两种调度 / 两种优化器得出「谁更好」的结论结论只是超参偏向的结果各自调优再比(K3 的做法;实验课规则 2)
裁剪阈值低于典型梯度范数日志里几乎每步都在裁裁剪变成了另一种优化器,不再只拦异常先看 grad_norm 的典型值,阈值取在它之上(第 6 课)
以为开了裁剪就不会 spike大模型训练中仍出现 loss spike措手不及裁剪只管单步梯度长度;监控 grad_norm,spike 的其他来源见 C8
把 Muon 用到 embedding / 输出头 / router 上效果变差或早期不稳定白换优化器Muon 只管隐藏层二维矩阵,其余用 AdamW(第 7 课)
把小模型上的优化器结论搬到大模型结论与报告相反错误决策带上规模、调度、衰减、种子一起报告;同一个小模型上结论都会翻转(第 7 课、实验课)

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

提问记录:这一章还没有真实提问。学习中有疑问,记到 05-问答记录/C5-L<课号>.md(岔路课是 C5-B1.md);有价值的问题会展开成新的岔路课。

深入这一章

每条都在 2026-09-26 实际打开核对过:写清它讲清了什么、对应哪一课、为什么推荐。

🎮 想更直观 10–30 分钟

先玩本章的组件;下面三条是外部最好的直观入口
需联网20 min英文 Katanforoosh、Kunin、Ma · 2019 · 交互
在四种测试地形上拖起点、选优化器和学习率,看轨迹;还能把 batch 切成 1、小批、全量,直接看到 SGD 的噪声。
对应第 1、2 课和岔路课:和本章峡谷互补——它的地形更复杂,本章的峡谷数字更可核对。
需联网21:48中文 B 站 · 2025-07-20
正交矩阵的几何、梯度「白化」、SVD 与 zeropower、NS5 迭代、与精确 SVD 的对比;每一段对应公开 notebook 的一节。
对应第 7 课:中文里最直接的 Muon 讲解。配套 notebook 见下一档。
需联网3 章英文 2025-07-21
页面里有可拖的多项式滑杆,把 Newton-Schulz 的系数调一调就能看到奇异值怎么被拉动;后几章讲 MuonClip 与权重约束。
对应第 7 课的 NewtonSchulzViz,是同一个视角的另一种实现;后几章衔接 Kimi K2 的 QK-Clip(C8)。

🔬 想吃透原理 1–3 小时

唯一必看:Distill《Why Momentum Really Works》。其余按课挑
需联网约 1 h英文 Gabriel Goh · 2017-04-04 · 交互长文
把二次函数上的梯度下降和动量按曲率方向逐个分解,推出稳定域、最优 β 和 √κ 的加速;(α, β) 收敛速度的全景图就是本章热力图的原型。
对应第 1 课,也是整章的数学底座。它讲清的不是「动量好」,而是「在什么条件下、好多少、为什么」——这正是本章每一课想做到的。
需联网17 min 阅读 / 推导约 1 h英文 2024-12-08
定义、系数怎么调(为什么接受 0.7–1.3 的误差)、为什么只管隐藏层、FLOP 开销 T·m/B 的估算,以及优化器研究的证据标准。
对应第 7 课。原作者一手材料;文末关于「新优化器的论文为什么常常不可信」的讨论,是本章证据三问的最好注脚。
需联网一章中文 动量法、Adam 等各一节
动量法用的正是「病态二次函数」这个例子,Adam 一节从 RMSProp 推到偏置修正。
对应第 1、2 课:中文教材里最系统的一份,可以逐式对照本章组件的数字。
需联网4h01m中英字幕 B 站搬运(Web3天空之城)· 约 6.9 万播放
从空文件写到训练完 GPT-2 124M,中段逐个加入 AdamW、梯度裁剪、warmup + cosine、梯度累积——每一项都先跑、再讲为什么这么改。
对应第 3–6 课:看这些决策在真实代码和真实 loss 曲线里长什么样。旧版课程写的「36 万播放」已与现状不符,这里按 2026-09-26 的 API 数字写。
需联网约 2 h英文
怎么扫学习率、怎么判断训练早期与中期的不稳定、warmup 和梯度裁剪各在什么时候用、阈值取多少。
对应第 4、6 课与实验课:把本章的机制变成可以照着做的调参流程。
需联网40–60 min中文
从 SGD、动量一路讲到 Adam 与 AdamW,讲清「Adam 里的 L2 被自适应分母除掉」这件事,并提到图像任务上 SGD 泛化可能略好。
对应第 2、3 课。沿用旧版课程的推荐:有反例的中文资料更可信。
需联网30 min中文注释 公开 notebook
Frobenius 归一化、瘦高矩阵转置、五次多项式迭代、与 torch.linalg.svd 的对比,都是可运行的代码。
对应第 7 课「再深一层」:五道口纳什 Muon 视频的配套,自己跑一遍 NS5 与精确 SVD 的差。

📄 想读原文 按需

有本地 PDF 的直接打开;其余链 arXiv 摘要页(本地论文库暂无)
需联网Kingma & Ba 2014
算法 1(十来行)、偏置修正的推导、默认超参;摘要写明对梯度的逐坐标缩放不变。
第 2 课的出处。原论文的收敛证明后来被指出有缺陷(领域常识,本章未逐一核实),所以本章不引用那一部分。
Loshchilov & Hutter 2017
命题 1、2:SGD 下 L2 与 weight decay 等价、自适应优化器下不等价;算法 2 把两种写法放在同一张表里。
第 3 课的出处。标题里没有「AdamW」三个字。旧版课程把这篇放进论文库却没链上,这里补上。
需联网Goyal et al. 2017
学习率随 batch 线性放大 + 逐步 warmup,ResNet-50 用 8,192 的 batch 一小时训完、精度不降。
第 4 课 warmup 的首提与规模化出处;岔路课线性缩放规则的出处。
需联网Liu et al. 2019
自适应学习率在训练早期方差过大,warmup 起降方差作用;据此提出 RAdam。
第 4 课「为什么 warmup 有效」的理论动机。
需联网Hu et al. 2024
提出并命名 Warmup-Stable-Decay 调度,分析衰减段 loss 快速下降的现象,并用它低成本做 scaling 实验。
第 5 课 WSD 的出处(命名)。
需联网Hägele et al. 2024
「常数 + cooldown」与 cosine 一样可预测,且训练可复用,让 scaling 实验省很多算力。
第 5 课分歧的一方;和 Kimi K3 §3.2 对着读。
需联网McCandlish et al. 2018
梯度噪声尺度预测「最大的有用 batch」;噪声尺度随 loss 下降而增大。
岔路课的出处;GPT-3 选 batch 时引用的就是它。
需联网Pascanu et al. 2012
分析 RNN 的梯度爆炸与消失,提出按范数整体缩放的梯度裁剪。
第 6 课的出处。
需联网Liu et al. 2025 · Moonshot
给 Muon 加 weight decay、调整每个参数的更新尺度;scaling 实验显示算力最优训练下约为 AdamW 的 2 倍效率;训练了 3B/16B 的 MoE。
第 7 课「规模化」的出处。
需联网Kimi Team 2025
MuonClip:原版 Muon 下注意力 max logit 超过 1,000,加 QK-Clip 后 15.5T token 全程无 loss spike。
第 7 课「新失败」的出处,C8 兑现。
DeepSeek-AI 2024
§4.2 超参一段:AdamW(β₂ = 0.95、wd 0.1)、2K 步 warmup、保持到 10T 再 cosine 的混合调度、裁剪 1.0、batch 3,072 → 15,360。
第 1、4、5、6 课和岔路课反复引用的一段,只有一页。
DeepSeek-AI 2026
§2.4 Muon 的完整算法、混合 Newton-Schulz(8 + 2 步)、哪些模块留给 AdamW、为什么不用 QK-Clip;§4.2.2 超参。
第 7 课的主要出处:一份写得最完整的「Muon 管矩阵、AdamW 管其余」配方。
Kimi Team 2026
§2.5 Per-Head Muon;§3.2 为 cosine 与 WSD 各做独立的 scaling-law 搜索后选择 cosine。
第 5 课分歧的另一方、第 7 课按头正交化的出处。
🚫

排除了什么(也是筛选标准):① 各类「十分钟看懂优化器」速通视频与 CSDN 同质化转载——只给结论不给推导,数字多无出处;② Sebastian Ruder《An overview of gradient descent optimization algorithms》(2016)——经典,但动图不能交互,AdamW 只一句带过,已被本章组件与 Distill 覆盖;③ losslandscape.com 一类 3D「损失地形」艺术图——沿两个随机方向切出的截面,容易让人以为真实高维地形就长那样(见第 1 课 Dig);④ gradient_descent_viz 桌面程序——要下载安装,只借了它「正方形边长 = √v」的画法(第 2 课 AdamLedger);⑤ 本平台旧版的 LossChart「loss 诊断器」——用正弦噪声模拟 loss、开关 warmup 结果相同,不是真实训练动力学,本章用浏览器内真训练替代;⑥ 旧版 M3 地形实验的说明文字——「η 拖过 0.125,SGD 和动量当场发散」是错的(动量上限是 0.2375),第 1 课已纠正。