Esc

返回文章

Muon

Muon 的效果:省显存且不影响收敛#

在训练模型时,对于一份参数,如果使用 AdamW,显存占用情况为:

  • 2B,权重(bf16)
  • 2B,梯度(bf16)
  • 4B 一阶动量(fp32),4B,二阶动量(fp32)

则需要 12B 显存。

如果换用 Muon,显存占用情况为:

  • 2B,权重(bf16)
  • 2B,梯度(bf16)
  • 4B Muon 动量(fp32)

则需要 8B 显存。

假设我们忽略一些 Muon 不利于非稠密矩阵优化的特性,同样的显存条件下,按上面的统计,使用 Muon 替代 AdamW 进行训练可以多放下一半的参数(12/8=1.512/8=1.5 倍)!

Kimi 使用 Muon 训练 Moonlight 模型1证明了 Muon 的实用性,接下来我们浅析 Muon 优化器相对于已有的、广泛流行的优化器的区别与适用范围。

传统的优化器:把一切当做向量优化#

优化器:在数亿参数的空间 DD 里,对非凸函数 L(w)L(w),求解 w∗=arg⁡min⁡w∈D L(w)w^* = \underset{w \in D}{\arg\min}\, L(w)。

下面我们从最原始的 SGD 开始构建出 AdamW,这一十余年被广泛使用的优化器之形态。

随机梯度下降(Stochastic Gradient Descent, SGD)#

gtg_t 用 minibatch 估计:

wt+1=wt−α gtw_{t+1} = w_t - \alpha\, g_t

记号约定:wtw_t 为第 tt 步的参数,gt=∇L(wt)g_t = \nabla L(w_t) 为梯度,α\alpha 为学习率。

引入 Momentum#

优化器保存动量 mtm_t,累积历史梯度。

mt+1=β mt+gtwt+1=wt−α mt+1\begin{align*} m_{t+1} &= \beta\, m_t + g_t \\ w_{t+1} &= w_t - \alpha\, m_{t+1} \end{align*}

衰减系数 β\beta 决定“过去的信息保留多久、当前值更新时新旧数据各占多少权重”。指数滑动平均(EMA)一般能记住 11−β\dfrac{1}{1-\beta} 步的信息。

RMSProp#

在平坦的地方加速,在陡峭的地方减速。

vt+1=β vt+(1−β) gt2wt+1=wt−αvt+1+ϵ gt\begin{align*} v_{t+1} &= \beta\, v_t + (1-\beta)\, g_t^2 \\ w_{t+1} &= w_t - \dfrac{\alpha}{\sqrt{v_{t+1}} + \epsilon}\, g_t \end{align*}

vtv_t 为梯度平方的 EMA,运算按元素进行。ϵ=10−7\epsilon = 10^{-7} 是防止除零的数值稳定性技巧。

这个自适应学习率是工程直觉 + 启发式设计(归一化)。

Adam#

Who is Adam ?

缝合怪:Momentum 的一阶矩加 RMSProp 的二阶矩2。

mt+1=β1 mt+(1−β1) gtvt+1=β2 vt+(1−β2) gt2wt+1=wt−α mt+1vt+1+ϵ\begin{align*} m_{t+1} &= \beta_1\, m_t + (1-\beta_1)\, g_t \\ v_{t+1} &= \beta_2\, v_t + (1-\beta_2)\, g_t^2 \\ w_{t+1} &= w_t - \alpha\, \dfrac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} \end{align*}

AdamW3:把权重衰减从梯度计算里移动到最后更新参数那一步,权重衰减不会被 Adam 的自适应缩放机制干扰。λ\lambda 为权重衰减系数:

wt+1=wt−α(mt+1vt+1+ϵ+λ wt)w_{t+1} = w_t - \alpha \left( \dfrac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} + \lambda\, w_t \right)

Muon:尝试利用矩阵的信息#

记号:WtW_t 为 m×nm \times n 的权重矩阵,Gt=∇L(Wt)G_t = \nabla L(W_t),MtM_t 为动量。与 Momentum 相比,只在更新参数前多了一步 msign⁡\operatorname{msign}4:

Mt+1=β Mt+GtWt+1=Wt−α msign⁡(Mt+1)\begin{align*} M_{t+1} &= \beta\, M_t + G_t \\ W_{t+1} &= W_t - \alpha\, \operatorname{msign}(M_{t+1}) \end{align*}

msign#

