#从 SGD 到 Muon:大模型训练中优化器的演化逻辑、方法细节与未来展望

这条演化线,如果只看“公式变复杂了”,很容易看不懂;但如果抓住背后的训练痛点如何变化,逻辑其实非常清楚:

  • 最开始,大家只需要一个能下降 loss 的方法,于是有了 SGD
  • 后来发现梯度噪声大、方向抖、狭长谷底里前进很慢,于是有了 Momentum / Nesterov
  • 再后来发现不同参数、不同维度的梯度尺度差异太大,统一学习率很难调,于是有了 AdaGrad / RMSProp / Adam 这类自适应学习率方法。
  • 再后来,深度学习尤其是大模型训练发现:Adam 虽然好用,但泛化、权重衰减解释、显存占用、吞吐和超大 batch 场景下的稳定性都有问题,于是有了 AdamW、LAMB、Adafactor、Shampoo、Sophia 等针对特定瓶颈的改进。
  • 再往后,随着 Transformer / LLM 训练规模极大化,问题不再只是“能不能训起来”,而是:能否在极大 batch、极大宽度、强并行、低精度、长时间训练下,仍然高效地利用参数空间的几何结构? 这就把大家重新带回了一个老主题:优化器能否比逐坐标缩放更好地利用矩阵/子空间结构? Muon 就是在这个脉络下出现的。

所以,从 SGD 到 Muon,不是简单的“版本升级”,而是一个不断回答下列问题的历史:

  1. 梯度太噪怎么办?
  2. 不同方向曲率差别太大怎么办?
  3. 不同参数尺度差异太大怎么办?
  4. 显存、通信、吞吐、稳定性怎么办?
  5. 在大模型里,参数本身是矩阵而不是独立标量,优化器能不能尊重这种结构?

下面按这条线展开。


#一、起点:最普通的随机梯度下降(SGD)

#1.1 基本形式

我们要最小化目标函数

min_theta f(theta)

全批量梯度下降是:

theta_{t+1} = theta_t - eta * ∇f(theta_t)

但深度学习数据量巨大,通常只用一个 mini-batch 估计梯度:

g_t = ∇_theta L_B(theta_t)
theta_{t+1} = theta_t - eta * g_t

这就是 SGD

#1.2 为什么它是起点?

因为它抓住了最核心的一件事:沿着负梯度方向走一小步,局部上就能下降。它的优点是:

  • 简单;
  • 每步开销小;
  • 不需要额外状态;
  • 在大规模训练里很稳健;
  • 与很多理论分析兼容。

#1.3 SGD 的根本问题

但它很快暴露出几个痛点:

#(1)梯度噪声大

mini-batch 只是全数据梯度的采样估计,方向会抖。

#(2)各方向曲率差异大

在参数空间中,loss surface 往往像“狭长山谷”:

  • 某些方向曲率很大,稍微走快就震荡;
  • 某些方向曲率很小,走得又太慢。

单一学习率 eta 很难同时兼顾所有方向。

#(3)参数尺度不同

有些层梯度很大,有些层梯度很小;同一层中不同维度也可能相差几个数量级。

#(4)训练效率差

尤其在深网络、病态 Hessian、鞍点较多时,纯 SGD 容易来回摆动,前进速度慢。

动因总结:SGD 的问题不是“方向错了”,而是方向太噪、各向异性太强、统一步长不合适


#二、第一波改进:Momentum 与 Nesterov

#2.1 Momentum:给优化加“惯性”

最经典的动机是物理直觉:如果一个方向连续多步梯度都类似,那说明这个方向大概率值得继续前进;如果只是单步噪声,不应立即大幅改变方向。

更新写成:

v_t = beta * v_{t-1} + g_t
theta_{t+1} = theta_t - eta * v_t

也常见写成:

v_t = beta * v_{t-1} - eta * g_t
theta_{t+1} = theta_t + v_t

其中:

  • v_t 是速度;
  • beta 通常取 0.9 左右;
  • 本质上是对历史梯度做指数滑动平均。

#2.2 它解决了什么?

