梯度降低優化算法概述

感謝閱讀「美圖數據技術團隊」的原創文章,關注咱們持續獲取美圖最新數據技術動態。

平時咱們說的訓練神經網絡就是最小化損失函數的過程,損失函數的值衡量了模型在給定數據集下的表現(擬合)能力。算法

clipboard.png

損失函數 J 如上圖所示,B 點爲函數最低點,設 A 點爲初始值,那麼優化器的做用就是指引初始值 A 點走向最低點 B 點,那麼如何讓這個過程執行的更加迅速呢?網絡

梯度降低了解一下!函數

位於三維空間裏的任意一個點均可以找到與之相切的平面,在高維的狀況下也能找到超平面與其相切。那麼在相切平面上的任意一個點都有多種方向,但只有一個方向能使該函數值上升最快,這個方向咱們稱之爲梯度方向,而這個梯度方向的反方向就是函數值降低最快的方向,這就是梯度降低的過程。學習

基於以上概念咱們進一步瞭解批量梯度更新 BGD,顧名思義,它就是一次性把全部樣本同時計算以後獲得梯度值,而後更新參數。這種方法十分簡便,它對凸函數能夠收斂到全局最優值,對於非凸函數則收斂到局部最優值。與此同時它缺點顯而易見:在大數據量下內存佔用巨大、計算時間久,而且沒法進行在線更新。大數據

面對 BGD 的瓶頸 SGD 應運而生,它每次只更新一個樣本,相對比於 BGD ,它的收斂速度更快而且能夠在線更新,有機會跳出局部最優。但 SGD 沒法利用矩陣操做加速計算過程,考慮到上述兩種方法的優缺點,就有了小批量梯度降低算法(MBGD),每次只選取固定小批量數據進行梯度更新。優化

而基於梯度更新也意味着面臨一些挑戰:spa

  • 選擇恰當的初始學習率很困難,學習率太大會妨礙收斂,致使損失函數在最小值附近振盪甚至偏離最小值;
  • 非凸的損失函數優化過程存在大量的局部最優解或鞍點;
  • 參數更新採用相同的學習率。

針對上述挑戰,接下來爲你們列舉一些優化算法。3d

若是咱們把梯度降低法看成小球從山坡到山谷的一個過程,那麼在小球滾動時是帶有必定的初速度,在下落過程,小球積累的動能愈來愈大,小球的速度也會越滾越大,更快的奔向谷底,受此啓發就有了動量法 Momentumblog

clipboard.png

如上公式所示,動量法在當前梯度值的基礎上再加上一次的梯度值與衰減率 𝛾 的乘積,這樣能夠不斷累積上一次的梯度值。其中衰減率 𝛾 通常小於等於 0.9。加上動量項的 SGD 算法在更新模型參數時,對於當前梯度方向與上一次梯度方向相同的參數,則會加大更新力度;而對於當前梯度方向與上一次梯度方向不一樣的參數,則會進行消減,即在當前梯度方向的更新減慢了。所以,相較於 SGD,動量法能夠收斂得更快,而且減小震盪。ip

在動量法中,小球下滾過程若是遇到上坡則會減少速度,那麼更好的作法應該是遇到上坡以前就減慢速度。這就是 NAG 的大體思想,相較於動量法,NAG在計算參數的梯度時,在損失函數中減去了動量項,這種方式至關於預估了下一次參數所在的位置。公式以下:
clipboard.png

以下圖所示,藍色部分是標準的動量法更新過程,首先它會計算當前梯度,接着是累積梯度的大跳躍。而 NAG 則先來一個大跳躍(圖中褐色向量),而後在跳躍後的地方計算梯度(下圖紅色向量)進行修正獲得真正的梯度降低方向,即下圖中的綠色向量。這樣可能會避免產生振盪的情形,如應用於 RNN。

clipboard.png

那可否根據參數的重要性自適應學習率呢?Adagrad 的提出思想是:在學習的過程當中自動調整學習率。對於出現頻率低的參數使用較大的學習率,出現頻率高的參數使用較小的學習率。Adagrad 公式以下:

clipboard.png

clipboard.png

clipboard.png

令 gt,i 表示當前參數的梯度值,Adagrad 計算第 t 步以前累加的梯度平方和,以此做爲學習率的分母。

Adagrad 在數據分佈稀疏的場景能更好利用稀疏梯度的信息,相比 SGD 算法能更有效地收斂。而它的缺點也十分明顯,隨着時間的增長,它的分母項愈來愈大,最終致使學習率收縮到過小沒法進行有效更新。