msign⁡\operatorname{msign} 是 sign⁡={1x>00x=0−1x<0\operatorname{sign} = \begin{cases} 1 &x>0 \\ 0 &x=0 \\ -1 &x<0 \end{cases} 的矩阵版本:只保留矩阵的“方向”,把大小全部抹平。

对矩阵 MM 做奇异值分解(SVD):

M=UΣV⊤M = U \Sigma V^\top

U,VU, V 是正交矩阵,Σ\Sigma 是对角矩阵,对角线上是奇异值 σ1≥σ2≥⋯≥0\sigma_1 \ge \sigma_2 \ge \dots \ge 0。则

msign⁡(M)=UV⊤\operatorname{msign}(M) = U V^\top

即把 Σ\Sigma 换成单位矩阵,所有奇异值都变成 1。

例:M=(3000.5)M = \begin{pmatrix} 3 & 0 \\ 0 & 0.5 \end{pmatrix},奇异值是 33 和 0.50.5,U=V=IU = V = I,所以 msign⁡(M)=I\operatorname{msign}(M) = I。原来 33 与 0.50.5 相差 6 倍,处理后两个方向的更新幅度相同。

Newton–Schulz 迭代#

训练中直接做 SVD 太慢,在 Moonlight 的论文中,实际的优化器使用(沿用论文记号:μ\mu 为动量系数,ηt\eta_t 为学习率):

Mt=μMt−1+∇Lt(Wt−1)Ot=Newton-Schulz5(Mt)Wt=Wt−1−ηtOt\begin{align*} M_t &= \mu M_{t-1} + \nabla L_t(W_{t-1})\\ O_t &= \text{Newton-Schulz}_5(M_t)\\ W_t &=W_{t-1} - \eta_t O_t \end{align*}

Newton–Schulz 步骤如下:

X0=Mt∥Mt∥FXk=aXk−1+b(Xk−1Xk−1⊤)Xk−1+c(Xk−1Xk−1⊤)2Xk−1\begin{align*} X_0 &= \frac{M_t}{\|M_t\|_F} \\ X_k &= aX_{k-1} + b(X_{k-1}X_{k-1}^\top)X_{k-1} \\ &\quad + c(X_{k-1}X_{k-1}^\top)^2X_{k-1} \end{align*}

设 X=UΣV⊤X=U\Sigma V^\top,则一步迭代的结果为

U (aΣ+bΣ3+cΣ5) V⊤U\,(a\Sigma + b\Sigma^3 + c\Sigma^5)\,V^\top

即对每个奇异值独立套用同一个标量多项式 f(σ)=aσ+bσ3+cσ5f(\sigma)=a\sigma+b\sigma^3+c\sigma^5,奇异向量保持不变,迭代多次后奇异值接近 1。X0X_0 除以 ∥Mt∥F\|M_t\|_F 是为了让所有奇异值落在 [0,1][0,1] 内。

这里有三个 magic number:a=3.4445, b=−4.7750, c=2.0315a=3.4445,\ b=-4.7750,\ c=2.0315,苏神在博客↗5还原了 modded-nanogpt 制造他们的方式:在迭代 5 步的限制下,求使奇异值最接近 1 的系数。

Muon 为什么有效:众说纷纭#

此前的优化器逐元素处理参数,Muon 把一层权重当作整个矩阵处理。当 MM 为对角矩阵时,msign⁡(diag⁡(d))=diag⁡(sign⁡(d))\operatorname{msign}(\operatorname{diag}(d)) = \operatorname{diag}(\operatorname{sign}(d)),Muon 退化为 signSGD6(只取梯度符号的优化器)。

只有天知道.jpg

Muon 为什么有效,目前没有定论,下面是文献中提出的几种可能因素:

  • 补足被压制的方向:梯度矩阵常由少数大奇异值主导,msign 把其余方向的步长拉到相同水平。

  • 免累积的 Shampoo:Muon 等价于没有累积统计量的 Google Shampoo7,保留了二阶预条件的结构,只需要一份动量。

  • 大 batch 下保持数据效率:Essential AI 的实验显示,batch 变大时 Muon 比 AdamW 更能保持数据效率8。

这些因素哪一个起主要作用,不知道。

经验与工程中的适用范围#

对我们来说,Muon 该被如何使用也许才是更重要的事情。经验性的结论是,把稠密的矩阵交给 Muon。

embedding、输出层、bias 和 norm 的缩放参数还是应该用 AdamW——这些应该被视作向量。

同时,非常遗憾的是,Muon 和 AdamW 训出来的模型可能收敛到的不是同一类解9。如果预训练用的是 AdamW,而后训练使用 Muon 在一些情况下无显著收益10。

即便如此,节约显存已经是一件很伟大的事情了。

Footnotes#

  1. Jingyuan Liu 等. Muon is Scalable for LLM Training. 2025. arXiv:2502.16982↗ ↩

  2. Diederik P. Kingma, Jimmy Ba. Adam: A Method for Stochastic Optimization. 2014. arXiv:1412.6980↗ ↩

  3. Ilya Loshchilov, Frank Hutter. Decoupled Weight Decay Regularization. 2017. arXiv:1711.05101↗ ↩

  4. Keller Jordan 等. Muon: An optimizer for hidden layers in neural networks↗. 2024. ↩

  5. 苏剑林. Muon优化器赏析:从向量到矩阵的本质跨越↗. 科学空间, 2024. ↩

  6. Jeremy Bernstein 等. signSGD: Compressed Optimisation for Non-Convex Problems. 2018. arXiv:1802.04434↗ ↩

  7. Vineet Gupta, Tomer Koren, Yoram Singer. Shampoo: Preconditioned Stochastic Tensor Optimization. 2018. arXiv:1802.09568↗ ↩

  8. Essential AI. Practical Efficiency of Muon for Pretraining. 2025. arXiv:2505.02222↗ ↩

  9. Chen Fan, Mark Schmidt, Christos Thrampoulidis. Implicit Bias of Spectral Descent and Muon on Multiclass Separable Data↗. NeurIPS 2025. 该工作研究多类线性可分数据上的隐式偏置。 ↩

  10. Jingyuan Liu 等. Muon is Scalable for LLM Training. 2025. 第 3.5、4 节。 ↩

引用本文

Candlest. Muon 优化器浅析[EB/OL]. (2026-11-02). https://blog.candlest.cc/archives/1034.

BibTeX
@online{candlest2026,
  author = {Candlest},
  title = {Muon 优化器浅析},
  date = {2026-11-02},
  url = {https://blog.candlest.cc/archives/1034}
}