Momentum 主要解决两个问题:

#(1)降低梯度噪声的影响

当前 batch 的偶然抖动不会立刻完全改变方向。

#(2)在一致方向上加速

如果某个方向连续多步都朝同一边,速度会积累,走得更快。

这在“长谷底”里特别有用:

  • 横向高曲率方向:梯度符号频繁翻转,动量相互抵消;
  • 纵向低曲率方向:梯度长期同向,动量逐渐累积。

所以它天然有一种“抑制震荡、沿谷底加速”的效果。

#2.3 Nesterov Accelerated Gradient(NAG)

Nesterov 的核心想法是:不要站在当前位置看梯度,而是先按当前速度“预看一眼”未来位置,再在那里算梯度。

形式上可写为:

g_t = ∇f(theta_t - eta * beta * v_{t-1})
v_t = beta * v_{t-1} + g_t
theta_{t+1} = theta_t - eta * v_t

直觉上,它比普通 Momentum 多了一点“纠偏”能力:

  • Momentum 容易因为惯性太大冲过头;
  • Nesterov 提前看一眼前方的梯度,因此修正更及时。

#2.4 这一阶段的意义

这一步演化说明:

大家开始意识到,优化不是“每一步只看当前梯度”,而应该利用时间上的历史结构

但 Momentum 仍然有一个根本限制:所有参数共享同一个学习率尺度。如果不同维度梯度量级差异很大,它还是不好调。


#三、第二波改进:按坐标自适应步长——AdaGrad

#3.1 为什么会想到自适应学习率?

在很多任务里,不同参数维度的梯度统计性质差异巨大:

  • 稀疏特征:某些维度很少出现,但一出现就很重要;
  • 深网络不同层:梯度尺度差别大;
  • embedding 参数:频繁更新和罕见更新差异显著。

如果还用统一学习率,就会出现:

  • 频繁更新的维度步子太大;
  • 稀有维度步子太小,学不动。

#3.2 AdaGrad 的公式

AdaGrad 为每个参数维度维护历史平方梯度累积:

s_t = s_{t-1} + g_t^2
theta_{t+1} = theta_t - eta * g_t / (sqrt(s_t) + epsilon)

这里的平方、除法、开方都是逐元素的。

#3.3 它解决了什么?

如果某个维度过去梯度经常很大,那么 s_t 会越来越大,该维度后续有效学习率会变小;反之,如果某个维度很少被更新,则其学习率衰减更慢。

它的好处是:

  • 自动按坐标缩放;
  • 对稀疏场景特别有效;
  • 减少手工调参难度。

#3.4 它为什么后来不够用了?

致命问题是:平方梯度是累加不忘的

s_t = Σ_{i=1..t} g_i^2

这样训练越久,s_t 越大,有效学习率就会持续下降,最后几乎走不动。

所以 AdaGrad 很适合一些稀疏、凸优化或中短期训练问题,但在长时间深度网络训练里常常衰减过头。

动因总结:AdaGrad 引入了一个新思想——不同维度应该有不同步长,但它的“永久记忆”太强。


#四、RMSProp:只记最近一段历史

#4.1 从 AdaGrad 到 RMSProp 的核心动机

大家很快意识到,问题不在“按坐标自适应”这个思想,而在于 AdaGrad 的历史累积无限增长。

所以自然的修正就是:

不要累计所有历史,只维护一个局部窗口近似,也就是平方梯度的指数滑动平均。

#4.2 RMSProp 公式

s_t = rho * s_{t-1} + (1-rho) * g_t^2
theta_{t+1} = theta_t - eta * g_t / (sqrt(s_t) + epsilon)

通常 rho 取 0.9、0.99 之类。

#4.3 它的本质

RMSProp 可以理解成:

  • 对每个坐标估计最近梯度 RMS 大小;
  • 用这个尺度对当前梯度进行归一化;
  • 让每个维度都用相对合理的局部步长。

#4.4 为什么它比 AdaGrad 更适合深度学习?

