神經網絡中的各種優化方法

神經網絡中的各種優化方法

大家耳熟能詳的優化方法有梯度下降法(Gradient Descent)、隨機梯度下降法(Stochastic Gradient Descent)、Adam方法等等。雖然很多聽過甚至用過這些方法,但是卻未必能夠說出他們的區別,已經什麼時候改用什麼樣的優化算法。這篇文章將會從原理、區別和使用場景等角度詳細介紹神經網絡中的各種優化算法。

什麼是優化算法

優化算法就是一種能夠幫我們最小化或者最大化目標函數(有時候也叫損失函數)的一類算法。而目標函數往往是模型參數和數據的數學組合。例如給定數據XX和其對應的標籤YY,我們構建的模型是一個線性模型f(x)=Wx+bf(x)=Wx+b,有了模型後,根據輸入xx就可以得到預測輸出f(x)f(x),並且可以計算出預測值和真實值之間的差距(f(x)Y)2\left (f(x)-Y\right)^2,這個就是損失函數。我們的目的是找到合適的W,bW, b時上述的損失函數的值達到最小,損失值越小,則說明我們的模型越接近於真實情況。

通過上面的描述可以知道,模型的內參(W,bW, b) 在模型中扮演着非常重要的角色,而這些內參的更新和優化就用到我們所說的優化算法,所以優化算法也層出不窮,而一個好的優化算法往往能夠更加高效、更加準確的訓練模型的內參。

優化算法的種類

一般的,根據優化算法在優化過程中使用的導數階數。可以將優化算法可以分爲兩大類,一階優化算法和二階優化算法。

1、 一階優化算法

一階優化算法是指使用參數梯度值來最小化或者最大化損失函數的優化算法。最爲廣泛應用的就是梯度下降法,參數的一階導能夠清晰的告訴我們損失函數在某個特定點上是增加的還是減少的。那什麼是梯度呢?簡而言之,梯度就是函數輸出關於輸的偏導數,只不過這裏的輸入和輸出並不是簡單的數值,而是向量。梯度與導數的區別就是導數是單個變量的,而梯度是多個變量的。梯度往往採用雅克比矩陣(Jacobian Matrix)進行表達。

2、二階優化算法

顧名思義,二階優化算法就是採用二階導數進行優化算法。二階導數,有時候也被成爲海森矩陣(Hessian)。因爲二階導數要求兩次導數,尤其是在矩陣中進行求導,運算量會非常的大,所以二階優化算法被用的比較少。

各種梯度下降法

1、Gradient Descent

梯度下降法是最重要的一種方法,也是很多其他優化算法的基礎。

θ=θηΔJ(θ)\theta = \theta-\eta\Delta J(\theta)

上面的公式就是梯度下降法的基本形式,其中 η\eta 是學習率 ΔJ(θ)\Delta J(\theta) 是損失函數 J(θ)J(\theta) 關於模型參數 θ\theta 的梯度。

這裏的損失函數 J(θ)J(\theta) 是在整個數據集上進行計算得到的。

因爲這裏的損失函數是在整個數據集上進行計算得到的均值,所以每更新一次模型參數,就要對整個數據集進行一個計算,可想而知這樣非常的慢,並且當數據集變得非常大的時候,如此多的數據沒法都load到內存中。

特點:

對於凸目標函數,肯定可以找到全局最優,對於非凸目標函數,可以找到局部最優

每次更新都對整個數據集進行計算,計算量大

2、隨機梯度下降法(Stochastic Gradient Descent)

θ=θηΔJ(θ;xi,yi)\theta = \theta - \eta \Delta J(\theta; x_i, y_i)

隨機梯度下降法和梯度下降法其實是走的兩個極端,梯度下降法是每次更新都計算整個數據集的loss,而隨機梯度下降法每次更新都只用了一對樣本,即上面公式中的一對樣本(xi,yi)(x_i, y_i)。由於每個樣本都會對模型進行更新,所以模型更新的特別頻繁,參數就會變成高方差,損失函數的波動也會有很大強度的變化。有時候,這是好事,因爲這樣的可以幫助我們探索新的更新方向,找到更加好的局部極值點。但是,由於頻繁的更新和波動,會導致模型的損失收斂的非常不穩定。

上圖就是隨機梯度下降法更新過程中loss值的變化,可以發現loss值的變化非常大,這就是模型超調了,整個模型比較不穩定。

特點:

每次只用一個樣本進行更新,計算量小,更新頻率高

容易導致模型超調不穩定,收斂也不穩定

3、Mini Batch Gradient Descent

mini batch 梯度下降法是梯度下降法和隨機梯度下降法的折衷,即在計算loss的時候,既不是直接計算整個數據集的loss,也不是隻計算一個樣本的loss,而是計算一個batch的loss,batch的大小自己設定。

θ=θη1Bi=1BJ(θ;xi,yi)\theta = \theta - \eta * \frac{1}{B}\sum_{i=1}^B J(\theta; x_i, y_i)

