深度基礎知識系列(一) 優化器介紹

一、梯度下降法(Gradient Descent)

    微積分中,對多元函數的參數求 θ\ \theta偏導數,把求得的各個參數的導數以向量的形式寫出來就是梯度。梯度就是函數變化最快的地方。梯度下降是迭代法的一種,在求解機器學習算法的模型參數  θ\ \theta 時,即無約束問題時,梯度下降是最常採用的方法之一。顧名思義,梯度下降法的計算過程就是沿梯度下降的方向求解極小值,也可以沿梯度上升方向求解最大值。 假設模型參數爲 θ\ \theta,損失函數爲 J(θ)\ J(\theta) ,損失函數 J(θ)\ J(\theta)關於參數 θ\ \theta的偏導數,也就是梯度爲  θJ(θ)\ \nabla_{\theta}J(\theta) ,學習率爲  α\ \alpha,則使用梯度下降法更新參數爲:
θt+1=θtαθJ(θ) \theta_{t+1} = \theta_t - \alpha ·\nabla_{\theta}J(\theta)
    梯度下降法目前主要分爲三種方法,區別在於每次參數更新時計算的樣本數據量不同:批量梯度下降法(BGD, Batch Gradient Descent),隨機梯度下降法(SGD, Stochastic Gradient Descent)及小批量梯度下降法(Mini-batch Gradient Descent)。

1、批量梯度下降法(BGD, Batch Gradient Descent)

    假設訓練樣本總數爲n,樣本爲  {(x1,y1)(xn,yn)}\ \{(x^1,y^1) ···(x^n,y^n)\} ,模型參數爲 θ\ \theta,損失函數爲 J(θ)\ J(\theta) ,在第i對樣本 $\ (xi,yi) $上損失函數關於參數的梯度爲  θJ(θ,xi,yi)\ \nabla_{\theta}J(\theta,x^i,y^i) , 學習率爲  α\ \alpha,則使用BGD更新參數爲:
θt+1=θtαti=1nθJi(θ,xi,yi) \theta_{t+1} = \theta_t - \alpha_t ·\sum_{i=1}^n\nabla_{\theta}J_i(\theta,x^i,y^i)
特點

1、每進行一次參數更新,需要計算整個數據樣本集,因此導致批量梯度下降法的速度會比較慢,尤其是數據集非常大的情況下,收斂速度就會非常慢

2、由於每次的下降方向爲總體平均梯度,它得到的會是一個全局最優解。


2、隨機梯度下降法(SGD, Stochastic Gradient Descent)

    隨機梯度下降法,不像BGD每一次參數更新,需要計算整個數據樣本集的梯度,而是每次參數更新時,僅僅選取一個樣本$\ (xi,yi) $計算其梯度,參數更新公式爲:
θt+1=θtαtθJi(θ,xi,yi) \theta_{t+1} = \theta_t - \alpha_t ·\nabla_{\theta}J_i(\theta,x^i,y^i)
特點

1、可以看到BGD和SGD是兩個極端,SGD由於每次參數更新僅僅需要計算一個樣本的梯度,訓練速度很快,即使在樣本量很大的情況下,可能只需要其中一部分樣本就能迭代到最優解

2、由於每次迭代並不是都向着整體最優化方向,導致梯度下降的波動非常大,更容易從一個局部最優跳到另一個局部最優,準確度下降。


3、小批量梯度下降法(Mini-batch Gradient Descent)

    小批量梯度下降法就是結合BGD和SGD的折中,對於含有n個訓練樣本的數據集,每次參數更新,選擇一個大小爲m (m<n)的mini-batch數據樣本計算其梯度,其參數更新公式如下:
θt+1=θtαi=xi=x+m1θJi(θ,xi,yi) \theta_{t+1} = \theta_t - \alpha ·\sum_{i=x}^{i=x+m-1}\nabla_{\theta}J_i(\theta,x^i,y^i)
    超參數建議值 m[50,256]\ m\in[50,256]

特點:

1、小批量梯度下降法即保證了訓練的速度,又能保證最後收斂的準確率,目前的SGD默認是小批量梯度下降算法。


PS:SGD的缺點

1、選擇合適的learning rate比較困難 ,學習率太低會收斂緩慢,學習率過高會使收斂時的波動過大

2、所有參數都是用同樣的learning rate

3、SGD容易收斂到局部最優,並且在某些情況下可能被困在鞍點