因为深度学习训练是非平稳的:

  • 模型前期和后期梯度统计完全不同;
  • 不同训练阶段会进入不同 loss landscape;
  • 数据分布和激活分布也在变化。

在这种情况下,旧得太久的统计反而是噪声。RMSProp 只记近期统计,因此更灵活。

不过,RMSProp 虽然解决了“每维学习率”,却没有显式利用一阶动量。因此大家自然想到:

能不能把 Momentum 和 RMSProp 合起来?

这就到了 Adam。


#五、Adam:一阶动量 + 二阶矩估计 的组合拳

#5.1 Adam 的核心设计

Adam = Adaptive Moment Estimation

它同时维护:

  • 一阶矩:梯度均值的指数滑动平均;
  • 二阶矩:梯度平方的指数滑动平均。

公式:

m_t = beta1 * m_{t-1} + (1-beta1) * g_t
v_t = beta2 * v_{t-1} + (1-beta2) * g_t^2

由于初始化为 0,前期会有偏差,所以做 bias correction:

m_hat_t = m_t / (1 - beta1^t)
v_hat_t = v_t / (1 - beta2^t)

更新为:

theta_{t+1} = theta_t - eta * m_hat_t / (sqrt(v_hat_t) + epsilon)

#5.2 它到底在做什么?

可以这样理解:

  • m_t:告诉你“总体该往哪个方向走”,降低噪声;
  • v_t:告诉你“这个坐标最近梯度尺度有多大”,做自适应缩放;
  • 两者相除:相当于用一个归一化后的、方向更稳定的梯度去更新。

#5.3 为什么 Adam 一度几乎统治训练实践?

因为它几乎精准命中了深度学习工程里的几个核心痛点:

#(1)少调参

默认超参数经常就能跑:

  • beta1 = 0.9
  • beta2 = 0.999
  • epsilon = 1e-8

#(2)前期收敛很快

在许多任务上,Adam 前期 loss 掉得非常快。

#(3)对梯度尺度不敏感

不同层、不同模块的梯度尺度不一致时,也常常比 SGD 更省心。

#(4)很适合 Transformer 早期训练生态

特别是配合 LayerNorm、残差结构、warmup 后,Adam 类方法在大部分 NLP 模型里都很顺手。

#5.4 Adam 的问题在哪里?

随着规模变大,大家慢慢发现 Adam 不是“完美答案”。

#(1)泛化有时不如 SGD / SGD+Momentum

在一些视觉和监督学习任务里,Adam 训练 loss 虽然下降快,但测试性能未必更好。

#(2)权重衰减与自适应缩放耦合

经典写法里把 L2 正则直接加进梯度,会和 Adam 的自适应缩放互相影响,使得“weight decay”的语义变得不干净。

#(3)状态占用大

Adam 要存:

  • 参数本身 theta
  • 一阶状态 m
  • 二阶状态 v

大模型训练里这很贵。

#(4)逐坐标缩放可能忽略矩阵结构

Adam 看每个标量维度自己的统计,但一个线性层权重矩阵里,很多方向上的耦合结构并没有被利用。

这几个问题,会在后面的 AdamW、Adafactor、Shampoo、Muon 里逐渐显性化。


#六、AdamW:把权重衰减从 Adam 里“解耦”

#6.1 为什么 AdamW 出现几乎是必然的?

经典 L2 正则做法是把 lambda * theta 加进梯度:

g_t <- g_t + lambda * theta_t

对于普通 SGD,这和 weight decay 基本等价;但对 Adam 不一样,因为这个加进去的项还要经过 1/sqrt(v_t) 的逐坐标缩放。

结果是:

  • 不同参数受到的衰减强度不一致;
  • weight decay 不再是简单、统一的参数范数收缩。

这在大模型训练里会导致行为变得难解释、难调。

#6.2 AdamW 的核心做法

把参数衰减从梯度更新中拆出来:

theta_{t+1} = theta_t - eta * m_hat_t / (sqrt(v_hat_t)+epsilon) - eta * lambda * theta_t

或者写成先梯度更新再乘一个衰减因子:

theta_{t+1} = (1 - eta*lambda) * theta_t - eta * update_t

