Muon 优化器:DeepSeek V4的幕后英雄

0 阅读17分钟

最近一年,Muon 这个名字在大模型圈里出现得很频繁。Keller Jordan 在 2024 年 12 月发出原始博客之后,NanoGPT speedrun、Moonshot 和 Essential AI 又把它带进了更大规模的预训练讨论里。现在再提 Muon,很多人会顺手把它概括成一句话:一个“把更新矩阵正交化”的优化器。

这句话不算错,但信息量不够。把 Muon 放回文献脉络里看,它更像是几条研究线索在 2024 年底碰到一起的结果:一条来自对 AdamW 这类逐坐标优化器的不满,一条来自谱范数和 feature learning 的缩放理论,一条来自 modular norm / duality map 这套更抽象的优化观点,还有一条来自 Shampoo 这类矩阵级预条件方法在数值实现上的启发。

一、动机

Muon 最直接的动机,来自一个很朴素的观察:神经网络里很多重要参数并不是一串彼此独立的标量,而是有明确线性代数结构的矩阵。

对于 Transformer 里的 MLP、Attention 投影、卷积核这类 2D 参数来说,权重矩阵并不是“很多数字随便排成一块板子”。它们的输入是 dense vector,输出也是 dense vector,矩阵本身承担的是一个线性映射。既然参数对象是矩阵,那么更新它的方式,理论上也应该多少尊重一点矩阵的几何结构。

这恰好是很多主流优化器最容易被质疑的地方。AdamW 这类方法的强项,在于稳定、通用、工程基础设施成熟;但它在更新上更偏向逐坐标处理,默认每个参数元素都像独立对象。这个假设在很多情况下很好用,可一旦参数天然带有矩阵语义,它就开始显得有点粗糙了。

Jeremy Bernstein 在 Deriving Muon 里把问题讲得更明确:社区在激活归一化这件事上花了大量精力,BatchNorm、LayerNorm、RMSNorm 都是在问“怎样控制激活的尺度”;那为什么在权重更新这件事上,反而默认梯度可以原样减到参数上?如果更新的尺度和方向会直接决定输出扰动的大小,那么它本来就应该被当成一个需要设计的问题。

这里面最直接的不满,就是不要再把隐藏层权重矩阵的更新,当成一团没有内部结构的坐标噪声。

第二层动机,来自“输出扰动应该怎样被控制”。

Deriving Muon 的推导抓住了一个很有用的角度:更新一个线性层,本质上是在扰动这个层的输出。既然如此,衡量一个更新是不是“合适”,就不该只看它在参数空间里有多大,还应该看它会把输出推多远。对一个线性层来说,这个问题自然会落到 operator norm 上,因为 operator norm 正是在问:这个矩阵最多能把输入向量放大多少。

一旦这么看,问题就不再是“梯度多大”,而变成了“这个更新会给功能空间带来多大扰动”。Muon 的很多设计都可以从这里往回读。

第三层动机,来自宽度缩放和学习率迁移。

大模型训练里有一个很烦但又绕不开的问题:模型一变宽、层一变深,原来那套学习率和更新尺度常常就不再对。于是大家不得不靠经验公式、参数化技巧和大量 sweep 去重新找平衡。A Spectral Condition for Feature Learning 和后来的 Scalable Optimization in the Modular Norm 都在试图回答:有没有一种“自然”的更新尺度,使得随着网络宽度变化,训练行为还能保持相对稳定?

Muon 吸收了这条思路。它不是单纯追求“把 singular value 变成 1 很酷”,而是在找一种更接近 layer semantics 的更新度量,让 learning rate 更有机会跨宽度迁移。

第四层动机,才是最靠近工程现场的一层:这些理论想法必须能跑在 GPU 上。

如果一个优化器的数学形式很好看,但需要完整 SVD 才能算一次更新,那它在大模型训练里基本就没法用。Keller Jordan 在原始博客里专门解释了为什么最后没有选 SVD,也没有走更重的矩阵函数实现,而是用了 Newton-Schulz iteration。原因很简单:它可以稳定地用 bfloat16 跑,而且足够快。

这也是 Muon 的一个重要背景。它不是从“理论完美”往下推,而是从一开始就带着很强的数值实现意识:什么东西在现代 GPU 上算得动,什么东西虽然漂亮但注定太慢。

把这几层动机放在一起,Muon 的出现就不难理解了。问题主要集中在几件事上:矩阵被当成标量集合,更新尺度主要靠经验调,宽度变化后学习率迁移依旧麻烦,而矩阵级优化方法又常常太重。

二、原理

