优化与训练

动量(momentum)

/ moh-MEN-tum /

动量借用了物理学的一个念头:一个沉重的球滚下坡,不会在每块小石子前都停下来重新盘算——它会积起速度,朝着一直在走的方向继续滚。在训练里,动量让模型记住自己最近几步的方向,并顺着那个方向继续走,而不是只对脚下当前的坡度做反应。结果就是一次更平滑、更快的下降。

从机制上说,普通梯度下降纯粹朝当前的下坡方向迈步。动量则保留一份过去梯度的滑动平均——一个「速度」——并朝这个累积起来的方向迈步。一个典型的动量值0.9,意味着每次更新大部分是上一次的速度,再加上一点点新的梯度。当接连几次的梯度方向一致时,它们会叠加起来,让模型在那些长而平稳的坡上加速;当它们相互矛盾时(那些带噪声、来回锯齿的方向),它们会部分抵消,把摇摆抑制下去。

这在两种常见情形里确实有用:一是长长的缓坡谷地,普通下降在那里一寸一寸地挪;二是狭窄的沟壑,普通下降在那里像乒乓球一样两壁来回弹。动量能冲过前者,抚平后者。代价是沉重的球可能迈过头——滚过谷底才掉头——所以动量要配一个合理的学习率。它也是流行的 Adam 优化器的底座,Adam 在它之上又加了「逐参数的步长」。

想象一条狭窄的沟壑,缓缓朝下坡延伸。普通梯度下降会在陡峭的两壁之间左右弹跳,向前进展缓慢。加上动量,左右的弹跳相互抵消,而那个平缓的向前方向却累积起来——模型于是顺着沟壑滑行而下,而不是哐当哐当地一路颠。

动量抵消了来回的锯齿,留下那个有用的向前运动。

动量不是用来替代学习率的——它与学习率协同工作。动量太大、外加学习率太大,就是迈过头与来回振荡的配方,所以这两者要一起调。

又称
heavy ball methodSGD with momentumNesterov momentum动量動量