SGD指stochastic gradient descent,即隨機梯度降低。是梯度降低的batch版本。算法
對於訓練數據集,咱們首先將其分紅n個batch,每一個batch包含m個樣本。咱們每次更新都利用一個batch的數據,而非整個訓練集。即: markdown
其中,η爲學習率,gt爲x在t時刻的梯度。
這麼作的好處在於:函數
當訓練數據太多時,利用整個數據集更新每每時間上不顯示。batch的方法能夠減小機器的壓力,而且能夠更快地收斂。
當訓練集有不少冗餘時(相似的樣本出現屢次),batch方法收斂更快。以一個極端狀況爲例,若訓練集前一半和後一半梯度相同。那麼若是前一半做爲一個batch,後一半做爲另外一個batch,那麼在一次遍歷訓練集時,batch的方法向最優解前進兩個step,而總體的方法只前進一個step。學習
SGD方法的一個缺點是,其更新方向徹底依賴於當前的batch,於是其更新十分不穩定。解決這一問題的一個簡單的作法即是引入momentum。優化
momentum即動量,它模擬的是物體運動時的慣性,即更新的時候在必定程度上保留以前更新的方向,同時利用當前batch的梯度微調最終的更新方向。這樣一來,能夠在必定程度上增長穩定性,從而學習地更快,而且還有必定擺脫局部最優的能力: atom
其中,ρ 即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
這是對傳統momentum方法的一項改進,由Ilya Sutskever(2012 unpublished)在Nesterov工做的啓發下提出的。
其基本思路以下圖(轉自Hinton的coursera公開課lecture 6a):
首先,按照原來的更新方向更新一步(棕色線),而後在該位置計算梯度值(紅色線),而後用這個梯度值修正最終的更新方向(綠色線)。上圖中描述了兩步的更新示意圖,其中藍色線是標準momentum更新路徑。
公式描述爲:
上面提到的方法對於全部參數都使用了同一個更新速率。可是同一個更新速率不必定適合全部參數。好比有的參數可能已經到了僅須要微調的階段,但又有些參數因爲對應樣本少等緣由,還須要較大幅度的調動。
Adagrad就是針對這一問題提出的,自適應地爲各個參數分配不一樣學習率的算法。其公式以下:
其含義是,對於每一個參數,隨着其更新的總距離增多,其學習速率也隨之變慢。
Adagrad算法存在三個問題
其學習率是單調遞減的,訓練後期學習率很是小
其須要手工設置一個全局的初始學習率
更新xt時,左右兩邊的單位不一樣一
Adadelta針對上述三個問題提出了比較漂亮的解決方案。
首先,針對第一個問題,咱們能夠只使用adagrad的分母中的累計項離當前時間點比較近的項,以下式:
這裏ρ是衰減係數,經過這個衰減係數,咱們令每個時刻的
隨之時間按照ρ指數衰減,這樣就至關於咱們僅使用離當前時刻比較近的
信息,從而使得還很長時間以後,參數仍然能夠獲得更新。
針對第三個問題,其實sgd跟momentum系列的方法也有單位不統一的問題。sgd、momentum系列方法中:
注意,這裏f無單位。於是,牛頓迭代法的單位是正確的。
因此,咱們能夠模擬牛頓迭代法來獲得正確的單位。注意到:
這裏,在解決學習率單調遞減的問題的方案中,分母已是
的一個近似了。這裏咱們能夠構造Δx的近似,來模擬獲得
的近似,從而獲得近似的牛頓迭代法。具體作法以下: