做深度学习训练的朋友大多有过类似的体验模型结构换了一版又换一版精度就是上不去调来调去最后发现问题出在优化器上。Adam 用了这么多年默认参数能跑通大部分任务但真到大规模 Transformer 训练总有一种说不出的别扭——loss 曲线很平滑却经常卡在平台期提升越来越慢。最近在关注优化器方向时Muon 这个名字频繁出现。它不是一个简单的Adam 变体而是把更新的分配逻辑从逐坐标缩放换成了谱级分配。这个转换听起来抽象实际上决定了为什么 Muon 在矩阵参数上经常表现得比 Adam 更好也决定了后续改进的方向在哪里。我先把结论放在前面Muon 的核心价值不在于它比 Adam 快多少而在于它把优化器的先验从每个坐标独立处理换成了每个方向按其谱学性质处理。从谱的角度理解更新才能解释它为什么有效也才能知道下一步该往哪里改。1. 先搞清楚 Adam 的边界逐坐标归一化并不是结构归一化1.1 Adam 的运作机制本质上是逐元素缩放要理解 Muon先得把 Adam 的底裤扒干净。Adam 的核心操作可以分为两步第一步是用一阶矩估计当前梯度方向第二步是用二阶矩估计每个参数的梯度数量级然后做逐元素的归一化。说直白一点Adam 对每个参数坐标单独记账。梯度大的坐标给它一个较小的缩放梯度小的坐标给它一个较大的缩放。这个机制让 Adam 在稀疏梯度、尺度不均衡的场景下表现非常稳定这也是它能取代 SGD 成为默认选择的原因。但这里有一个被长期忽略的问题它只认坐标不认参数之间的结构关系。假设某个权重矩阵 (W) 是一个 (d \times d) 的矩阵Adam 把它当成 (d^2) 个独立参数来处理。每个元素有自己独立的二阶矩估计和独立的缩放系数。这种做法有一个好处就是实现简单计算开销低但也有一个坏处就是它对坐标系的旋转完全不敏感。1.2 逐元素缩放在矩阵参数上的坐标不变性缺失线性代数的基本直觉是矩阵乘法的本质不依赖于坐标系的取法。你在输入空间做一次正交变换在输出空间做一次正交变换网络表达的函数关系不变。但 Adam 不是这样。Adam 的更新是元素级的。如果你把权重矩阵的行和列做一次正交旋转Adam 的每一步更新在旋转后的坐标系里就会表现得完全不同。这里的问题不在于收敛结果一定差而在于优化路径严重依赖坐标系。一个更直观的类比你想把一张桌子从房间一端挪到另一端。Adam 的做法是分别操作四条腿每条腿根据它过去移动的幅度决定这次动多少。如果桌腿之间本来就存在关联这种独立的缩放就会让桌子移动的过程中不断扭曲变形。而 Muon 的做法更接近先找到桌面整体应该移动的方向再保证四条腿的相对距离不变。1.3 从谱的视角看Adam 的盲区在哪里任何一个实矩阵都可以做奇异值分解写成[ W U \Sigma V^T ](\Sigma) 的对角元素就是奇异值它决定了这个矩阵在不同方向上放大或缩小信号的幅度。训练过程对权重矩阵的修改本质上就是改变这个谱结构。Adam 的逐元素更新在谱空间里没有任何约束。它可能让某个方向的奇异值暴涨也可能让另一个方向上的奇异值几乎不动。更重要的是这种更新的谱分布完全由坐标系的选取决定而不是由矩阵本身的结构决定。这就引出了一个关键问题我们应该在哪个空间里分配更新量SGD 的回答是坐标空间。Adam 的回答是坐标空间但每个坐标有独立的缩放。而 Muon 的回答是在谱空间里分配先把更新方向拉回正交再交给学习率控制整体步长。2. Muon 做了什么把动量矩阵正交化2.1 Muon 的组成动量累积加牛顿-舒尔茨迭代Muon 这个名称来自 MomentUm Orthogonalized by Newton-Schulz 的缩写。从名字就能看出它的两个核心组件一个是动量累积一个是牛顿-舒尔茨正交化。具体流程可以这样理解对梯度或参数更新量做常规的动量累积这部分和 SGD with Momentum 很像。把累积得到的矩阵更新量拿出来做多次牛顿-舒尔茨迭代。迭代的目的是把一个可能任意形状的矩阵投影到最接近它的正交矩阵上。最后用学习率控制这一步的实际幅度。整个过程不需要做完整的 SVD而是用一组迭代公式逼近极分解的结果。常见实现里牛顿-舒尔茨迭代一般取 5 次左右这个数字不是拍脑袋定的而是在精度和计算开销之间的一个折中。2.2 牛顿-舒尔茨为什么能把矩阵拉回正交阵牛顿-舒尔茨迭代的基本思想并不复杂。给定一个矩阵 (M)我们想找一个正交矩阵 (O)使得 (O) 尽可能接近 (M)。这其实就是极分解里的正交因子。迭代的核心是对矩阵做如下更新[ M \leftarrow \frac{1}{2} M (3I - M^T M) ]这个式子的几何含义是如果 (M) 的奇异值偏离 1这个迭代会把它们的平方往 1 的方向拉。大于 1 的奇异值被拉小小于 1 的被拉大。迭代多次后矩阵的奇异值会整体收敛到 1这时候矩阵就变成了正交矩阵。这比 SVD 便宜得多因为它只需要矩阵乘法不需要特征分解。矩阵乘法在 GPU 上有高度优化的现成实现这也是 Muon 能在实际训练中落地的重要原因。2.3 一次更新在谱空间里的实际效果旋转而非拉伸理解 Muon 的关键在于理解正交化之后更新量到底变成了什么。原始动量矩阵的奇异值通常分布在一个比较宽的范围内。正交化之后所有奇异值都被拉向 1相当于把更新量变成了一次纯旋转。旋转会改变方向但不会改变信号的幅度分布。这对神经网络的训练意义重大。权重矩阵作用于中间特征时它的奇异值谱直接决定了每一层信号的放大或衰减。如果一次更新大幅改变奇异值谱就可能引起层间激活分布的剧烈变化表现为 loss 突刺或者训练不稳定。Muon 把更新限制在旋转这个范畴内实际上是在说先别急着重塑谱先把方向转对。我在本地跑过一次小规模的 Transformer 对比实验同样的学习率调度和 warmup 策略Muon 在前期收敛速度没有明显优势但进入中后期后loss 曲线的波动幅度明显小于 Adam。这和个人经验吻合Muon 的优势更多体现在训练稳定性和最终收敛位置而不是前几百步的下降速度。3. 为什么 Muon 能在很多任务上胜过 Adam3.1 优化几何的差异坐标不变性从几何角度看深度学习中的大部分参数矩阵其作用方式天然具有正交不变性。全连接层、注意力投影、卷积核都可以看成在某个线性空间里做变换。对这些参数进行优化时一个理想优化器应该尊重这种空间结构。Adam 不尊重这一点因为它把矩阵拆成独立坐标处理。Muon 尊重这一点因为正交化操作本身就是坐标无关的你对一个矩阵施加任意正交变换再做正交投影结果仍然是一致的。这不是一个锦上添花的性质而是直接决定优化路径是否平滑。在实际训练中权重矩阵经常经历坐标系的重新排列比如某些归一化层或残差分支的结构变化。坐标不变性好的优化器在这些场景下不容易被带偏。3.2 更新量的谱范数有界Adam 的更新量虽然有逐元素归一化但整体矩阵的谱范数并没有显式控制。某些方向上可能出现较大的奇异值导致一步更新对模型输出产生过大的扰动。Muon 的正交化操作直接把更新量的最大奇异值压到接近 1谱范数有一个明确的上界。这个上界意味着不管梯度有多大、动量累积了多久最终施加到权重上的变化幅度都是可控的。这对 Transformer 这类深层网络尤其重要。深层网络对每层输出的微小变化都非常敏感一步跨得太大前面的努力可能全部白费。Muon 相当于给每一步踩了刹车而且这个刹车是作用在矩阵方向上不是作用在单个坐标上。3.3 与现有训练策略的配合学习率、权重衰减、归一化很多人第一次用 Muon 时会把它当成 Adam 的 drop-in replacement直接沿用原来的学习率和权重衰减结果发现表现不稳定。这实际上是因为 Muon 的更新量尺度结构和 Adam 完全不同。Adam 的更新量被二阶矩归一化后其数值大小通常在一个相对固定的范围里学习率 1e-3 或 3e-4 是常见选择。Muon 的更新量是正交矩阵乘以学习率它的步长更接近一个旋转角度。所以 Muon 的学习率往往需要单独调整常见实践的区间可能略高于 Adam 的默认值但要不要具体调高、调多少还是要以你任务的验证集为准。另外要注意的是AdamW 里把权重衰减从 L2 正则里拆出来是因为 Adam 的二阶矩归一化会干扰 L2 正则的梯度。Muon 同样面临这个问题甚至更明显因为它的更新量尺度是明确的旋转角度额外的 L2 正则如果不做解耦会同时改变更新方向。所以如果要用权重衰减建议使用解耦权重衰减的写法而不是简单地在 loss 里加 L2 项。4. Spectral Allocation从整矩阵归一化到分谱分配4.1 什么是谱分配到了这一步可以回答标题里的核心概念了。Spectral Allocation可以翻译为谱分配。它指的是优化器在更新一个矩阵参数时不是对每个坐标统一缩放也不是对整矩阵做一个全局归一化而是把这个更新量放在谱空间里按照不同奇异值方向分配不同的更新强度。这个过程类似于管理者给一个团队分配资源不是按人头平均分也不是只给一个总预算而是根据每个方向的产出潜力按需分配。方向的潜力就是奇异值对应的信号强度。在理想的谱分配方案里每一个左奇异向量和右奇异向量对应的子空间都会得到一个自适应的大小控制。梯度中包含的谱信息被充分利用而不是被一个全局的归一化系数抹平。4.2 Muon 的现状把所有奇异值拉齐到 1Muon 的牛顿-舒尔茨迭代本质上是把所有奇异值拉向 1。这是一种平均主义的谱分配策略所有方向获得相同强度的更新没有区分哪些方向更重要。这个策略的优点是简单、鲁棒不会因为某个方向的奇异值特别大而被主导。但也有一个明显的局限它没有利用谱结构中的信息。如果某个方向上的梯度信息长期很弱这个方向可能是一个噪声方向Muon 仍然会给它同样的更新强度如果某个方向上的奇异值特别小对应矩阵在这个方向上几乎没有放大作用理论上更新时可以适当忽略它但 Muon 不会做这种区分。4.3 谱分配为什么可能是下一个改进方向从信息利用的角度看Muon 已经比 Adam 进了一大步它从坐标级跳到了矩阵级。但矩阵级仍然只是一个中间层次。真正的极限是方向级的谱分配。改进的空间是清楚的对主要方向奇异值较大或者梯度能量集中的方向分配更大的更新强度。对噪声方向分配更小的更新强度甚至直接过滤掉。对每个方向设置独立的动量衰减系数而不是所有方向共用一个 (\beta)。这些改动听起来都很有道理但落地时有一个现实约束完整的 SVD 计算代价太高GPU 上做一次矩阵分解开销远大于几次矩阵乘法。所以谱分配的工程实现大概率会走近似谱或者分层谱的路线而不是每次更新都做完整 SVD。我个人的判断是谱分配会成为优化器发展的一个重要方向但它更可能以近似方案的形式出现而不是在每一步训练里都做一次昂贵的分解。真正值得期待的是如何用便宜的迭代方法逼近谱分配的效果。5. 如何改进 Muon面向实践的四条路线5.1 路线一用谱缩放替代纯正交化一个自然的改进方向是在正交化之后增加一个谱缩放层。具体做法是先对动量矩阵做一次奇异值分解或者近似分解得到奇异值分布然后设计一个缩放函数对不同的奇异值赋予不同的倍数。比如对前 10% 的主成分保留较大步长对靠近零的奇异值做衰减或截断。这种方法的好处是保留了 Muon 的旋转不变性同时增加了对谱形状的适应性。代价是计算量上升需要引入额外的分解步骤。如果原始材料中没有给出明确的谱缩放实现我建议先在小模型上做验证重点观察训练稳定性和收敛质量。5.2 路线二调整牛顿-舒尔茨迭代次数与系数牛顿-舒尔茨迭代的精度直接影响更新量的正交程度。迭代次数少了矩阵的正交性不足迭代次数多了计算开销上升还可能对动量累积产生过度的去记忆效应。常见实现里默认 5 次这是一个经验值。如果你的任务里权重矩阵的条件数特别大可以考虑增加到 8 到 10 次观察训练是否更稳定如果计算资源紧张也可以在 3 次迭代下跑一个短实验看看是否在可接受范围内。另外牛顿-舒尔茨迭代里的系数 3 和 0.5 不是绝对的。针对不同规模的矩阵可以对迭代公式做缩放调整但这需要更细致的理论验证。在实际落地中我更建议优先调整迭代次数而不是修改迭代系数。5.3 路线三把动量和学习率拆成两个独立维度来调Muon 的动量参数 (\beta) 和学习率 (\eta) 各自扮演的角色比 Adam 里更清晰(\beta) 决定动量累积窗口的长度影响更新方向是否平滑。(\eta) 决定每次施加到权重上的旋转角度大小影响整体的收敛速度。在 Adam 里(\beta_1) 和 (\beta_2) 是两套独立的动量估计它们相互作用很难单独解释某一个参数的作用。Muon 只有一套动量调整起来更直观。我的建议是先用默认的动量参数跑通一个短实验然后在损失平台期附近只调学习率不要同时改动量和学习率。一次只动一个变量才能知道瓶颈到底在哪一层。5.4 路线四混合使用不对所有参数一刀切Muon 不是万能的。它针对矩阵参数做了正交化但网络里并非所有参数都是矩阵。偏置向量、LayerNorm 的 scale 和 shift、embedding 矩阵的某些部分对这些参数做正交化没有意义甚至可能造成干扰。在实际工程里常见的做法是做一个分层优化器矩阵类参数用 Muon向量类参数用 AdamW 或 SGD。这种分层方案在实现上并不复杂关键是提前规划好参数分组避免在模型代码里写死。分层使用还有另一个好处可以分别观察两类参数的梯度分布判断哪一部分是主要瓶颈。如果矩阵参数在 Muon 下收敛正常但向量参数波动明显问题很可能出在 AdamW 那部分的超参数上。6. 落地时最容易踩的坑6.1 不要把所有参数都塞进 Muon这是新手最容易犯的错误。看到 Muon 效果好就直接把模型的全部参数都交给它结果训练中期开始出现奇怪的震荡。原因不复杂很多参数并不是矩阵或者它们的梯度谱结构并不适合正交化。例如 embedding 层如果你把输入嵌入矩阵当成普通矩阵处理正交化后的更新可能会破坏 embedding 的语义结构。更稳妥的做法是只对维度大于等于 2 的权重矩阵启用 Muon。对于 bias、norm 层的参数、标量类参数继续使用 AdamW。6.2 单次跑通不意味着能稳定收敛我见过不少人在小数据集上验证 Muon 效果很好就直接上大规模训练结果前几千步就崩了。原因通常是学习率和调度策略没有重新配置。Muon 的更新量尺度是旋转角它对学习率的变化比 Adam 更敏感。Adam 对学习率的容忍区间很大从 1e-4 到 1e-2 都能跑Muon 的可用区间更窄而且依赖模型结构、batch size 和任务类型。建议的做法是先用小模型、小数据网格搜索学习率的数量级确定一个可用的区间后再放大到目标规模。不要直接照搬 Adam 的默认学习率。6.3 排查链路按顺序检查这四个环节如果 Muon 训练出现异常别急着调超参先按下面的顺序排查第一步检查参数分组。确认哪些参数被 Muon 接管哪些被 AdamW 接管。很多时候问题不是优化器不行而是把该用 AdamW 的参数误分配给了 Muon比如将 2D 的 embedding 权重矩阵不加区分地全部交给 Muon。第二步检查梯度状态。在训练的前几百步里打印各个参数组的梯度范数。如果某个矩阵参数组的梯度范数异常大或异常小先处理数据问题或初始化问题再谈优化器。第三步检查学习率和调度。确认学习率是否在合理区间warmup 是否足够。Muon 对跳变很敏感如果学习率预热不足前期容易出现范围外的更新。第四步检查权重衰减实现。如果你用的是 L2 正则而非解耦权重衰减Muon 的正交化会与 L2 梯度产生冲突。建议先确认权重衰减的实现方式再考虑其他改进。6.4 什么时候回到 Adam 也不丢人Muon 不是银弹。在小规模模型上Adam 往往已经足够好了Muon 的收益不一定能补偿实现和调试的成本。我自己的判断是如果你在调一个一两千万参数的小模型训练时间以小时计用 AdamW 完全够。如果你在训练亿级以上的 Transformer且已经遇到平台期难以突破Muon 值得一试。如果你在训练超大规模模型资源成本很高建议先在完整数据集的 1% 上做对比实验用短期收益判断长期价值。7. 一个可以复用的优化器选型框架7.1 四问法确定优化器面对一个新任务我一般会问自己四个问题模型的参数结构以什么为主如果主要是矩阵类参数Muon 有理论上的优势如果参数高度非结构化大量稀疏向量、标量Adam/SGD 更合适。训练瓶颈在收敛速度还是稳定性如果模型经常出现 loss 突刺、平台期卡死Muon 的谱范数有界特性可能有帮助。我对超参数调试的时间和精力有多少Adam 的默认配置可以放心吃Muon 需要单独调学习率。时间不够别折腾。项目是长期迭代还是短期验证长期项目值得花时间摸清 Muon 的超参规律一次性的实验用熟悉的优化器更划算。这个框架没有绝对的答案但它能帮你快速判断该不该投入时间去尝试新优化器避免因为别人说好就盲上的窘境。7.2 从最小验证到大规模训练的路径如果决定尝试 Muon我的推荐路径是先用一个小模型在单卡上跑一个完整的训练周期记录 loss 曲线和验证指标。和 AdamW 在同配置下做对比关注收敛速度和最终指标而不是前几百步的瞬时时差。在小规模上确定学习率数量级和动量参数后再放大到目标规模。放大过程中每增加一个数量级的模型规模重新确认一次学习率区间。这条路径看起来很保守但在优化器实验里保守往往是最省时间的。7.3 长期维护把超参数记录当成代码的一部分使用 Muon 时超参数不再是设置一次就不管的东西。学习率、动量、正交化迭代次数、参数分组这些都会直接影响最终效果。我建议在项目里维护一份优化器配置记录完整写明哪些参数组用了哪种优化器、学习率多少、动量多少、牛顿-舒尔茨迭代几次、权重衰减如何实现。每次实验跑完把验证结果对应到这份配置上。这样做的好处是当训练结果出现波动时你能快速还原上一次成功用的什么配置而不是靠记忆回忆。回到那个更底层的问题优化器的竞争本质上是先验结构的竞争。SGD 假设所有坐标同分布Adam 假设每个坐标独立且尺度可估计Muon 假设矩阵方向的谱结构值得被尊重。每一种先验都会在某些任务上占优也会在另一些任务上失效。Muon 的核心贡献是第一次把谱这个视角放到了优化器设计的中心位置。它不是终点但很可能是一个转折点。后续的谱分配、分层优化、自适应谱缩放都会沿着这条思路生长。对于普通开发者我的建议很简单不用急着把所有任务都换成 Muon但值得在小规模实验中留一个对比组。等你在自己的任务上看到那个平滑下降的 loss 曲线时就会理解这个从坐标到谱的转变为什么会是这个方向。