1. 程式人生 > >神經網路優化演算法:從梯度下降到Adam方法

神經網路優化演算法:從梯度下降到Adam方法

調整模型更新權重和偏差引數的方式時,你是否考慮過哪種優化演算法能使模型產生更好且更快的效果?應該用梯度下降,隨機梯度下降,還是Adam方法?

這篇文章介紹了不同優化演算法之間的主要區別,以及如何選擇最佳的優化方法。

什麼是優化演算法?

優化演算法的功能,是通過改善訓練方式,來最小化(或最大化)損失函式E(x)

損失函式E(x):

模型內部有些引數,是用來計算測試集中目標值Y的真實值和預測值的偏差程度的,基於這些引數,就形成了損失函式E(x)。

比如說,權重(W)和偏差(b)就是這樣的內部引數,一般用於計算輸出值,在訓練神經網路模型時起到主要作用。

在有效地訓練模型併產生準確結果時,模型的內部引數起到了非常重要的作用。

這也是為什麼我們應該用各種優化策略和演算法,來更新和計算影響模型訓練和模型輸出的網路引數,使其逼近或達到最優值。

優化演算法分為兩大類:

1. 一階優化演算法

這種演算法使用各引數的梯度值來最小化或最大化損失函式E(x)。最常用的一階優化演算法是梯度下降。

函式梯度:

導數dy/dx的多變量表達式,用來表示y相對於x的瞬時變化率。往往為了計算多變數函式的導數時,會用梯度取代導數,並使用偏導數來計算梯度。梯度和導數之間的一個主要區別是函式的梯度形成了一個向量場。

因此,對單變數函式,使用導數來分析;而梯度是基於多變數函式而產生的(數學角度就是求偏導數)。更多理論細節在這裡不再進行詳細解釋。

2. 二階優化演算法

二階優化演算法使用了二階導數(也叫做Hessian方法)來最小化或最大化損失函式。由於二階導數的計算成本很高,所以這種方法並沒有廣泛使用(我們下面不表,下面主要還是講一階梯度下降法)。如牛頓梯度下降。

詳解各種神經網路優化演算法 :梯度下降

在訓練和優化智慧系統時,梯度下降是一種最重要的技術和基礎。

梯度下降的功能是:

通過尋找最小值,控制方差,更新模型引數,最終使模型收斂。

網路更新引數的公式為:θ=θ−η×∇(θ).J(θ) ,其中η是學習率∇(θ).J(θ)是損失函式J(θ)的梯度

這是在神經網路中最常用的優化演算法。

如今,梯度下降主要用於在神經網路模型中進行權重更新,即在一個方向上更新和調整模型的引數,來最小化損失函式。

2006年引入的反向傳播技術,使得訓練深層神經網路成為可能。反向傳播技術是以前向傳播為基礎的,

前向傳播:

先在前向傳播中計算輸入訊號的乘積及其對應的權重,然後將啟用函式作用於這些乘積的總和。這種將輸入訊號轉換為輸出訊號的方式,是一種對複雜非線性函式進行建模的重要手段,並引入了非線性啟用函式,使得模型能夠學習到幾乎任意形式的函式對映。

然後,在網路的反向傳播過程中回傳相關誤差,使用梯度下降更新權重值,通過計算誤差函式E相對於權重引數W的梯度,在損失函式梯度的相反方向上更新權重引數。

圖1:權重更新方向與梯度方向相反。梯度下降法是為了使得損失函式最小,既然是梯度下降,自然就是取梯度的負方向了。

圖1顯示了權重更新過程與梯度向量誤差的方向相反,其中U形曲線為梯度。要注意到,當權重值W太小或太大時,會存在較大的誤差,需要更新和優化權重,使其轉化為合適值,所以我們試圖在與梯度相反的方向找到一個區域性最優值。

分析:

圖中表示的是最常見的損失函式表示式,前面取1/2 是為了,一階梯度的平方求偏導時候可以更加簡便。

後面表示用預測值與真實值的誤差的平方,表示模型的預測效能,誤差值小說明模型預測精準。

裡面的累加部分表示神經網路裡面的所有引數經過計算後,再經過一系列的非線性函式f(.....)(即啟用函式),才得到最終預測的結果。

