Muon


训练一个 linear layer 时,参数是矩阵,但 SGD 和 AdamW 的更新规则并没有充分利用这个矩阵的结构。Muon (Jordan et al., 2024) 的做法是:先用 momentum 平滑梯度,再调整更新矩阵的奇异值,让不同方向的更新具有相近的尺度。名字里的 MomentUm Orthogonalized by Newton–Schulz,说的就是这个过程。

从逐元素缩放到矩阵更新

设一层的计算是 \(y=Wx\),其中 \(W\in\mathbb{R}^{m\times n}\),梯度为 \(G_t=\nabla_W\mathcal{L}_t\)。SGD 直接沿着 \(-G_t\) 更新。AdamW (Loshchilov & Hutter, 2019) 则保存梯度的一阶、二阶矩估计 \(M_t,V_t\),用经过 bias correction 的 \(\widehat M_t,\widehat V_t\) 做逐元素缩放:

\[ W_{t+1}=(1-\eta_t\lambda)W_t -\eta_t\frac{\widehat M_t}{\sqrt{\widehat V_t}+\epsilon}. \]

这里的除法和平方根都逐元素进行,\(\eta_t\) 是 learning rate,\(\lambda\) 是 decoupled weight decay 的系数。AdamW 能根据每个坐标的历史梯度调整步长,但矩阵还描述了输入方向到输出方向的映射。Muon 从这些方向入手构造更新。

先看不带 Nesterov 的版本。令 \(M_{-1}=0\),定义

\[ \begin{aligned} M_t&=\beta M_{t-1}+(1-\beta)G_t,\\ O_t&\approx\operatorname{Polar}(M_t),\\ W_{t+1}&=(1-\eta_t\lambda)W_t-\eta_t s_{m,n}O_t. \end{aligned} \]

\(\operatorname{Polar}\) 是下面要解释的矩阵变换,\(s_{m,n}\) 用来控制不同形状矩阵的更新尺度。Momentum 先于这个变换计算:累积的是梯度的历史,再变换平滑后的矩阵。

把奇异值拉到相同尺度

暂时省略时间下标,把待处理的 momentum 矩阵写成 compact SVD:

\[ M=U\Sigma V^\top =\sum_{i=1}^{r}\sigma_i u_i v_i^\top, \qquad r=\operatorname{rank}(M),\quad \sigma_i>0. \]

\(v_i\) 是输入空间里的一个单位方向,\(u_i\) 是对应的输出方向,两组向量各自正交。等式 \(Mv_i=\sigma_i u_i\) 告诉我们:这个更新在方向 \(v_i\) 上的强度是 \(\sigma_i\)。如果奇异值相差很大,更新便主要集中在少数方向。

Muon 的理想变换是

\[ \operatorname{Polar}(M)=UV^\top =\sum_{i=1}^{r}u_i v_i^\top. \]

也就是保留这些方向,把每个非零奇异值变成 \(1\)。这和把整个矩阵除以 Frobenius norm 不一样:整体归一化保留奇异值之间的比例,polar 变换会改变这个比例。

例如 \(M=\operatorname{diag}(8,2,0.5)\),除以 \(\lVert M\rVert_F\) 以后,三个方向仍然相差 \(16:4:1\);理想 polar 变换得到 \(I_3\),三个方向的强度相同。下面也画出了实际五步迭代的结果,计算方法见下一节。

整体归一化、理想 polar 变换与五步近似的奇异值示例矩阵的奇异值为 8, 2, 0.5。Frobenius 归一化后为 0.968, 0.242, 0.061,理想 polar 变换后为 1, 1, 1,五步五次迭代后为 0.740, 0.744, 1.021。三栏共用相同纵轴尺度,柱子始终按原始奇异方向排列,不按迭代后的数值重新排序。Frobenius normalization10.968
\(\sigma_1\)
0.242
\(\sigma_2\)
0.061
\(\sigma_3\)
Same ratio: 16 : 4 : 1
Ideal polar factor11.000
\(\sigma_1\)
1.000
\(\sigma_2\)
1.000
\(\sigma_3\)
All nonzero values become 1
Five quintic steps10.740
\(\sigma_1\)
0.744
\(\sigma_2\)
1.021
\(\sigma_3\)
Similar scale, not exactly 1
左右滑动查看完整示意图
三栏使用相同尺度,虚线标出 1;颜色和下标跟踪同一个原始奇异方向。整体归一化保留比例,理想 polar 变换将非零奇异值设为 1,实际五步近似只将它们拉到相近尺度。

