序言
對於y=f(wx+b),如何使用神經網絡來進行求解,也就是給定x和y的值,如何讓系統自動生成正確的權重值w和b呢?
一般情況下,有兩種嘗試方法:
1) 隨機試:純概率問題,幾乎不可能實現。
2) 梯度下降法:先初始化w和b(可以隨機設置,也可以人為默認),然后使用下降算法來對w和b進行更新。都有哪些方法?到底哪種方法更好?
目錄
一、基礎知識
二、SGD
三、Momentum
四、Adagrad
五、Adadelta
六、RMSProp
七、Adam
正文
一、基礎知識
斜率:在一維空間上,斜率就是函數的導數;
梯度:在多維空間里,函數的導數叫梯度,梯度是偏導數組成的向量;
梯度指向函數增加最快的方向,相應地,負梯度就指向函數下降最快的方向;推導方法可以參考該鏈接:https://blog.csdn.net/itplus/article/details/9337515
二、SGD
一般情況下,SGD指Mini-batch GD,(GD可分為三種:Batch GD,Stochastic GD,mini-batch GD)
SGD就是每次迭代計算mini-batch的梯度,然后對參數進行更新:
三、Momentum
積累之前的動量來替代梯度
其中,μ是動量因子
梯度下降前期:使用上一次參數來更新,下降方向一致,乘上較大的μ能夠進行很好的加速
梯度下降后期,在局部最小值來回震盪的時候,gradient→0,μ使得更新幅度增大,跳出陷阱
梯度方向改變時,μ能夠減少更新
結論:momentum項能夠加速SGD,抑制振盪,從而加快收斂
四、Adagrad
對學習率進行了約束:
nt=nt−1+gt2
Δθt=−η/(√nt+ϵ)∗gt
此處,對gt從11到tt進行一個遞推形成一個約束項regularizer:−1/√(∑r=1t(gr)2+ϵ) ,ϵ用來保證分母非0
特點:
前期gt較小的時候, regularizer較大,能夠放大梯度
后期gt較大的時候,regularizer較小,能夠約束梯度
適合處理稀疏梯度
缺點:
由公式可以看出,仍依賴於人工設置一個全局學習率
η設置過大的話,會使regularizer過於敏感,對梯度的調節太大
中后期,分母上梯度平方的累加將會越來越大,使gradient→0,使得訓練提前結束
五、Adadelta
對Adagrad的擴展,也是對學習率進行自適應約束,但對計算進行了簡化。
Adagrad會累加之前所有的梯度平方,而Adadelta只累加固定大小的項,並且也不直接存儲這些項,僅僅是近似計算對應的平均值。即:
Adadelta依是依賴於全局學習率,但是經過近似牛頓迭代法:
訓練初中期,加速效果不錯,很快
訓練后期,反復在局部最小值附近抖動
六、RMSprop
RMSprop算Adadelta一個特例
當ρ=0.5時,E|g^2|t=ρ∗E|g^2|t−1+(1−ρ)∗gt^2就變為了求梯度平方和的平均數。
如果再求根的話,就變成了RMS(均方根):
RMS|g|t=√(E|g^2|t+ϵ)
此時,這個RMS就可以作為學習率ηη的一個約束:
Δxt=−η/(RMS|g|t)∗gt
特點:
其實RMSprop依然依賴於全局學習率
RMSprop算是Adagrad的一種發展,和Adadelta的變體,效果趨於二者之間
適合處理非平穩目標
對於RNN效果很好
七、Adam
Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。Adam的優點主要在於經過偏置校正后,每一次迭代學習率都有個確定范圍,使得參數比較平穩。公式如下:
mt=μ∗mt−1+(1−μ)∗gt
nt=ν∗nt−1+(1−ν)∗gt^2
mt^=mt/(1−μt)
nt^=nt/(1−νt)
Δθt=−mt^/√(nt^+ϵ)∗η
其中,mtmt,ntnt分別是對梯度的一階矩估計和二階矩估計,可以看作對期望E|gt|,E|gt^2|的估計,mt^,nt^是對mt,nt的校正,這樣可以近似為對期望的無偏估計。
可以看出,直接對梯度的矩估計對內存沒有額外的要求,而且可以根據梯度進行動態調整,而−mt^/(nt^+ϵ)對學習率形成一個動態約束,而且有明確的范圍。
特點:
結合了Adagrad善於處理稀疏梯度和RMSprop善於處理非平穩目標的優點
對內存需求較小
為不同的參數計算不同的自適應學習率
也適用於大多非凸優化
適用於大數據集和高維空間
