深度学习|表示学习|训练优化方法|Nesterov动量一定比基础的Momentum更好吗?|22
如是我闻: Nesterov 动量(Nesterov Accelerated Gradient, NAG)并不一定总比 基础动量(Momentum) 更好,它们各有优劣,适用于不同的场景。
1. Momentum(标准动量法)
标准动量法的更新规则:
v
k
+
1
=
β
v
k
−
α
∇
f
(
x
k
)
v_{k+1} = \beta v_k - \alpha \nabla f(x_k)
vk+1=βvk−α∇f(xk)
x
k
+
1
=
x
k
+
v
k
+
1
x_{k+1} = x_k + v_{k+1}
xk+1=xk+vk+1
其中:
- v k v_k vk 是动量项, β \beta β 是动量系数(通常在 0.9 附近)。
- α \alpha α 是学习率, ∇ f ( x k ) \nabla f(x_k) ∇f(xk) 是当前点的梯度。
核心思想:将上一时刻的更新方向部分保留,并在当前梯度的基础上继续前进,从而减少梯度震荡,提高收敛速度。
2. Nesterov Accelerated Gradient (NAG)
Nesterov 动量的更新规则:
v
k
+
1
=
β
v
k
−
α
∇
f
(
x
k
+
β
v
k
)
v_{k+1} = \beta v_k - \alpha \nabla f(x_k + \beta v_k)
vk+1=βvk−α∇f(xk+βvk)
x
k
+
1
=
x
k
+
v
k
+
1
x_{k+1} = x_k + v_{k+1}
xk+1=xk+vk+1
相比标准动量法,Nesterov 方法在计算梯度时 “提前看一步”,即在
x
k
x_k
xk 沿着动量方向前进一小步后再计算梯度。这种方法可以在到达目标点之前就对路径进行调整,从而减少不必要的震荡。
核心思想:
- 标准动量法先基于当前梯度更新速度,再用速度更新参数。
- Nesterov 先向动量方向走一步,再计算梯度,调整前进方向,使优化更稳定。
3. Nesterov 动量 vs 标准动量
特性 | 标准动量法(Momentum) | Nesterov 动量(NAG) |
---|---|---|
计算梯度点 | 当前位置 x k x_k xk | 预估的新位置 x k + β v k x_k + \beta v_k xk+βvk |
梯度方向调整 | 沿当前梯度更新 | 先估计后调整,避免过冲 |
收敛速度 | 快 | 一般比标准动量更快 |
震荡现象 | 可能有较大震荡 | 震荡较少,更稳定 |
适用场景 | 适用于普通优化 | 适用于高曲率区域或有明显梯度变化的场景 |
计算量 | 计算一次梯度 ∇ f ( x k ) \nabla f(x_k) ∇f(xk) | 计算两次梯度(一次在 x k + β v k x_k + \beta v_k xk+βvk) |
4. Nesterov 一定比 Momentum 更好吗?
不一定,它的优势取决于具体的优化问题:
- 适合 Nesterov 的场景:
- 当目标函数具有高曲率(如狭长谷地)时,Nesterov 方法比标准动量收敛更快,且更稳定。
- 适用于深度学习的自适应学习率方法(如 SGD + Nesterov),能减少梯度震荡。
- 不适合 Nesterov 的场景:
- 如果梯度计算非常昂贵(如每次计算梯度涉及大量数据),Nesterov 需要计算两次梯度,可能会增加计算负担。
- 在某些优化问题中,提前估计梯度可能会导致步长过小,反而影响收敛速度。
5. 实际应用中的选择
- 深度学习(如 CNN、RNN 训练):
- Nesterov 动量通常比标准动量更快,因此 SGD + Nesterov 常用于优化神经网络(如 AlexNet、VGG)。
- 但在自适应优化算法(如 Adam, RMSProp)中,Nesterov 并不常用。
- 凸优化问题:
- Nesterov 动量有理论上的最优加速收敛率,比普通梯度下降更快。
总的来说
- 如果目标是更快收敛且梯度计算成本可接受,Nesterov 方法通常优于标准动量。
- 如果计算梯度的代价很高,或者收敛速度不是关键,标准动量法也可以很好地完成任务。
- 在深度学习中,SGD + Nesterov 通常比普通 SGD + Momentum 更受欢迎。
➡ 综上,Nesterov 并不总是更好,而是要看问题的特性和计算成本。
以上