这里的 orthogonalization 指的是更新矩阵。加上这个更新之后,权重 \(W\) 本身不必正交,也不是在要求相邻两个训练 step 的更新互相垂直。对于满秩矩形矩阵,只能有 \(O^\top O=I_n\)\(m\ge n\))或 \(OO^\top=I_m\)\(m\le n\)),所以更准确地说是 semi-orthogonal。

如果 \(M\) 秩亏,上面的 compact SVD 只保留非零奇异值,\(UV^\top\) 是一个 partial isometry,不能声称它的所有行或所有列都正交。多项式迭代也不会凭空生成缺失的方向:在精确算术下,零奇异值始终为零。

和 sign、向量归一化有什么关系?

苏剑林在《Muon 优化器赏析》(Su, 2024) 中将这个 polar 变换记作 \(\operatorname{msign}\)。对非零标量 \(z\)\(\operatorname{sign}(z)=z/\sqrt{z^2}\);矩阵也有类似的表达式:

\[ \operatorname{Polar}(M) =M(M^\top M)^{-1/2}. \]

这里的逆平方根作用于矩阵的特征值;遇到零特征值时采用伪逆约定,将对应值保留为零。因此它一般不同于逐元素取 \(\operatorname{sign}\)。两个特例能说明矩阵形状的意义:

\[ \begin{aligned} \operatorname{Polar}(\operatorname{diag}(z_1,\ldots,z_n)) &=\operatorname{diag}(\operatorname{sign}(z_1),\ldots,\operatorname{sign}(z_n)),\\ \operatorname{Polar}(v)&=\frac{v}{\lVert v\rVert_2}, \qquad v\in\mathbb{R}^{n\times1},\ v\ne0. \end{aligned} \]

同一组数值,作为对角矩阵中的独立缩放系数,结果是逐元素取符号;作为一个列向量,结果是整体归一化。参数在计算中扮演什么角色,会影响合适的更新方式。这里的 \(\operatorname{msign}\) 指基于奇异值的变换,不是一般数值线性代数中基于特征值定义的 matrix sign function。

为什么这种更新可能有用?如果小奇异值对应的方向也包含学习信号,拉平谱就能提高它们相对于主导方向的更新强度。不过,小方向也可能包含噪声;这种直觉本身并不保证泛化更好。Momentum 能平滑输入给变换的梯度,实际收益仍然需要实验验证。

另一个出发点是约束特征的变化。《为什么我们选择尝试 Muon?》(Su, 2025) 从这个角度解释了谱范数:固定这一层的输入 \(x\),更新权重后有 \(\Delta y=\Delta W x\),而

\[ \max_{x\ne0}\frac{\lVert\Delta y\rVert_2}{\lVert x\rVert_2} =\lVert\Delta W\rVert_2. \]

所以,限制谱范数就是限制这个线性层的输出变化相对于输入的最大幅度,再在这个范围内尽量降低 loss。“下降最快”需要先说明怎样衡量一步的大小;Frobenius norm 和 spectral norm 给出的最优方向不同。

为什么 spectral norm 约束会给出这个方向?

Bernstein 和 Newhouse (Bernstein & Newhouse, 2024) 从 norm 约束下的 steepest descent 解释了这种矩阵更新。先忽略 momentum,用一阶近似

\[ \mathcal{L}(W+\Delta W) \approx\mathcal{L}(W)+\langle G,\Delta W\rangle_F, \qquad \langle A,B\rangle_F=\operatorname{tr}(A^\top B). \]

