优化器:Adam → Muon → Scheduler → Per-Layer LR → 调参理论¶
更新日期:2026-04-16
一、优化器全景¶
飞书 add-on(待手动转 mermaid / 图)
component: blk_631fefbbae02400430b8f9f4
| 优化器 | 更新规则 | 内存 | 核心改进 | 论文 |
|---|---|---|---|---|
| SGD+Momentum | \(\theta \leftarrow \theta - \eta(\beta m + g)\) | \(1\times\) | 一阶动量 | - |
| Adam | \(\theta \leftarrow \theta - \eta \frac{m_t}{\sqrt{v_t}+\epsilon}\) | \(2\times\) | 自适应学习率 | Adam (2014) |
| AdamW | Adam + \(\lambda\theta\) 解耦衰减 | \(2\times\) | 权重衰减不经过自适应 | AdamW (2017) |
| Muon | \(\theta \leftarrow \theta - \eta \cdot \text{orth}(m_t)\) | \(1.33\times\) | 正交化保留梯度结构 | Muon (2024) |
| NorMuon | Muon + 逐行归一化 | \(1.33\times\) | 解决深层不稳定 | NorMuon (2025) |
二、AdamW:为什么它是标准¶
2.1 Adam 的设计动机¶
为什么不用 SGD?SGD 对所有参数用同一个学习率。但 LLM 中不同参数的梯度量级差异极大——embedding 的梯度可能是 attention 权重的 100 倍。SGD 要么学 embedding 太快(不稳定),要么学 attention 太慢。 Adam 的解法:每个参数自己算自适应学习率。对梯度大的参数自动减小 lr,对梯度小的自动增大。
数学上:有效学习率 \(= \eta \cdot m_t / \sqrt{v_t}\)。\(v_t\) 大(梯度方差大)→ 有效 lr 小;\(v_t\) 小 → 有效 lr 大。
2.2 为什么要 AdamW 而非 Adam+L2¶
Adam + L2 正则:权重衰减项 \(\lambda\theta\) 经过了 Adam 的自适应缩放 \(\frac{1}{\sqrt{v_t}}\)。结果:梯度大的参数衰减被压小了,梯度小的参数衰减被放大了——这不是我们想要的。 AdamW 解耦:衰减项 \(\lambda\theta\) 直接作用在参数上,不经过 Adam 缩放。每个参数的衰减强度一样。参考 Loshchilov & Hutter (2017)。
2.3 超参经验值与"为什么"¶
三、Warmup:为什么必须有¶
3.1 不 warmup 会怎样¶
不 warmup 直接用高 lr 训几乎一定崩溃(loss spike 或 NaN)。但为什么? 三个原因(参考 Analyzing Warmup in GPT Training (2024)):
原因 1:Adam 的二阶矩 \(v\) 还没准备好
训练初期 \(v \approx 0\)(刚初始化)。偏差修正后 \(\hat{v}_t = v_t/(1-\beta_2^t)\),当 \(t\) 很小时分母 \((1-\beta_2^t)\) 接近 0 → \(\hat{v}\) 极大波动 → 有效 lr = \(m/\sqrt{\hat{v}}\) 不可预测。
原因 2:梯度信噪比(SNR)高
训练初期所有样本对模型都是"新的",梯度方向高度一致(SNR 高)。这意味着一步更新会大幅改变模型表示。如果 lr 大 → 一步就把 embedding 空间搞乱,后续难以恢复。
原因 3:表示坍缩
初期大 lr 可能导致某些神经元永久死亡(ReLU 饱和)或 attention 分布退化。这种"结构损伤"无法通过后续训练修复。
3.2 Warmup 的机制¶
Warmup 让 lr 从 0 线性增长到 peak。这给了 Adam 的 \(v\) 时间累积有意义的统计量(约需 \(1/(1-\beta_2)\) 步 ≈ 20 步才相对准确),也让模型逐步建立稳定的内部表示。
实验证据:即使 5% 的 warmup 步数(1000 步中的 50 步)就能显著改善最终性能。参考 Analyzing Warmup (2024)。
六、Muon:为什么比 Adam 快 2 倍¶
6.1 Adam 的问题¶
Adam 的逐元素缩放 \(m_i/\sqrt{v_i}\) 把梯度矩阵打散成独立的标量。这丢失了矩阵结构信息(如低秩结构、方向关联)。
6.2 Muon 的解法¶
Muon 对动量矩阵做 Newton-Schulz 正交化:所有奇异值变为 1 → 所有方向步长一样 → 保留了梯度的方向信息。
\(X_{k+1} = \frac{3}{2}X_k - \frac{1}{2}X_k X_k^T X_k\)
5 次迭代后 \(X^TX \approx I\)。
为什么这更高效?想象一个 [4096, 11008] 的 FFN 权重矩阵。Adam 把它看成 4500 万个独立参数。Muon 把它看成一个整体矩阵,保留了行-列关联。参考 Muon is Scalable (Liu & Su, 2025)。
6.3 Muon 的限制与混合¶
Muon 只对 2D 矩阵有效。Embedding、LM Head、LayerNorm 必须用 AdamW。
def build_optimizer(model):
muon_params = [p for n,p in model.named_parameters()
if p.ndim==2 and 'embed' not in n and 'lm_head' not in n]
adam_params = [p for n,p in model.named_parameters()
if p not in muon_params]
return CombinedOptimizer([
Muon(muon_params, lr=0.02, momentum=0.95),
AdamW(adam_params, lr=3e-4, betas=(0.9,0.95), weight_decay=0.1)
])
6.4 实际收益¶
参考文献¶
-
[1] Kingma & Ba. Adam. 2014. 论文
-
[2] Loshchilov & Hutter. AdamW. 2017. 论文
-
[3] Jordan. Muon. 2024. 博客
-
[4] Liu & Su. Muon is Scalable. 2025. 论文
-
[5] NorMuon. 2025. 论文
-
[6] Analyzing Warmup in GPT Training. 2024. 论文
-
[7] Essential AI. Practical Efficiency of Muon. 2025. 论文