趋近智
正如我们所见,标准梯度下降仅根据当前位置计算的梯度来更新权重。尽管这种方法可行,但它可能导致训练效率低下,特别是在某些类型的损失函数形状中。想象损失曲面中一个狭窄的沟壑或山谷。梯度下降倾向于在沟壑的陡峭壁上反复振荡,沿着底部向最小值缓慢移动。同样,它可能停滞在局部最小值,或者在鞍点处显著减速。
为了解决这些问题,我们可以引入动量的理念,借鉴物理学的思想。想象一个球从山上滚下来。球不是仅仅计算当前位置最陡峭的坡度并稍微沿该方向移动(像标准梯度下降那样),而是具有动量。它当前的速率会影响它在下一步的移动。如果它已经以某个方向快速移动,即使当前的坡度略有改变,它也倾向于保持该方向。这种动量有助于它:
带有动量的梯度下降将物理类比应用于优化过程。它引入了一个“速率”向量 v,该向量累积了过去梯度的指数衰减移动平均值。权重更新随后会同时考虑当前梯度和这个速率。
带有动量的梯度下降的更新规则在每个迭代 t 中包含两个步骤:
更新速率向量 vt:
vt=βvt−1+η∇L(wt−1)这里:
这一步主要通过取旧速率的一部分(β)并加上缩放的当前梯度(η∇L(wt−1))来计算新的速率。如果当前梯度方向与之前的速率方向一致,则速率的大小会增加。如果梯度方向振荡,速率倾向于被抑制,因为相反的梯度项会随时间部分抵消。
更新权重 wt:
wt=wt−1−vt权重通过沿着新计算的速率向量 vt 的方向移动来更新。
通过加入速率 vt(其中包含近期梯度历史的信息),更新变得更平滑、更快,尤其是在梯度方向一致的路径上。
考虑优化一个带有狭窄山谷的函数。标准梯度下降可能会在两侧壁之间来回跳动,而动量则会走一条更直接的路径。
样本损失曲面上的优化路径。标准梯度下降(粉色)在狭窄山谷中振荡,向最小值(接近原点)缓慢移动。动量(蓝色)抑制了这些振荡,并沿着谷底加速,走了一条更直接的路径。
动量系数 β 控制着过去梯度的影响。
β 的常用值是0.9或更高,例如0.99。通常从0.9开始使用效果不错,并在训练期间可能增加它。这个参数,就像学习率一样,可能需要针对特定问题进行调整以达到最佳效果。
在PyTorch等框架中使用动量很简单。在定义优化器时,只需指定 momentum 参数即可。
import torch
import torch.nn as nn
import torch.optim as optim
# 假设 'model' 是你定义的神经网络 (nn.Module)
# 假设 'learning_rate' 是你选择的学习率(例如 0.01)
# 使用带有动量的SGD定义优化器
momentum_coefficient = 0.9
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum_coefficient)
# --- 在你的训练循环中 ---
# loss.backward() # 计算梯度
# optimizer.step() # 使用带有动量的SGD更新权重
# optimizer.zero_grad() # 重置梯度以进行下一次迭代
通过简单地将 momentum 参数添加到 optim.SGD 构造函数中,优化器会自动实现前面描述的速率计算和权重更新步骤。
带有动量的梯度下降是标准梯度下降的显著改进,通常能带来更快的收敛速度和对复杂损失曲面的更好应对。尽管它有助于应对许多问题,但进一步的改进促成了RMSprop和Adam等自适应方法的出现,我们将在下一节中进行考察。
这部分内容有帮助吗?
momentum 参数及其在实现中的直接使用。© 2026 ApX Machine Learning用心打造