状态:草稿 (2026-10-31)。 论文数据直接取自 arXiv 原文(正文为同版 HTML),并附带了表号和图号。奇异值图(第 3 节)由笔者在笔记本电脑 CPU 上直接测量。训练实测在 第 2 篇。 编写规则:以实测数据为基础,未能测出的标记为“未实测”,无法确认的标记为“未确认”。
目录
- 1. 优化器决定“多少与方向”
- 2. 从矩阵视角来看,更新集中在某些方向上
- 3. 无需 SVD 的正交化:Newton–Schulz 5 次迭代
- 4. 整体算法与应用场景
- 5. 2025–2026 年的分支
- 6. 总结与待验证问题
- 原始数据与参考文献
1. 优化器决定“多少与方向”
训练中的单步更新是根据梯度 G 微微调整权重 W。最简单的 SGD 是 W ← W − η·G ,因此梯度大的方向走得大,梯度小的方向走得小。Adam 在此基础上,为每个坐标记住“到目前为止该坐标的梯度有多大”,并用这个大小去除以梯度。因此,每一个坐标的步长变得相近。LLM 预训练多年来一直将 AdamW(Adam + 解耦权重衰减)作为默认选择,原因就在于这种稳定性。
然而,Adam 将权重视为 数字的集合。Transformer 的绝大多数权重都是矩阵,而矩阵拥有的不是孤立的坐标,而是 方向这一结构。Muon 正是出发于此。
2. 从矩阵视角来看,更新集中在某些方向上
任何矩阵都可以通过奇异值分解(SVD)写成 G = U·Σ·Vᵀ 的形式。U 和 V 的列是彼此正交的方向,而 Σ 的对角元素(奇异值)则是该方向的强度。语言模型的梯度与动量矩阵的奇异值往往集中在少数几个值上(Keller Jordan 在其关于 Muon 的文章中将其称为“接近低秩(low rank)”)。这样一来,无论是 SGD 还是 Adam,实际更新都只在几个强方向上移动,其余方向几乎无法得到学习。
Muon 的应对方案很简单: 将奇异值全部替换为 1 U·Vᵀ ,并将其用作更新量。 也就是保持方向不变,同时让强度变得均匀。 U·Vᵀ 是原矩阵最接近的“正交矩阵”,因此该运算被称为正交化。
3. 无需 SVD 的正交化:Newton–Schulz 5 次迭代
如果在每一步对大型矩阵执行 SVD 会非常慢。Muon 仅通过矩阵乘法就能近似实现相同的功能。将 X 除以弗罗贝尼乌斯范数(Frobenius norm)使奇异值降至 1 或以下,然后重复以下迭代五次。
def newton_schulz5(G, steps=5, eps=1e-7):
a, b, c = 3.4445, -4.7750, 2.0315 # Keller Jordan 이 고른 계수
X = G.bfloat16()
if G.size(0) > G.size(1): # 세로로 긴 행렬은 눕혀서 계산
X = X.T
X = X / (X.norm() + eps) # 특잇값을 1 이하로
for _ in range(steps):
A = X @ X.T
B = b * A + c * A @ A
X = a * X + B @ X # 특잇값 s 가 a·s + b·s³ + c·s⁵ 로 바뀐다
if G.size(0) > G.size(1):
X = X.T
return X
单次迭代对每个奇异值应用多项式 a·s + b·s³ + c·s⁵ (方向 U·V 保持不变)。该多项式被设计为能够让系数较小的 s 快速增长,因此即使是接近 0 的小奇异值,经过五次迭代也能上升到接近 1 的水平。不过,它们不会精确收敛到 1。这是因为为了“快速增长”,系数在准确性上做了一些妥协。
我们进行了直接测量。构建了一个 512×2048 的矩阵,其奇异值按 1、1/2、1/3……递减(呈现出类似于梯度的集中在少数方向上的形态),在 bf16 精度下运行上述函数,并在每次迭代时测量奇异值(代码见“原始数据”一节)。
| 迭代次数 | 最大奇异值 | 最小奇异值 | 中位数 | 前 10 个方向的能量占比 |
|---|---|---|---|---|
| 0(仅归一化) | 0.776 | 0.0024 | 0.0048 | 93.7% |
| 1 | 1.075 | 0.0083 | 0.017 | 84.8% |
| 3 | 1.202 | 0.098 | 0.196 | 19.7% |
| 5 | 1.205 | 0.679 | 1.112 | 2.5% |
| 精确的 U·Vᵀ | 1.000 | 1.000 | 1.000 | 1.95% |
在输入中,512 个方向里的前 10 个方向占了总能量的 93.7%。五次迭代后降至 2.5%,所有方向的强度变得几乎一致(0.68–1.21)。这相当接近精确的 U·Vᵀ(1.95%)。其代价是 15 次矩阵乘法,并且由于在 bf16 下运行,在 GPU 上的开销很低,这正是 Muon 的实用核心所在。实际训练中测得的开销在第 2 篇中(吞吐量下降 5.4%,若将批次大小扩大 4 倍则降至 1.5%)。
4. 整体算法与应用场景
遵循 Keller Jordan 的公开实现(博客链接的 muon.py),单步流程如下:
- 动量:
M ← β·M + (1−β)·G, β=0.95,更新时使用涅斯捷罗夫(Nesterov)形式(1−β)·G + β·M。 - 正交化:
O = NS5(위의 값). - 尺寸缩放:
O ← O · sqrt(max(1, 행/열))。这一行在博客正文中没有,仅存在于代码中。 - 更新:
W ← W − η·O(默认 η=0.02)。
重要的一点是 应用范围。Muon 仅用于隐藏层的二维矩阵(注意力机制中的 Q·K·V·O,以及 MLP 的两个矩阵)。嵌入层、输出层(lm_head)、归一化层的增益以及偏置项(bias)则保留使用 AdamW。因为嵌入层是一次只接收几行梯度的表格(查找表),“矩阵方向”的图景并不适用,且一维参数没有可供正交化的矩阵。如果某个实现将 Q·K·V 合并为一个矩阵,建议将其拆分为三个并分别进行正交化。
不同论文中的尺寸缩放规范各不相同
正交矩阵中单个元素的大小(RMS)取决于矩阵的形状。因此,决定“将更新放大多少”的代码行在每篇论文中都不一样,即便学习率同为“0.02”,其含义也会发生变化。
| 规范 | 缩放 | 应用场景 | 学习率量级 |
|---|---|---|---|
| Keller Jordan | sqrt(max(1, 行/列)) | 原始实现、modded-nanogpt | 0.02 左右 |
| Moonlight | 0.2·sqrt(max(行, 列)) | Moonlight, Essential AI | 与 AdamW 相同的值(1e-3 左右) |
| 维度比 | sqrt(行/列) | Scion, MUON+, Spectral Allocation | 0.005–0.06 |
Moonlight(arXiv 2502.16982)中的 0.2·sqrt(max) 旨在将更新的 RMS 对齐到 AdamW 的典型值 0.2,以便能够直接套用为 AdamW 调好的学习率和权重衰减。如果是 512×512 的矩阵,Keller 规范下的 0.02 对应 Moonlight 规范下的约 4.4e-3(计算得出)。这是在迁移论文中的学习率时最容易出错的地方。
5. 2025–2026 年的分支
Moonlight:扩大规模所需的权重衰减与尺寸缩放
Moonlight 表明,要在大型模型上使用 Muon,需要满足两点:如果不加上解耦权重衰减(W ← W − η(O + λW)),权重和输出规模会持续增长;并且必须通过 0.2·sqrt(max) 来调整因矩阵形状不同而异的更新规模。据报告,在计算最优条件下,它以 AdamW 约 52% 的 FLOPs 达到了相同的性能(图 1a,表 3)。
在大批量下保持数据效率 (2505.02222)
Essential AI 的《Practical Efficiency of Muon for Pretraining》探讨了增大批次大小时的情况。增大批次虽然会因步数减少而加快训练,但一旦超过某个临界点(临界批次大小),达到相同损失所需的 Token 就会增加。该论文按批次大小绘制了 AdamW 和 Muon 达到相同损失所消耗的 Token 比例,并指出 Muon 少用了 10–15% 的 Token,并且这种优势在批次变大时得以维持甚至扩大(图 2·3)。原文表述为 "retaining data efficiency at large batch sizes, far beyond the so-called critical batch size"。它并非依赖于“临界批次大小更大”的点估计,而是基于 Token 比例没有下降这一事实。我们在第 2 篇中会对这一主张进行小规模复测。
MUON+:正交化之后再进行一次归一化 (2602.21545)
人们可能会认为正交化后行和列的规模也会变得均匀,但有观点指出,在实际使用的 5 次迭代中,行和列范数的不平衡反而可能会加剧(第 2.1 节,图 2·3)。5次迭代并非精确的 U·Vᵀ 这一事实(如上表中奇异值分散在 0.68–1.21 之间)正是同根同源的问题所在。作者分析认为,这种不平衡缩短了可以稳定使用的最大步长。MUON+ 增加了一个步骤:首先除以正交化结果的列范数,接着再除以行范数。这没有增加状态量,也只需几行代码。在 60M 至 7B 的 GPT 和 LLaMA 模型中,其验证困惑度(PPL)均低于 Muon(LLaMA-60M 从 25.75 降至 25.25,表 2),并且据报告达到相同损失所需的步数减少了 22.4–37.1%(表 5)。值得一提的是,在我们与实验模型规模几乎相同的 LLaMA-60M 上,其增益较小,约为 0.5 PPL。
Spectral Allocation:针对不同方向采用不同步长 (2608.25990)
Muon 对所有方向赋予相同的步长。该论文直接测量了训练期间动量矩阵各个奇异方向上“在未见过的批次中使损失降幅最大的步长”。结果显示,最顶层的方向处于稳定性边缘(Edge of Stability),而其余方向则能够承受大几倍的步长。因此,他们提出了 SAMuon,即保持顶层方向的 Muon 规模不变,而将其余方向放大 γ 倍,据称其达到相同损失时少用了 13–24% 的 Token(表 7)。从这一视角也可以解释“Muon > Adam > SGD”的顺序。SGD 将步长集中在强方向上,Adam 仅在坐标层面上对其进行缓和,而 Muon 则在方向层面上将其拉平。在该论文的表 5 中,AdamW 与 Muon 之间的损失差在 1024 序列批次下为 0.048,在 4096 序列批次下为 0.110,批次越大,差距越明显。
大规模比较:SOAP、Muon与Beyond(2607.20548)
NVIDIA的这篇论文使用1–3T Token训练了8B稠密、30B及72B MoE模型,并对比了AdamW、Muon和SOAP。Muon和SOAP在各项测试中均持续战胜AdamW,即使将全局Batch Size扩大到1.02亿(100M)Token也能稳住,而AdamW则表现恶化(摘要、5.3节)。修复了SOAP大Batch不稳定问题的KL-SOAP「持续但微弱地」领先于Muon(图7与图8)。不过,作者们澄清说,这里所说的公平比较并不是为每个优化器单独寻找最佳学习率,而是通过匹配更新RMS来进行的。原文中也指出,8B混合模型的数学平均分反而是AdamW更高(表5,84.04对80.79)。
小模型配方也走向Muon系列
2026年发布的两篇小模型预训练配方也都采用了Muon系列优化器。IMU-1(2602.02522, 430M)使用了NorMuon搭配Cautious Weight Decay与μP,而Puro-2B(2608.27370)则使用了MuonH。两者在嵌入层、输出层和1D参数上均使用AdamW。这一分支将在 第4篇中继续探讨。
6. 总结与想要验证的内容
- Muon将隐藏层矩阵的更新改为了
U·Vᵀ,从而让所有方向都有均匀的步长。其计算过程包含五次矩阵乘法。 - 使用位置(仅限隐藏层2D矩阵)以及大小校正规范需要结合起来看,学习率的数值才有实际意义。
- 2026年的趋势主要有三个:「进一步打磨正交化结果」(MUON+)、「为不同方向分配不同步长」(Spectral Allocation),以及「在大规模和大Batch下进行公平比较」(NVIDIA、Essential AI)。
论文在数亿到数千亿参数规模下得出了这一结论。那么,换成只能用一张8GB笔记本GPU运行的3400万参数模型、1亿Token时,会发生同样的事情吗?如果为每个优化器单独寻找学习率来进行公平对比,差距还剩多少?在大的Batch Size下差距会拉大吗?我们在 第2篇中亲自进行实测。
原始数据与参考文献
- 奇异值测量代码:
ns_spectrum.py(本系列的实验文件夹)。笔记本CPU、PyTorch 2.15、随机种子0。第2篇的训练代码使用了相同的NS函数。 - Keller Jordan, "Muon: An optimizer for hidden layers in neural networks"(博客文章,2024)及公开实现
muon.py. - Liu 等人,“Muon is Scalable for LLM Training”,arXiv 2502.16982。
- Essential AI,“Practical Efficiency of Muon for Pretraining”,arXiv 2505.02222。
- Zhang 等人,“MUON+”,arXiv 2602.21545。
- Wu 等人,“Spectral Allocation”,arXiv 2608.25990。
- Khona 等人,“SOAP, Muon, and Beyond”,arXiv 2607.20548。