二、動量優化法

    動量優化方法引入物理學中的動量思想,加速梯度下降,有Momentum和Nesterov兩種算法。當我們將一個小球從山上滾下來,沒有阻力時,它的動量會越來越大,但是如果遇到了阻力,速度就會變小,動量優化法就是借鑑此思想,使得梯度方向在不變的維度上,參數更新變快,梯度有所改變時,更新參數變慢,這樣就能夠加快收斂並且減少動盪。

1、Momentum

    momentum算法思想:參數更新時在一定程度上保留之前更新的方向,同時又利用當前batch的梯度微調最終的更新方向,簡言之就是通過積累之前的動量來加速當前的梯度。假設 mt\ m_t表示t時刻的動量, μ\ \mu 表示動量因子,通常取值0.9或者近似值,在SGD的基礎上增加動量,則參數更新公式如下:
mt+1=μmt+αθJ(θ)θt+1=θtmt+1 m_{t+1} = \mu ·m_t + \alpha·\nabla_{\theta}J(\theta) \\ \theta_{t+1} = \theta_t - m_{t+1}

在這裏插入圖片描述

    超參數建議值 μ=0.9\ \mu=0.9

特點

1、momentum能夠降低參數更新速度,從而減少震盪。

2、在梯度方向相同時,momentum可以加速參數更新, 從而加速收斂。


2、NAG(Nesterov accelerated gradient)

    但是,讓“球”無腦地沿着斜坡向下滾並不總能得到讓人滿意的解。我們更希望有這樣的一個小球,它能夠對下一步怎麼滾有個基本的“主見“,在滾過斜坡遇到上坡時,能夠減速,防止越過最優解。NAG則在動量法的基礎上引入了”預測“的功能。在動量法中,我們用 μmt\ \mu·m_t更新參數 θ\ \theta,及先讓小球按照慣性前進,計算出該處的梯度,便可以對其進行一個初步的預估。
mt+1=μmt+αθJ(θμmt)θt+1=θtmt+1 m_{t+1} = \mu ·m_t + \alpha·\nabla_{\theta}J(\theta-\mu·m_t) \\ \theta_{t+1} = \theta_t - m_{t+1}

在這裏插入圖片描述

    當動量法第一次計算當前梯度時(短藍線),並在累積梯度方向上進行了一大步參數更新(長藍線);NAG是首先在之前的梯度方向上走了一大步(棕色線),然後在此位置上評估一下梯度,最後做出一個相對正確的參數更新(綠線)。這種“先知”更新方法可以避免走過頭而逃離了最優解——這在RNN相關的各種任務中收益甚好。

    超參數建議值 μ=0.9\ \mu=0.9

特點:

1、該方法用到了loss函數的二姐信息,比momentum收斂速度更快,波動更小


三、自適應學習率優化算法

    在機器學習中,學習率是一個非常重要的超參數,但是學習率是非常難確定的,雖然可以通過多次訓練來確定合適的學習率,但是一般也不太確定多少次訓練能夠得到最優的學習率,玄學事件,對人爲的經驗要求比較高,所以是否存在一些策略自適應地調節學習率的大小,從而提高訓練速度。 目前的自適應學習率優化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。

1、AdaGrad

    AdaGrad可以自適應的調節學習率:對於很少更新的參數採用較大的學習率,對於頻繁更新的參數採取更小的學習率——非常適合處理稀疏的數據。谷歌的Dean等人發現,在使用它訓練大規模神經網絡時,Adagrad很大程度上提升了SGD的魯棒性。同時,Penningto等人用它來訓練GloVe詞嵌入模型,因爲低頻詞相對高頻詞需要更大的學習步長。
gt,i=J(θe,i)Gt,i=Gt1,i+gt,i2θt+1,i=θt,iηG+ϵgt,iϵ0106 g_{t,i} = \nabla J(\theta_{e,i}) \\ G_{t,i} = G_{t-1,i} + g_{t,i}^2 \\ \theta_{t+1,i} = \theta_{t,i} - \frac{\eta}{\sqrt{G+\epsilon}} ·g_{t,i} \\ \epsilon 是一個小的常數,用來防止分母未0,一般取10^{-6}
    超參數建議值 η=0.01\ \eta=0.01

特點:

1、Adagrad的好處在於,它避開了人工調參學習率的問題,絕大部分開源庫實現只需要在開始的時候設置η=0.01即可。

