深度學習各種優化方法比較

2021-08-08 15:11:53 字數 4620 閱讀 9610

(標題不能再中二了)本文僅對一些常見的優化方法進行直觀介紹和簡單的比較,各種優化方法的詳細內容及公式只好去認真啃**了,在此我就不贅述了。

此處的sgd指mini-batch gradient descent,關於batch gradient descent, stochastic gradient descent, 以及 mini-batch gradient descent的具體區別就不細說了。現在的sgd一般都指mini-batch gradient descent。

sgd就是每一次迭代計算mini-batch的梯度,然後對引數進行更新,是最常見的優化方法了。即:  g

t=∇θ

t−1f

(θt−

1)

δθt=

−η∗g

t 其中,η

是學習率,gt

是梯度sgd完全依賴於當前batch的梯度,所以

η 可理解為允許當前batch的梯度多大程度影響引數更新

缺點:(正因為有這些缺點才讓這麼多大神發展出了後續的各種演算法)

momentum是模擬物理裡動量的概念,積累之前的動量來替代真正的梯度。公式如下:  m

t=μ∗

mt−1

+gt

δθt=−η∗

mt

其中,μ

是動量因子

特點:

總而言之,momentum項能夠在相關方向加速sgd,抑制振盪,從而加快收斂

nesterov項在梯度更新時做乙個校正,避免前進太快,同時提高靈敏度。 

將上一節中的公式展開可得:  δ

θt=−

η∗μ∗

mt−1

−η∗g

t 可以看出,mt

−1並沒有直接改變當前梯度gt

,所以nesterov的改進就是讓之前的動量直接影響當前的動量。即: gt

=∇θt

−1f(

θt−1

−η∗μ

∗mt−

1)

mt=μ

∗mt−

1+gt

δθt=−η

∗mt

所以,加上nesterov項後,梯度在大的跳躍後,進行計算對當前梯度進行校正。如下圖:

momentum首先計算乙個梯度(短的藍色向量),然後在加速更新梯度的方向進行乙個大的跳躍(長的藍色向量),nesterov項首先在之前加速的梯度方向進行乙個大的跳躍(棕色向量),計算梯度然後進行校正(綠色梯向量)

其實,momentum項和nesterov項都是為了使梯度更新更加靈活,對不同情況有針對性。但是,人工設定一些學習率總還是有些生硬,接下來介紹幾種自適應學習率的方法

adagrad其實是對學習率進行了乙個約束。即:  n

t=nt

−1+g

2t

δθt=

−ηnt

+ϵ−−

−−−√

∗gt

此處,對gt

從1 到t

進行乙個遞推形成乙個約束項regularizer,−1

∑tr=

1(gr

)2+ϵ

√ ,ϵ

用來保證分母非0

特點:

缺點:adadelta是對adagrad的擴充套件,最初方案依然是對學習率進行自適應約束,但是進行了計算上的簡化。 

adagrad會累加之前所有的梯度平方,而adadelta只累加固定大小的項,並且也不直接儲存這些項,僅僅是近似計算對應的平均值。即:  n

t=ν∗

nt−1

+(1−

ν)∗g

2t

δθt=

−ηnt

+ϵ−−

−−−√

∗gt

在此處adadelta其實還是依賴於全域性學習率的,但是作者做了一定處理,經過近似牛頓迭代法之後:  e

|g2|

t=ρ∗

e|g2

|t−1

+(1−

ρ)∗g

2t

δxt=

−∑t−

1r=1

δxr−

−−−−

−−−√

e|g2

|t+ϵ

−−−−

−−−−

√ 其中,e

代表求期望。 

此時,可以看出adadelta已經不用依賴於全域性學習率了。

特點:

rmsprop可以算作adadelta的乙個特例:當ρ

=0.5

時,e|

g2|t

=ρ∗e

|g2|

t−1+

(1−ρ

)∗g2

t 就變為了求梯度平方和的平均數。 

