Kimi K2 的 MuonClip:把 Muon 的正交化更新与 QK-Clip 一步步推导清楚
Kimi K2 用一套叫 MuonClip 的优化器,在总量约 1.04 万亿参数(激活约 320 亿)的 MoE 上预训练了 15.5 万亿 token 且没有一次 loss 尖峰。本文把它的两半拆开推导:一半是 Muon —— 把 SGD-动量的更新矩阵正交化(取极分解的酉因子 U Vᵀ),让它在「谱范数下的最速下降」这个意义下成立,再用五次 Newton-Schulz 迭代在 bfloat16 里逼近它,最后乘上 0.2·sqrt(max(m,n)) 把条目更新 RMS 对齐到 AdamW 的约 0.2;另一半是 QK-Clip —— 因为纯 Muon 在一个 90 亿激活、530 亿总参数的 MoE 上会把最大注意力 logit 顶到 1000 以上,K2 改为每一步后按头把 Wq、Wk 缩放 γ_h=min(1, τ/S_max^h),阈值 τ=100。注意「万亿级参数」与「15.5 万亿 token」是两个不同量纲的口径,正文会逐处区分。
2024 年以来,训练大模型的优化器版图里多了一个新名字:Muon。就在所有人默认「大模型预训练 = AdamW」的这些年,Muon 一路从 NanoGPT 的小实验爬到万亿参数规模——迄今公开过的最有分量的证据,是 Moonshot AI 的 Kimi K2:一个总量约 1.04 万亿参数、每个 token 只激活约 320 亿参数的 MoE 模型,用一套叫 MuonClip 的优化器在 15.5 万亿 token 上完成了预训练,且报告声称没有出现一次 loss 尖峰(zero loss spike)(Kimi K2 技术报告,arXiv:2507.20534)。
这套优化器名字里的两个词泄露了它的全部秘密:Muon(MomentUm Orthogonalized by Newton-Schulz)+ Clip(QK-Clip)。前者是「把动量的更新矩阵正交化」这个算法本身,后者是 K2 为了在万亿规模上摁住一类特定故障而加的安全阀。本文不满足于说「K2 用了 Muon」,而是要把这两半都从第一性原理推一遍:Muon 为什么是「谱范数下的最速下降」?那个 是怎么出来的?五次 Newton-Schulz 迭代凭什么不需要 SVD?乘的那个 到底在匹配什么?以及——纯 Muon 在 K2 的规模上究竟撞了什么墙,QK-Clip 又是如何用一个逐头缩放因子把它摁下去的。
按惯例,凡是引用他人结论处一律标注出处(报告名 + 章节/公式);凡是本文自己算出来的数字,在文末「本文自行推导」一节单列,与官方数字分列。尤其要提醒的一点口径:K2 的「1.04 万亿」是参数量,「15.5 万亿」是训练 token 数,两者单位都带「万亿」但量纲完全不同,请勿混读。
一、直觉:AdamW 管坐标,Muon 管方向
在进入公式之前,先把两种优化器的直觉摆在一起。
AdamW 是**逐坐标(per-coordinate)**自适应的:它为权重矩阵的每一个元素各自维护一阶、二阶动量,更新量近似是 ,在正则化掉历史信息后就是 ——每个元素的步长彼此独立,且大小都被压到同一量级。换句话说,AdamW 关心的是「每个权重自己走多快」,它对矩阵整体的几何结构没有意见。
Muon 的想法完全不同:它只针对二维权重矩阵(隐藏层的线性变换),不再逐元素看,而是把整个更新矩阵当作一个对象,要求这个矩阵「走」的方向具有某种整体性质。它借用的几何是谱范数(也叫声范数、算子二范数,即矩阵最大的奇异值)。在谱范数这把尺子下,最速下降的那个更新恰好是把梯度矩阵正交化:保留它的奇异向量,把奇异值全部替换成 1。用一句话概括——
- AdamW 让每个坐标的更新大小一致(等坐标);
- Muon 让每个方向的更新幅度一致(等方向)。
前者是「坐标几何」,后者是「方向几何」。这两句话将在第四节被写成一个精确的优化问题。也正因为 Muon 只处理矩阵,它不用于 embedding 层、输出层和任何一维参数(如 RMSNorm 的缩放),这些仍交给 AdamW(Keller Jordan 的 Muon 实现文档;GLM-4.5 技术报告也明确「word embedding、bias、RMSNorm 权重除外」)。
如果只想先记住一句:AdamW 标准化「每个坐标的步长」,Muon 标准化「每个方向的步长」;前者是逐元素的,后者是逐矩阵的。而「方向」这个词的严格含义,正是下一节要建立的——把一个矩阵的更新「正交化」。
二、符号约定与术语表
后面所有推导都用这套记号,尽量与 Keller Jordan 的 Muon 文档和 Moonlight 报告保持一致。
| 记号 | 含义 | 说明 |
|---|---|---|
| 某个二维权重矩阵 | 输出维(fan-out), 输入维(fan-in),PyTorch 布局 | |
| 第 步的梯度矩阵 | ||
| 动量缓冲 | ||
| 动量系数 | Muon 默认 0.95 | |
| 学习率 | 同一套 也给 AdamW 的那组参数用 | |
| 的奇异值分解(SVD) | 列正交, 对角非负 | |
| 奇异值 | 的对角元,降序排列 | |
| 正交化 / 极分解酉因子 | 即 | |
| Frobenius 范数 | 所有元素平方和的平方根 | |
| 谱范数 | 最大奇异值 | |
| 核范数 | 奇异值之和 ,是谱范数的对偶 | |
| 条目均方根 | ||
| Newton-Schulz 五次系数 | 本文取 | |
| Newton-Schulz 迭代矩阵 | 从归一化后的更新出发迭代 | |
| 第 头、第 与第 个 token 的注意力 logit | ||
| 第 头的最大 logit | ||
| QK-Clip 阈值 | K2 取 100 | |
| QK-Clip 逐头缩放因子 |
| 术语 | 一句话解释 |
|---|---|
| 最速下降(steepest descent) | 在给定范数下、单位步长内让线性化损失下降最多的方向 |
| 极分解酉因子 | 与矩阵「最接近」的半正交矩阵, |
| Newton-Schulz 迭代 | 用奇次矩阵多项式反复逼近正交化的方法,可全程 bfloat16 |
| RMS 匹配 | 让 Muon 的条目更新 RMS 与 AdamW 一致,从而共用学习率 |
| 注意力 logit | softmax 之前的注意力打分,即未归一化的 点积;本文的 即此 |
| QK-Clip | 训练中按头缩放 、把注意力 logit 压回阈值内的机制 |
| MoE | 混合专家,每个 token 只激活部分专家的稀疏结构 |
三、Muon 的形式化:正交化的是动量
先把算法本身写清楚。给定一个二维权重 ,Muon 的一步是:
其中 是标准的 Nesterov 混合(若不用 Nesterov 则直接取 )——此后 与动量 是两个不同的量,勿混。注意函数 里的关键:被正交化的是动量(或 Nesterov 混合后的更新),不是原始梯度。这一点与历史上一些先正交化、再套动量的做法相反;Keller Jordan 明确说把动量放在正交化之前「经验上更好」(Muon 博客)。正交化的定义是
下一条定理告诉我们:这个 有闭式解,就是极分解的酉因子。
命题(极分解酉因子) 设 是(瘦)SVD,则
证明要点:,而半正交矩阵满足 为常数,故最小化距离等价于最大化 。把 代入,(因为对单位向量有 ),等号在 处取得。
于是 Muon 的一步可以等价地写成「把 Nesterov 更新替换成它最近的半正交矩阵,再按学习率下降」。但这里有个工程上的坎:精确算 需要 SVD,代价过高。第五、六节分别解决「怎么便宜地算出正交化」与「算完之后乘什么尺度」。
四、为什么是正交化:谱范数下的最速下降
第三步留下的问题是:凭什么用 而不是别的?答案来自一个把优化器放回「范数几何」的统一视角(Bernstein & Newhouse, Old Optimizer, New Norm: An Anthology, arXiv:2409.20325)。
考虑线性化的损失:
「最速下降」被定义为一个带约束的线性规划:在单位范数球内,选 让 下降最多:
关键就在这个范数 上——换个范数,解就换个方向。下面把四种常见的范数摆在一起:
| 范数 | 含义 | 最速下降解 |
|---|---|---|
| Frobenius | 元素平方和 | |
| 谱范数 | 最大奇异值 | |
| RMS→RMS 算子范数 | 输入输出 RMS 之比 | |
| 无穷范数(向量 ) | 最大元素 |
先看谱范数这一行为什么解是 。给定 ,我们要在 的球上让 最小。谱范数的对偶范数是核范数,而对偶范数的定义恰好给出
且这个最大值在 处取得(此时 )。于是
用大白话说:在谱范数这把尺子下,最速下降会把梯度的所有非零奇异值统统换成 1,只留下奇异向量。它不再关心某些方向梯度的「大小」差异,而是强制所有方向以相同幅度前进——这就是第一节那句「等方向」的精确含义。顺带一个漂亮的旁证:Shampoo 优化器在关掉累加后写出的更新 化简之后也正好等于 (同一份 Anthology,Story II);也就是说 Muon 与 Shampoo 在这一点上殊途同归,区别只在「怎么便宜地算出这个酉因子」。
为了让推导可核,本文在「本文自行推导」一节对核范数恒等式做了一次完整复算(D1)。
「等方向」还有一个常被忽略的好处:它让学习率能跨宽度迁移。Bernstein 在推导 Muon 时指出,若把更新按 RMS→RMS 算子范数缩放(对应乘 ),则当层加宽、宽度放大若干倍时,同一学习率仍然合适——这一性质来自他与 Yang、Simon 关于「特征学习谱条件」的工作(Deriving Muon)。这正是第四、六节那两套尺度约定可能同时存在的根源:一套从「学率可迁移」出发,一套从「与 AdamW 共享超参」出发,两者在某些形状上数值接近、但在层级缩小时会分道扬镳。
4.1 顺带一提:AdamW 的「等坐标」同样是某种范数下的最速下降
同一份 Anthology 的第一篇故事(Story I)给出了 AdamW 的对应解释:把 Adam 的指数滑动平均关掉()后,更新退化为符号下降
而符号下降正是无穷范数()下的最速下降——因为 。注意这里的「无穷范数」是把权重矩阵拍平成一个长向量之后取的:它约束的是「单次更新里最大的那个元素」,因此每个坐标分到的步长上限都相同。
这就把第一节的直觉写实了:
- AdamW 走的是 (更精确地说,是「max-of-max」诱导范数),约束最大元素,等效于「等坐标」;
- Muon 走谱范数,约束最大方向,等效于「等方向」。
两者都是最速下降,差别只在选哪把尺子。Muon 的「新」不在于发明了更新方向,而在于第一次认真地给二维权重矩阵选了一把矩阵范数,而不是沿用元素级的几何。
五、Newton-Schulz:不靠 SVD 拿到
正交化虽好,但每步对每个权重做一次 SVD 太贵。Muon 的取巧之处,是注意到奇次矩阵多项式与 SVD 可交换:若
则对 有
证明很短:把 代入,,于是每一项都变成 。这条性质意味着我们可以只对奇异值做标量运算,却从不动奇异向量——于是「把奇异值压成 1」这件事,就变成了「找一个奇多项式,反复迭代后能把 内的标量映射到 1」。
下面的图说明了这条流水线:整个正交化被降维成「迭代一个标量多项式」。
flowchart TD
A["输入更新矩阵 X"] --> B["SVD 分解 X = U Sigma V^T"]
B --> C["奇次多项式 p 与 SVD 交换"]
C --> D["p(X) = U 乘 p(Sigma) 乘 V^T"]
D --> E["只需把标量多项式迭代到 1"]
E --> F["迭代 N 次后 Sigma 的谱逼近全 1"]
F --> G["输出近似酉因子 U V^T"]这张图说明了什么:真正难的部分(找到正交化的奇异向量)被完全避开——多项式迭代只作用在奇异值这一维标量上,所有矩阵乘法都在原空间里完成,因此可以全程跑在 bfloat16 上。这也解释了为什么 Muon 的更新能高效地在 GPU 上算出来。
具体怎么做?Newton-Schulz 用的是一个五次迭代,每次
在奇异值上等价于 。若想让它收敛到 1,只需把初始矩阵按范数归一化,让所有奇异值落在 内:
Muon 采用的系数是 。这里有一个反直觉的细节值得点出:这三个系数并不满足 (实际上 ),也就是说单步映射在 处会「回落」。作者选择的是一种「陡上加陡」的策略——把零点处的斜率(3.4445)推得尽可能大,哪怕牺牲「处处收敛到 1」的严格性。Keller Jordan 自己写得很直白:这个迭代产出的并不是精确的 ,而是形如 的东西,其中 大致在 之间均匀分布,而这对模型效果并无损害(Muon 博客 / 实现注释)。换言之,第四节的「等方向」在这里被近似地执行,而不是精确执行——这是一个工程折中,不是理论漏洞。
5.1 迭代为什么会收敛
要保证 ,等价于要求标量序列 把所有奇异值都推向 1。最朴素的版本是 1970 年的三次迭代
它要求初始奇异值满足 才会收敛(这是经典的 Newton-Schulz 收敛条件,见 Anthology 附录)。Muon 用五次多项式把「收敛盆地」与「收敛速度」重新做了权衡:更高的零点斜率意味着更少的迭代次数就能把谱压到 1 附近,代价是收敛的严格性被放弃。这正是「5 步足够、且允许 bfloat16」背后的原因——它换来的不是精确的 ,而是一个统计意义上足够正交的更新。
5.2 为什么必须是 bfloat16 也跑得动
这里还有一层工程上的讲究。要做正交化,除了 Newton-Schulz,更「正统」的路线是直接对更新矩阵做 SVD,或用迭代法求逆四次根(后者对应关掉累加后的 Shampoo,其更新同样等于 ,见第四节的旁注)。但 Keller Jordan 明确记下了取舍:这类方法在低精度下不稳定,而 Newton-Schulz 迭代可以在 bfloat16 里稳定运行,因此被选为正交化的首选方案(Muon 博客)。
原因不难理解:Newton-Schulz 的每一步都只是矩阵乘法(、 与几次线性组合),没有特征分解那类对条件数敏感的操作,误差在 bf16 下是可控的;而 SVD 的迭代求解在 bf16 下容易发散。所以「用多项式迭代而不是 SVD」这个选择,一半是为了省算力,另一半是为了在低精度张量核上也能跑——后者在万亿参数规模上同样关键,因为全 fp32 的优化器状态会显著抬高显存与通信开销。
六、尺度匹配:为什么乘
正交化算出来了,还剩最后一个问题:它该乘多大的系数。这一步常常被略过,但它恰恰是 Muon 能「开箱即用」的关键,也是 Moonlight 报告自认的两大贡献之一(另一项是权重衰减)。
先把事实算清楚。设权重矩阵形状为 ,则 有 个非零奇异值、且都等于 1,于是
代入 RMS 定义:
这个式子说明了一个麻烦:正交化更新的条目 RMS 会随矩阵变宽而变小。对一个宽大的 MLP 层乘同一个学习率,实际更新幅度就偏小;对一个小矩阵(比如某个注意力头),更新幅度又偏大。Moonlight 报告把这称为「更新幅度不一致」,并给出修法:每个更新再乘一个 ,正好抵消上式里的那一项。再进一步,把整体条目 RMS 对齐到 AdamW 的典型区间,Moonlight 选定的目标是 0.2(报告给 AdamW 更新 RMS 的典型范围是 0.2–0.4),于是最终系数是
这一步的意义要说清楚:它把 Muon 的更新「校准」到与 AdamW 同尺度的记号里,从而可以让 Muon 那一组参数与 AdamW 那一组参数共用同一个 ——不必为 Muon 单独调一套学习率。这就是「开箱即用(out-of-the-box)」的确切含义。
值得注意的是,这里存在两种不同的尺度约定,不要混用:
- Bernstein 约定:乘 ,它保持的是「RMS→RMS 位移 = 」,好处是跨宽度可迁移学习率;
- Moonlight/K2 约定:乘 ,它保持的是单条目 RMS≈0.2,好处是与 AdamW 共用超参。
Keller Jordan 最早的实现用的是前一种思路的一个变体(),Moonlight 换成了后者。两者不是对错之分,而是「对齐什么」的不同取舍——这一点在工程选型时会直接决定你抄谁的超参。
6.1 把数字代进去
举个具体形状:设某权重为 。裸 的条目 RMS 是 ——比 AdamW 的约 0.2 小了十几倍,若共用一个 ,这一层的有效步长会被严重饿死。乘上系数后:
反过来若矩阵是 的注意力头投影,、系数 、裸 RMS 为 ,两者相乘同样落回约 0.2。这就是「一个 走遍所有形状」的来源:系数随形状以 伸缩,恰好抵消裸正交化 RMS 随宽度收缩的那一项,使每个矩阵的条目更新幅度都被钉在同一尺度上。(以上为本文按公式代入的算术校核,见文末 D2。)
七、从 Muon 到 MuonClip:K2 撞上的 logit 爆炸
算法到这里已经完整。但把它端到万亿参数规模,Moonshot 撞上了一堵具体的墙。
先说 K2 的体量,把口径摆清楚:总参数量约 1.04 万亿、每个 token 激活约 320 亿,MoE 用了 384 个专家(每 token 选 8 个 + 1 个共享专家),注意力机制是 MLA(多头潜在注意力),隐层维度 7168、专家隐层 2048、64 个注意力头、词表 16 万、上下文 12.8 万,共 61 层(1 层稠密);预训练量是 15.5 万亿 token(Kimi K2 技术报告与官方仓库)。
Moonshot 选择 Muon 的理由是它更好的 token 效率。这里要把「约 2 倍计算效率」的口径讲清楚:Moonlight 报告的原文口径是「在 compute-optimal 训练下约 2 倍于 AdamW 的计算效率」,其准确含义是——在同一条缩放律曲线上、按 compute-optimal 的最优数据量配比,Muon 达到与 AdamW 相同损失所需的算力约为后者的一半(Moonlight 报告)。这是一个仅在 compute-optimal 配比下成立的等效算力结论,不能外推成「任何情况下训练量都砍半」。但报告同时记下一个现象:在 Muon 下,注意力 logit 爆炸(exploding attention logits)比在 AdamW 下更频繁,这带来了 loss 尖峰乃至训练发散的风险。报告用一个中型实验把问题量化得清清楚楚:在一个 90 亿激活、530 亿总参数 的 MoE 上跑原版 Muon,最大注意力 logit 会迅速冲到 1000 以上;而在 K2 主训练里,这个数被 QK-Clip 稳稳压住。
已有的工具都救不了场:报告评估了 **logit 软截断(soft-capping)**与 Query-Key 归一化(QK-Norm),发现它们「不够用」;更麻烦的是 QK-Norm 对 MLA 根本不适用——因为 MLA 的 Key 矩阵在推理时并非完整物化,没有可归一化的显式 。这解释了为什么 Moonshot 必须另起炉灶。
这里要强调一点对口:logit 的「1000 以上」与阈值「100」是两个不同实验、指称不同运行的数字——前者是「原版 Muon 在 9B/53B 中型实验里会涨到的量级」,后者是「K2 主训练为 QK-Clip 设定的目标上限」。两者同为 logit 量纲,但不要当成同一次训练里的前后对比。
7.1 为什么已有的两种方案都不够用
报告里有一句很关键的判断:logit 软截断与 QK-Norm「被发现不足以解决问题」。把三者摆在一起,差异一目了然:
| 方案 | 作用于什么 | 是否改动当步前向 | 对 MLA 是否可用 |
|---|---|---|---|
| logit 软截断(soft-capping) | 注意力 logit 的数值 | 是(改变 logit 本身) | 可用但不充分 |
| QK-Norm | 归一化后的 q、k 向量 | 是 | 不可用(K 未完整物化) |
| QK-Clip | 更新后的 Wq、Wk 权重 | 否(事后缩放) | 可用(仅裁未共享分量) |
三者最本质的区别在第三列:soft-capping 与 QK-Norm 都直接介入当步的前向计算,而 QK-Clip 是事后对权重做缩放——报告强调它「不改变当前步的前向/反向」(第八节会展开),这使它可以限制权重的长期增长而不干扰梯度流。而对 MLA 来说,QK-Norm 直接出局,这正是「已有方案不够用」的核心原因。⚠️ 上表第四列的「可用 / 不可用」是报告结论;第一、二列的机制描述为本文按各方案定义所作的归纳;第三列 QK-Clip 一格(否,事后缩放)的结论亦来自报告。全表仅用于对比。
八、QK-Clip:按头把 、 缩回去
MuonClip 的第二半,就是这个新炉灶。它做的事一句话可概括:每一步参数更新之后,检查每一头的最大注意力 logit,若超过阈值 ,就把这一头的 、 成比例缩小。
定义第 头、在训练样本 上的注意力 logit 为
取该头在样本上的最大值 ,并定义逐头缩放因子
当 时 (不动);一旦超过阈值, 把最大 logit 拉回 。缩放怎么施加在权重上?把因子在 与 之间拆开:
其中 是平衡超参。代回 logit 立刻得到「logit 整体乘 」:
当取 时, 与 各缩 。下面的图给出了这条闭环:注意它只读最大 logit 作为信号,并不改写当前步的前向/反向。
flowchart LR
A["W_q, W_k 经 Muon 更新后"] --> B["算出每头最大 logit S_max"]
B --> C{"S_max 是否超过 tau"}
C -->|"超过"| D["gamma = tau / S_max"]
C -->|"未超过"| E["gamma = 1"]
D --> F["按头缩放 W_q, W_k"]
E --> F
F --> G["进入下一步训练"]
G --> A这张图说明了什么:QK-Clip 是一个事后(post-update)的反馈控制——它把「最大 logit」当成一个可观测的被控量,把 的缩放当成执行器,目标是把被控量钉在阈值附近。报告特别强调,这个操作不改变当前步的前向与反向计算,最大 logit 只是一个「引导信号」,用来决定权重增长的强度(arXiv:2507.20534)。
三个设计细节值得记牢:
- 逐头、而非逐层或全局。 报告观察到,实践中只有一小部分头会出现 logit 爆炸;如果对所有头一刀切地缩放,会无谓地干预正常头。因此 K2 采用逐头因子 ,把干预面缩到最小。
- MLA 上只裁剪「非共享」部分。 对 MLA,报告只在未共享的注意力头分量上做裁剪(每个头各自的 上投影与从潜向量到 的上投影),而不动被各头共享的潜空间下投影。原因和第六节 QK-Norm 失效同源——MLA 的共享潜向量一旦被逐头缩放,就破坏了它「共享」的语义。
- 阈值 。 K2 全训练用 ,并全程监控最大 logit:训练早期 logit 一直贴着上限 100(说明早期裁剪持续在生效——报告附录给出前 70000 步有约 12.7% 的头至少触发过一次),直到约 训练进度的 30% 之后才衰减回稳定区间(报告 Figure 2 右与附录)。
最终结果是报告最关键的一句:K2 用 MuonClip 在 15.5 万亿 token 上预训练,零 loss 尖峰,且下游任务表现不受损。
8.1 一个可手算的例子
为了把 QK-Clip 的量感做实,取一组虚构但自洽的数:设某头 、阈值 。则
因为 ,两边各缩约 36.8%,logit 整体乘 ,最大 logit 由 250 精确回落到
也就是说,超阈值的部分被「按比例」抹平,而不是被强行截断——这正是「clip」一词在这里的准确含义:它不是把 logit 一刀切到 100,而是把这个头的权重整体缩小、使新 logit 恰好落在 100 附近。若某头本来就没超阈值(),,权重原封不动,干预面因此被压到最小。(该例为本文自造,仅用于说明机制,见文末 D5。)
九、工程含义与横向对照
把 Muon 家族摆成一张对照表,能看出这条路线在过去一年多里(从 2024 年末 Keller Jordan 的原始实现,到 2025 年的 Moonlight / K2 / GLM-4.5,再到 2026 年初的 GLM-5)是如何被一次次校准的:
| 工作 | 参数规模(总/激活) | 训练量 | 优化器 | 更新尺度约定 | 稳定化手段 |
|---|---|---|---|---|---|
| AdamW(基线) | 通用 | 通用 | Adam + 解耦权重衰减 | 条目 RMS ≈ 0.2–0.4 | 无需特设 |
| Muon(原版) | 小规模实验 | NanoGPT 等 | SGD-动量 + Newton-Schulz | 无 | |
| Moonlight | 160 亿 / 30 亿 | 5.7 万亿 token | Muon | 权重衰减 + RMS 匹配 | |
| Kimi K2 | 1.04 万亿 / 320 亿 | 15.5 万亿 token | MuonClip | RMS 匹配(0.2 约定) | 上述 + QK-Clip() |
| GLM-4.5 | 3550 亿 / 320 亿 | 23 万亿 token | Muon | 条目 RMS 0.2、、 | 权重衰减 + QK-Norm(GQA 架构) |
数据来源:Moonlight 报告(arXiv:2502.16982)与官方仓库、Kimi K2 技术报告(arXiv:2507.20534)、GLM-4.5 技术报告(arXiv:2508.06471)、Keller Jordan 的 Muon 文档与实现。⚠️ 表中「参数规模」列是参数量、「训练量」列是 token 数,两者量纲不同;「更新尺度约定」指的是单条目 RMS 的对齐目标,不是参数量。⚠️ 另注意两个视觉近似但语义不同的常数:Keller 原版用的是 0.02(乘 的学习率尺度),而 Moonlight / K2 / GLM 用的是 0.2(条目 RMS 目标),二者不可互相代入。GLM-5 未入表,因为它的贡献(Muon Split)是「逐头更新尺度」而非「与 AdamW 对齐的 RMS 约定」,本文放在正文 §9 讨论。
这张表里藏着两条工程判断:
第一,尺度约定可以跨实验室迁移,但稳定化手段各有各的招。 Moonlight 与 K2 同出 Moonshot,从 5.7 万亿一路放大到 15.5 万亿 token,尺度约定(0.2 条目 RMS)一脉相承;而独立实验室 GLM-4.5 也独立地选了同样的 0.2——这是一个值得注意的收敛证据:不同团队在没有共享作者的情况下对「Muon 条目 RMS 该对齐到多少」给出了同一答案。
第二,MLA + Muon 的「逐头」需求,被两个实验室从不同方向各自撞到。 K2 用 QK-Clip 逐头缩放 ;GLM-5 技术报告(arXiv:2602.15763)则记录了另一条相关经验:在其实验中,采用 Muon 时 MLA 的表现一度不如 GQA,于是他们提出 Muon Split——让不同注意力头的投影权重以不同尺度更新,从而把 MLA 的表现拉回与 GQA 相当。两家的具体机制不同(一个动 logit、一个动更新尺度),但都指向同一个事实:把「逐头差异」纳入优化器设计,是 MLA 配 Muon 时绕不开的一环。
9.1「token 效率」为什么值得反复强调
把这张表里各家的「更新尺度约定」并列看,会引出一个问题:为什么大家愿意花这么大力气去校准一个优化器?答案藏在那句「约 2 倍计算效率」里。预训练的成本在很大程度上由总训练量决定(token 数 × 每 token 算力),优化器若能让「同样的损失用更少的算力达到」,就等于把训练预算砍掉一大块。这也解释了为什么 K2 宁愿在 15.5 万亿 token 的规模上额外引入一个逐头裁剪机制来保住 Muon 的稳定性——代价是一层额外的工程复杂度,收益是可以沿用 Muon 那条更省算力的缩放曲线。
对自研训练的团队来说,这个权衡是否划算取决于规模:在几十亿参数的实验里,AdamW 的成熟度往往更省心;而到了 K2 这个量级,算力预算的绝对值足够大,约 2 倍效率的诱惑就压过了引入新机制的复杂度。这也提示了一条审慎的经验——Muon 的收益与「规模」强相关,小规模上看到的相对优劣未必能外推到万亿参数。
在更靠前沿的方向上,正交化本身也还在被优化:Tri Dao 的博客提出 Gram Newton-Schulz,通过换用 Gram 矩阵形式来降低正交化步骤的墙钟开销(称该步骤运行时下降约 40%–50%,见其 2026 年博文)。也就是说,Muon 这条线目前仍是活跃的工程研究领域,而不是一个定型方案。
对做工程的人还有一条直接可用的推论:Muon 与 AdamW 是可以混用的。因为 0.2 的条目 RMS 匹配把两者校准到同一尺度,你完全可以在同一套超参下,把隐藏层的二维矩阵交给 Muon、把 embedding / 输出层 / 一维参数交给 AdamW——这正是 K2、Moonlight、GLM-4.5 三者共同采用的分工。这也是「换优化器」在当前最现实的落点:不必推倒重来,只需替换注意力与 MLP 里那些矩阵参数。
十、边界、未解与小结
按惯例,把这篇能证明的、不能证明的与仍未解决的问题逐条列清楚。
- 命名边界:MuonClip 是「Muon + 权重衰减 + RMS 匹配 + QK-Clip」的组合体(报告原文),不是单一新算法。把它当成「Muon 的替代品」会读错——它是 Muon 的加固版。
- QK-Clip 不改变当前步的前向/反向,只是一个事后缩放(报告明确)。因此它不能防止某一步内因 logit 已经过大而产生的数值问题,只能在后续步把权重增长压回去;它管的是「跨步的漂移」,不是「单步的爆炸」。
- 是经验阈值,不是推导结果。 报告未给出该阈值的选取准则,只报告了「早期只有少数头反复触发(附录:前 70000 步约 12.7% 的头至少触发过一次)、约 30% 进度后回落」的观测。换模型、换数据后是否仍取 100,需要重新标定。
- 「零 loss 尖峰」是报告的自述口径,本刊未独立复现,也不掌握其内部 loss 曲线原始数据。它精确的含义是「未记录到 loss spike 事件」,不等于「训练全程无任何数值波动」。
- 本文的数学推导只作量级与逻辑一致性检查(第四节对核范数恒等式、第六节对 的 RMS 都做了复算),、0.2 这些具体取值均来自报告原文,本文未也难以独立复现其训练实验。
- 尺度约定的两套记法容易混用( 与 )。它们不可互换:前者对齐「RMS→RMS 位移」,后者对齐「单条目 RMS」。抄超参前务必先确认对方用的是哪一套。
- K2 与 GLM-4.5 的数字口径不可直接并置:前者 1.04 万亿参数 / 15.5 万亿 token,后者 3550 亿参数 / 23 万亿 token——参数量与 token 数是两条轴,把「谁训练得更久」与「谁更大」混在一句话里会得出错误结论。
- 一个仅作直觉的机制猜想(非报告结论、本文推测):注意力 logit 是 的内积,而 Muon 的正交化更新把每个方向的更新幅度拉平(第四节),这可能让某些方向上逐步累积的 logit 更少被「差异化压制」;Muon 比 AdamW 更频繁地出现 logit 爆炸,或许与此有关。报告本身没有给出根因分析,此猜测仅用于帮读者建立直觉,不作为事实陈述;真正的根因仍是开放问题。
- 的取值、MoE 与逐头裁剪的耦合尚无公开数据。 报告给出了 这一平衡因子,但未展开它对 分配的影响;K2 每 token 选 8 个专家,注意力与专家路由都会随训练漂移,QK-Clip 只作用于注意力侧,对专家侧稳定性的间接影响报告未涉及。
- 所有规模与阈值都必须带着「哪个模型、哪次实验」一起读。 「1000 以上」来自 9B/53B 的中型实验,「100」来自 K2 的设定;把它们并列却不标出处,是这类文章最常见的误读源。
- 本文未做任何训练实验。 全文的推导是纸面复算与一手报告的重述;MuonClip 在具体硬件上的实际加速、以及 QK-Clip 触发频率的量化曲线,都需要读者在自有负载上验证。
小结:Muon 与 MuonClip 其实可以各用一句干净的话记住。Muon 是「谱范数下的最速下降」——在谱范数这把尺子下,最优更新就是把动量的奇异值全部压成 1(即正交化 ),再用 Newton-Schulz 以廉价、可 bfloat16 的方式逼近它,最后乘 把条目 RMS 对齐到 AdamW 的尺度、从而共享学习率。MuonClip 则是「给 Muon 装了一个逐头的 feedback 控制器」——因为纯 Muon 会在 9B/53B 的中型实验里把最大注意力 logit 推到 1000 量级,K2 改为每步按头缩放 ,、,在 15.5 万亿 token 上换来零 loss 尖峰。把「等方向」和「控 logit」这两件事分开看,比记住「K2 用了新优化器」这个结论有用得多。
📋 来源与核验记录
一手论文与官方材料(均于 2026-10-08 实访对应官方/arXiv 页面;论文版本以各自 arXiv 页 Submission history 为准):
- Kimi Team(Moonshot AI),Kimi K2: Open Agentic Intelligence,arXiv:2507.20534,v1 2025-07-28。含摘要、MuonClip / QK-Clip 小节(、、MLA 仅裁剪未共享分量、 平衡因子)、K2 架构表(1.04 万亿总 / 320 亿激活、384 专家、64 头、MLA)、9B 激活/53B 总参数的中型实验(原版 Muon 最大 logit > 1000)、Figure 2(logit 被钉在 100、约 30% 进度后回落)、15.5 万亿 token 零 loss 尖峰;其 Algorithm 1(MuonClip)第 5 行逐字给出 并注「Match Adam RMS」,即 K2 报告本身即印出了 0.2 这一常数;附录记「前 70000 步有约 12.7% 的注意力头至少触发过一次 QK-Clip(把 压到 100),此后各头 陆续降到 100 以下、QK-Clip 自行失效」。https://arxiv.org/abs/2507.20534
- Moonshot AI,Kimi K2 官方项目页(含 MuonClip、qk-clip 的公式与「15.5T tokens、zero loss spike」表述)。https://moonshotai.github.io/Kimi-K2/
- Moonshot AI,Kimi-K2 官方仓库(模型卡:1T 总 / 32B 激活、61 层、隐层 7168、专家隐层 2048、64 头、384 专家、每 token 选 8 + 1 共享、词表 160K、上下文 128K、MLA、SwiGLU)。https://github.com/MoonshotAI/Kimi-K2
- Jingyuan Liu, Jianlin Su, Xingcheng Yao 等(Moonshot AI),Muon is Scalable for LLM Training,arXiv:2502.16982,v1 2025-02-24。含两项关键技巧(权重衰减、逐参数更新尺度)、更新 RMS 与 的分析、0.2–0.4 的 AdamW 对齐目标、约 2 倍计算效率、Moonlight 3B/16B 模型 5.7T token。https://arxiv.org/abs/2502.16982
- Moonshot AI,Moonlight 官方仓库(Muon 可扩展性说明与实现)。https://github.com/MoonshotAI/Moonlight
- Keller Jordan,Muon: An optimizer for hidden layers in neural networks,2024-12-08(正交化定义、NS 迭代与 SVD 交换的推导、五次系数、 归一化、 的近似说明、embedding/输出层除外)。https://kellerjordan.github.io/posts/muon/
- Keller Jordan,Muon 参考实现仓库(
zeropower_via_newtonschulz5、系数(3.4445, -4.7750, 2.0315)、ns_steps=5、momentum=0.95、max(1, fan_out/fan_in)**0.5尺度)。https://github.com/KellerJordan/Muon - Jeremy Bernstein,Deriving Muon(谱范数/RMS→RMS 算子范数下的最速下降、 与核范数对偶的推导)。https://jeremybernste.in/writing/deriving-muon
- Jeremy Bernstein, Laker Newhouse,Old Optimizer, New Norm: An Anthology,arXiv:2409.20325,v2 2024-12-06(Proposition 1 最速下降、Proposition 5 Shampoo = 谱范数最速下降、核范数恒等式 、Table 1 四种范数对照)。https://arxiv.org/abs/2409.20325
- GLM Team(Zhipu AI / 清华),GLM-4.5: Agentic, Reasoning, and Coding (ARC) Foundation Models,arXiv:2508.06471,v1 2025-08-08。含「除 word embedding、bias、RMSNorm 外用 Muon」「Newton-Schulz 步数 、动量 、更新 RMS 缩放到 0.2」、355B 总 / 32B 激活、23T token。https://arxiv.org/abs/2508.06471
- GLM Team(Zhipu AI / 清华),GLM-5: from Vibe Coding to Agentic Engineering,arXiv:2602.15763,v2 2026-02-24(Muon 下 MLA 一度不如 GQA、以及 Muon Split 让不同注意力头的投影权重以不同尺度更新)。https://arxiv.org/abs/2602.15763
第三方分析与工程博客:
- Jack Zhang, Noah Amsel, Berlin Chen, Tri Dao,A Fast, Hardware-Aware Newton-Schulz Algorithm for Muon(Gram Newton-Schulz 与 GramMuon,正交化步骤运行时间下降约 40%–50%;2026-03-30 博文,发布于 Tri Dao 站点)。https://tridao.me/blog/2026/gram-newton-schulz/
- Ki-Ung Song,About Muon: Muon At Scale(把 Bernstein 与 Moonlight 两种乘子约定并排对比;其同系列另一篇 Why Not Adam? 另给出 Jordan 的 0.02 约定;第三方个人博客,2026-09-21)。⚠️ 该文曾称「K2 报告描述了优化器但未印出该常数」,本刊逐字核对 K2 报告 Algorithm 1 后确认此说不成立(报告已印出 0.2,见来源 1),故正文口径以一手报告为准。https://kiungsong.github.io/2026/09/21/About_Muon_Muon_At_Scale.html
本文自行推导(仅作量级一致性检查,不得作为官方数值引用):
- D1|核范数恒等式 :由 与 ,等号在 处取得(第四节)。
- D2|:由 得 Frobenius 范数平方为 ,除以 即得;据此反推「乘 后条目 RMS≈0.2」,并代入 (裸 RMS≈0.0156、系数 12.8)与 (裸 RMS 0.125、系数 1.6)两组形状做算术校核(第六节)。
- D3|QK-Clip 的 logit 缩放:把 分别乘 与 后,logit 恰乘 (指数相加),故 等价于把最大 logit 压到不超过 (第八节)。
- D4|系数算术:,用于说明该五次映射在 处并未取到 (第五节的「近似而非精确」论点)。
- D5|8.1 节的手算例:设 、,则 、、两边各缩约 36.8%()、;该例为本文自造,仅用于说明机制,不对应任何真实训练数据(第八节)。
- 另:第五节「奇多项式与 SVD 交换」的推导()为对 Keller Jordan 博文的重述性复算,不计入本文自行推导。
数据截至 2026-10-08。文中各项模型规模、token 数、更新尺度与阈值均为对应技术报告/官方仓库的报告值,本刊未做独立复现;「零 loss 尖峰」为 Moonshot 报告自述口径,理论推导与实测值的边界已在第五、十节标明。本文由 AI 辅助整理,一手来源与推导步骤已如实标注,供读者自行核验。