带动量的SGD是随机梯度下降(SGD)的一种变体,它引入动量项以加速收敛并稳定更新。标准SGD仅使用当前小批量梯度更新参数,这可能导致噪声和剧烈波动。动量通过维护过去梯度的运行平均值来解决这一问题,有效平滑更新方向并抑制振荡。这一技术受物理动量启发,使优化器能在一致方向上积累速度,并更高效地穿越深谷,尤其在深度学习中常见的病态损失景观中表现突出。
其核心思想可追溯至经典优化,并在1980年代由伯克利研究员Bernard Widrow等人推广至神经网络训练,但如今广泛使用的具体公式由卡内基梅隆教授Geoffrey Hinton在其1986年论文《通过反向传播误差学习表示》中提出,并在其2012年讲义中进一步完善。该方法已成为训练深度神经网络的标准工具,常作为与Adam等新优化器比较的基线。
数学表述
在标准SGD中,迭代\( t \)时的参数更新为:
\[ w_{t+1} = w_t - \eta \nabla Q_i(w_t) \]
其中\( \eta \)是学习率,\( \nabla Q_i(w_t) \)是从小批量样本计算的梯度。引入动量后,增加一个速度变量\( v \),更新变为:
\[ v_{t+1} = \mu v_t + \eta \nabla Q_i(w_t) \]
\[ w_{t+1} = w_t - v_{t+1} \]
这里,\( \mu \)(通常在0.5到0.9之间)是动量系数,控制保留多少先前速度。较高的\( \mu \)赋予过去梯度更多权重,导致更新更平滑,但可能对新梯度方向适应较慢。速度随时间累积梯度,因此如果梯度持续指向同一方向,步长会增大,加速进展。相反,如果梯度振荡,动量项会将其平均,减少抖动。
直觉与类比
“动量”一词源自物理学:球滚下山坡时加速,并因质量而抵抗方向变化。在优化中,速度向量类似于球的动量,使优化器能“滚过”小的局部波动并保持一致方向。这在具有长而窄谷的损失表面中尤为有用,标准SGD会在谷壁间来回曲折。动量帮助优化器更直接地沿谷底移动,减少达到最小值所需的迭代次数。
变体与扩展
已开发出多种动量变体。由Yurii Nesterov于1983年提出的Nesterov加速梯度(NAG)是一种前瞻版本,它在应用当前速度后的位置计算梯度,而非当前位置。这种“窥视”使NAG能更快纠正方向,通常比经典动量收敛更快。在深度学习中,NAG有时称为“Nesterov动量”,并在TensorFlow和PyTorch等库中实现。
另一个相关概念是重球动量,本质上就是上述经典动量。“重球”一词源自重球在表面滚动的类比,在优化文献中有时与“动量”互换使用。
在深度学习训练中的作用
实践中,带动量的SGD广泛用于训练神经网络,包括大型语言模型和Transformer。例如,OpenAI和Google DeepMind已报告在各种训练运行中使用基于动量的优化器。该方法有助于在使用大批量和学习率调度时稳定训练,因为速度项平滑了批次间的梯度噪声。通常还将动量与学习率调度结合,随时间衰减学习率,使优化器能先大步前进,然后微调。
与Adam的比较
Adam优化器于2015年提出,通过为每个参数维护独立的自适应学习率,将动量与逐参数缩放结合。Adam在实践中通常收敛更快,尤其适用于稀疏梯度或噪声目标,但带动量的SGD在某些任务中可能泛化更好,特别是在计算机视觉中。许多从业者将带动量的SGD作为卷积网络的默认选择,而将Adam用于Transformer,但具体选择取决于问题。研究表明,适当调优后,带动量的SGD可达到相当或更优的测试准确率,尤其结合权重初始化和批归一化时。
收敛性质
理论上,带动量的SGD在凸性假设下保留了标准SGD的收敛保证。对于凸目标,在满足Robbins-Monro条件的递减学习率下,算法几乎必然收敛到全局最小值。对于非凸目标,它收敛到局部最小值或驻点。动量项不改变渐近收敛率,但可改善常数因子,意味着它通常能在更少迭代中达到给定精度。然而,选择正确的动量系数至关重要;过高可能导致过冲和发散,过低则减少收益。
实践考虑
实现带动量的SGD时,几个实际细节很重要。动量系数通常默认设为0.9,但对于非常深的网络,可能使用0.95或0.99。某些实现使用动量调度,在训练过程中增加\( \mu \),从低值开始并逐步提升。此外,动量与梯度裁剪相互作用:在应用动量更新前裁剪梯度可防止速度增长过大,这对训练循环网络或梯度不稳定的模型很重要。在分布式训练中,动量可同步或异步实现,同步动量更常见以确保可复现性。
历史背景
优化中的动量概念早于深度学习。在1960年代,Bernard Widrow和Ted Hoff开发了最小均方滤波器,其更新中使用了某种形式的动量。现代神经网络公式常归功于Geoffrey Hinton的1986年工作,他在其中将“动量方法”描述为加速反向传播的方式。此后,它成为机器学习库中的标准组件,在scikit-learn、TensorFlow和PyTorch中均有实现。尽管更复杂的优化器层出不穷,但其简单性和有效性确保了其持续相关性。