Muon 的名字来自 MomentUm Orthogonalized by Newton-Schulz。只看实现的话,它做的事情并不复杂:

  1. 先对梯度做动量累积。
  2. 把这个 2D 更新矩阵送进 Newton-Schulz 迭代。
  3. 迭代的目标不是求逆,也不是求特征值,而是把更新矩阵近似正交化。
  4. 再把这个正交化后的更新乘上合适的尺度,减到参数上。

流程本身不难,难的是后面那套解释。

如果把公式直接写出来,最基础的 Muon 可以先记成下面这组式子。设矩阵参数为 (W_t),对应梯度为 (G_t=\nabla_W \mathcal{L}(W_t)),动量系数为 (\mu),学习率为 (\eta):

[ M_t=\mu M_{t-1}+G_t,\qquad M_0=0 ]

[ \operatorname{Ortho}(M_t)=U_tV_t^\top,\qquad \text{其中 } M_t=U_tS_tV_t^\top ]

[ W_{t+1}=W_t-\eta,\operatorname{Ortho}(M_t) ]

这就是 Keller Jordan 原始博客里的核心写法:先得到一个动量矩阵,再把它替换成对应的半正交矩阵,然后拿这个结果更新参数。 第一行还是常见的 momentum。真正变味的是第二行和第三行:Muon 不直接拿动量矩阵去更新,而是先把“大小分布很不均匀的矩阵”变成“方向保留、奇异值被拉平的矩阵”,再走下一步。

如果采用 Nesterov 版本,常见写法会先构造一个前瞻动量项

[ \tilde M_t = G_t + \mu M_t ]

然后把上面的 (\operatorname{Ortho}(M_t)) 换成 (\operatorname{Ortho}(\tilde M_t))。 这一步和 Nesterov momentum 的直觉一致:先往前看一小步,再决定当前更新往哪儿走。Muon 只是把这个“前瞻方向”也放进了正交化流程里。

问题在于,(\operatorname{Ortho}(\cdot)) 如果直接按奇异值分解来算,代价太高。于是实际实现里不会真的每一步都做 SVD,而是改用 Newton-Schulz 迭代去近似这个正交化过程。一个常见写法是先归一化

[ X_0=\frac{M_t}{\lVert M_t\rVert_F+\varepsilon} ]

然后反复迭代

[ A_k=X_kX_k^\top ]

[ X_{k+1}=aX_k+bA_kX_k+cA_k^2X_k ]

其中 ((a,b,c)=(3.4445,-4.7750,2.0315)),通常迭代 5 步左右,最后用 (X_T) 近似 (\operatorname{Ortho}(M_t))。 这里可以把 Newton-Schulz 迭代理解成一种“便宜地把奇异值往 1 推”的过程。它不追求把 SVD 算得很精确,目标是用少量矩阵乘法拿到一个足够接近正交化结果的更新方向。

到了大规模训练里,公开实现通常还会再补上两项工程修正:一项是 decoupled weight decay,另一项是和矩阵形状有关的 update scale。于是更新式更接近

[ W_{t+1}=(1-\eta\lambda)W_t-\eta,\alpha(W_t),X_T ]

这里 (\lambda) 是 weight decay,(\alpha(W_t)) 是按参数形状调整的缩放因子。Moonshot 那篇 Muon is Scalable for LLM Training 讨论的,主要就是这两项修正为什么在大规模训练里变得必要。 这一步说明,真正落到大规模预训练时,Muon 并不是“正交化一下就结束了”。权重衰减和形状相关缩放要一起管,否则小模型上能跑通的更新规则,放到 LLM 训练里不一定稳。

1. 先积累动量,再处理矩阵形状

Keller Jordan 在原始博客里专门把 Muon 和更早的 Orthogonal-SGDM 做了区分。后者是先对梯度做正交化,再做动量;Muon 则把顺序调过来,先积累动量,再把动量矩阵正交化。

背后的直觉并不复杂。动量本来就在做方向整合,让短期噪声别太干扰长期更新趋势。既然如此,真正值得拿去做矩阵级几何处理的对象,不是某一步瞬时梯度,而是已经带有时间信息的更新方向。Muon 相当于先让 SGD-momentum 给出一个长期方向,再用正交化去重新分配这个方向在不同奇异方向上的强弱。

2. 正交化在这里解决什么问题

这里大致有两种解释路径,一种偏经验,一种偏理论。

经验路径来自 Keller Jordan 的观察:Transformer 隐藏层里,SGD-momentum 和 Adam 产生的 2D 更新矩阵往往条件数很高,很多更新几乎是低秩的,少数方向特别强,其他方向很弱。这样一来,优化就容易被几个主导方向牵着跑,而那些幅度小、但可能对学习有用的“稀有方向”很难真正发挥作用。