其中B就是自己設定的batch size的大小。

特點:
每次更新模型時,採用一部分數據進行計算
現在幾乎在所有的深度學習應用中,都使用的是mini batch梯度下降法
正是因爲使用廣泛,所以很多深度學習的庫和框架都對這方面的矩陣操作進行了特別優化

梯度下降法面臨的挑戰:

Challenges:

1、很難選擇一個合適學習率,需要我們大量的嘗試。太小的學習率會導致模型收斂變得緩慢,導致訓練時間變長;太大的學習率會阻礙模型的收斂,使損失函數在最優值附近來回波動甚至是發散。

2、對於所有的參數,均使用相同的學習率。如果有的參數的梯度很大,有的很小,使用相同的學習率顯然就不是很合適。

3、在非凸函數的優化過程中,我們往往希望模型能夠跳過那些局部極值點,去找一個更好的極值。在實際訓練過程中,鞍點也是非常難以解決的問題。

鞍點:一個數在所在行中是最大值,在所在列中是最小值

例如,在某個點處,一個維度的梯度方向是往上的,一個維度的梯度是往下的,那梯度下降法在就很難跳出這個點,因爲這個點所有維度的梯度是接近0的。

4、Momentum

帶momentum(動量)的梯度下降法也是一種很常用的的優化算法。這種方法因爲引入了momentum量,所以能夠對梯度下降法起到加速的作用。

打個比方,一個球順着斜坡往下滾動,會因爲地心引力的原因而一直加速,速度越來越快的往坡低滾去。梯度下降法中的Momentum量就和地心引力的作用很類似,能夠讓梯度下降法沿着下降的方向逐漸擴大幅度。起到對梯度下降法進行加速的作用。

V(t)=γV(t1)+ηΔJ(θ)1θ=θV(t)2 V(t) = \gamma V(t-1) + \eta \Delta J(\theta) -----(1)\\ \theta = \theta - V(t) -----(2)

從上述公式(1)可以看出,噹噹前的梯度方向(ΔJ(θ)\Delta J(\theta)的正負號)和 V(t1)V(t-1) 的方向相同時,V(t)>ηΔJ(θ)V(t) > \eta\Delta J(\theta) 所以參數 θ\theta 的變化幅度會增大,從而加快梯度下降法的幅度;而當方向不同時,會逐步減小當前更新的幅度。這樣可以有效的對梯度下降法進行加速,同時提高模型的穩定性。

特點:

能夠更快更穩定的收斂

能夠減少模型的波動震盪

5、Nesterov

Nesterov是一位學者,他發現Momentum方法中存在一個問題。當我們把球放在斜坡上,小球會一直往下滾動,並且越滾越快,當球到達坡底時,速度最快。我們的目的是讓小球能夠停在坡底,可是當小球到達坡底時,由於仍舊有較大的速度,小球會往另一個方向爬坡,並不會穩穩的停在谷底。

具體到梯度下降法,就是Momentum方法在極值附近不能進行提前減速,且在極值附近仍舊以較大的幅度進行改變,有時候可能就直接跳出了這個極值。

爲了解決這一問題,Nesterov就提出了 Nestrov Accelerated Gradient(NAG)。

NAG算法簡而言之,就是在進行Momentum梯度下降法之前,先做一個預演,看看沿着以前的方向進行更新是否合適,不合適就立馬調整方向。也就是說參數更新的方向不再是當前的梯度方向,而是參數未來所要去的真正方向。

V(t)=γV(t1)+ηΔJ(θγV(t1))(3)θ=θV(t)(4) V(t)=\gamma V(t-1) + \eta\Delta J(\theta - \gamma V(t-1)) ---- (3) \\ \theta = \theta - V(t) ---- (4)

特點:

能夠在對梯度下降法進行加速的同時,提高穩定性,避免越過極值

6、Adagrad

前面講了在mini batch梯度下降法中,因爲對所有的參數均使用相同的學習率,而當有的參數的梯度很大,有的很小時,顯然不合適。另外,對於不同的樣本,如果有的樣本出現的較爲頻繁,導致其對應的一些參數更新較爲頻繁,而有的樣本出現的頻率很低,導致一些參數更新頻率很低時,再採用相同的學習率有時候也不太合適。我們更加希望那些出現更新頻率比較低的參數能夠有更大的更新幅度。

根據每個參數以前的梯度情況,對不同參數使用不同的學習率,同時動態調整參數學習率

gi,t=gi,t1+ΔJ(θi,t)25θi,t=θi,t1ηgi,t+ϵΔJ(θi,t)(6) g_{i,t} = g_{i,t-1} + \Delta J(\theta_{i,t})^2 ---(5)\\ \theta_{i,t} = \theta_{i, t-1} - \frac{\eta}{\sqrt{g_{i,t} + \epsilon}}\cdot \Delta J(\theta_{i,t}) --- (6)\\
其中ΔJ(θi,t)\Delta J(\theta_{i,t})代表第i個參數在第t個迭代中的梯度ϵ\epsilon是一個微小量,爲了防止分母爲0,一般取1e-8