如果限制 \(\lVert\Delta W\rVert_F\le\eta\),最优方向是 \(-G/\lVert G\rVert_F\)。换成 spectral norm 约束

\[ \min_{\lVert\Delta W\rVert_2\le\eta} \langle G,\Delta W\rangle_F, \]

其中 \(\lVert A\rVert_2\) 是最大奇异值,就得到一个最优解 \(\Delta W=-\eta UV^\top\)。因为若 \(G=\sum_i\sigma_i u_i v_i^\top\),则

\[ \langle G,\Delta W\rangle_F =\sum_i\sigma_i u_i^\top\Delta Wv_i \ge-\eta\sum_i\sigma_i, \]

\(-\eta UV^\top\) 能取到等号。这里 \(\sum_i\sigma_i\) 也叫 nuclear norm。

这解释了单层、固定输入下的更新方向。整个网络同时更新时,输入特征也会改变;带 momentum、有限步近似的实际 Muon,也不等于每一步都精确求解当前 loss 的这个问题。

用 Newton–Schulz 避免 SVD

SVD 适合解释方向,但每个 step 都对每个权重矩阵做 SVD,计算成本太高。Newton–Schulz 可以只用矩阵乘法近似这个变换,更适合 GPU。

先归一化

\[ X_0=\frac{M}{\lVert M\rVert_F+\epsilon}. \]

因为最大奇异值不超过 Frobenius norm,\(X_0\) 的奇异值都小于 \(1\)。经典的三次迭代是

\[ X_{k+1}=\frac32X_k-\frac12X_kX_k^\top X_k. \]

\(X_k=U\Sigma_kV^\top\) 代入,得到

\[ X_{k+1}=U\left(\frac32\Sigma_k-\frac12\Sigma_k^3\right)V^\top. \]

矩阵乘法在这里实现了对每个奇异值分别应用 \(f(x)=\frac32x-\frac12x^3\):奇异向量不变,位于 \((0,1)\) 的奇异值逐渐靠近 \(1\)。整个过程不需要显式算出 \(U,\Sigma,V\)

实际的 Muon 实现 使用更激进的五次多项式,常用 \(5\) 步:

\[ \begin{aligned} A_k&=X_kX_k^\top,\\ X_{k+1}&=aX_k+(bA_k+cA_k^2)X_k,\\ (a,b,c)&=(3.4445,-4.7750,2.0315). \end{aligned} \]

对应的标量变换是 \(f(x)=ax+bx^3+cx^5\)。它在零附近的斜率更大,可以更快放大小奇异值;代价是它并不精确收敛到 \(1\),例如 \(f(1)=0.701\)。所以实际输出是 \(U\widetilde\Sigma V^\top\),把奇异值拉到相近尺度,而非严格得到 \(UV^\top\)。前图的第三栏正是这个有限步计算,不能把更多迭代简单理解为更精确的正交化。

极小的非零奇异值在有限步后也可能仍然很小。苏剑林在 Newton–Schulz 专文 (Su, 2025b) 中讨论了另一种改进:每一步采用不同的 \((a_k,b_k,c_k)\),针对剩余的奇异值区间设计后续变换。同样的迭代步数不必共享系数;上面的固定系数五步法只是一个具体实现,计算近似更准确也不自动意味着训练效果更好。

五次多项式如何改变每个奇异值沿用同一个对角矩阵,横轴是一次更新内部的迭代次数 0 到 5,纵轴是各个原始奇异方向上的值。小值被迅速放大,之后围绕 1 上下变化,并非单调收敛。每步数值见图后的折叠表格。One update · five polynomial iterations0.00.51.01.5012345
\(k\)
\(\sigma_1\)
\(\sigma_2\)
\(\sigma_3\)
左右滑动查看完整示意图
实线、长虚线和点线分别跟踪三个原始奇异方向;圆点表示实际迭代值,连线仅用于跟踪。虚线水平线是理想目标 1。这是矩阵内部的数值迭代,不是训练 loss 曲线。
示例每步的奇异值