正交化做的事情,正是把更新矩阵的奇异值重新拉平。SVD 角度下,如果更新矩阵写成 USV^T,那正交化之后就更接近 UV^T:方向还在,但奇异值信息被压掉了。Keller 对此的解释很朴素,也很有代表性:这会抬高那些原本被压得很小的“rare directions”的权重。

理论路径则来自 Jeremy Bernstein 一系的工作。

Old Optimizer, New Norm 里,Bernstein 和 Newhouse 重新解释了不少优化器:关掉指数滑动平均之后,Adam、Shampoo、Prodigy 都可以看成某种范数下的最速下降。这个视角的关键是,梯度不是天然就适合直接减到参数上的对象;它首先是某个范数结构下的对偶向量,需要先通过对偶映射回到“权重所在的空间”。

到了 Modular Duality in Deep Learning,这个想法被进一步推广到神经网络:不同层的语义不同,就应该配不同的 operator norm,再由这些 layerwise norm 递归地构造整个网络的 duality map。对线性层来说,这条路最终会把你带到一个矩阵级的 dualization 操作,而这个操作恰好和正交化高度相关。

从这个视角看,Muon 不是“碰巧发现正交化有用”,而是在更一般的“梯度需要先被 dualize”这个框架里,找到了一个适合 Linear / Conv 这类层的具体实现。

3. 缩放项是怎么进来的

这部分经常被略过,但它决定了 Muon 和很多“矩阵小技巧”的差别。

Jeremy 在 Deriving Muon 里并不是直接从“谱范数很酷”起步,而是先给 linear layer 指定输入、输出的 RMS 度量,再定义 RMS-to-RMS operator norm。这样一来,一个更新 ΔW 会让输出变化多少,就可以通过这个 operator norm 来控制。

如果你沿这条推导走下去,会得到一个很重要的结果:对 linear layer 来说,合适的更新尺度会自然带出 sqrt(fan-out / fan-in) 这样的维度因子。它的意义不只是“数值上更顺手”,而是它把 width transfer 这件事写进了更新规则里。

这里能看出,Muon 不是先决定做正交化,再到后面补一个缩放常数。它的完整形式,来自“要控制输出扰动,而且这个控制要跨宽度稳定”这一整套思路。

4. 最后为什么落到 Newton-Schulz

如果目标是把 USV^T 变成 UV^T,最直接的做法当然是 SVD。但 SVD 太贵,这条路在大模型训练里很难走通。

Newton-Schulz 的好处,是它提供了一种便宜得多的迭代方式。Keller 的博客里把这件事讲得很清楚:Newton-Schulz 作用在矩阵上,本质上是在对奇异值施加一个多项式迭代,让落在 [0, 1] 区间里的奇异值逐步靠近 1。只要先把矩阵做一个尺度归一化,再选好多项式系数,几步迭代就能得到一个足够好的“近似正交化”结果。

Muon 里那组看起来有点神秘的系数,本质上是在优化这个收敛过程。目标不是数学上最精确,而是在“误差可接受”的前提下尽量减少迭代步数,让整件事值得上 GPU。

这一步很能说明 Muon 的气质:它不是拿一个经典矩阵算法生搬硬套到深度学习里,而是把“数值够快、精度够用、硬件友好”一起当成设计条件。

三、特点

1. 参数被当成矩阵,不再只是坐标集合

这是 Muon 最直观的特点。它看待 2D 隐藏层参数的方式,不是把它们当成一万个独立坐标,而是把它们当成一个线性算子。正因为如此,它关心的不是单个条目要不要被放大,而是整个更新矩阵在奇异方向上的分布是否失衡。

这一点也解释了为什么 Muon 对参数类型有很明确的偏好:MLP 权重、Attention 投影、卷积核可以吃;bias、LayerNorm scale、embedding 往往不适合直接吃。Laker Newhouse 在 Understanding Muon 的源码解读里把这件事说得很实在:规则不能简化成“只要是 2D 就用 Muon”,关键还得看这个矩阵两端的输入输出范数语义是否匹配。

2. 仍然是一阶优化,只是几何直觉变了

这点很容易被说歪。很多人看到 Muon 和 Shampoo 的关系,就会顺手把它归到“二阶味道更重”的一类里。可按 Old Optimizer, New Norm 和 Keller 自己的解释,Muon 更合理的理解方式,仍然是一阶优化,只不过这个一阶不是在 Euclidean/coordinate 直觉里定义的,而是在一个更适合矩阵层的范数结构里定义的。

这会影响对 Muon 成本和收益的判断。它不是在完整地逼近 Hessian,也不是在做传统意义上的 curvature correction。它做的是另外一件事:换一个更贴近层语义的“最速下降方向”。

3. 和宽度缩放、feature learning 连得比较紧

