优化器 (2):Muon
引言
在上一篇文章中,我们深入介绍了基于梯度下降算法的各种机器学习优化器。这些优化器以SGD和Adam为代表,通过迭代更新模型参数,最小化损失函数。
在实际的机器学习模型中,参数往往是一个矩阵(比如MLP、transformer中的QKV等)。然而在SGD和Adam中,我们一般将参数看作一个一维向量,即
近期,有一项研究在社区中引起了不小的关注。这项研究提出了一个全新的优化器Muon (MomentUm Orthogonalized by Newton-Schulz),这个优化器将参数作为一个矩阵而非向量来看待,因此可以更好地利用参数的结构信息,苏剑林在博客将这个工作称为【从向量到矩阵的本质跨越】。
在LLM的预训练中,研究者们发现Muon拥有比默认选择AdamW更好的性能,且训练的稳定性更高、收敛速度更快。更重要的是,Muon只需要维护一份梯度的动量估计(Adam需要维护一阶矩和二阶矩),因此在大规模训练中有很大优势。因此,Muon在Kimi-k1.5和Kimi-k2上均被用作预训练阶段的优化器。
在这篇博客中,我们就跟随着苏剑林的一系列博客,详细介绍Muon优化器的原理和实现。
一、Muon的数学原理 [1]
1.1. Muon的更新公式
Muon的全称是 “MomentUm Orthogonalized by Newton-Schulz”,从名字中可以看到,Muon的主要创新点是利用Newton-Schulz方法对参数的动量进行正交化。
具体来说,Muon是一个适用于矩阵参数
公式 (1) 中出现了一个矩阵符号函数
其中,
关于
在上一篇博客中我们已经看到,像AdaGrad、RMSProp、Adam等自适应学习率优化器的特点是通过维护【梯度平方的滑动平均的平方根】来动态调整每个参数的学习率。这种调节方法有两大好处:
- 对损失函数进行常数缩放不影响优化轨迹。
- 每个参数的更新幅度尽可能一致。
而Muon也正好具有这两大好处,具体来说:
- 当损失函数乘上常数因子
,此时动量矩阵 也会乘上相同的因子,但经过SVD分解之后的特征向量矩阵 不会发生变化。因此 不变,即优化轨迹不变。 - 由于
是对动量矩阵 的正交化,因此它表现出“各向同性”,即每个参数的更新幅度是一致的。
事后考古发现,一篇2015年的论文也提出了类似的思想,当时称为 “Stochastic Spectral Descent”。
1.2. 矩阵符号函数
在这一小节中,我们对矩阵符号函数
首先我们说明,为什么它是
利用 SVD,我们可以证明(具体证明展示在附录中):
对于实数
此外,考虑一维向量
综上所述,Muon对于性质的矩阵参数有着不同的处理方式:
- 对于一般的矩阵参数(如MLP、QKV等),使用
对动量进行正交化。 - 对于对角矩阵参数(如LayerNorm中的gamma),则是对动量进行
操作。 - 对于向量参数(如MLP的偏置和词表embedding),则是对动量进行L2归一化。
值得注意的是,虽然词表embedding也属于矩阵参数,但它们在使用上是稀疏的,因此更合理的方式是对它们的动量进行L2归一化。
值得补充的是,当矩阵
1.3. Newton-schulz迭代求解
由于SVD的计算开销较大,因此在实践中,作者提出了使用Newton-schulz迭代来近似计算
迭代近似的出发点是公式 (3)。不失一般性地,我们设
因此,我们有:
因此,Newton-schulz算法的迭代公式为:
然而,当我们查看Muon的官方实现时,发现其Newton-schulz的迭代公式与公式 (8) 大致相同,但常数项不同。苏剑林的博客中对这个不一致做出了解释,他认为官方实现对目的在于加速Newton-schulz迭代的收敛。感兴趣的读者可以在附录3中找到这个解释的具体内容。
二、从范数视角看Muon的优势 [1,2]
上面我们提到,Muon优化器是一种从向量到矩阵的本质跨越。它把模型的参数以矩阵的形式来进行优化,从而获得了更好的理论优势。在这一节中我们我们试图分析这一观点。
读者可能会感到好奇的是,把参数看作向量和矩阵有什么本质的区别吗?因为矩阵和向量都是一堆数字的排列,形式的不同会对优化的结果产生什么影响?
在苏剑林的博客 [1] 中提到了一种观点,即矩阵有一些性质和概念是与向量不同的。比如说,矩阵中有迹(trace)这个概念,它是矩阵主对角线上元素的和。矩阵的迹有一个重要特性是在相似变换下保持不变,且等于矩阵的所有特征值之和。从这个例子就可以看出,矩阵的对角线元素跟非对角线元素,地位其实是不完全对等的。而Muon正是因为考虑了这种不对等性,才有着更好的效果。
那么Muon究竟捕捉了矩阵的什么关键特性呢?我们下面将从范数的视角来重新看待Muon,试图来回答这个问题。
2.1. Muon控制了模型输出值的变化量
对于一个向量
其中,
考虑一个线性变换
其中,
公式 (10) 的证明展示在附录4中。
当我们将权重矩阵更新
由于【任意向量范数与其诱导范数都是相容的】,因此我们可以写出
这意味着我们可以通过控制权重更新
2.2. Muon的带约束优化问题形式
Muon的核心思想可以总结为:在【稳】的前提下寻找【尽可能快】的更新量。即:
- 对模型的扰动尽可能小;
- 对Loss对贡献要尽可能大。
为此,Muon把参数的更新量
其中,矩阵内积定义为:
可以证明,公式 (14) 的最优解为:
公式 (15) 的证明在附录5中。
公式 (14) 中的目标函数正是梯度下降的目标函数。而公式 (15) 告诉我们,当给梯度下降的参数更新量施加一个范数约束时,得到的最优更新量正好就是Muon优化器。
因此,我们可以看到,Muon相当于一个在RMS范数约束下的梯度下降法,这个范数约束更好地度量了矩阵之间的本质差异,从而使得更新的每一步都走的更精准、更本质。
三、Scaling Muon to Large Models [3,4]
在这一节中,我们主要讨论如何在更大尺寸的模型上应用Muon优化器。虽然Muon的理论优势在小尺寸模型上已经被证明,但在更大尺寸的模型上,想要让Muon稳定优于经典的Adam等优化器,还需要一些工程优化。
3.1. 权重衰减项的引入 [3]
苏剑林的团队在将Muon应用在更大尺寸的模型上时,发现在训练前期收敛确实很快,但很快就被Adam追上,甚至还会有各种崩溃的苗头出现。
为此,他们在公式 (14) 中引入了一个权重衰减项,即:
此时发现,Muon就能一直保持领先于Adam。他们分析,权重衰减项在其中起的作用就是让参数的范数保持有界。
当某一个优化器给出的更新向量
对于Muon来说,我们选择
这样就保证了参数
3.2. Update RMS对齐:快速找到最优超参数 [3]
当我们尝试一个新的优化器时,一个非常重要的问题就是如何快速找到最优的超参数。比如说Muon中至少有两个重要超参数:学习率
苏剑林团队提出了一种名为Update RMS对齐的超参迁移思路,可以快速地将Adam中经过检验的超参数快速应用到其他优化器上。
对于一个矩阵
注意这里的RMS和公式 (10) 中定义的RMS范数不一样,请读者务必加以区分。
在实验中观察到,使用Adam更新参数时,更新量的RMS基本稳定在0.2~0.4之间 [5]。因此,我们可以将Muon的Update RMS也对齐到0.2,即改为:
这样一来,我们就可以服用Adam中的
更进一步地,对于Muon来说,其更新量的RMS是可以解析地算出来的:
在实践中,一个矩阵是严格低秩的概率比较小,因此我们可以认为
因此公式 (20) 可以进一步写为:
上面的公式同时也表明了:在Muon中不适宜对所有的参数
3.3. QK-Clip:将Muon应用到100B以上的模型 [4]
上述两个优化手段的有效性在16B的模型上得到了验证,然而当他们试图进一步将Muon拓展到100B参数以上的模型时,则出现了新的问题:MaxLogits爆炸。
为了解决这个问题,他们使用了一种新技术:QK-Clip。该方法从一个非常本质的角度去看待和解决MaxLogit爆炸现象,并且无损模型效果,这也是Kimi K2(1000B参数)的关键训练技术之一。
MaxLogits是指attention矩阵的最大值,即:
MaxLogits爆炸是指:
尽管经过Softmax之后都会变成小于1,顶多是浪费了一个attention head,但在最坏情况下MaxLogits爆炸会引起梯度爆炸和训练崩溃。因此,我们也应当尽可能地避免MaxLogits爆炸的情况。
3.3.1. softcap和QK-Norm
在上面我们提到,可以使用权重衰减来一定程度上防止MaxLogits爆炸的情况出现,但这种策略仅仅适用于小模型。当模型参数量越来越大,训练的不稳定因素越多,权重衰减就越难稳定训练过程,且会造成严重的效果损失。
一种直接的方式是给Logits加上一个上界 softcap:
由于
为此,Gemma3、Qwen3等模型都该用了QK-Norm:
QK-Norm是一种压制MaxLogits的有效方法,但它的一个严重问题是只适用于MHA、GQA等注意力机制,无法用在MLA中。
这是因为QK-Norm需要完整写出Q、K矩阵,但对于MLA来说,其训练阶段和推理阶段的Q、K矩阵是不同的,因此在推理阶段没法做QK-Norm。
3.3.2. QK-Clip
其实对QK进行缩放的关键问题就是:什么时候缩放、缩放多少。为了解决这个问题,QK-Clip将MaxLogit本身作为触发缩放的信号。具体来说,当MaxLogit超过一个阈值
同时,由于QK-Clip是对参数直接进行操作,因此不会影响推理阶段,自然也就能够兼容MLA。
Appendix
Apd.1. Proof on Eq. (3)
下面我们证明恒等式:
我们首先计算
其中
代入恒等式右侧得:
其中,
因此,代入上式得:
得证。
Apd.2. Proof on Eq. (5)
下面我们证明当矩阵
对于正交矩阵
由于
又因为
Apd.3. Newton-schulz迭代的官方实现 [1]
在Muon的官方实现中,Newton-schulz迭代的实现为:
可以看到,所选用的常数项与公式 (8) 不同。在苏剑林的博客 [1] 中,他认为这样设计是为了加速迭代的收敛速度。下面我们复述一下博客中的内容。
考虑更一般的迭代过程:
其中
我们选择的迭代初始值是
设
因此,我们可以看到公式 (35) 实际上是在对奇异值对角矩阵
由于我们的目标是将
我们将常数
我们将
不失一般性地,我们令
- 选定超参数
。 - 生成随机矩阵
,并计算其SVD分解 。 - 初始化
,并迭代 步,得到 。 - 最小化
,通过梯度回传求得最优的 。
我编写了一个python脚本来进行上述模拟,结论发现:最优参数与矩阵大小、迭代次数
Apd.4. Proof on Eq. (10)
下面我们证明由向量RMS范数诱导出的矩阵RMS范数有如下形式:
由公式 (9) 我们可以用2范数来表示上式的两个向量RMS范数:
代入诱导范数的定义得:
最后一步是利用了谱范数的定义,即公式 (11)。
得证。
Apd.5. Proof on Eq. (15)
下面我们证明带约束的优化问题 (14) 的最优解为公式 (15)。
Step 1. 优化问题变形
将公式 (10) 代入 (14) 中的约束条件并移项后,可以得到约束条件等价于:
我们记
我们定义
又由于
由于矩阵的谱范数在正交变化下保持不变,因此有:
因此我们的优化问题可以等价地写为:
Step 2. 求解
对于任意矩阵,其谱范数都大于等于其任意对角线元素的绝对值,即:
因此我们有
由于
同时,为了使约束条件中的谱范数尽可能小,非对角线元素我们应该置0,即
此时,最优解
最后我们便可以求出原始的最优解:
公式 (15) 得证。
Reference
[2] Building the Muon Optimizer in PyTorch: A Geometric Approach to Neural Network Optimization