神經網絡中自適應的梯度下降優化算法(一)

學習率是神經網絡中非常難以設置的超參數之一。

對於大規模的神經網絡訓練我們經常採用mini-batch Gradient Descent,但是在MBGD中如何選擇合適的學習率是一個非常困難的問題。Learning Rate設置太小會導致神經網絡收斂緩慢,Learning Rate設置太大可能導致神經網絡在最小值附近波動甚至發散。

一種方案是在Trainning過程中動態調整Learning Rate。這種調整往往通過預先定義的策略進行調整或者當目標函數落在某個閾值中的時候進行調整,這些策略或者閾值是事先定義好的,不能自適應數據集自身的特徵。

此外,數據的特徵是不同的,用相同的Learning Rate調整所有的參數也部分場景下也是不合適的。比如我們的數據特徵是非常稀疏的,我們可能更傾向於為很少出現的feature更大的學習率;

為了解決這些問題,研究者提出了很多梯度優化算法。

Momentum優化算法

普通的梯度下降(MBGD、SGD等)方法的缺點是:它的梯度更新方向完全依賴於當前Batch數據計算出的梯度,因此易變,不穩定。

神經網絡中自適應的梯度下降優化算法(一)

如上圖所示,蜿蜒曲折的河流流向低谷處,但是由於局部的高低起伏,河流並不是筆直的流向低谷,而是曲曲折折的流過去。梯度下降也有同樣的問題,由於局部梯度的波動,導致梯度下降過程總是以震盪的形式靠近局部最優解。

Momentum算法借用了物理中的動量概念。它模擬的是物體運動時的慣性,即更新的時候在一定程度上保留之前更新的方向,同時利用當前batch數據計算的梯度微調最終的更新方向。這樣一來,可以在一定程度上增加穩定性,從而學習地更快,並且還有一定擺脫局部最優的能力。Momentum通過引入γv(t-1)抑制震盪,加速SGD朝著相關的梯度方向迭代(如下圖所示)

神經網絡中自適應的梯度下降優化算法(一)

梯度更新規則

神經網絡中自適應的梯度下降優化算法(一)
神經網絡中自適應的梯度下降優化算法(一)

加入歷史信息v(t-1)之後,與物理學中動量的合成法則一樣,如果當前梯度與歷史梯度方向一致,則增強該維度上的梯度變化;如果當前梯度與歷史梯度方向不一致,則當前梯度會衰減,從而達到加快收斂,減小震盪的目的。

γ的值通常取0.9。

TensorFlow中的實現

tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9)

Nesterov Accelerated Gradient

Nesterov Accelerated Gradient方法是對Momentum梯度下降算法的改進版本,其速度更快。它的基本思想是既然每一步都需要引入歷史梯度信息γv(t-1)來更新參數θ,那為什麼不先按照歷史梯度往前走一小步,按照前面一小步的位置的"超前梯度"來做梯度合併呢?

梯度更新規則

神經網絡中自適應的梯度下降優化算法(一)
神經網絡中自適應的梯度下降優化算法(一)

如下圖所示,Momentum的方法首先計算當前的梯度(圖中比較短的藍色向量),然後沿著歷史累計梯度方向向前邁出一大步(上圖比較長的藍色向量)。NAG的方法首先在歷史累計的梯度方向上邁出一大步(棕色向量),然後在此基礎上做一個校準(紅色向量),兩個向量累加得到最終的NAG梯度更新向量(綠色向量)。

神經網絡中自適應的梯度下降優化算法(一)

TensorFlow中的實現

tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9, use_nesterov=True)

基於不同的參數使用不同的學習率的梯度優化算法下文繼續...


分享到:


相關文章: