趋近智
动量通过累积过去的梯度来加速梯度下降 (gradient descent),使优化器能在一致的方向上更快地移动并抑制震荡。涅斯捷罗夫加速梯度(NAG),有时也称为涅斯捷罗夫动量,通过引入一个预测性的元素来进一步优化。设想一个球从山上滚下来;动量赋予了球惯性。但是,如果球能在完全基于当前动量和梯度来确定下一步行动之前,智能地向前看一点呢?这种智能的超前预测机制就是涅斯捷罗夫加速梯度背后的主要思想。
标准动量在当前位置 计算梯度,然后沿着更新后的累积梯度(动量 )的方向迈出一大步。
NAG 采取略微不同的方法。它首先沿着之前的动量方向迈出“向前看”的一步。它计算如果只应用前一步的累积速度,参数 (parameter)将会到达的位置。接着,它在这个“向前看”位置而非原始位置计算梯度。最后,它利用这个向前看的梯度来调整最终的更新步骤。
这为什么有效?如果动量步将我们带到接近最小值的位置,或爬上不应爬的斜坡,向前看位置的梯度会指向最小值或向下,比标准动量更有效地修正轨迹。它充当一个修正因子,防止优化器越过最小值,并在许多情况下实现更快的收敛。
我们来比较更新规则。回顾标准动量的更新方式:
这里, 是动量系数(通常约为 0.9), 是学习率, 是步骤 的速度向量 (vector),而 是在当前位置 处评估的损失函数 (loss function) 相对于参数 的梯度。
涅斯捷罗夫加速梯度修改了这个过程:
简单来说,NAG 采用沿动量方向稍前位置计算的梯度,从而提供一个更明智的更新方向。
我们可以可视化动量与 NAG 之间的差异。
更新步骤比较。标准动量在当前位置(黑点)计算梯度,并将其添加到动量步(紫色虚线)中。NAG 首先将动量步(紫色虚线)移动到向前看位置(红点),在那里计算梯度(红色虚线),然后将此梯度添加到动量步中,得到最终更新(蓝色实线)。
向前看计算使 NAG 相较于标准动量具有多项优势:
尽管稍显复杂,但实际实现通常只需在优化器中设置一个标志。
大多数深度学习 (deep learning)框架在其标准 SGD 优化器中将 NAG 作为可选功能实现。例如,在 PyTorch 中,你在创建 torch.optim.SGD 优化器时启用 NAG:
import torch
import torch.optim as optim
# 假设 'model_parameters' 从你的神经网络中获取
# model_parameters = model.parameters()
# 实际参数的占位符:
model_parameters = [torch.randn(10, 5, requires_grad=True)]
learning_rate = 0.01
momentum_coeff = 0.9
# 实例化启用涅斯捷罗夫动量的 SGD 优化器
optimizer = optim.SGD(
model_parameters,
lr=learning_rate,
momentum=momentum_coeff,
nesterov=True # 启用涅斯捷罗夫加速梯度
)
# --- 训练循环中的使用示例 ---
# optimizer.zero_grad() # 重置梯度
# loss = calculate_loss(...) # 计算损失
# loss.backward() # 计算梯度
# optimizer.step() # 使用 NAG 更新参数
print(f"优化器已创建: {optimizer}")
使用 SGD 时,启用涅斯捷罗夫动量通常是与标准动量一同尝试的良好默认选项,因为它经常提供更好的收敛表现,且额外计算成本极小。它代表了一种简单而有效的改进,用于在复杂损失曲面中进行优化。
这部分内容有帮助吗?
nesterov参数。© 2026 ApX Machine LearningAI伦理与透明度•