全部笔记

Qwen3.8-Flash-Next 架构笔记 · 07 / OPTIMIZER

Optimizer:知道哪里错了,接下来怎么改?

把梯度与优化器分开,再理解 AdamW 和 Muon 为什么会分工合作。

中文草稿 本笔记由 GPT-5.6-Sol 和 GPT-6-Astra 混合撰写。 官方博客 技术报告

训练时,模型先预测,再和答案比较。反向传播算出参数该往什么方向调整的线索;优化器根据这些线索和历史记录,决定实际怎么更新参数。

从逐坐标 AdamW,到按参数用途混用优化器

假设你已经理解反向传播、Adam 的一二阶矩和解耦权重衰减。Muon 的新增操作作用于矩阵动量:近似正交化更新方向。重点是它改变了什么几何结构,以及哪些参数适合这一操作。

对照项 熟悉的基线 本章关注的变化
处理对象 AdamW 逐坐标自适应缩放 Muon 对矩阵更新做近似正交化
线性映射 通常交给 AdamW 适用的矩阵使用 Muon
查表与特殊参数 常使用同类优化器 embedding、输出头、router 等保留 AdamW;N-gram 表用无衰减 Adam
实现问题 维护逐坐标统计 还需考虑矩阵拆分、迭代近似、形状缩放与通信

这里的比较基线是典型 dense LLaMA decoder(优化器章以 AdamW 为基线),不代表所有 LLaMA 版本;“变化”也不等于 Qwen 首创。报告、配置与实现分别见 [2][4][39],历史来源见下文。

看图理解逐坐标调整,和按矩阵调整
看每个坐标

AdamW

↘↓↗↑

参考各坐标的历史梯度
分别调整更新幅度

看整张矩阵的方向结构

Muon

100 0
0 1
→1 0
0 1

理想化的更新方向例子
压平奇异值的尺度差异

处理的是参数怎样更新Muon 的图不是权重本身的变化;实际算法用有限步迭代近似计算。
AdamW 的箭头仅示意不同坐标可有不同更新。Muon 右图是 diag(100,1) 的理想 polar factor,表示更新方向的变换,不是模型实测,也不是把权重变成单位矩阵。依据 [29][30][31]。

Muon:一组旋钮组成了矩阵,能不能一起看?

很多神经网络参数其实是一张矩阵,负责把一组特征变成另一组特征。Muon 对矩阵动量形成的更新做近似正交化,调整它在不同奇异方向上的尺度。[31]

用 SVD 的视角看,理想 polar factor 保留左右奇异向量,并压平非零奇异值。看图中很特殊的对角矩阵:两个方向的更新大小分别是 100 和 1。理想化处理后可以变成 1 和 1。例子表达的是对方向尺度的重新安排,实际算法有有限步近似、动量和额外缩放,远比这个例子复杂。

最关键的一点是:它处理的是准备采取的更新,不是直接把模型权重改成正交矩阵。

为什么 Qwen 不把所有参数都交给 Muon?

不同参数的用途不同。一张矩阵可能负责线性变换,也可能是一张按 token 编号查行的表,或负责给专家打分的路由器。虽然存储形状类似,更新时需要保留的结构并不相同。

Qwen 对适合的线性映射使用 Muon,对输入 embedding、输出头、router 等保留 AdamW,N-gram 表则使用不带权重衰减的 Adam。[2] 这是一套按用途分工的训练方案,不是一个算法名字替换另一个名字。

普通聊天时,它还会运行吗?

通常不会。普通推理使用已经训练好的参数,不会每回答一句就运行优化器。对话变长时增加的是请求相关的状态,不能据此说模型正在通过 AdamW 或 Muon 学习你刚输入的内容。

需要时回顾:已有 Transformer / LLaMA 基础

梯度告诉你什么,优化器又做了什么?

想象你有很多可调旋钮,模型的参数就是这些旋钮。预测错了以后,梯度提供局部线索:稍微向哪个方向转,损失可能下降。