#6.3 它解决了什么?

  • 让 weight decay 真正回到“参数衰减”的语义;
  • 超参数更可解释;
  • 大模型训练里更稳定、更标准;
  • 与参数分组配合更自然:很多参数(如 LayerNorm、bias)不做 decay,而矩阵权重做 decay。

#6.4 在 LLM 训练中的地位

如果说 Adam 是深度学习工程的主力军,那么 AdamW 基本就是现代 Transformer / LLM 训练的默认基线。很多后续工作都是拿 AdamW 作为参照系来比较的。


#七、大模型训练把问题重新放大:为什么 AdamW 还不够?

到了 LLM 时代,优化器不再只是“loss 能不能降”的问题,而是要同时面对:

#7.1 显存/状态成本

AdamW 每个参数至少要多存两份状态,混精和 ZeRO 下还会牵涉更多副本和通信。

#7.2 超大 batch 训练稳定性

大模型为了吃满硬件,经常希望增大 batch;但 batch 变大后,优化动力学会变化,学习率缩放、噪声水平、泛化性质都不同。

#7.3 参数类型异质性极强

在 Transformer 里,不同参数其实不是一类东西:

  • embedding 矩阵;
  • attention / MLP 权重矩阵;
  • bias;
  • LayerNorm / RMSNorm 缩放参数;
  • output head。

这些参数的几何结构完全不同。对所有参数都用同一种逐坐标 AdamW,并不一定最优。

#7.4 矩阵结构被忽略

一个 W ∈ R^{d_out × d_in} 的线性层权重,本质是一个矩阵。它的重要结构常常体现在:

  • 行空间;
  • 列空间;
  • 奇异值分布;
  • 某些低秩/近低秩结构。

AdamW 把它拆成许多独立标量坐标来对待,可能丢失了结构信息。

#7.5 低精度与数值稳定

在 bf16 / fp16 训练下,优化器状态和更新规则是否数值稳定,也是第一等公民。

于是出现了几条改进路线。


#八、几条重要分叉:LAMB、Adafactor、Shampoo、Sophia

这几条线不一定都直接通向 Muon,但它们定义了 Muon 出现前的“问题版图”。

#8.1 LAMB:为超大 batch 训练服务

LAMB(Layer-wise Adaptive Moments for Batch training)是在 Adam 类更新基础上,再加入层级/张量级 trust ratio

r_t = ||theta_t|| / ||update_t||
theta_{t+1} = theta_t - eta * r_t * update_t

其中 update_t 通常来自 Adam 型归一化更新。

#核心动机

超大 batch 下,不同层参数范数和更新范数差异显著,统一步长容易让某些层更新过大或过小。

#本质

LAMB 不是只看逐坐标统计,还看整层的整体尺度关系。这说明大家已经开始从“坐标级”转向“张量级”结构。

#8.2 Adafactor:为省内存服务

Adafactor 的核心目标非常直接:Adam 太占内存了

对于矩阵参数 W,Adam 要存同形状的二阶状态 V。Adafactor 则把它近似分解为行、列统计:

V ≈ r c^T

或者说只存:

  • 每行的均方统计;
  • 每列的均方统计。

这样内存从 O(mn) 降到 O(m+n)

#动机

当模型参数达到数十亿、上百亿时,优化器状态直接决定能不能训。

#意义

这说明优化器设计开始不仅是数学问题,更是系统问题:显存、通信和硬件约束进入核心目标。

#8.3 Shampoo:利用矩阵几何的预条件器

Shampoo 是非常关键的一条线,因为它和 Muon 的精神距离很近。

对于矩阵梯度 G ∈ R^{m×n},Shampoo 不再只做逐元素缩放,而是估计:

  • 左侧二阶统计:L_t = Σ G_t G_t^T
  • 右侧二阶统计:R_t = Σ G_t^T G_t

然后用矩阵逆幂根做预条件:

G'_t = L_t^{-1/4} G_t R_t^{-1/4}

这样更新就尊重了矩阵的行列结构。