从对角矩阵的奇异值 8、2、0.5 开始,先除以 Frobenius norm 加 1e-7,再使用正文的五次多项式。表格保留三位小数,各列跟踪原始方向。

迭代次数\(\sigma_1\)\(\sigma_2\)\(\sigma_3\)
00.9680.2420.061
10.7290.7680.207
21.0791.0250.673
30.6890.6871.143
41.1271.1290.771
50.7400.7441.021

计算时可以先转置高矩阵,让参与 \(X_kX_k^\top\) 的行数为 \(\min(m,n)\),最后再转置回来。这样临时方阵更小。矩阵乘法可以在 BF16 下进行;上图用 FP64 演示标量递推,实际低精度结果会有差异。

完整的一步与更新尺度

前面为了说明机制使用了普通 momentum。作者实现默认使用 Nesterov-style momentum,采用 EMA 记法时,完整顺序如下。这里的 \(t\) 是训练 step,\(k\) 是一次更新内部的 Newton–Schulz 迭代,二者不要混淆。

  1. 计算当前梯度 \(G_t=\nabla_W\mathcal{L}_t\)
  2. 更新 \(M_t=\beta M_{t-1}+(1-\beta)G_t\),初始 \(M_{-1}=0\)
  3. 构造 \(H_t=\beta M_t+(1-\beta)G_t\);不用 Nesterov 时取 \(H_t=M_t\)
  4. \(H_t\) 为输入,归一化后执行 \(K\) 次 Newton–Schulz,得到 \(O_t\)
  5. 更新 \(W_{t+1}=(1-\eta_t\lambda)W_t-\eta_t s_{m,n}O_t\)

常用起点是 \(\beta=0.95\)\(K=5\)。有些实现用不带 \((1-\beta)\) 的 momentum 累加式;配套的 Nesterov 写法也要一起对应,不能只替换其中一行。正的整体缩放会被进入迭代前的归一化消去,忽略 \(\epsilon\) 和舍入时,两套配套写法可以等价。

还需要选择 \(s_{m,n}\)。对满秩矩阵的理想 polar 结果,令 \(r=\min(m,n)\),因为共有 \(r\) 个值为 \(1\) 的奇异值,

\[ \lVert O\rVert_F^2=r, \qquad \operatorname{RMS}(O) =\frac{\lVert O\rVert_F}{\sqrt{mn}} =\frac1{\sqrt{\max(m,n)}}. \]

如果直接使用 \(O\),矩阵越大,平均每个元素的更新反而越小。Moonlight (Liu et al., 2025) 使用

\[ s_{m,n}=0.2\sqrt{\max(m,n)}, \]

让理想更新的 RMS 为 \(0.2\),方便与 AdamW 的更新尺度对齐。\(0.2\) 来自该工作的经验选择,不是 AdamW 更新 RMS 的普适定理;有限步近似、秩亏也会使实际 RMS 偏离它。Weight decay 直接作用于 \(W_t\),不放进正交化,也不乘这个形状系数。

苏剑林的《Muon 优化器指南》(Su, 2025c) 将常见缩放整理为四种约定。沿用本文 \(y=Wx\) 的记号,\(m\) 是输出维度,\(n\) 是输入维度:

约定\(s_{m,n}\)缩放方式
朴素版\(1\)直接使用近似 polar 结果
KellerJordan 版\(\sqrt{\max(1,m/n)}\)输出维度大于输入维度时放大更新
MuP 版\(\sqrt{m/n}\)按输出与输入的维度比缩放
Moonlight 版\(0.2\sqrt{\max(m,n)}\)将理想更新的元素 RMS 对齐到 \(0.2\)

