梯度降低與優化方法(BGD & SGD & Momentum & AdaGrad & RMSProp & Adam)

SGD

SGD指stochastic gradient descent,即隨機梯度降低。是梯度降低的batch版本。算法

對於訓練數據集,咱們首先將其分紅n個batch,每一個batch包含m個樣本。咱們每次更新都利用一個batch的數據,而非整個訓練集。即: markdown

x t + 1 = x t + Δ x t

Δ x t = η g t

其中,η爲學習率,gt爲x在t時刻的梯度。
這麼作的好處在於:函數

當訓練數據太多時,利用整個數據集更新每每時間上不顯示。batch的方法能夠減小機器的壓力,而且能夠更快地收斂。
當訓練集有不少冗餘時(相似的樣本出現屢次),batch方法收斂更快。以一個極端狀況爲例,若訓練集前一半和後一半梯度相同。那麼若是前一半做爲一個batch,後一半做爲另外一個batch,那麼在一次遍歷訓練集時,batch的方法向最優解前進兩個step,而總體的方法只前進一個step。學習

Momentum

SGD方法的一個缺點是,其更新方向徹底依賴於當前的batch,於是其更新十分不穩定。解決這一問題的一個簡單的作法即是引入momentum。優化

momentum即動量,它模擬的是物體運動時的慣性,即更新的時候在必定程度上保留以前更新的方向,同時利用當前batch的梯度微調最終的更新方向。這樣一來,能夠在必定程度上增長穩定性,從而學習地更快,而且還有必定擺脫局部最優的能力: atom

Δ x t = ρ Δ x t 1 η g t

其中,ρ 即momentum,表示要在多大程度上保留原來的更新方向,這個值在0-1之間,在訓練開始時,因爲梯度可能會很大,因此初始值通常選爲0.5;當梯度不那麼大時,改成0.9。η 是學習率,即當前batch的梯度多大程度上影響最終更新方向,跟普通的SGD含義相同。ρ 與 η 之和不必定爲1。spa

「衝量」這個概念源自於物理中的力學,表示力對時間的積累效應。.net

在普通的梯度降低法x += v中,每次x的更新量v爲v = - dx * lr,其中dx爲目標函數func(x)對x的一階導數。
當使用衝量時,則把每次x的更新量v考慮爲本次的梯度降低量- dx * lr與上次x的更新量v乘上一個介於[0, 1]的因子momentum的和,即v = - dx * lr + v * momemtum。
從公式上可看出:code

當本次梯度降低- dx * lr的方向與上次更新量v的方向相同時,上次的更新量可以對本次的搜索起到一個正向加速的做用。
當本次梯度降低- dx * lr的方向與上次更新量v的方向相反時,上次的更新量可以對本次的搜索起到一個減速的做用。orm

Nesterov Momentum

這是對傳統momentum方法的一項改進,由Ilya Sutskever(2012 unpublished)在Nesterov工做的啓發下提出的。

其基本思路以下圖(轉自Hinton的coursera公開課lecture 6a):
這裏寫圖片描述
首先,按照原來的更新方向更新一步(棕色線),而後在該位置計算梯度值(紅色線),而後用這個梯度值修正最終的更新方向(綠色線)。上圖中描述了兩步的更新示意圖,其中藍色線是標準momentum更新路徑。

公式描述爲:

Δ x t = ρ Δ x t 1 η Δ f ( x t + ρ Δ x t 1 )

Adagrad

上面提到的方法對於全部參數都使用了同一個更新速率。可是同一個更新速率不必定適合全部參數。好比有的參數可能已經到了僅須要微調的階段,但又有些參數因爲對應樣本少等緣由,還須要較大幅度的調動。

Adagrad就是針對這一問題提出的,自適應地爲各個參數分配不一樣學習率的算法。其公式以下:

Δ x t = η τ = 1 t g τ 2 + ϵ g t

其中gt 一樣是當前的梯度,連加和開根號都是元素級別的運算。eta 是初始學習率,因爲以後會自動調整學習率,因此初始值就不像以前的算法那樣重要了。而ϵ是一個比較小的數,用來保證分母非0。

其含義是,對於每一個參數,隨着其更新的總距離增多,其學習速率也隨之變慢。

Adadelta

Adagrad算法存在三個問題

其學習率是單調遞減的,訓練後期學習率很是小
其須要手工設置一個全局的初始學習率
更新xt時,左右兩邊的單位不一樣一
Adadelta針對上述三個問題提出了比較漂亮的解決方案。

首先,針對第一個問題,咱們能夠只使用adagrad的分母中的累計項離當前時間點比較近的項,以下式:

E [ g 2 ] t = ρ E [ g 2 ] t 1 + ( 1 ρ ) g t 2

Δ x t = η E [ g 2 ] t + ϵ g t

這裏ρ是衰減係數,經過這個衰減係數,咱們令每個時刻的 g t 隨之時間按照ρ指數衰減,這樣就至關於咱們僅使用離當前時刻比較近的 g t 信息,從而使得還很長時間以後,參數仍然能夠獲得更新。
針對第三個問題,其實sgd跟momentum系列的方法也有單位不統一的問題。sgd、momentum系列方法中:

Δ x g f x 1 x

相似的,adagrad中,用於更新Δx的單位也不是x的單位,而是1。
而對於牛頓迭代法:
Δ x = H t 1 g t

其中H爲Hessian矩陣,因爲其計算量巨大,於是實際中不常使用。其單位爲:
Δ x H 1 g f x 2 f 2 x x

注意,這裏f無單位。於是,牛頓迭代法的單位是正確的。
因此,咱們能夠模擬牛頓迭代法來獲得正確的單位。注意到:

\Delta x = \frac{\frac{\partial f}{\partial x}}{\frac{\partial ^2 f}{\partial ^2 x}} \Rightarrow \frac{1}{\frac{\partial ^2 f}{\partial ^2 x}} = \frac{\Delta x}{\frac{\partial f}{\partial x}}\end{equation}

這裏,在解決學習率單調遞減的問題的方案中,分母已是 f x 的一個近似了。這裏咱們能夠構造Δx的近似,來模擬獲得 H 1 的近似,從而獲得近似的牛頓迭代法。具體作法以下:

Δ x t = E [ Δ x 2 ] t 1 E [ g 2 ] t + ϵ g t

能夠看到,如此一來adagrad中分子部分須要人工設置的初始學習率也消失了,從而順帶解決了上述的第二個問題。

tensorflow 中相關的類

這裏寫圖片描述

參考文獻

相關文章
相關標籤/搜索