優化與訓練

動量(momentum)

/ moh-MEN-tum /

動量借用了物理學的一個念頭:一個沉重的球滾下坡,不會在每塊小石子前都停下來重新盤算——它會積起速度,朝著一直在走的方向繼續滾。在訓練裡,動量讓模型記住自己最近幾步的方向,並順著那個方向繼續走,而不是只對腳下當前的坡度做反應。結果就是一次更平滑、更快的下降。

從機制上說,普通梯度下降純粹朝當前的下坡方向邁步。動量則保留一份過去梯度的滑動平均——一個「速度」——並朝這個累積起來的方向邁步。一個典型的動量值0.9,意味著每次更新大部分是上一次的速度,再加上一點點新的梯度。當接連幾次的梯度方向一致時,它們會疊加起來,讓模型在那些長而平穩的坡上加速;當它們相互矛盾時(那些帶雜訊、來回鋸齒的方向),它們會部分抵消,把搖擺抑制下去。

這在兩種常見情形裡確實有用:一是長長的緩坡谷地,普通下降在那裡一寸一寸地挪;二是狹窄的溝壑,普通下降在那裡像乒乓球一樣兩壁來回彈。動量能衝過前者,撫平後者。代價是沉重的球可能邁過頭——滾過谷底才掉頭——所以動量要配一個合理的學習率。它也是流行的 Adam 優化器的底座,Adam 在它之上又加了「逐參數的步長」。

想像一條狹窄的溝壑,緩緩朝下坡延伸。普通梯度下降會在陡峭的兩壁之間左右彈跳,向前進展緩慢。加上動量,左右的彈跳相互抵消,而那個平緩的向前方向卻累積起來——模型於是順著溝壑滑行而下,而不是哐噹哐噹地一路顛。

動量抵消了來回的鋸齒,留下那個有用的向前運動。

動量不是用來替代學習率的——它與學習率協同工作。動量太大、外加學習率太大,就是邁過頭與來回振盪的配方,所以這兩者要一起調。

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