#它解决了什么?

  • 比逐坐标方法更接近真实曲率结构;
  • 能利用矩阵方向之间的耦合信息;
  • 对大型层参数更自然。

#它为什么没完全统治实践?

因为代价大:

  • 要维护矩阵级统计;
  • 要算矩阵逆幂根;
  • 分布式实现、数值稳定、吞吐都更复杂。

但它非常重要,因为它清楚地提出一个方向:

对矩阵参数,真正合理的优化器不应只逐元素地缩放,而应做结构化预条件

Muon 在某种意义上,就是把这条线进一步推向了一个更轻、更适合现代模型训练的版本。

#8.4 Sophia:近似二阶、关注 curvature 的低成本路线

Sophia 这类方法的代表性思想是:

  • 一阶方法只看梯度,不看 curvature;
  • 真正牛的二阶方法又太贵;
  • 那能不能用 Hessian 对角近似、Gauss-Newton 近似或者 cheap curvature estimate,得到比 Adam 更有结构感、但比全二阶更便宜的更新?

它们反映出一个持续动机:

只靠梯度均值和平方均值,不足以刻画大模型训练的几何结构。


#九、为什么会走到 Muon:大模型时代的核心动因

Muon 的出现,不是偶然冒出来一个新公式,而是好几条历史趋势汇合:

#9.1 对 AdamW 的不满越来越具体

在大模型里,AdamW 很强,但问题也非常具体:

  • 逐坐标自适应有时过于“局部”;
  • 更新方向未必尊重矩阵层的整体结构;
  • 状态成本高;
  • 某些规模和 batch 区间下,不一定是吞吐/样本效率最优。

#9.2 大量关键参数其实是 2D 矩阵

Transformer 的主干 FLOPs 主要花在线性层上,而它们几乎都是大矩阵:

  • Q, K, V, O 投影;
  • MLP 上下投影;
  • embedding / lm head。

既然参数是矩阵,梯度也是矩阵,那么优化器若完全忽略其谱结构、行列结构,就显得“有点粗糙”。

#9.3 工程上需要比 Shampoo 更轻的方法

Shampoo 指出了方向,但实现/代价偏重。大家自然会问:

有没有一种方法,能吃到一部分矩阵几何的红利,但不用承担完整二阶预条件器的高成本?

#9.4 正交化/白化类更新重新受到关注

在深网络里,人们逐渐意识到:很多训练困难和表示退化都和方向冗余、尺度耦合、谱形状不良有关。于是:

  • 正交初始化长期有效;
  • 归一化层长期有效;
  • 某些更新若能让步子在矩阵空间里更“均匀”、更“各向同性”,常常能带来好处。

Muon 就是在这种背景下强调:

对矩阵更新,先做某种意义上的正交化/极分解式归一化,再更新参数,可能比逐元素 AdamW 更贴近适合大模型的优化几何。


#十、Muon 的核心方法:它到底在干什么?

先说明一下:Muon 目前最值得抓的是方法论本质,而不是死记某个实现细枝末节。不同实现版本可能在动量、缩放、分组和数值细节上略有差异,但核心思想相对稳定。

#10.1 一句话直觉

Muon 主要面向 2D 权重矩阵,把原始梯度更新变成一个“正交化后的矩阵方向”,使得更新更多由子空间方向决定,而不过分受奇异值尺度扭曲影响。

如果说:

  • AdamW 是“逐坐标归一化”;
  • Shampoo 是“矩阵二阶预条件”;

那么 Muon 更像是:

  • 矩阵级方向净化 / 谱归一化 / 正交化更新

#10.2 从梯度矩阵到正交化更新

设某个矩阵参数的梯度(或动量)是 G ∈ R^{m×n}

对 SGD/AdamW 来说,通常直接用 G 或其逐元素缩放版本去更新。

但 Muon 会先把它变成一个“正交化”的矩阵 U。直观上,它保留 G 的主要作用子空间,却压平不同奇异方向上的尺度差异。

如果做 SVD:

G = P Σ Q^T

则一种理想化的正交化形式是:

orth(G) = P Q^T

