1. 程式人生 > >梯度優化演算法Adam(續)

梯度優化演算法Adam(續)

進一步優化梯度下降

現在我們要討論用於進一步優化梯度下降的各種演算法。

1. 動量梯度下降法(Momentum)

SGD方法中的高方差振盪使得網路很難穩定收斂,所以有研究者提出了一種稱為動量(Momentum)的技術,通過優化相關方向的訓練和弱化無關方向的振盪,來加速SGD訓練。換句話說,這種新方法將上個步驟中更新向量的分量’γ’新增到當前更新向量。

V(t)=γV(t−1)+η∇(θ).J(θ)

最後通過θ=θ−V(t)來更新引數。

動量項γ通常設定為0.9,或相近的某個值。

這裡的動量與經典物理學中的動量是一致的,就像從山上投出一個球,在下落過程中收集動量,小球的速度不斷增加。

在引數更新過程中,其原理類似:

1)使網路能更優和更穩定的收斂;

2)減少振盪過程。

當其梯度指向實際移動方向時,動量項γ增大;當梯度與實際移動方向相反時,γ減小。這種方式意味著動量項只對相關樣本進行引數更新,減少了不必要的引數更新,從而得到更快且穩定的收斂,也減少了振盪過程。

2. 加速梯度下降法(Nesterov Momentum)

一位名叫Yurii Nesterov研究員,認為動量方法存在一個問題

如果一個滾下山坡的球,盲目沿著斜坡下滑,這是非常不合適的。一個更聰明的球應該要注意到它將要去哪,因此在上坡再次向上傾斜時小球應該進行減速。

實際上,當小球達到曲線上的最低點時,動量相當高。由於高動量可能會導致其完全地錯過最小值,因此小球不知道何時進行減速,故繼續向上移動。

Yurii Nesterov在1983年發表了一篇關於解決動量問題的論文,因此,我們把這種方法叫做Nestrov梯度加速法。

在該方法中,他提出先根據之前的動量進行大步跳躍,然後計算梯度進行校正,從而實現引數更新。這種預更新方法能防止大幅振盪,不會錯過最小值,並對引數更新更加敏感。

Nesterov梯度加速法(NAG)是一種賦予了動量項預知能力的方法,通過使用動量項γV(t−1)來更改引數θ。通過計算θ−γV(t−1),得到下一位置的引數近似值,這裡的引數是一個粗略的概念。因此,我們不是通過計算當前引數θ的梯度值,而是通過相關引數的大致未來位置,來有效地預知未來

V(t)=γV(t−1)+η∇(θ)J( θ−γV(t−1)

),

然後使用θ=θ−V(t)來更新引數。

現在,我們通過使網路更新與誤差函式的斜率相適應,並依次加速SGD,也可根據每個引數的重要性來調整和更新對應引數,以執行更大或更小的更新幅度。

3. Adagrad方法

Adagrad方法是通過引數來調整合適的學習率η,對稀疏引數進行大幅更新和對頻繁引數進行小幅更新。因此,Adagrad方法非常適合處理稀疏資料。

在時間步長中,Adagrad方法基於每個引數計算的過往梯度,為不同引數θ設定不同的學習率。

先前,每個引數θ(i)使用相同的學習率,每次會對所有引數θ進行更新。在每個時間步t中,Adagrad方法為每個引數θ選取不同的學習率,更新對應引數,然後進行向量化。為了簡單起見,我們把在t時刻引數θ(i)的損失函式梯度設為g(t,i)。

圖3:引數更新公式

Adagrad方法是在每個時間步中,根據過往已計算的引數梯度,來為每個引數θ(i)修改對應的學習率η。

Adagrad方法的主要好處是,不需要手工來調整學習率。大多數引數使用了預設值0.01,且保持不變。

Adagrad方法的主要缺點是,學習率η總是在降低和衰減。

因為每個附加項都是正的,在分母中累積了多個平方梯度值,故累積的總和在訓練期間保持增長。這反過來又導致學習率下降,變為很小數量級的數字,該模型完全停止學習,停止獲取新的額外知識。

因為隨著學習速度的越來越小,模型的學習能力迅速降低,而且收斂速度非常慢,需要很長的訓練和學習,即學習速度降低

