各類梯度降低 bgd sgd mbgd adam

轉載  https://blog.csdn.net/itchosen/article/details/77200322

 

 

各類神經網絡優化算法:從梯度降低到Adam方法

在調整模型更新權重和誤差參數的方式時,你是否考慮過哪一種優化算法能使模型產生更好且更快的效果?應該用梯度降低,隨機梯度降低,仍是Adam方法?html

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

什麼是優化算法?

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

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

好比說,權重(W)和誤差(b)就是這樣的內部參數,通常用於計算輸出值,在訓練神經網絡模型時起到主要做用。post

在有效地訓練模型併產生準確結果時,模型的內部參數起到了很是重要的做用。這也是爲何咱們應該用各類優化策略和算法,來更新和計算影響模型訓練和模型輸出的網絡參數,使其逼近或達到最優值。學習

優化算法分爲兩大類:測試

1. 一階優化算法優化

這種算法使用各參數的梯度值來最小化或最大化損失函數E(x)。最經常使用的一階優化算法是梯度降低。動畫

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

所以,對單變量函數,使用導數來分析;而梯度是基於多變量函數而產生的。更多理論細節在這裏再也不進行詳細解釋。

2. 二階優化算法

二階優化算法使用了二階導數(也叫作Hessian方法)來最小化或最大化損失函數。因爲二階導數的計算成本很高,因此這種方法並無普遍使用。

詳解各類神經網絡優化算法

梯度降低

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

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

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

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

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

2006年引入的反向傳播技術,使得訓練深層神經網絡成爲可能。反向傳播技術是先在前向傳播中計算輸入信號的乘積及其對應的權重,而後將激活函數做用於這些乘積的總和。這種將輸入信號轉換爲輸出信號的方式,是一種對複雜非線性函數進行建模的重要手段,並引入了非線性激活函數,使得模型可以學習到幾乎任意形式的函數映射。而後,在網絡的反向傳播過程當中回傳相關偏差,使用梯度降低更新權重值,經過計算偏差函數E相對於權重參數W的梯度,在損失函數梯度的相反方向上更新權重參數。

圖1:權重更新方向與梯度方向相反

圖1顯示了權重更新過程與梯度矢量偏差的方向相反,其中U形曲線爲梯度。要注意到,當權重值W過小或太大時,會存在較大的偏差,須要更新和優化權重,使其轉化爲合適值,因此咱們試圖在與梯度相反的方向找到一個局部最優值。

梯度降低的變體

傳統的批量梯度降低將計算整個數據集梯度,但只會進行一次更新,所以在處理大型數據集時速度很慢且難以控制,甚至致使內存溢出。

權重更新的快慢是由學習率η決定的,而且能夠在凸面偏差曲面中收斂到全局最優值,在非凸曲面中可能趨於局部最優值。

使用標準形式的批量梯度降低還有一個問題,就是在訓練大型數據集時存在冗餘的權重更新。

標準梯度降低的上述問題在隨機梯度降低方法中獲得瞭解決。

1. 隨機梯度降低(SDG)

隨機梯度降低(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算法很難脫離出來,由於梯度在全部維度上接近於零。

進一步優化梯度降低

如今咱們要討論用於進一步優化梯度降低的各類算法。

1. 動量

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

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

最後經過θ=θ−V(t)來更新參數。

動量項γ一般設定爲0.9,或相近的某個值。

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

在參數更新過程當中,其原理相似:

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

2) 減小振盪過程。

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

2. Nesterov梯度加速法

一位名叫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²僅僅取決於先前的平均值和當前梯度值。

Eg²=γ.Eg²+(1−γ).g²(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或其餘自適應學習速率的方法,由於這些方法的實際效果更優。

但願你能經過這篇文章,很好地理解不一樣優化算法間的特性差別。

來自:知乎 量子位

相關文章
相關標籤/搜索