本文僅對一些常見的優化方法進行直觀介紹和簡單的比較,各類優化方法的詳細內容及公式只好去認真啃論文了,在此我就不贅述了。html
此處的SGD指mini-batch gradient descent,關於batch gradient descent, stochastic gradient descent, 以及 mini-batch gradient descent的具體區別就不細說了。如今的SGD通常都指mini-batch gradient descent。算法
SGD就是每一次迭代計算mini-batch的梯度,而後對參數進行更新,是最多見的優化方法了。即:網絡
其中,是學習率,
是梯度 SGD徹底依賴於當前batch的梯度,因此
可理解爲容許當前batch的梯度多大程度影響參數更新學習
缺點:(正由於有這些缺點才讓這麼多大神發展出了後續的各類算法)大數據
momentum是模擬物理裏動量的概念,積累以前的動量來替代真正的梯度。公式以下:優化
其中,是動量因子spa
特色:3d
nesterov項在梯度更新時作一個校訂,避免前進太快,同時提升靈敏度。 將上一節中的公式展開可得:htm
能夠看出,並無直接改變當前梯度
,因此Nesterov的改進就是讓以前的動量直接影響當前的動量。即:內存
因此,加上nesterov項後,梯度在大的跳躍後,進行計算對當前梯度進行校訂。以下圖:
momentum首先計算一個梯度(短的藍色向量),而後在加速更新梯度的方向進行一個大的跳躍(長的藍色向量),nesterov項首先在以前加速的梯度方向進行一個大的跳躍(棕色向量),計算梯度而後進行校訂(綠色梯向量)
其實,momentum項和nesterov項都是爲了使梯度更新更加靈活,對不一樣狀況有針對性。可是,人工設置一些學習率總仍是有些生硬,接下來介紹幾種自適應學習率的方法
Adagrad實際上是對學習率進行了一個約束。即:
此處,對從1到
進行一個遞推造成一個約束項regularizer,
,
用來保證分母非0
特色:
缺點:
Adadelta是對Adagrad的擴展,最初方案依然是對學習率進行自適應約束,可是進行了計算上的簡化。 Adagrad會累加以前全部的梯度平方,而Adadelta只累加固定大小的項,而且也不直接存儲這些項,僅僅是近似計算對應的平均值。即:
在此處Adadelta其實仍是依賴於全局學習率的,可是做者作了必定處理,通過近似牛頓迭代法以後:
其中,表明求指望。
此時,能夠看出Adadelta已經不用依賴於全局學習率了。
特色:
RMSprop能夠算做Adadelta的一個特例:
當時,
就變爲了求梯度平方和的平均數。
若是再求根的話,就變成了RMS(均方根):
此時,這個RMS就能夠做爲學習率的一個約束:
特色:
Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每一個參數的學習率。Adam的優勢主要在於通過偏置校訂後,每一次迭代學習率都有個肯定範圍,使得參數比較平穩。公式以下:
其中,,
分別是對梯度的一階矩估計和二階矩估計,能夠看做對指望
,
的估計;
,
是對
,
的校訂,這樣能夠近似爲對指望的無偏估計。 能夠看出,直接對梯度的矩估計對內存沒有額外的要求,並且能夠根據梯度進行動態調整,而
對學習率造成一個動態約束,並且有明確的範圍。
特色:
Adamax是Adam的一種變體,此方法對學習率的上限提供了一個更簡單的範圍。公式上的變化以下:
能夠看出,Adamax學習率的邊界範圍更簡單
Nadam相似於帶有Nesterov動量項的Adam。公式以下:
能夠看出,Nadam對學習率有了更強的約束,同時對梯度的更新也有更直接的影響。通常而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可使用Nadam取得更好的效果。
最後展現兩張可厲害的圖,一切盡在圖中啊,上面的都沒啥用了... ...
損失平面等高線
在鞍點處的比較
[1]Adagrad
[3]Adadelta
[4]Adam
[5]Nadam
[6]On the importance of initialization and momentum in deep learning
[8]Alec Radford(圖)
[9]An overview of gradient descent optimization algorithms