如果再求根的話,就變成了rms(均方根):  r

ms|g

|t=e

|g2|

t+ϵ−

−−−−

−−−√

此時,這個rms就可以作為學習率η

的乙個約束: δx

t=−η

rms|

g|t∗

gt

特點:

adam(adaptive moment estimation)本質上是帶有動量項的rmsprop,它利用梯度的一階矩估計和二階矩估計動態調整每個引數的學習率。adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定範圍,使得引數比較平穩。公式如下:  m

t=μ∗

mt−1

+(1−

μ)∗g

t n

t=ν∗

nt−1

+(1−

ν)∗g

2t

mt^=

mt1−

μt

nt^=

nt1−

νt

δθt=

−mt^

nt^−

−√+ϵ

∗η

其中,mt

,nt

分別是對梯度的一階矩估計和二階矩估計,可以看作對期望e|

gt|

,e|g

2t|

的估計;mt

^ ,n

t^ 是對

mt ,

nt的校正,這樣可以近似為對期望的無偏估計。 

可以看出,直接對梯度的矩估計對記憶體沒有額外的要求,而且可以根據梯度進行動態調整,而−m

t^nt

^√+ϵ

對學習率形成乙個動態約束,而且有明確的範圍。

特點:

adamax是adam的一種變體,此方法對學習率的上限提供了乙個更簡單的範圍。公式上的變化如下:  n

t=ma

x(ν∗

nt−1

,|gt

|)

δx=−

mt^n

t+ϵ∗

η 可以看出,adamax學習率的邊界範圍更簡單

nadam類似於帶有nesterov動量項的adam。公式如下:  g

t^=g

t1−π

ti=1

μi

mt=μ

t∗mt

−1+(

1−μt

)∗gt

mt^=mt

1−πt

+1i=

1μi

nt=ν∗nt

−1+(

1−ν)

∗g2t

nt^=nt

1−νt

mt¯=(1

−μt)

∗gt^

+μt+

1∗mt

^ δ

θt=−

η∗mt

¯nt^

−−√+

ϵ 可以看出,nadam對學習率有了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的rmsprop,或者adam的地方,大多可以使用nadam取得更好的效果。

最後展示兩張可厲害的圖,一切盡在圖中啊,上面的都沒啥用了… …

損失平面等高線

在鞍點處的比較

[1]adagrad

[2]rmsprop[lecture 6e]

[3]adadelta

[4]adam

[5]nadam

[6]on the importance of initialization and momentum in deep learning

[7]keras

中文文件

[8]alec radford(圖) 

[9]an overview of gradient descent optimization algorithms

[10]gradient descent only converges to minimizers

[11]deep learning:nature

深度學習 優化方法

仍然是讀完deep learning之後的筆記和知識梳理,這些內容其實是偏理論層面的,後續的話可以結合 進行講解。dl關注的優化問題 尋找神經網路上的一組引數 顯著降低代價函式j j 通常包括整個訓練集上效能評估 er 經驗風險 和額外的正則化項 sr 結構風險 對於偏應用層面的可以直接看基本演算法...

深度學習常用優化方法

以下方法都是總結吳恩達深度學習課程的方法。1 梯度下降 batch gd size m 速度比較慢,但每一次都是最優方向 隨機梯度下降 size 1 不能用向量加速,相對來說速度慢,而且最後只會在最優值附近徘徊 mini batch size 16,32,64,128 速度較快,雖然也會在最優值之間...

各種深度學習框架

在我看來,機器學習這個領域,從業者 特指技術類從業者,不包括資本類玩家 一定會分成三個不同的群體 1.學術研究者 他們的工作是從理論上詮釋機器學習的各個方面,試圖找出 這樣設計模型 引數為什麼效果更好 並且為其他從業者提供更優秀的模型,甚至將理論研究向前推進一步。能夠做到這一步的人,可以說鳳毛麟角,...