數值最佳化

Nesterov 加速(Nesterov acceleration)

/ nyeh-STEH-roff /

一顆滾下山谷的重球不會在每一點都停下重新決定——它的動量帶它向前,撫平小的鋸齒,並讓它沿谷底加速。為梯度下降加上動量就借用了這個直覺。Nesterov 加速是更聰明的動量:在量斜率之前,它先「前瞻」到動量即將把它帶到的位置,並在那裡計算梯度——就像一位滑雪者順著她看見即將到來的彎、而非她正在的彎去傾身。

樸素的重球動量保有一個速度 v,更新 v_{k+1} = mu * v_k - alpha * grad f(x_k),然後 x_{k+1} = x_k + v_{k+1},其中 mu(約 0.9)是動量係數。Nesterov 的巧妙之處在於:在前瞻點 x_k + mu * v_k(動量已經要帶你去的地方)、而非在 x_k 計算梯度:v_{k+1} = mu * v_k - alpha * grad f(x_k + mu * v_k),然後 x_{k+1} = x_k + v_{k+1}。這個小小的改動——對未來位置偷看一眼——讓方法更早修正航向、抑制越過頭。在光滑凸問題上回報巨大:梯度下降以 O(1/k) 速度收斂,但 Nesterov 加速梯度達到 O(1/k^2)——對這一類一階方法而言是可證明的最佳速度(它達到一個理論下界)。

加速之所以重要,是因為它幾乎免費地加快收斂——相同的梯度、每步幾乎相同的成本,卻有本質上更快的速度——而動量思想幾乎內建於每個深度學習優化器中(帶動量的 SGD 與 Adam 都帶一個速度項)。誠實的提醒:乾淨的 O(1/k^2) 保證是針對光滑、確定性、凸的情形;用隨機迷你批次梯度時,梯度雜訊會混淆前瞻,理論優勢隨之削弱,不過動量在實務上仍有幫助。而加速在下降途中可能越過頭並振盪(重球滾過底部再回來)——這是個撫平進展但可能看起來非單調的特性,屬正常、非錯誤。

在一個光滑凸問題上,樸素梯度下降約需 10,000 步才達到某目標精度,Nesterov 加速梯度約 100 步就到——因為誤差以 1/k^2、而非 1/k 縮小,所以要多 100 倍精度只需 10 倍步數、而非 100 倍。

前瞻到動量所指之處再修正——O(1/k^2) 而非 O(1/k)。

最佳的 O(1/k^2) 速度是光滑、凸、確定性的結果;迷你批次梯度雜訊會模糊前瞻、削弱保證,不過動量在經驗上仍有幫助。加速法也可能越過頭並振盪(非單調的下降),這是預期行為、而非故障。

又称
Nesterov accelerated gradientNAGaccelerated gradient methodmomentum lookahead加速梯度法前瞻動量