同一个 learning rate 数值不能脱离缩放约定比较。PyTorch 的 Muon 文档 (PyTorch Contributors, n.d.) 将 KellerJordan 版和 Moonlight 版分别称为 originalmatch_rms_adamw。维度比要按线性层的实际输入、输出判断:如果代码写成行向量形式的 x @ W,权重的存储形状就是 \([\text{in},\text{out}]\),不能照搬 PyTorch Linear 的轴顺序。为降低 Newton–Schulz 成本而临时转置矩阵,也不应改变缩放因子。

MuP 版与官方版的 max(1, ·) 分别在控制什么?

MuP 关注模型宽度改变时的更新尺度。对 \(v\in\mathbb{R}^d\)\(\operatorname{RMS}(v)=\lVert v\rVert_2/\sqrt d\)。用这个量衡量每个特征分量的变化,有

\[ \max_{x\ne0} \frac{\operatorname{RMS}(\Delta W x)}{\operatorname{RMS}(x)} =\sqrt{\frac{n}{m}}\lVert\Delta W\rVert_2. \]

对非零矩阵的理想 polar 更新,\(\Delta W=-\eta s_{m,n}O\)\(\lVert O\rVert_2=1\)。取 \(s_{m,n}=\sqrt{m/n}\),上式就等于 \(\eta\),不随输入、输出维度改变。这给出了 MuP 版的尺度直觉;它控制特征扰动,Moonlight 版则对齐更新矩阵本身的元素 RMS。

苏剑林在 2026 年的文章 (Su, 2026) 中进一步用各向同性输入解释官方版的截断,下面假设待处理的矩阵满秩。当 \(m<n\) 时,理想 \(O\) 会丢掉输入在其行空间之外的分量;若固定 \(O\),并假设输入满足 \(\mathbb{E}[xx^\top]=I_n\),就有

\[ \mathbb{E}[\operatorname{RMS}(Ox)^2] =\frac{\operatorname{tr}(OO^\top)}m=1 =\mathbb{E}[\operatorname{RMS}(x)^2]. \]

按这种平均尺度,取 \(s_{m,n}=1\) 就够了;当 \(m\ge n\) 时,相同计算则给出 \(s_{m,n}=\sqrt{m/n}\),合起来正是官方版的 \(\max(1,\cdot)\)。这是一种依赖输入分布的解释。训练中输入与更新方向可能相关,不能据此认定该缩放在所有阶段都更优。

Weight decay 为什么能限制权重谱范数?

《为什么我们选择尝试 Muon?》(Su, 2025a) 还给出了一个简单的范数界。设 \(\lambda>0\)\(0\le\eta_t\lambda\le1\),矩阵形状和缩放 \(s_{m,n}\) 固定。对理想 polar 更新,由三角不等式得到

\[ \begin{aligned} \lVert W_{t+1}\rVert_2 &\le(1-\eta_t\lambda)\lVert W_t\rVert_2+\eta_t s_{m,n}\\ &\le\max\left(\lVert W_t\rVert_2,\frac{s_{m,n}}\lambda\right). \end{aligned} \]

逐步使用这个关系,就有 \(\lVert W_t\rVert_2\le\max(\lVert W_0\rVert_2,s_{m,n}/\lambda)\)。因此,限制每步更新的谱范数,再配合 weight decay,可以限制权重谱范数的累积增长。

实际近似若满足统一的界 \(\lVert O_t\rVert_2\le C\),则将上界中的 \(s_{m,n}\) 换成 \(Cs_{m,n}\)。这个界通常很宽松,也没有同时约束整个网络的输入特征,不能把它当作 attention logits 必然稳定的保证。

实际训练中的取舍

Muon 通常用于 Transformer 隐藏层的 attention projection 和 MLP 权重;embedding、LM head、bias 和 normalization 参数交给 AdamW。Embedding 和 LM head 虽然也是二维矩阵,但参数分组还要考虑它们的用途,不能只检查 ndim == 2。作者还报告 (Jordan et al., 2024),把合并存储的 Q、K、V 分开做 Muon 更新更好;矩阵如何分块会改变变换本身。

