考试相关¶
- GD 和 SGD 唯二要求掌握
- 动量 SGD 和 普通 SGD 的效果其实是一样的(存在一个最坏情况,一般来说动量 SGD 效果会更好)
- momentum SGD 仅供了解
1 优化:只需要把 GD / SGD 的主线想清楚¶
训练大模型本质上是在解一个(通常是)随机优化问题:
其中 \(x\) 是参数,\(\xi\) 是随机采样的 batch / token / 数据样本,\(F\) 是单次采样对应的损失。
1.1 GD(全量梯度)vs SGD(随机梯度)¶
- GD: 用全量梯度 \(\nabla f(x)\) 更新,方向稳定但每步代价高。
- SGD: 用随机梯度 \(\nabla F(x;\xi)\) 近似 \(\nabla f(x)\),每步便宜但带噪声。
1.2 为什么 SGD 依然能工作:两个核心假设¶
做收敛性分析时,最常用的两个假设是:
- 无偏性: \(\mathbb{E}[\nabla F(x_k;\xi_k)\mid \mathcal{F}_k] = \nabla f(x_k)\)
- 方差有界: \(\mathbb{E}[\|\nabla F(x_k;\xi_k)-\nabla f(x_k)\|^2\mid \mathcal{F}_k]\le \sigma^2\)
\(\mathcal{F}_k\) 可以理解为 “到第 \(k\) 步为止的全部历史信息”:在第 \(k\) 步时,当前位置 \(x_k\) 已经由历史决定,但当前采样的 \(\xi_k\) 仍未知。无偏性保证 “平均方向不歪”,方差有界保证 “噪声不爆炸”,配合合适的学习率策略才能推出可控的收敛结论。
2 动量:理论上不一定加速,但实践很常用¶
动量方法的直觉是减少病态问题中的 “Zig-Zag”:
- 在狭长谷底(ill-conditioned)里,梯度往往在陡峭方向来回反弹
- 把历史方向叠加进更新中,相当于引入惯性,让轨迹更平滑
2.1 Momentum SGD 的两个常见写法¶
一种写法(重球动量)是:
等价地也常写成动量缓冲区:
2.2 一个重要的理论观点(记住结论即可)¶
在某些经典假设下(光滑 + 强凸、学习率足够小、\(\beta\) 不接近 1),Momentum SGD 在收敛行为上可能与 “把学习率放大到 \(\gamma/(1-\beta)\) 的普通 SGD” 等价。这解释了一个常见现象:很多时候你看到的 “动量加速”,可能来自于有效学习率增大,而不是阶数意义上的收敛率改进。
不过,深度学习的实际训练通常远超这些假设(非凸、分布漂移、噪声结构复杂、batch/优化器细节),所以动量依然在工程上非常有效。
3 Adaptive SGD:自适应学习率与预条件(Preconditioning)¶
自适应方法的核心:不同坐标方向的梯度尺度不同,应该对每个方向使用不同的有效学习率。
直观效果是:
- 梯度变化剧烈的方向,自动减小步长(抑制震荡)
- 梯度较弱的方向,自动增大步长(更快推进)
3.1 AdaGrad:累积平方梯度(逐坐标缩放)¶
3.2 RMSProp:用指数滑动平均避免步长过快衰减¶
更新形式与 AdaGrad 类似,只是把 “累积” 改为 “近期加权平均”。
3.3 Adam:动量 + 自适应(工程上最常见之一)¶
Adam = momentum (累计历史) + preconditioning (改变周围环境) 可以把 Adam 理解成两件事的结合:
- 动量: 用一阶动量 \(m_k\) 平滑梯度
- 预条件: 用二阶统计 \(s_k\) 做逐坐标缩放
但需要注意:Adam 确实存在理论上的 不收敛反例(在某些构造问题上会失败)。实践中常用变体(例如 AdamW)与合适的超参/学习率调度,通常能获得良好效果,但这不是无条件保证。
4 “新”优化器:Muon 与 SOAP(先记住关键词)¶
这部分属于 “课后可以继续追” 的内容,先把关键词记下来:
- Muon: 一类新近讨论较多的优化器方向,目标之一是在某些设置下减少额外开销(你记的点是 “计算量可能减半”)。具体机制需要对照原文/实现再细读。据说是 kimi 从某篇博客中发现并发展的优化器 (Muon cuts the computation by half!)
- SOAP: 一个关键特征是构造 矩阵值(matrix-valued)的预条件,也就是不再是逐坐标的缩放(对角矩阵),而可能在更高维结构上调整更新几何。
一句话直觉:从 “每个坐标一个学习率” 走向 “在子空间/矩阵结构上做更强的几何校正”。
5 Loss landscape:大模型为什么难训¶
训练神经网络难,常被概括为非凸。但更有用的直觉是:即使在局部可优化,几何结构也可能非常病态。
- 对 LLM,有一种常见比喻是 “河谷地形”(river valley):谷底很长、很窄,沿不同方向的曲率差异巨大
- 这会导致优化轨迹很容易出现震荡、对学习率敏感,也解释了动量/自适应/预条件这类方法的必要性
6 训练内存:把 4 个部分拆开看¶
训练时显存占用通常可以拆为:
- Model(参数)
- Gradient(梯度)
- Optimizer states(优化器状态)
- Activations(前向激活/中间变量)
主导项要分情况讨论:例如 Adam 会带来额外的动量/二阶状态;长序列 Transformer 的激活可能成为主要瓶颈;batch size、sequence length、checkpointing 等策略会显著改变 Activations 的占比。