2、主要缺點在於它累積了歷史梯度作爲分母:因爲每一個新梯度平方後都是非負值,在訓練過程中,分母會越來越大,導致學習率整體會減小直至最後無限小——意味着算法不再能夠學習到新的知識。


2、RMSprop

    RMSprop是Hinton在他的Coursera課程上提出的(未公佈)的自適應學習率的梯度優化方法。它和Adadelta關注和解決的問題是一樣的——學習率的單調遞減問題。
gt=J(θe)E[g2]t=ρE[g2]t1+(1ρ)gt2Δθt=ηE[g2]t+ϵgtθt+1=θtΔθt g_{t} = \nabla J(\theta_{e}) \\ E[g^2]_t = \rho E[g^2]_{t-1} +(1-\rho) g_{t}^2 \\ \Delta \theta_t = \frac{\eta}{\sqrt{E[g^2]_t+\epsilon}} ·g_{t} \\ \theta_{t+1} = \theta_{t} - \Delta \theta_t
    超參數建議值 ρ=0.9η=0.001\ \rho=0.9,\eta=0.001

特點:

1、其實RMSprop依然依賴於全局學習率 [公式]
2、RMSprop算是Adagrad的一種發展,和Adadelta的變體,效果趨於二者之間
3、適合處理非平穩目標——對於RNN效果很好


3、Adadelta

    Adadelta是AdaGrad的一種拓展形式——Adadelta僅考慮了一個歷史時間窗口下的累積梯度(在實現上並非存儲歷史梯度,而是藉助衰減因子),避免了Adagrad中學習率總是單調遞減的問題。
E[g2]t=ρE[g2]t1+(1ρ)gt2Δθt=ηE[g2]t+ϵgtE[Δθ2]t=ρE[Δθ2]t1+(1ρ)Δθt2  RMS[g]t=E[g2]t+ϵ  RMS[Δθ]t=E[Δθ2]t+ϵΔθt=RMS[Δθ]tRMS[g]tgtθt+1=θtΔθt E[g^2]_t = \rho E[g^2]_{t-1} +(1-\rho) g_{t}^2 \\ 初始化 \Delta \theta_t = \frac{\eta}{\sqrt{E[g^2]_t+\epsilon}} ·g_{t} \\ E[\Delta \theta^2]_t = \rho E[\Delta \theta^2]_{t-1} +(1-\rho) \Delta \theta_t^2 \\ 記\ \ RMS[g]_t = \sqrt{E[g^2]_t+\epsilon} \\ 記\ \ RMS[\Delta \theta]_t = \sqrt{E[\Delta \theta^2]_t+\epsilon} \\ \Delta \theta_t = \frac{RMS[\Delta \theta]_t}{RMS[g]_t} ·g_t \\ \theta_{t+1} = \theta_{t} - \Delta \theta_t
    超參數建議值 ρ=0.9\ \rho=0.9

特點:

1、訓練初中期,加速效果不錯,很快。

2、訓練後期,反覆在局部最小值附近抖動。


4、Adam: Adaptive Moment Estimation

    這個算法是另一種計算每個參數的自適應學習率的方法。相當於 RMSprop + Momentum

    除了像 Adadelta 和 RMSprop 一樣存儲了過去梯度的平方  vt\ v_t 的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度  mt\ m_t指數衰減平均值
m,v=0mt=β1mt1+(1β1)gtvt=β2vt1+(aβ2)gt2mv(00)m^t=mt1β1v^t=vt1β2θt+1=θtηv^t+ϵm^t 初始化m,v=0 \\ m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t \\ v_t = \beta_2 v_{t-1} + (a-\beta_2)g_t^2 \\ 對m、v做偏差矯正(初始化爲0帶來的向0偏置的問題) \\ \hat{m}_t = \frac{m_t}{1-\beta_1} \\ \hat{v}_t = \frac{v_t}{1-\beta_2} \\ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t+\epsilon}}·\hat{m}_t
    超參數建議值 β1=0.9β2=0.999ϵ=108\ \beta_1=0.9,\beta_2=0.999,\epsilon=10^{-8}

特點

1、相比於其他的自適應學習率優化算法,效果更好

參考文獻

https://zhuanlan.zhihu.com/p/55150256

https://www.jianshu.com/p/0e561f62e64f

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章