比较项AdamWMuon 的矩阵参数部分
更新处理用二阶矩估计逐元素缩放用矩阵多项式调整 momentum 的奇异值
持久优化器状态一阶、二阶矩一个 momentum buffer
每步额外计算主要是逐元素运算多次矩阵乘法和临时方阵
参数切片更新可逐元素独立计算任意切片后分别正交化通常不等价

假设两者的状态都用 FP32,Muon 的矩阵参数每个元素需 \(4\) bytes 的持久 momentum,AdamW 的两个矩估计需 \(8\) bytes。这只比较优化器状态,不包含参数、梯度、master weights、activations、Newton–Schulz workspace,以及仍由 AdamW 管理的参数,不能据此说训练总显存减半。

分布式训练的区别也来自矩阵结构。例如按行分成 \(M_1,M_2\),完整 Gram matrix 包含 \(M_1M_2^\top\) 这样的跨分片项;各卡独立处理自己的切片会漏掉它们。结合 FSDP / ZeROTensor Parallel 时,需要恢复相关矩阵,或使用数学上对应的分布式矩阵运算。Moonlight 的实现会 gather 相关分片再计算完整更新,并保留本卡需要的部分;这些临时状态和通信都要计入成本。

Moonlight (Liu et al., 2025) 在其 compute-optimal scaling 实验中报告了相对 AdamW 约 \(2\times\) 的计算效率,并用 Muon 训练了总参数 \(16\)B、激活参数约 \(3\)B 的 MoE。这个结果描述的是其训练设置下的 compute–loss 关系,不代表一个 optimizer step 快了两倍。Muon 每步增加的矩阵计算能否被达到目标 loss 所需 step 的减少抵消,要在相同硬件和训练设置下测 wall-clock time。

更大规模还会遇到稳定性问题。Kimi K2 的 MuonClip (Kimi Team, 2025) 在 Muon 更新之外加入 QK-Clip:根据每个 attention head 观测到的 logits,在更新后缩放相关 query / key 权重,抑制 logits 过大。它是额外的稳定化机制;仅把更新矩阵的奇异值拉平,并不能限制整个训练过程中权重和 attention logits 的增长。

References

Bernstein, J., & Newhouse, L. (2024). Old Optimizer, New Norm: An Anthology. doi.org
Jordan, K., Jin, Y., Boza, V., You, J., Cesista, F., Newhouse, L., & Bernstein, J. (2024). Muon: An optimizer for hidden layers in neural networks. kellerjordan.github.io
Kimi Team. (2025). Kimi K2: Open Agentic Intelligence. doi.org
Liu, J., Su, J., Yao, X., Jiang, Z., Lai, G., Du, Y., Qin, Y., Xu, W., Lu, E., Yan, J., Chen, Y., Zheng, H., Liu, Y., Liu, S., Yin, B., He, W., Zhu, H., Wang, Y., Wang, J., … Yang, Z. (2025). Muon is Scalable for LLM Training. doi.org
Loshchilov, I., & Hutter, F. (2019). Decoupled Weight Decay Regularization. International Conference on Learning Representations. arxiv.org
PyTorch Contributors. (n.d.). Muon — PyTorch 2.9 documentation. docs.pytorch.org
Su, J. (2024, December). Muon优化器赏析:从向量到矩阵的本质跨越. kexue.fm
Su, J. (2025a, February). Muon续集:为什么我们选择尝试Muon?. kexue.fm
Su, J. (2025b, May). msign算子的Newton-Schulz迭代(上). kexue.fm
Su, J. (2025c, November). Muon优化器指南:快速上手与关键细节. kexue.fm
Su, J. (2026, June). 为什么官方版Muon比MuP版多出一个max(1, ⋅)?. kexue.fm

Cite this post

@misc{pu2026mlmlrevisitoptmmuon,
  author = {Pu, Fanyi},
  title  = {Muon},
  year   = {2026},
  month  = {9},
  url    = {https://pufanyi.com/blog/ml/ml-revisit/optm/muon}
}