SGD 与 Momentum#
TL;DR#
本页内容7 个部分
1. 背景与问题#
训练集给出很多样本,但每更新一次参数就计算全量梯度,成本会随数据量增长。随机梯度下降(Stochastic Gradient Descent,SGD)改用一小批样本估计梯度,让训练可以在有限计算下持续更新。
问题随之变成:一次小批量梯度应该怎样作用于参数?相邻批次的方向来回摆动时,能否把此前的信息也用起来?
2. 目标与定义#
设参数为 θ,单样本损失为 ℓ(θ;x,y)。希望降低数据分布上的平均损失:
L(θ)=E(x,y)∼Pdata[ℓ(θ;x,y)].
第 t 步在当前参数 θt−1 上,对含 B 个样本的 batch 求平均梯度:
gt=B1i=1∑B∇θℓ(θt−1;xi,yi).
独立、同分布采样且可交换期望与求导时,E[gt∣θt−1]=∇L(θt−1)。这里区分总体梯度和单批估计;一次估计可能偏离总体方向。
3. 方法与推导#
3.1 为什么沿负梯度更新#
先看确定的梯度 g=∇L(θ)。在足够小的邻域内,一阶展开给出:
L(θ−ηg)≈L(θ)−η⟨∇L(θ),g⟩=L(θ)−η∥g∥22.
η>0 是学习率。把完整梯度换成 batch 估计,得到 SGD 更新 θt=θt−1−ηgt。负号负责降低局部损失,学习率控制全局步幅;随机估计与高阶项使单步下降不再有无条件保证。[1]
3.2 Momentum 怎样累积方向#
为减少相邻 batch 的来回摆动,引入动量状态 ut,从 u0=0 开始:
ut=βut−1+gt,θt=θt−1−ηut,0≤β<1.
展开递推,ut=∑k=1tβt−kgk。同向梯度累积,反向梯度部分抵消;越久以前的贡献越小。这里采用不含 (1−β) 的约定;若改写为指数移动平均,需要同步换算学习率。[1]
4. 计算过程#
固定输入优化器的两步梯度 g1=2,g2=−1,从 θ0=2 出发,取 η=0.1、β=0.9。这组输入用于比较更新规则,不表示不同优化器在真实训练中会产生相同梯度轨迹。
第二步当前梯度已为负,普通 SGD 转向增加参数;动量仍为正,参数继续减小。这既展示了方向平滑,也展示了滞后。
5. 比较与边界#
Momentum 增加一份参数大小的历史状态,缓和方向摆动,但没有消除不同坐标的尺度差异。相同设置下,把整段梯度乘 c>0,SGD 与上述动量更新也放大 c 倍;逐坐标归一化由 Adam进一步处理。
陡峭方向可能限制可用步长,学习率仍需选择。上述局部展开也不等于非凸训练的收敛证明。
参考资料#
- Deep Learning,Chapter 8(2016). §8.3:小批量 SGD、Momentum 与更新约定。
延伸阅读#
- Muon 原理:对整张动量矩阵做谱变换,与逐坐标缩放有什么区别?
- 学习率调度:学习率为什么随训练阶段变化?
- AdamW:为什么 Adam 中的 L2 惩罚与权重衰减需要区分?