一、梯度下降法(Gradient Descent)
微積分中,對多元函數的參數求 θ偏導數,把求得的各個參數的導數以向量的形式寫出來就是梯度。梯度就是函數變化最快的地方。梯度下降是迭代法的一種,在求解機器學習算法的模型參數 θ 時,即無約束問題時,梯度下降是最常採用的方法之一。顧名思義,梯度下降法的計算過程就是沿梯度下降的方向求解極小值,也可以沿梯度上升方向求解最大值。 假設模型參數爲 θ,損失函數爲 J(θ) ,損失函數 J(θ)關於參數 θ的偏導數,也就是梯度爲 ∇θJ(θ) ,學習率爲 α,則使用梯度下降法更新參數爲:
θt+1=θt−α⋅∇θJ(θ)
梯度下降法目前主要分爲三種方法,區別在於每次參數更新時計算的樣本數據量不同:批量梯度下降法(BGD, Batch Gradient Descent),隨機梯度下降法(SGD, Stochastic Gradient Descent)及小批量梯度下降法(Mini-batch Gradient Descent)。
1、批量梯度下降法(BGD, Batch Gradient Descent)
假設訓練樣本總數爲n,樣本爲 {(x1,y1)⋅⋅⋅(xn,yn)} ,模型參數爲 θ,損失函數爲 J(θ) ,在第i對樣本 $\ (xi,yi) $上損失函數關於參數的梯度爲 ∇θJ(θ,xi,yi) , 學習率爲 α,則使用BGD更新參數爲:
θt+1=θt−αt⋅i=1∑n∇θJi(θ,xi,yi)
特點:
1、每進行一次參數更新,需要計算整個數據樣本集,因此導致批量梯度下降法的速度會比較慢,尤其是數據集非常大的情況下,收斂速度就會非常慢
2、由於每次的下降方向爲總體平均梯度,它得到的會是一個全局最優解。
2、隨機梯度下降法(SGD, Stochastic Gradient Descent)
隨機梯度下降法,不像BGD每一次參數更新,需要計算整個數據樣本集的梯度,而是每次參數更新時,僅僅選取一個樣本$\ (xi,yi) $計算其梯度,參數更新公式爲:
θt+1=θt−αt⋅∇θJi(θ,xi,yi)
特點:
1、可以看到BGD和SGD是兩個極端,SGD由於每次參數更新僅僅需要計算一個樣本的梯度,訓練速度很快,即使在樣本量很大的情況下,可能只需要其中一部分樣本就能迭代到最優解
2、由於每次迭代並不是都向着整體最優化方向,導致梯度下降的波動非常大,更容易從一個局部最優跳到另一個局部最優,準確度下降。
3、小批量梯度下降法(Mini-batch Gradient Descent)
小批量梯度下降法就是結合BGD和SGD的折中,對於含有n個訓練樣本的數據集,每次參數更新,選擇一個大小爲m (m<n)的mini-batch數據樣本計算其梯度,其參數更新公式如下:
θt+1=θt−α⋅i=x∑i=x+m−1∇θJi(θ,xi,yi)
超參數建議值: m∈[50,256]
特點:
1、小批量梯度下降法即保證了訓練的速度,又能保證最後收斂的準確率,目前的SGD默認是小批量梯度下降算法。
PS:SGD的缺點
1、選擇合適的learning rate比較困難 ,學習率太低會收斂緩慢,學習率過高會使收斂時的波動過大
2、所有參數都是用同樣的learning rate
3、SGD容易收斂到局部最優,並且在某些情況下可能被困在鞍點
二、動量優化法
動量優化方法引入物理學中的動量思想,加速梯度下降,有Momentum和Nesterov兩種算法。當我們將一個小球從山上滾下來,沒有阻力時,它的動量會越來越大,但是如果遇到了阻力,速度就會變小,動量優化法就是借鑑此思想,使得梯度方向在不變的維度上,參數更新變快,梯度有所改變時,更新參數變慢,這樣就能夠加快收斂並且減少動盪。
1、Momentum
momentum算法思想:參數更新時在一定程度上保留之前更新的方向,同時又利用當前batch的梯度微調最終的更新方向,簡言之就是通過積累之前的動量來加速當前的梯度。假設 mt表示t時刻的動量, μ 表示動量因子,通常取值0.9或者近似值,在SGD的基礎上增加動量,則參數更新公式如下:
mt+1=μ⋅mt+α⋅∇θJ(θ)θt+1=θt−mt+1
超參數建議值: μ=0.9
特點:
1、momentum能夠降低參數更新速度,從而減少震盪。
2、在梯度方向相同時,momentum可以加速參數更新, 從而加速收斂。
2、NAG(Nesterov accelerated gradient)
但是,讓“球”無腦地沿着斜坡向下滾並不總能得到讓人滿意的解。我們更希望有這樣的一個小球,它能夠對下一步怎麼滾有個基本的“主見“,在滾過斜坡遇到上坡時,能夠減速,防止越過最優解。NAG則在動量法的基礎上引入了”預測“的功能。在動量法中,我們用 μ⋅mt更新參數 θ,及先讓小球按照慣性前進,計算出該處的梯度,便可以對其進行一個初步的預估。
mt+1=μ⋅mt+α⋅∇θJ(θ−μ⋅mt)θt+1=θt−mt+1
當動量法第一次計算當前梯度時(短藍線),並在累積梯度方向上進行了一大步參數更新(長藍線);NAG是首先在之前的梯度方向上走了一大步(棕色線),然後在此位置上評估一下梯度,最後做出一個相對正確的參數更新(綠線)。這種“先知”更新方法可以避免走過頭而逃離了最優解——這在RNN相關的各種任務中收益甚好。
超參數建議值: μ=0.9
特點:
1、該方法用到了loss函數的二姐信息,比momentum收斂速度更快,波動更小
三、自適應學習率優化算法
在機器學習中,學習率是一個非常重要的超參數,但是學習率是非常難確定的,雖然可以通過多次訓練來確定合適的學習率,但是一般也不太確定多少次訓練能夠得到最優的學習率,玄學事件,對人爲的經驗要求比較高,所以是否存在一些策略自適應地調節學習率的大小,從而提高訓練速度。 目前的自適應學習率優化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。
1、AdaGrad
AdaGrad可以自適應的調節學習率:對於很少更新的參數採用較大的學習率,對於頻繁更新的參數採取更小的學習率——非常適合處理稀疏的數據。谷歌的Dean等人發現,在使用它訓練大規模神經網絡時,Adagrad很大程度上提升了SGD的魯棒性。同時,Penningto等人用它來訓練GloVe詞嵌入模型,因爲低頻詞相對高頻詞需要更大的學習步長。
gt,i=∇J(θe,i)Gt,i=Gt−1,i+gt,i2θt+1,i=θt,i−G+ϵη⋅gt,iϵ是一個小的常數,用來防止分母未0,一般取10−6
超參數建議值: η=0.01
特點:
1、Adagrad的好處在於,它避開了人工調參學習率的問題,絕大部分開源庫實現只需要在開始的時候設置η=0.01即可。
2、主要缺點在於它累積了歷史梯度作爲分母:因爲每一個新梯度平方後都是非負值,在訓練過程中,分母會越來越大,導致學習率整體會減小直至最後無限小——意味着算法不再能夠學習到新的知識。
2、RMSprop
RMSprop是Hinton在他的Coursera課程上提出的(未公佈)的自適應學習率的梯度優化方法。它和Adadelta關注和解決的問題是一樣的——學習率的單調遞減問題。
gt=∇J(θe)E[g2]t=ρE[g2]t−1+(1−ρ)gt2Δθt=E[g2]t+ϵη⋅gtθt+1=θt−Δθt
超參數建議值: ρ=0.9,η=0.001
特點:
1、其實RMSprop依然依賴於全局學習率 [公式]
2、RMSprop算是Adagrad的一種發展,和Adadelta的變體,效果趨於二者之間
3、適合處理非平穩目標——對於RNN效果很好
3、Adadelta
Adadelta是AdaGrad的一種拓展形式——Adadelta僅考慮了一個歷史時間窗口下的累積梯度(在實現上並非存儲歷史梯度,而是藉助衰減因子),避免了Adagrad中學習率總是單調遞減的問題。
E[g2]t=ρE[g2]t−1+(1−ρ)gt2初始化Δθt=E[g2]t+ϵη⋅gtE[Δθ2]t=ρE[Δθ2]t−1+(1−ρ)Δθt2記 RMS[g]t=E[g2]t+ϵ記 RMS[Δθ]t=E[Δθ2]t+ϵΔθt=RMS[g]tRMS[Δθ]t⋅gtθt+1=θt−Δθt
超參數建議值: ρ=0.9
特點:
1、訓練初中期,加速效果不錯,很快。
2、訓練後期,反覆在局部最小值附近抖動。
4、Adam: Adaptive Moment Estimation
這個算法是另一種計算每個參數的自適應學習率的方法。相當於 RMSprop + Momentum
除了像 Adadelta 和 RMSprop 一樣存儲了過去梯度的平方 vt 的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度 mt 的指數衰減平均值
初始化m,v=0mt=β1mt−1+(1−β1)gtvt=β2vt−1+(a−β2)gt2對m、v做偏差矯正(初始化爲0帶來的向0偏置的問題)m^t=1−β1mtv^t=1−β2vtθt+1=θt−v^t+ϵη⋅m^t
超參數建議值: β1=0.9,β2=0.999,ϵ=10−8
特點:
1、相比於其他的自適應學習率優化算法,效果更好
參考文獻
https://zhuanlan.zhihu.com/p/55150256
https://www.jianshu.com/p/0e561f62e64f