梯度下降優化演算法概述

美圖資料技術團隊發表於2018-08-31

平時我們說的訓練神經網路就是最小化損失函式的過程,損失函式的值衡量了模型在給定資料集下的表現(擬合)能力。

梯度下降優化演算法概述

圖 1

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

梯度下降了解一下!

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

基於以上概念我們進一步瞭解批量梯度更新 BGD,顧名思義,它就是一次性把所有樣本同時計算之後得到梯度值,然後更新引數。這種方法十分簡便,它對凸函式可以收斂到全域性最優值,對於非凸函式則收斂到區域性最優值。與此同時它缺點顯而易見:在大資料量下記憶體佔用巨大、計算時間久,並且無法進行線上更新。

面對 BGD 的瓶頸 SGD 應運而生,它每次只更新一個樣本,相對比於 BGD ,它的收斂速度更快並且可以線上更新,有機會跳出區域性最優。但 SGD 無法利用矩陣操作加速計算過程,考慮到上述兩種方法的優缺點,就有了小批量梯度下降演算法(MBGD),每次只選取固定小批量資料進行梯度更新。

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

  • 選擇恰當的初始學習率很困難,學習率太大會妨礙收斂,導致損失函式在最小值附近振盪甚至偏離最小值;

  • 非凸的損失函式優化過程存在大量的區域性最優解或鞍點;

  • 引數更新採用相同的學習率。

針對上述挑戰,接下來為大家列舉一些優化演算法

如果我們把梯度下降法當作小球從山坡到山谷的一個過程,那麼在小球滾動時是帶有一定的初速度,在下落過程,小球積累的動能越來越大,小球的速度也會越滾越大,更快的奔向谷底,受此啟發就有了動量法 Momentum

梯度下降優化演算法概述

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

在動量法中,小球下滾過程如果遇到上坡則會減小速度,那麼更好的做法應該是遇到上坡之前就減慢速度。這就是 NAG 的大致思想,相較於動量法,NAG在計算引數的梯度時,在損失函式中減去了動量項,這種方式相當於預估了下一次引數所在的位置。公式如下:

梯度下降優化演算法概述

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

梯度下降優化演算法概述

圖 2

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

梯度下降優化演算法概述

梯度下降優化演算法概述

梯度下降優化演算法概述

梯度下降優化演算法概述表示當前引數的梯度值,Adagrad 計算第 t 步之前累加的梯度平方和,以此作為學習率的分母。

Adagrad 在資料分佈稀疏的場景能更好利用稀疏梯度的資訊,相比 SGD 演算法能更有效地收斂。而它的缺點也十分明顯,隨著時間的增加,它的分母項越來越大,最終導致學習率收縮到太小無法進行有效更新。

Adagrad 的在日常利用率較高,同時也存在著很多「坑」希望大家儘量避免。以 TensorFlow 為例,θ 是防被除零的項,但 TensorFlow 只提供了累積梯度平方和的初始值,並且預設為 0.1。如果我們設定的較小時,會導致初始學習率偏大。實際使用中,可以調整此引數可能有意外收穫。

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

梯度下降優化演算法概述

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

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

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

梯度下降優化演算法概述

但論文中認為這個引數的更新沒有遵循引數的單元假設,於是作者第二次嘗試採用梯度平方的指數移動平均數來調整得到了:

梯度下降優化演算法概述

Adagrad 最大的變化是有學習率的設定,但是到訓練後期進入區域性最小值雷區之後就會反覆在區域性最小值附近抖動。

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

梯度下降優化演算法概述

RMSprop 相對 Adagrad 梯度下降得較慢,被廣泛應用在 CNN 領域。RMSprop 在 Inception v4 內取衰減因子 ?=0.9,引數 ε = 1.0 。

Adam 演算法可以看作是 RMSprop 和動量法的結合體:

梯度下降優化演算法概述

梯度下降優化演算法概述

其中,梯度下降優化演算法概述 是指數移動平均數,可以看成是動量法的過程;梯度下降優化演算法概述則是梯度平方的指數移動平均數,也就是 RMSProp 的過程。由於基於指數移動平均數的方式存在偏差,特別是在下降初期 m 和 v 被初始化為0並且接近 1 時。為此,引入偏差修正過程:

梯度下降優化演算法概述最後利用偏差修正後的梯度下降優化演算法概述梯度下降優化演算法概述更新模型引數:

梯度下降優化演算法概述

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

Adam 計算效率高,適用於稀疏資料&大規模資料場景,更新的步長能夠被限制在合理的範圍內,並且引數的更新不受梯度的伸縮變換影響。但它可能導致不收斂,或者收斂區域性最優點。=

由於 Adam 可能導致不收斂,或者收斂區域性最優點,因此谷歌在 ICLR 2018 提出了 AMSGrad,該論文中提到這樣一個問題:

對於 SGD 和 AdaGrad 可以保證學習率總是衰減的, 而基於滑動平均的方法則未必。實際上,以 Adam 為代表的自適應演算法存在兩個主要問題:

  • 可能不收斂

  • 可能收斂於區域性最優點

RMSprop 會對最近增加的值提出比較大的更新,隨著步數梯的增加慢慢消散它的作用;Adagrad 以梯度的平方進行累積,所以說基於滑動平均的方法不一定能夠保證走勢衰減。那麼怎麼確保學習率得到衰減?

梯度下降優化演算法概述

AMSGrad 在二階區域性更新過程中通過取當前值與上一次的值的最大值用於計算∆?,確保學習率的衰減。

梯度下降優化演算法概述

圖 3

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

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

拋磚引玉,期待你們的更優答案:

1.SGD + Momentum

被大量用在CNN 、NLP 問題上


2.Adam + SGD

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


相關文章