也就是把奇异值 Σ 去掉,只保留左右奇异向量张成的方向结构。

这可以看成矩阵的极分解中的正交因子

#10.3 为什么这样做有意义?

因为原始梯度矩阵的奇异值往往很不平衡:

  • 某些方向特别大;
  • 某些方向特别小;
  • 这既可能反映真实重要性,也可能只是局部参数化尺度、激活统计、层间耦合导致的病态缩放。

如果你直接按 G 更新,那么步子会被这些尺度严重扭曲;而如果用 P Q^T 这样的正交化方向,更新更像是在说:

我相信这个梯度定义出来的“输入—输出子空间对应关系”,但不完全相信它当前的奇异值尺度。

这和很多现代训练经验是吻合的:

  • 参数化会诱导很多不必要的尺度自由度;
  • 方向信息常常比绝对尺度更稳健;
  • 对矩阵层来说,子空间几何可能比逐坐标量级更重要。

#10.4 一个更操作性的描述

Muon 通常会:

  1. 先像 Momentum 一样维护矩阵级动量 M_t
  2. 取某个矩阵更新候选 H_t(可能就是 M_t 或其变体);
  3. H_t 做正交化近似,得到 U_t
  4. U_t 去更新参数矩阵;
  5. 对非矩阵参数(如 bias、norm scale)通常仍用 AdamW 或其它常规优化器。

所以在真实大模型训练中,它往往不是“全参数统一用 Muon”,而是:

  • 2D 大矩阵参数:Muon
  • 标量/向量参数:AdamW 或类似方法

#10.5 正交化怎么高效实现?

真正算一次完整 SVD 很贵,所以工程实现一般不会每步都做精确 SVD,而会用:

  • Newton-Schulz 迭代;
  • 极分解近似;
  • 一些低步数矩阵函数近似;
  • 针对 bf16/fp32 混合精度的数值技巧。

Newton-Schulz 的思想可以概括为:

通过矩阵迭代,把一个矩阵逐渐推向其极分解中的正交因子。

这类迭代特别适合 GPU 上的矩阵乘法实现,因此在现代硬件上有吸引力。

#10.6 Muon 和 Shampoo 的差异

二者都尊重矩阵结构,但角度不同:

#Shampoo:

  • 通过估计二阶统计矩阵来做预条件;
  • 目标更接近曲率校正;
  • 更像“结构化二阶方法”。

#Muon:

  • 不显式估计完整 curvature;
  • 更强调把更新变成“正交化的矩阵方向”;
  • 更像“结构化方向归一化方法”。

所以 Muon 并不是“更便宜的 AdamW”,而是对优化几何有不同假设:

矩阵更新最重要的是子空间方向,而不是每个奇异方向原始幅值。

#10.7 Muon 的潜在优点

在大模型训练里,人们关注它通常是因为以下几点:

#(1)更适合矩阵主导的网络

Transformer 的核心计算都在矩阵乘法上,Muon 对这些参数形状天然匹配。

#(2)可能提升样本效率/训练速度

如果更新方向更“干净”,可能减少无效震荡,提高有效步长。

#(3)某些设置下吞吐/效果权衡更好

相比重型二阶方法,它可能更便宜;相比 AdamW,它可能更懂矩阵结构。

#(4)与大 batch 训练可能更契合

当噪声较小、梯度更稳定时,矩阵级几何归一化的收益可能更明显。

#10.8 Muon 的边界与风险

它也不是银弹。

#(1)并非所有参数都适合

对 bias、norm scale、embedding 的某些部分,矩阵正交化未必合适。

#(2)可能过度抹平有意义的谱信息

梯度奇异值不平衡有时确实反映“某些方向更该大步走”。如果一刀切把奇异值全部抹掉,可能损失信息。

#(3)数值与实现细节很关键

正交化近似、精度、截断、缩放系数、更新频率,都可能极大影响效果。

#(4)结果依赖具体模型族与训练配方

优化器从来不是脱离系统的:

  • 初始化;
  • normalization;
  • batch size;
  • LR schedule;
  • weight decay;
  • precision;
  • parallelism。