另一個叫做Adadelta的演算法改善了這個學習率不斷衰減的問題。

4. AdaDelta方法

這是一個AdaGrad的延伸方法,它傾向於解決其學習率衰減的問題。Adadelta不是累積所有之前的平方梯度,而是將累積之前梯度的視窗限制到某個固定大小w。

與之前無效地儲存w先前的平方梯度不同,梯度的和被遞迴地定義為所有先前平方梯度的衰減平均值。作為與動量項相似的分數γ,在t時刻的滑動平均值Eg⊃2;僅僅取決於先前的平均值和當前梯度值。

Eg⊃2;=γ.Eg⊃2;+(1−γ).g⊃2;(t),其中γ設定為與動量項相近的值,約為0.9。

Δθ(t)=−η⋅g(t,i).

θ(t+1)=θ(t)+Δθ(t)

圖4:引數更新的最終公式

AdaDelta方法的另一個優點是,已經不需要設定一個預設的學習率。

目前已完成的改進

1)為每個引數計算出不同學習率;

2) 也計算了動量項momentum;

3)防止學習率衰減或梯度消失等問題的出現。

還可以做什麼改進?

在之前的方法中計算了每個引數的對應學習率,但是為什麼不計算每個引數的對應動量變化並獨立儲存呢?這就是Adam演算法提出的改良點。

Adam演算法

Adam演算法即自適應時刻估計方法(Adaptive Moment Estimation),能計算每個引數的自適應學習率。這個方法不僅儲存了AdaDelta先前平方梯度的指數衰減平均值,而且保持了先前梯度M(t)的指數衰減平均值,這一點與動量類似:

M(t)為梯度的第一時刻平均值,V(t)為梯度的第二時刻非中心方差值。

圖5:兩個公式分別為梯度的第一個時刻平均值和第二個時刻方差

則引數更新的最終公式為:

圖6:引數更新的最終公式

其中,β1設為0.9,β2設為0.9999,ϵ設為10-8。

在實際應用中,Adam方法效果良好。與其他自適應學習率演算法相比,其收斂速度更快,學習效果更為有效,而且可以糾正其他優化技術中存在的問題,如學習率消失、收斂過慢或是高方差的引數更新導致損失函式波動較大等問題。

對優化演算法進行視覺化

圖8:對鞍點進行SGD優化

從上面的動畫可以看出,自適應演算法能很快收斂,並快速找到引數更新中正確的目標方向;而標準的SGD、NAG和動量項等方法收斂緩慢,且很難找到正確的方向。

結論

我們應該使用哪種優化器?

在構建神經網路模型時,選擇出最佳的優化器,以便快速收斂並正確學習,同時調整內部引數,最大程度地最小化損失函式。

Adam在實際應用中效果良好,超過了其他的自適應技術。

如果輸入資料集比較稀疏,SGD、NAG和動量項等方法可能效果不好。因此對於稀疏資料集,應該使用某種自適應學習率的方法,且另一好處為不需要人為調整學習率,使用預設引數就可能獲得最優值。

如果想使訓練深層網路模型快速收斂或所構建的神經網路較為複雜,則應該使用Adam或其他自適應學習速率的方法,因為這些方法的實際效果更優。

希望你能通過這篇文章,很好地理解不同優化演算法間的特性差異。

相關連結:

二階優化演算法:

https://web.stanford.edu/class/msande311/lecture13.pdf

Nesterov梯度加速法:http://cs231n.github.io/neural-networks-3/

================Adam部分說真的,看的還有點暈,數學底子不行啊,下次再補吧==============

看這篇文章,對Adam演算法有個巨集觀的認識,但具體細節寫的不好。

其中,RMSprop是一個未被髮表的自適應學習率的演算法,該演算法由Geoff Hinton在其Coursera課堂的課程6e中提出。

RMSprop和Adadelta在相同的時間裡被獨立的提出,都起源於對Adagrad的極速遞減的學習率問題的求解。2個人其實就是寫法不一樣,實際上2個公式是一樣的。有些文章喜歡寫成RMSprop代替Adadelta。2個最終的公式移項就是一個加法,一個寫成減法

以下三篇寫的很周到,尤其第3篇裡面帶參考連結

以下2篇專門講Adam,