但这还没回答“这次转多大、该不该参考前几次的方向”。优化器负责决定实际更新。它只使用数学量,不理解题目本身,也不代替反向传播计算梯度。

AdamW:参考每个旋钮的历史表现

Adam 会记录梯度的历史方向与大小,再对不同参数坐标调整步长。可以理解为:某个坐标的梯度长期很大,与另一个长期很小的坐标,不必用完全相同的处理方式。[29]

AdamW 在此基础上把权重衰减单独处理。权重衰减让参数有向零收缩的趋势;把它与自适应梯度更新分开,改变了实际的正则化效果。[30]

这里的“二阶矩”只是平方梯度的统计,不是求出了整个损失函数的曲率。

怎么一步步走到这里?

  1. 先沿梯度走,再参考过去的方向。 SGD 与动量提供基础的参数更新方式。
  2. 不同坐标的尺度不同。 Adam 使用历史统计调整更新,AdamW 进一步解耦权重衰减。[29][30]
  3. 参数多了,状态和矩阵结构都值得研究。 Adafactor 关注少存优化器状态,Shampoo 利用张量结构;这两条路线不是同一件事。[58][59]
  4. Muon 从更新矩阵的方向结构入手。 大规模训练还要处理形状缩放、跨设备矩阵重建和超参数选择;Qwen 因而采用按参数用途分工的方案。[31][32][2]

读到这里,先记住:梯度提供局部调整线索,优化器决定怎么走。Muon 的对象是矩阵更新方向;它不会在普通聊天中自动改写模型参数。

继续深入:论文脉络、公式与实现细节点此展开原有详细笔记;用于核对精确公式、配置和论文证据。

Adam/AdamW 为每个参数维护一阶与二阶矩估计,再逐元素缩放更新;这种统一接口非常稳健,却不会显式利用“这个参数其实是一张线性映射矩阵”的几何结构。Muon 对矩阵动量做近似正交化,希望让更新的奇异方向更均衡。Qwen3.8 的关键不只是“用了 Muon”,而是建立了一套按参数语义、形状和训练行为分配优化器的规则。[2][31]

发展主线:从标量步长到矩阵更新几何

动量到 Adam:先处理梯度的噪声与尺度差异

最基本的 SGD 沿负梯度走一步;动量累积近期梯度,减少更新方向随 batch 抖动。Adam(2014 预印本 / 2015 ICLR)同时维护一阶矩和平方梯度的二阶矩估计,并进行偏差修正。[29] 后者用于逐坐标调节步长,不是计算 Hessian;“二阶矩”不等于“二阶优化器”。

在不同坐标梯度尺度差异很大时,这种自动调节很方便。但它也要存储额外状态,且每个标量如何更新的接口,没有显式表达一整张线性映射的方向结构。

AdamW 与 Adafactor:先纠正正则化,再考虑状态内存

AdamW(2017 预印本 / 2019 ICLR)把权重衰减从自适应梯度更新中分离。[30] 若直接把 $\lambda W$ 加进梯度,它会与梯度一起被每个坐标不同的分母缩放;解耦衰减则直接执行与当前权重成比例的收缩。这不是给 Adam 换个名字,而是改变了正则化的实际效果。

Adafactor(2018)针对大矩阵的二阶矩存储,使用行列统计来近似完整逐元素统计。[58] 对 $m\times n$ 的矩阵,相关二阶矩状态从 $mn$ 项降到约 $m+n$ 项。它代表“减少优化器内存”的路线;不是说 Qwen 在使用 Adafactor,也不是 Muon 的必经前身。

Shampoo 到 Muon:把矩阵当成矩阵处理

Shampoo(2018)为张量的不同维度维护预条件矩阵,利用比逐坐标缩放更丰富的结构。[59] Muon(2024)采用另一种思路:对矩阵动量做近似正交化。[31] 两者都利用矩阵结构,但 Muon 不是直接求完整 Hessian 的逆,也不能简单等同于 Shampoo。

用理想化满秩矩阵 $M=U\Sigma V^\top$ 解释,polar factor 是 $UV^\top$。若 $M=\operatorname{diag}(100,1)$,理想 polar factor 是 $\operatorname{diag}(1,1)$:强弱方向的尺度差异被压平。实际 Muon 用有限次多项式迭代得到近似结果,还要考虑动量、更新缩放和数值稳定性;不会真的对每张大矩阵执行完整 SVD。[31]

尤其要注意,被处理的是更新方向。更新后的权重 $W-\eta U$ 不因此变成正交矩阵;“Muon 让模型权重全部正交”是错误解释。

2025—2026:单卡公式走向大规模训练 recipe

Muon Is Scalable for LLM Training(2025)研究大规模 LLM 中的更新尺度与实现问题。[32] 到 Qwen3.8,问题进一步细化为哪些矩阵适用、拼接参数怎样拆分、完整矩阵由哪个设备重建与更新,以及学习率和 batch 如何重新标定。[2] 这解释了为什么“替换 optimizer 类名”并不足以复现论文收益。

方法 主要保存 / 使用的信息 解决的问题 不能据此断言
SGD + momentum 梯度与历史方向 噪声、方向抖动 自动适应所有坐标尺度
Adam / AdamW 逐坐标一阶、二阶矩 自适应步长、解耦衰减 利用了完整矩阵几何
Adafactor 行列统计 二阶矩状态内存 等价于矩阵正交化
Shampoo 各维度预条件矩阵 张量结构与相关性 与 Muon 算法相同
Muon 矩阵动量及其近似 polar 更新 更新方向尺度不均衡 所有二维 tensor 都适合

接下来的参数分工可以按语义理解:线性层的矩阵、离散地址的表、专家分类器的 router,虽然都可能存成二维数组,但一次更新希望保留的结构并不相同。

1. AdamW 的默认假设

Adam 根据梯度的一阶矩 m 和二阶矩 v,对每个标量参数独立调节步长。AdamW 再把 weight decay 从自适应梯度更新中解耦。它对 embedding、bias、norm、router 和各种形状都能使用,工程接口统一。[29][30]

“逐元素”也是它的限制:对于一个 A × B 线性变换,更新矩阵的不同方向可能尺度差异很大;AdamW 不会主动把这些奇异方向拉到相近尺度。Muon 正是在这里引入矩阵级操作。

2. Muon 做了什么

Muon 先形成带 Nesterov momentum 的更新矩阵,再用 Newton-Schulz iteration 近似计算其 polar factor / matrix sign,使更新方向接近半正交矩阵。直观上,它保留矩阵更新的主要方向结构,同时压平奇异值的尺度差异。[31][32]

Mt = μMt-1 + ∇Wt Ut ≈ Polar(Mt) Wt+1 = Wt - η · scale(A, B) · Ut 这是概念化写法;Qwen 报告使用 Nesterov momentum 与具体的 shape scaling。

Qwen3.8 的配置细节包括:momentum μ = 0.95,使用 8 步 Newton-Schulz,迭代系数采用 Polar Express 给出的逐步 schedule,并按矩阵形状缩放更新 RMS。报告的 stress test 中,更多 NS steps 降低了 gradient-norm spike 的幅度和频率。[33]

3. 哪些参数使用哪种优化器

Muon

真正作为二维线性映射工作的矩阵

  • Attention Q / K / V / O
  • GDN input / output projections
  • Routed 与 shared expert FC1 / FC2
  • N-gram key / value projections

AdamW

语义或形状不适合矩阵正交化

  • Input embedding 与 LM Head
  • MoE router
  • GR 低秩 projections
  • Attention / GDN output gates
  • Norm weights

Adam, no decay

稀疏访问的查表参数

  • N-gram embedding tables