这些都决定 Muon 到底有多香。


#十一、把整条演化线串起来:每一步到底解决了前一步什么问题?

这里做一个压缩总结。

#11.1 SGD

想解决的问题:最基本地利用梯度下降。

不足

  • 梯度噪声大;
  • 狭长谷底震荡;
  • 统一学习率不合适。

#11.2 Momentum / Nesterov

相对 SGD 想解决的问题

  • 利用时间历史,减小噪声影响;
  • 沿稳定方向加速;
  • 减少震荡。

仍不足

  • 没有坐标级自适应;
  • 对不同维度尺度差异无能为力。

#11.3 AdaGrad

相对 Momentum/SGD 想解决的问题

  • 不同维度学习率应该不同;
  • 稀疏维度应该得到更大有效步长。

仍不足

  • 学习率单调衰减,后期走不动。

#11.4 RMSProp

相对 AdaGrad 想解决的问题

  • 只记近期统计,适应非平稳训练过程。

仍不足

  • 没有完整结合动量方向稳定性。

#11.5 Adam

相对 RMSProp + Momentum 想解决的问题

  • 兼顾方向稳定与自适应缩放;
  • 让训练更省心、更快启动。

仍不足

  • 状态成本高;
  • 泛化未必最佳;
  • 权重衰减语义不清;
  • 忽略矩阵结构。

#11.6 AdamW

相对 Adam 想解决的问题

  • 解耦 weight decay,让正则更合理。

仍不足

  • 仍然是逐坐标方法;
  • 仍有较高状态成本;
  • 仍未利用矩阵级几何。

#11.7 LAMB / Adafactor / Shampoo / Sophia

相对 AdamW 想解决的问题

  • LAMB:超大 batch 层间尺度不匹配;
  • Adafactor:状态内存太贵;
  • Shampoo:逐坐标太粗糙,需要矩阵级预条件;
  • Sophia:想吃 curvature 红利但不想付完整二阶代价。

#11.8 Muon

相对 AdamW / Shampoo 这条线想解决的问题

  • 逐坐标方法没有尊重矩阵参数结构;
  • 重型矩阵预条件方法又太贵;
  • 需要一种更贴近矩阵几何、但工程上仍可行的更新方式。

#十二、在大模型训练领域,为什么这条演化尤其重要?

大模型训练把优化器问题变得更“尖锐”,主要因为它同时放大了三个维度。

#12.1 规模放大:小缺陷会积累成大代价

几亿步训练里,一个优化器哪怕只多 2% 样本效率,差别都很大;哪怕只多 10% 状态内存,也可能决定能不能放下更大 batch。

#12.2 架构统一:大量重复矩阵层让结构型优化更有意义

Transformer 中大量层是同构的矩阵运算,这意味着:

  • 如果一种矩阵优化几何有效,它可以在很多层重复受益;
  • 这比在异构网络中更容易形成稳定收益。

#12.3 工程约束极强:优化器必须兼顾理论、硬件与系统

在 LLM 训练里,一个优化器是否可用,取决于:

  • 能否混精;
  • 能否张量并行/数据并行;
  • 额外状态是否可承受;
  • 核函数是否高效;
  • 是否容易调参;
  • 是否兼容已有训练配方。

因此,大模型优化器的演化,本质上是三股力量博弈:

  1. 数学几何:更新是否合理;
  2. 统计学习:是否样本效率高、泛化好;
  3. 系统工程:是否跑得动、跑得省、跑得稳。

Muon 受关注,正因为它试图处在三者的一个新平衡点上。


#十三、未来会怎么演化?我对大模型优化器的判断

我觉得未来不会是“某一个优化器永久统一天下”,而是会出现几条并行趋势。

#13.1 趋势一:混合优化器将成为常态

不同参数类型用不同优化器,会越来越自然:

  • 大型 2D 权重矩阵:结构化方法(Muon / Shampoo-like / 新型矩阵优化器);
  • 向量/标量参数:AdamW 或更便宜替代;
  • embedding/head:可能单独设计;
  • 甚至 MoE 路由器、状态空间模型中的特殊参数,也可能有专门更新规则。

