Nesterov Momentum/zh
| Article | |
|---|---|
| Topic area | Optimization |
| Prerequisites | Stochastic Gradient Descent, Gradient Descent |
概述
Nesterov 动量,又称 Nesterov 加速梯度(NAG),是一种一阶优化方法,它在 梯度下降 的基础上引入了一个在前瞻点处计算的速度项。该方法由 Yurii Nesterov 于 1983 年针对光滑凸问题提出,对具有 Lipschitz 梯度的凸函数能够达到最优最坏情形收敛速率 $ O(1/t^2) $,相比之下普通梯度下降仅为 $ O(1/t) $。在现代机器学习中,它最常用于替代 随机梯度下降 中的动量选项,相较于经典的重球动量,往往能带来略快的收敛和更好的稳定性。
其核心思想很简单:NAG 不在当前参数向量处计算梯度后再走一个动量加权步,而是先沿先前的速度移动到一个前瞻点,在该点计算梯度,然后再做修正。这种细微的次序调整带来了显著的算法差异,也正是该方法理论加速性质的来源。
背景:经典动量
经典动量(有时称为 Polyak 重球法)通过对过去梯度进行指数加权累积来改进梯度更新。设 $ \theta_t $ 表示第 $ t $ 步的参数,$ \eta $ 为学习率,$ \mu \in [0,1) $ 为动量系数,$ \nabla f(\theta_t) $ 为目标函数的梯度。则经典更新公式为
$ {\displaystyle v_{t+1} = \mu v_t + \nabla f(\theta_t),} $ $ {\displaystyle \theta_{t+1} = \theta_t - \eta\, v_{t+1}.} $
速度 $ v_t $ 类似于在损失景观中滚动的粒子的动量:它在狭长的山谷中抑制高频振荡,同时在持续的下降方向上积累速度。重球动量可以在病态问题上显著加快进展,但容易越过最优点,并且在一般光滑凸函数上无法达到最优的加速收敛速率。
Nesterov 更新
Nesterov 的改动是将梯度在前瞻点 $ \theta_t - \eta \mu v_t $ 处计算,而不是在 $ \theta_t $ 处。更新公式变为
$ {\displaystyle v_{t+1} = \mu v_t + \nabla f\!\left(\theta_t - \eta \mu v_t\right),} $ $ {\displaystyle \theta_{t+1} = \theta_t - \eta\, v_{t+1}.} $
从左到右阅读这个公式:优化器先承诺执行惯性步 $ -\eta \mu v_t $,然后再问“我即将落脚的位置上梯度是什么?”,并用该梯度对速度进行修正。如果惯性步正朝着上坡方向走,前瞻点的梯度就会提前指向反向,从而在过冲发生之前就将其抑制。
在其最初的凸优化形式中,Nesterov 使用了一个由辅助序列递推得到的随时间变化的系数 $ \mu_t $,且当 $ t \to \infty $ 时 $ \mu_t \to 1 $。大多数深度学习实现将其替换为一个常数 $ \mu $(通常取 0.9 或 0.99),这虽然舍弃了形式上的加速保证,但仍保留了实际的优势。
直观理解:前瞻修正
一个有用的直觉是把每次迭代分成两个阶段。第一阶段,迭代点沿当前速度滑行,与经典动量的做法完全相同。第二阶段,在这个被投影后的位置上计算的梯度作为校正力。相比之下,经典动量是基于当前位置的梯度做修正,而当前位置已“落后于”真实运动。因此前瞻使 NAG 在每次迭代中获得半步额外的信息。
这种效应在具有狭长等高线的二次目标函数上最为明显。重球迭代沿着狭窄方向振荡,其振幅衰减得很慢。NAG 的迭代能更快地阻尼同样的振荡,因为每次修正都基于参数将要去到的位置,而不是它当前所处的位置。
收敛性质
对于具有 $ L $-Lipschitz 梯度的凸函数 $ f $(其最小值为 $ f^* $),Nesterov 加速梯度在步长 $ \eta = 1/L $ 下满足
$ {\displaystyle f(\theta_t) - f^* \le \frac{2L\,\|\theta_0 - \theta^*\|^2}{(t+1)^2},} $
这与任何只访问梯度信息的一阶方法的下界相匹配。[1] 在 $ \mu $ 强凸目标上,速率变为线性收敛,收缩因子为 $ 1 - \sqrt{\mu / L} $,仍严格优于梯度下降的 $ 1 - \mu / L $。
上述保证依赖于精确梯度以及最初的时变调度。在深度学习实践中使用的随机梯度下,形式上的加速性质不再成立,但前瞻结构在经验上通常仍然有帮助。
实用形式
上面的形式需要在 $ \theta_t - \eta \mu v_t $ 处计算梯度,这在更习惯于在当前存储参数处计算梯度的自动微分框架中并不方便。Sutskever 等人[2]证明了通过变量替换可以得到一个等价的更新形式,其始终在当前参数处计算梯度:
$ {\displaystyle v_{t+1} = \mu v_t - \eta\, \nabla f(\theta_t),} $ $ {\displaystyle \theta_{t+1} = \theta_t + \mu v_{t+1} - \eta\, \nabla f(\theta_t).} $
这正是 PyTorch(torch.optim.SGD(..., nesterov=True))和 TensorFlow Keras 等框架所采用的形式。它在重新参数化的意义下与前瞻形式产生完全相同的轨迹,也是大多数实际从业者所运行的版本。
与相关方法的比较
在优化器的设计空间中,Nesterov 动量介于经典重球动量与 Adam、RMSprop 等自适应方法之间。与重球相比,它通常训练更快、过冲更少;这种差异虽然不大但相当一致,特别是在卷积视觉模型上,使用 Nesterov 动量的 SGD 仍是一个强基线。与自适应方法相比,NAG 不对每个参数单独调整梯度尺度,因此对梯度幅值不均匀的问题鲁棒性较差,但在调优良好的视觉基准上,往往能带来更好的最终泛化效果。
Lookahead 优化器以及与之密切相关的 Anderson 加速法都与 NAG 思想相似:它们都使用辅助序列来消除振荡行为,但其修正发生在更粗的粒度上,或采用更一般的外推方案。
局限性
尽管理论优雅,Nesterov 动量在实践中仍有若干局限。其形式加速性质依赖于光滑性、凸性和精确梯度,而这些条件在深度网络训练中均不成立;一旦学习率和权重衰减调好,相对于经典动量的经验增益往往有限,有时几乎可以忽略。当动量系数非常高(接近 1)且学习率较大时,它在含噪问题上仍可能过冲乃至发散。最后,在自适应缩放至关重要的任务上,例如基于 transformer 的语言模型,NAG 几乎不敌 Adam 及其变体,鲜少作为默认选择。