特點:
在訓練過程中,每個不參數都有自己的學習率,並且這個學習率會根據自己以前的梯度平方和而進行衰減。
優點:在訓練的過程中不用認爲的調整學習率,一般設置好默認的初始學習率就行了

缺點:隨着迭代的進行,公式(6)中的學習率部分會因爲分母逐漸變大而變得越來越小,在訓練後期模型幾乎不再更新參數。

7、AdaDelta

AdaDelta是Adagrad的改進版,目的就是解決Adagrad在訓練的後期,學習率變得非常小,降低模型收斂速度。AdaGrad方法是完全累計先前所有梯度的平方和,AdaDelta則是添加一個衰減係數 ww 用來減小很久以前的梯度對當前訓練的影響,從而避免學習率無限減小的問題。

gi,t=wgi,t1+(1w)ΔJ(θi,t)2θi,t=θi,t1ηgi,t+ϵΔJ(θi,t) g_{i,t} = wg_{i,t-1} + (1-w)\Delta J(\theta_{i,t})^2\\ \theta_{i,t} = \theta_{i,t-1} - \frac{\eta}{\sqrt{g_{i,t}+\epsilon}}\cdot\Delta J(\theta_{i,t}) \\

AdaDelta也可以和Nesterov方法進行結合:
gi,t=wgi,t1+(1w)ΔJ(θi,tγVi(t1))2Vi(t)=γVi(t1)+ηgi,t+ϵΔJ(θi,tγVi(t1))θi,t=θi,t1V(t) g_{i,t} = wg_{i,t-1} + (1-w)\Delta J(\theta_{i,t} - \gamma V_i(t-1))^2\\ V_i(t)=\gamma V_i(t-1) + \frac{\eta}{\sqrt{g_{i,t}+\epsilon}}\cdot\Delta J(\theta_{i,t} - \gamma V_i(t-1)) \\ \theta_{i,t} = \theta_{i,t-1} - V(t)

8、Adam

前面我們從最經典的梯度下降法開始,介紹了幾個改進版的梯度下降法。
Momentum方法通過添加動量,提高收斂速度;
Nesterov方法在進行當前更新前,先進行一次預演,從而找到一個更加適合當前情況的梯度方向和幅度;
Adagrad讓不同的參數擁有不同的學習率,並且通過引入梯度的平方和作爲衰減項,而在訓練過程中自動降低學習率;
AdaDelta則對Adagrad進行改進,讓模型在訓練後期也能夠有較爲適合的學習率。

既然不同的參數可以有不同的學習率,那麼不同的參數是不是也可以有不同的Momentum呢?

Adam方法就是根據上述思想而提出的,對於每個參數,其不僅僅有自己的學習率,還有自己的Momentum量,這樣在訓練的過程中,每個參數的更新都更加具有獨立性,提升了模型訓練速度和訓練的穩定性。

Adam(Adaptive Moment Estimation):
V(t)=ρ1V(t1)+(1ρ)ΔJ(θ)Momentgt=ρ2gt1+(1ρ2)ΔJ(θ)2AdaDeltaV(t)^=V(t)1ρ1gt^=gt1ρ2θt=θt1ηgt^+ϵV(t)^ V(t) = \rho_1V(t-1) + (1-\rho)\Delta J(\theta) ---Moment項\\ g_t = \rho_2g_{t-1} + (1-\rho_2)\Delta J(\theta)^2 --- AdaDelta項\\ \hat{V(t)} = \frac{V(t)}{1-\rho_1}\\ \hat{g_t} = \frac{g_t}{1-\rho_2}\\ \theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\hat{g_t}+\epsilon}}\cdot \hat{V(t)}
一般的,ρ1\rho_1 設置爲0.9, ρ2\rho_2 設置爲0.999

總結

套用別人說過的一句話:

Adam works well in practice and outperforms other Adaptive techniques.

事實上,如果你的數據比較稀疏,那麼像SGD,NAG以及Momentum的方法往往會表現的比較差,這是因爲對於模型中的不同參數,他們均使用相同的學習率,這會導致那些應該更新快的參數更新的慢,而應該更新慢的有時候又會因爲數據的原因的變得快。因此,對於稀疏的數據更應該使用Adaptive方法(Adagrad、AdaDelta、Adam)。同樣,對於一些深度神經網咯或者非常複雜的神經網絡,使用Adam或者其他的自適應(Adaptive)的方法也能夠更快的收斂。

Reference:

[1] https://towardsdatascience.com/types-of-optimization-algorithms-used-in-neural-networks-and-ways-to-optimize-gradient-95ae5d39529f “Types of Optimization Algorithms used in Neural Networks and Ways to Optimize Gradient Descent”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章