这和现在大家按参数组设定不同 weight decay,本质是一条路线的继续深化。

#13.2 趋势二:从逐坐标自适应走向结构化预条件

AdamW 的核心假设是“每个坐标各管各的”,但大模型主力参数其实高度结构化。未来更可能看到:

  • block-wise;
  • matrix-wise;
  • low-rank;
  • Kronecker-factored;
  • subspace-aware;
  • spectral-aware。

也就是说,优化器会越来越像在做“结构化几何校正”,而不只是简单 EMA。

#13.3 趋势三:优化器与参数化共同设计

未来不只是换优化器,而是:

  • 参数化方式;
  • normalization 方式;
  • 初始化;
  • activation scaling;
  • optimizer

会一起 co-design。

如果一种参数化天生让梯度谱更健康,那 Muon 这类方法可能收益更大;反之也可能不明显。优化器不会再被视为一个完全独立模块。

#13.4 趋势四:优化器会更贴近硬件原语

谁能主要依赖:

  • 矩阵乘;
  • 低精度稳定算子;
  • 少同步通信;
  • 小状态;

谁就更有机会成为工业主流。

这也是为什么 Newton-Schulz 这类“矩阵乘友好”的近似会有吸引力。

#13.5 趋势五:预训练与后训练可能分化

预训练关注:

  • 长程稳定;
  • 吞吐;
  • 样本效率;
  • 大 batch 可扩展性。

后训练/对齐/RL 关注:

  • 非平稳目标;
  • 更高噪声;
  • 稀疏反馈;
  • 多阶段分布迁移。

这两类场景对优化器的最优选择未必相同。Muon 也许在预训练里更强,但未必直接等价于后训练最好。

#13.6 趋势六:真正大的突破可能来自“优化器 + 数据/课程 + 模型内部状态”的联动

从更长远看,单纯参数空间的一阶/二阶更新也许不是终点。未来可能出现:

  • 利用模型内部表征统计的优化器;
  • 基于激活子空间而非仅参数梯度的更新;
  • 与 curriculum / data scheduling 联动的自适应优化;
  • 更接近 model-based training dynamics control 的方法。

如果说 AdamW 还停留在“参数梯度统计学”,那未来可能走向“表示-参数-数据三者耦合的训练控制器”。


#十四、我对 Muon 的整体判断

如果要一句话评价:

Muon 不是对 AdamW 的小修小补,而是一次很重要的“视角切换”:从逐坐标优化,转向矩阵几何优化。

它的重要性不一定体现在“从此以后所有模型都只用 Muon”,而更可能体现在:

  1. 它让大家更认真地面对一个事实:LLM 主体参数是矩阵,不是独立标量
  2. 它推动优化器从 EMA 技巧堆叠,走向更结构化的几何设计;
  3. 它可能成为一批新型矩阵优化器的起点,而不是终点。

如果未来回头看,我猜真正留下来的不一定是 Muon 的某个具体实现细节,而是它代表的原则:

  • 更新要尊重参数张量结构;
  • 子空间方向信息比逐元素幅值更重要;
  • 优化器设计要同时考虑几何、系统和大规模训练现实。

#十五、最后给一个最短总结

如果把这条历史压成最短一句话:

  • SGD:先学会往负梯度走;
  • Momentum:别只看当下,要利用历史方向;
  • AdaGrad/RMSProp/Adam:不同维度应该有不同步长;
  • AdamW:把正则语义理顺,成为大模型默认基线;
  • Shampoo/Sophia 等:逐坐标太粗,要更多几何信息;
  • Muon:对矩阵参数,更新不该只逐元素缩放,而该先变成更“干净”的矩阵方向。

所以从 SGD 演化到 Muon,背后真正的主线不是“公式越来越花”,而是:

人们越来越不满足于把参数看成一串彼此独立的标量,而开始把优化看成一个与参数结构、模型几何和大规模系统约束共同耦合的问题。

这就是它在大模型训练时代最核心的意义。