跳转至

考试相关

  • GD 和 SGD 唯二要求掌握
  • 动量 SGD 和 普通 SGD 的效果其实是一样的(存在一个最坏情况,一般来说动量 SGD 效果会更好)
  • momentum SGD 仅供了解

1 优化:只需要把 GD / SGD 的主线想清楚

训练大模型本质上是在解一个(通常是)随机优化问题:

\[ \min_{x \in \mathbb{R}^d} f(x) = \mathbb{E}_{\xi \sim \mathcal{D}}[F(x;\xi)], \]

其中 \(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 的两个常见写法

一种写法(重球动量)是:

\[ x_{k+1} = x_k - \gamma \nabla F(x_k;\xi_k) + \beta (x_k - x_{k-1}), \quad \beta \in [0,1). \]

等价地也常写成动量缓冲区:

\[ \begin{aligned} m_k &= \beta m_{k-1} + \nabla F(x_k;\xi_k), \\ x_{k+1} &= x_k - \gamma m_k. \end{aligned} \]

2.2 一个重要的理论观点(记住结论即可)

在某些经典假设下(光滑 + 强凸、学习率足够小、\(\beta\) 不接近 1),Momentum SGD 在收敛行为上可能与 “把学习率放大到 \(\gamma/(1-\beta)\) 的普通 SGD” 等价。这解释了一个常见现象:很多时候你看到的 “动量加速”,可能来自于有效学习率增大,而不是阶数意义上的收敛率改进。

不过,深度学习的实际训练通常远超这些假设(非凸、分布漂移、噪声结构复杂、batch/优化器细节),所以动量依然在工程上非常有效。

3 Adaptive SGD:自适应学习率与预条件(Preconditioning)

自适应方法的核心:不同坐标方向的梯度尺度不同,应该对每个方向使用不同的有效学习率。

直观效果是:

  • 梯度变化剧烈的方向,自动减小步长(抑制震荡)
  • 梯度较弱的方向,自动增大步长(更快推进)

3.1 AdaGrad:累积平方梯度(逐坐标缩放)

\[ \begin{aligned} g_k &= \nabla F(x_k;\xi_k), \\ s_k &= s_{k-1} + g_k \odot g_k, \\ x_{k+1} &= x_k - \frac{\gamma}{\sqrt{s_k}+\varepsilon}\odot g_k. \end{aligned} \]

3.2 RMSProp:用指数滑动平均避免步长过快衰减

\[ s_k = \beta s_{k-1} + (1-\beta) g_k \odot g_k, \quad \beta \in (0,1). \]

更新形式与 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 的占比。