在數學角度說f(...),我們是在訓練一個預測的函式。函式裡面包括很多變數(即引數),我們最終的目的就是訓練好那些變數,使得預測函式值最小。說人話就是,預測的函式就是模型。我們為了模型更精準,那麼模型的預測就越好。

y就是表示真實值。

一般神經網路會累加一個batch的所有資料的誤差(而上面的公式表示一個數據的誤差值),然後取平均值作為本次batch訓練的誤差值,然後進行一次反向傳播來調節權重(即引數)。即後面的小批量梯度下降,現在通常用這種方法。

梯度下降的變體

傳統的批量梯度下降計算整個資料集梯度,但只會進行一次更新,因此在處理大型資料集時速度很慢且難以控制,甚至導致記憶體溢位。

權重更新的快慢是由學習率η決定的,並且可以在凸面誤差曲面中收斂到全域性最優值,在非凸曲面中可能趨於區域性最優值。

使用標準形式的批量梯度下降還有一個問題,就是在訓練大型資料集時存在冗餘的權重更新(一般資料量越多,資料維度越大,那麼應該對應增加神將網路的引數數目,才能學的更好,但整個資料一次輸入去學習那麼會有更多的維度,權重自然更多,那就冗餘了)

標準梯度下降的上述問題在隨機梯度下降方法中得到了解決。

1. 隨機梯度下降(SGD)

隨機梯度下降(Stochastic gradient descent,SGD)對每個訓練樣本進行引數更新,每次執行都進行一次更新,且執行速度更快。

θ=θ−η⋅∇(θ) × J(θ;x(i);y(i)),其中x(i)和y(i)為訓練樣本。

頻繁的更新使得引數間具有高方差,損失函式會以不同的強度波動。這實際上是一件好事,因為它有助於我們發現新的和可能更優的區域性最小值。反過來也,有人認為,一次只以一個數據來調整整個網路權重,容易陷入區域性最小值,更加難發現整體最小值,而且一個數據很難代表整個資料的分佈。個人偏向後者觀點。

SGD的問題是,由於頻繁的更新和波動,最終將收斂到最小限度,並會因頻繁波動存在超調量(一個數據調節一次,那計算量太大了)

雖然已經表明,當緩慢降低學習率η時,標準梯度下降的收斂模式與SGD的模式相同。

圖2:每個訓練樣本中高方差的引數更新會導致損失函式大幅波動,因此我們可能無法獲得給出損失函式的最小值。

另一種稱為“小批量梯度下降”的變體,則可以解決高方差的引數更新和不穩定收斂的問題。

2. 小批量梯度下降

為了避免SGD和標準梯度下降中存在的問題,一個改進方法為小批量梯度下降(Mini Batch Gradient Descent),因為對一個批次中的n個訓練樣本,這種方法只執行一次梯度下降更新

使用小批量梯度下降的優點是:

1)可以減少引數更新的波動,最終得到效果更好和更穩定的收斂。

2)還可以使用最新的深層學習庫中通用的矩陣優化方法,使計算小批量資料的梯度更加高效。

3)通常來說,小批量樣本的大小範圍是從50到256,可以根據實際問題而有所不同。

4)在訓練神經網路時,通常都會選擇小批量梯度下降演算法。

這種方法有時候還是被成為SGD。

使用梯度下降及其變體時面臨的挑戰。

1.難選擇出合適的學習率。太小的學習率會導致網路收斂過於緩慢,而學習率太大可能會影響收斂,並導致損失函式在最小值上波動,甚至出現梯度發散。

2.此外,相同的學習率並不適用於所有的引數更新。如果訓練集資料很稀疏,且特徵頻率非常不同,則不應該將其全部更新到相同的程度,但是對於很少出現的特徵,應使用更大的更新率。

3.在神經網路中,最小化非凸誤差函式的另一個關鍵挑戰是避免陷於多個其他區域性最小值中。實際上,問題並非源於區域性極小值,而是來自鞍點,即一個維度向上傾斜且另一維度向下傾斜的點。這些鞍點通常被相同誤差值的平面所包圍,這使得SGD演算法很難脫離出來,因為梯度在所有維度上接近於零。