Adagrad 的在平常利用率較高,同時也存在着不少「坑」但願你們儘可能避免。以 TensorFlow 爲例,θ 是防被除零的項,但 TensorFlow 只提供了累積梯度平方和的初始值,而且默認爲 0.1。若是咱們設置的較小時,會致使初始學習率偏大。實際使用中,能夠調整此參數可能有意外收穫。

Adadelta 是 Adagrad 的一種改進算法,更新過程當中參照了牛頓法。

clipboard.png

首先了解一下牛頓法(二階優化方法),它利用 Hessian 矩陣的逆矩陣替代人工設置的學習率,在梯度降低的時候能夠完美的找出降低方向,不會陷入局部最小值。

可是它的缺點十分明顯,求逆矩陣的時間複雜度近似 O(n3),計算代價過高,不適合大數據。

上文指出 Adagrad 隨着時間增長致使學習率不斷變小致使過早收斂,Adadelta 採用梯度平方的指數移動平均數來調節學習率的變化:

clipboard.png

但論文中認爲這個參數的更新沒有遵循參數的單元假設,因而做者第二次嘗試採用梯度平方的指數移動平均數來調整獲得了:

clipboard.png

Adagrad 最大的變化是沒有學習率的設置,可是到訓練後期進入局部最小值雷區以後就會反覆在局部最小值附近抖動。

RMSprop 是 AdaDelta 的一個特例,它由 Geoff Hinton 在公開課中提出,採用梯度平方的指數移動平均數來調整,當參數更新較大時會對它進行「懲罰」,它的公式以下:

clipboard.png

RMSprop 相對 Adagrad 梯度降低得較慢,被普遍應用在 CNN 領域。RMSprop 在 Inception v4 內取衰減因子 𝛽=0.9,參數 ε = 1.0 。

Adam 算法能夠看做是 RMSprop 和動量法的結合體:

clipboard.png

clipboard.png

其中,mt 是指數移動平均數,能夠當作是動量法的過程;vt 則是梯度平方的指數移動平均數,也就是 RMSProp 的過程。因爲基於指數移動平均數的方式存在誤差,特別是在降低初期 m 和 v 被初始化爲0而且接近 1 時。爲此,引入誤差修正過程:

clipboard.png

最後利用誤差修正後的 mt 和 vt 更新模型參數:

clipboard.png

Adam 即 Adaptive Moment Estimation(自適應矩估計),類比於動量法的過程也就是有偏一階矩估計過程,RMSprop 則對應於有偏二階矩估計。在平常使用中,每每採用默認學習率 0.001 就能夠取得不錯的結果。

Adam 計算效率高,適用於稀疏數據&大規模數據場景,更新的步長可以被限制在合理的範圍內,而且參數的更新不受梯度的伸縮變換影響。但它可能致使不收斂,或者收斂局部最優勢。

因爲 Adam 可能致使不收斂,或者收斂局部最優勢,所以谷歌在 ICLR 2018 提出了 AMSGrad,該論文中提到這樣一個問題:

對於 SGD 和 AdaGrad 能夠保證學習率老是衰減的, 而基於滑動平均的方法則未必。實際上,以

Adam 爲表明的自適應算法存在兩個主要問題:

  • 可能不收斂
  • 可能收斂於局部最優勢

RMSprop 會對最近增長的值提出比較大的更新,隨着步數梯的增長慢慢消散它的做用;Adagrad 以梯度的平方進行累積,因此說基於滑動平均的方法不必定可以保證走勢衰減。那麼怎麼確保學習率獲得衰減?

clipboard.png

AMSGrad 在二階局部更新過程當中經過取當前值與上一次的值的最大值用於計算∆𝑥,確保學習率的衰減。

clipboard.png

以上就是現有的主流梯度降低優化算法,總結一下以上方法,如圖 3 所示,SDG 的值在鞍點中沒法逃離;動量法會在梯度值爲0時添加動能以後跳過該點;而 Adadelta 雖然沒有學習率但在收斂過程很是快。

最後咱們思考一個問題:怎麼用現有的優化算法達到 state-of-art?

拋磚引玉,期待大家的更優答案:

1.SGD + Momentum

被大量用在CNN 、NLP 問題上

2.Adam + SGD

Adam加速收斂過程,可能陷入到局部最小值或沒法收斂,此時用小學習率 SGD 幫助 adam 跳出局部最小值。

相關文章
相關標籤/搜索