Muon 的另一个特点,是它不是孤零零的一条 trick,而是和一整套关于缩放规律的讨论连着的。A Spectral Condition for Feature Learning 讨论的是 feature learning 需要怎样的谱尺度;Scalable Optimization in the Modular Norm 讨论的是 learning rate 如何跨宽度和深度迁移;Deriving Muon 则把这些讨论具体落到 linear layer 的更新形式上。

Muon 让人感兴趣,不只是因为它在某些 benchmark 上更快,也因为它把“训练更快”和“缩放更自然”放在了同一个句子里。很多优化器只能解释局部性能,Muon 试图把解释往前多推一步。

4. 证据是一步一步堆起来的

Muon 的扩散路径也有点特别。它最早不是先发顶会论文,再由大公司背书,而是博客、speedrun 记录、开源实现、后续大规模预训练论文,一层一层往上叠。

这条路径本身也是 Muon 的一个特点:它的说服力很大一部分来自社区可见的竞争性任务。Keller 在原始博客里反复强调 speedrun 记录的重要性,原因就在这儿。优化器研究最怕的是 baseline 没调好,但 competitive task 至少会逼着大家不断回头调基线。Muon 能在这种环境里持续留下来,比单次论文表格里的领先更有说服力。

5. 公开优势主要还在预训练和大 batch

到 2025 年的公开材料为止,Muon 最能打的证据集中在预训练,尤其是大 batch 预训练。Practical Efficiency of Muon for Pretraining 这篇论文的重点很明确:Muon 的价值不只是某个 loss 点更低,而是它在大 batch 下更能守住数据效率,因此在 compute-time tradeoff 上有现实意义。

这让 Muon 和很多“实验室里很好看”的优化器不太一样。它已经开始回答一个更硬的问题:在真正昂贵的训练里,省下来的到底是不是钱。

四、局限性

1. 一开始就不是全参数替代 AdamW 的方案

这是最现实的一条限制。Muon 的设计对象是 2D hidden-layer parameters,而不是所有参数。Keller 的原始博客和 Laker 的源码解读都说得很直接:embedding、bias、LayerNorm、很多标量和向量参数,通常还是要交给 AdamW 这一类备份优化器。

这意味着 Muon 更像一个“分层混合优化方案”的核心部件,而不是一句 optimizer=muon 就能把全网参数一把梭的通用解法。对工程团队来说,这种适用范围限制并不致命,但它确实提高了接入门槛。

2. 理论成立,不等于大规模训练自动稳定

Moonshot 那篇 Muon is Scalable for LLM Training 提供了一个很重要的反面证据:Muon 不是把小模型经验原封不动搬到大模型上就能成功。作者明确说了,要把 Muon 稳定扩到大规模 LLM 训练,有两件事必须补上:weight decayper-parameter update scale

这也说明,Muon 的“原型阶段”还远远没结束。它不是那种一出现就所有超参数都自然闭合的优化器,至少到 2025 年初,很多缩放层面的细节还需要额外设计。

3. 系统开销压下来了,但没有消失

Newton-Schulz 比 SVD 便宜很多,这没错;但“便宜很多”和“没有额外成本”不是一回事。矩阵正交化毕竟是额外算子,分布式场景里的通信和实现复杂度也不会凭空消失。Keller 在 2024 年底的原始博客里把“如何在大规模 GPU 集群上妥善分发 Newton-Schulz 迭代”列成了公开问题,本身就说明这件事还没有被彻底解决。

后续像 Moonshot 的论文虽然已经把 memory-optimal、communication-efficient 的实现往前推了一步,但这类系统问题仍然是 Muon 的门槛之一。

4. 很依赖层语义,接入时不太傻瓜

Muon 的理论优势之一,是它强调不同层应该配不同范数;但同一件事换到工程端,就会变成一个限制:你必须知道自己在优化什么。什么是 dense-to-dense 映射,什么层适合 RMS-to-RMS operator norm,什么层要排除在外,这些都不是默认显然的。

这也是为什么 Laker 会强调“p.ndim == 2 不是一个正确的 Muon 参数选择规则”。它点出了一个很真实的问题:Muon 的成功,在某种程度上依赖你能不能正确理解网络里每一类参数的功能角色。

这比 AdamW 更挑使用者。

5. 证据还集中在预训练,别的训练范式要继续看

Keller 在原始博客里最后列出的开放问题,到今天看依然成立:Muon 会不会只对 pretraining 特别有效?到了 finetuning、RL,甚至更复杂的 agentic training 场景,它的优势还能不能保住?

到目前为止,公开证据还没有把这些问题全部回答完。更稳妥的看法不是“它会取代 AdamW”,而是“它已经证明自己值得被认真对待,但边界还在继续长出来”。

参考资料