趋近智
尽管随机梯度下降(SGD)在计算上优于批量梯度下降,但它的更新可能噪声大,且收敛速度慢,尤其是在狭长山谷或沟壑中。设想损失曲面如起伏地形。普通SGD仅根据当前点的梯度迈步,这可能导致当坡度在不同方向迅速变化时,产生不规则的之字形移动。这在狭窄的沟壑中尤其容易出现问题,因为梯度陡峭地指向山谷两岸,但沿着谷底方向却很平缓。SGD可能在狭窄轴上反复来回摆动,沿着谷底向最小值移动得非常缓慢。
为了解决这个问题,我们可以引入动量思想,借鉴物理学原理。想象一个球滚下山坡。它不仅仅是根据当前位置的坡度移动;它还拥有从之前运动中积累的动量。这种动量帮助它平滑路径,越过小障碍,并在持续的斜坡上更快地加速。
带动量的SGD将类似思想应用于参数更新。不只使用当前梯度来更新参数,我们维护一个“速度”向量,它本质上是过去梯度的指数衰减移动平均值。这个速度项代表了参数更新所累积的“动量”。
在每一步 ,我们更新速度 ,然后使用这个速度更新参数 。过程如下所示:
此处:
引入动量带来了几点好处:
思考在典型损失沟壑中,SGD与带动量的SGD所采取路径的区别:
SGD(红色)和带动量的SGD(蓝色)在损失曲面上的优化路径比较。动量法采用更直接的路径趋向最小值,避免了标准SGD中出现的震荡。
动量系数 决定了优化器的“记忆力”。
的常见起始值是0.9或有时是0.99。与学习率 类似, 的最优值取决于具体问题,通常需要通过实验来调整。重要的是要记住 和 之间存在互相影响,因此调整其中一个可能需要调整另一个。
大多数深度学习框架都提供了带动量的SGD的简单实现。例如,在PyTorch中,你可以在创建SGD优化器实例时,通过简单地指定 momentum 参数来启用动量:
import torch.optim as optim
# 假设 'model_parameters' 包含你的网络参数
# 设置学习率和动量系数
learning_rate = 0.01
momentum_beta = 0.9
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum_beta)
# --- 在你的训练循环中 ---
# optimizer.zero_grad()
# # 前向传播,计算损失
# loss = criterion(outputs, labels)
# # 反向传播
# loss.backward()
# # 更新权重
# optimizer.step()
通过根据过去梯度积累速度,带动量的SGD相对于普通SGD提供了明显的改进,通常能带来更快的收敛和更稳定的训练,尤其适用于深度学习中遇到的复杂非凸损失曲面。它为许多后续更高级的优化算法提供了依据。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造