这里的判断不是“二维 tensor 就用 Muon”。报告给出几个反例:

  • MoE router 虽是矩阵,但每个输出维对应相对独立的 expert score。Muon 在早期加剧波动,后期使用也没有显著收益。
  • GR 低秩矩阵 形状非常狭长,AdamW 表现相当或更好。
  • GDN decay / beta projection 每个 head 只产生一个 scalar,更接近向量,正交化没有明确意义。
  • Output gate projection 的消融中,AdamW 至少不差于 Muon。

这比“Muon for weights, AdamW for embeddings”更准确:分配依据是参数在网络中承担的运算语义。

4. 为什么 fused matrix 要先拆开

Megatron-LM 常把 Q/K/V、SwiGLU gate/up 或 GDN 多组投影存成一个大 fused tensor,以减少 kernel 和通信开销。但它们在数学上是若干独立线性算子的拼接。

如果直接对 fused tensor 做 Muon,会发生两件事:Newton-Schulz 把无关子块的奇异方向混在一起;shape scaling 也使用了拼接后的假形状。Qwen3.8 因此在 optimizer step 中先按语义切开:

  1. SplitQKV 与 GDN input 按 head 拆分,SwiGLU FC1 拆成 gate/up 两半。
  2. Orthogonalize每个真实子矩阵独立运行 Newton-Schulz。
  3. Exclude不适合 Muon 的 gate/vector 子块单独交给 AdamW。
  4. Gather更新重新拼回原 fused layout,不改变前向存储结构。

这说明 optimizer 的“参数单位”不一定等于框架中的 Parameter tensor;应以实际线性算子的边界为准。

5. 分布式 Muon 为什么难

Newton-Schulz 需要看到完整矩阵,但 tensor parallelism 会把矩阵切在多个 rank 上;同时其计算量对较短维度呈高阶增长,简单按元素数均分会让不同 data-parallel rank 的 optimizer workload 严重不均。

Qwen 团队为此使用 Canzona:把“参数在前向中怎样分片”和“optimizer 由谁负责”解耦。静态 partitioner 按估计的 NS FLOPs 分配完整矩阵;Micro-Group pipeline 通过 All-to-All 重建矩阵,owner 执行与单卡等价的 Muon step,再把结果放回原有 ZeRO-1 / Megatron layout。大量拆分后的小矩阵 kernel 则用 CUDA Graph 捕获,降低 launch overhead。[34]

获得矩阵级更新几何与更大的稳定区间

报告中 Muon recipe 支持更高学习率,并降低特定 stress test 的 clipping 与 spike。

支付NS FLOPs、重建通信与 optimizer 编排

需要负载感知分配、All-to-All、语义拆分和 CUDA Graph。

6. 超参数也要重新标定

更换 optimizer 会改变合适的 learning rate、batch size 与训练稳定区间。Qwen3.8 没有沿用 AdamW recipe 的既有 scaling law,而是重新用小规模实验拟合,再外推到目标模型。

报告还给出一个负结果:使用 batch-size warmup 的方案比直接从目标 batch size 开始多花了 18.8% optimizer steps,却没有改善最终效果;因此最终方案移除了 batch-size warmup。这类结果很重要,因为它表明“更多参数更新”并不自动等于更好的 token efficiency;optimizer、batch 和数据量必须共同考虑。

同样,Muon + GR + 新主干的联合稳定性实验不能解释为 Muon 单独带来全部收益。报告专门比较了若干组合,但最终 125B recipe 仍是多个结构与优化选择共同作用。

读完后,试着解释

Muon 正交化的是权重还是更新?为什么 embedding 也是矩阵,却不一定适合?

展开参考答案

处理的是矩阵动量形成的更新方向,权重不会因此自动正交。查表的每一行是离散地址,访问稀疏、语义不同于普通线性映射;仅凭 tensor 是二维不能决定优化器。

本章参考

[2] Qwen 技术报告 §3;[29] Adam;[30] AdamW;[31] Muon;[32] Scalable Muon;[33] Polar Express;[34] Canzona。

查看完整参考文献与资料边界