一文搞懂深度学习中常用的优化算法
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的時候需要使用到優(yōu)化算法,最終我們都是通過求解代價函數(shù)的最優(yōu)化問題來求解模型的參數(shù)。有的時候,訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)模型可能需要幾百上千臺機器同時訓(xùn)練幾個月,通過使用優(yōu)化算法可以節(jié)省訓(xùn)練的時間加快模型的收斂。本篇文章主要介紹一下常用的優(yōu)化算法
- 梯度下降算法
- 指數(shù)加權(quán)平均算法
- 動量梯度下降
- RMSprop算法
- Adam優(yōu)化算法
常用的優(yōu)化算法在面試的時候也會經(jīng)常被問到。
一、梯度下降算法
在訓(xùn)練模型之前會先定義一個代價函數(shù),然后通過不停的迭代訓(xùn)練數(shù)據(jù)利用梯度下降算法來減少每次迭代的誤差,從而使得代價函數(shù)最小化。梯度下降算法主要包括三種,隨機梯度下降、batch梯度下降、mini-batch梯度下降。最常用的是mini-batch梯度下降算法。
- 隨機梯度下降
隨機梯度下降算法是指在訓(xùn)練模型的時候,每次迭代只從訓(xùn)練數(shù)據(jù)中隨機抽取一個數(shù)據(jù)來計算梯度更新模型的參數(shù)。隨機梯度下降算法永遠無法收斂,容易受到噪聲的干擾,訓(xùn)練時間長,代價函數(shù)最終會圍繞全局最小值或者局部極小值震蕩。 - batch梯度下降
batch梯度下降算法是指在訓(xùn)練模型的時候,每次迭代時使用所有的訓(xùn)練數(shù)據(jù)來計算梯度更新模型的參數(shù)。batch梯度下降算法適用于小數(shù)據(jù)集的訓(xùn)練,對于大數(shù)據(jù)集(大于2000)不太適應(yīng),因為每次訓(xùn)練的時候都要使用所有的訓(xùn)練數(shù)據(jù),會導(dǎo)致需要消耗大量的內(nèi)存,增加電腦的計算量,計算時間長。batch梯度下降不容易受到噪聲數(shù)據(jù)的干擾,在迭代的時候能夠保證向全局最小值或局部極小值的方向進行收斂。
- mini-batch梯度下降
mini-batch梯度下降算法是指在訓(xùn)練模型的時候,每次迭代時會使用一個mini-batch數(shù)據(jù)來計算梯度更新模型的參數(shù),這個mini-batch通常取64、128、256、512,通常采用2^n作為一個mini-batch,符合電腦的內(nèi)存結(jié)構(gòu)在一定程度上可以加快計算機的計算速度,從而減少訓(xùn)練的時間。mini-batch梯度下降算法是最常用的梯度下降算法,mini-batch對計算機的內(nèi)存要求不高,收斂速度相對較快,在迭代的時候不能保證每次迭代都像全局最小值進行收斂,但是整體的趨勢是向全局最小值進行收斂的。當mini-batch取1時,就變成了隨機梯度下降算法,當mini-batch的大小為整個訓(xùn)練數(shù)據(jù)集的大小時就變成了batch梯度下降。
二、指數(shù)加權(quán)平均值
指數(shù)加權(quán)平均值,也被稱為移動平均值,從名字可以看出來它其實也是一種求平均值的算法,在后面介紹動量、RMSProp和Adam的時候都需要用到它。
- 指數(shù)加權(quán)平均值計算方法
公式:vn=β?vn?1+(1?β)?θnv_{n}=\beta*v_{n-1}+(1-\beta)*\theta_{n}vn?=β?vn?1?+(1?β)?θn?,其中β\betaβ指的是系數(shù)通常取0.9,vnv_{n}vn?表示的是當前的指數(shù)加權(quán)平均值,θ\thetaθ表示的是當前的值,下面用一個例子來詳細介紹一下指數(shù)加權(quán)平均值的計算:
我們有一組網(wǎng)站的訪問量數(shù)據(jù):
其中θ\thetaθ表示的是每天的訪問量(萬),下面我們來計算一下指數(shù)加權(quán)平均值,其中β\betaβ取0.9
v0v_{0}v0?=0
v1v_{1}v1?=β?v0\beta*v_{0}β?v0?+(1?β)?θ1(1-\beta)*\theta_{1}(1?β)?θ1?=0.9 * 0+ 0.1 * 5=0.5
v2v_{2}v2?=β?v1\beta*v_{1}β?v1?+(1?β)?θ2(1-\beta)*\theta_{2}(1?β)?θ2?=0.9 * 0.5+ 0.1 * 6=1.05 - β\betaβ系數(shù)對于加權(quán)平均值的影響
指數(shù)加權(quán)平均值的計算公式:vn=β?vn?1+(1?β)?θnv_{n}=\beta*v_{n-1}+(1-\beta)*\theta_{n}vn?=β?vn?1?+(1?β)?θn?
從公式可以看出,當β\betaβ越大時結(jié)果與上一時刻的指數(shù)加權(quán)平均值vn?1v_{n-1}vn?1?的相關(guān)性越大,與當前時刻θn\theta_{n}θn?相關(guān)性越小,導(dǎo)致的結(jié)果就是指數(shù)加權(quán)平均值無法更好的反映當前的變化趨勢,可能會導(dǎo)致曲線右移,曲線更平滑。如果當β\betaβ越小時,指數(shù)加權(quán)平均值能夠及時的反映出當前的變化趨勢,但是曲線的變化幅度會比較大。如下圖所示
上圖中,橫軸表示的是天數(shù),縱軸表示的是溫度。通過上圖可以發(fā)現(xiàn),其中紅色曲線的β\betaβ為0.9,黃色曲線的β\betaβ小于0.9,綠色曲線的β\betaβ大于0.9,當β\betaβ越來越大時,指數(shù)加權(quán)平均值曲線會慢慢的向右移動,反映溫度的變化會延時,曲線會越來平滑。
指數(shù)加權(quán)平均算法相對于直接求平均值算法的優(yōu)勢在于,指數(shù)加權(quán)平均值只需要極小的空間就可以計算出近似平均值,而直接使用平均值算法需要保存以前所有的數(shù)據(jù),相對而言指數(shù)加權(quán)平均值的計算出來平均值的精度沒有那么高,它是犧牲了一定的精度來換取空間和速度的。由于它在空間上具有極大的優(yōu)勢,所以應(yīng)用范圍還是很廣泛。 - 為什么叫指數(shù)加權(quán)平均值
vn=β?vn?1+(1?β)?θn=β?(β?vn?2+(1?β)?θn?1)+(1?β)?θn=β2?vn?2+β?(1?β)?θn?1+(1?β)?θn=βn?v0+βn?1?(1?β)?θ1+...+(1?β)?θn\begin{aligned} v_{n} &= \beta*v_{n-1}+(1-\beta)*\theta_{n} \\&= \beta*( \beta*v_{n-2}+(1-\beta)*\theta_{n-1})+(1-\beta)*\theta_{n} \\&= \beta^2*v_{n-2} + \beta*(1-\beta)*\theta_{n-1}+(1-\beta)*\theta_{n} \\&= \beta^n*v_{0}+\beta^{n-1}*(1-\beta)*\theta_{1}+...+(1-\beta)*\theta_{n} \end{aligned} vn??=β?vn?1?+(1?β)?θn?=β?(β?vn?2?+(1?β)?θn?1?)+(1?β)?θn?=β2?vn?2?+β?(1?β)?θn?1?+(1?β)?θn?=βn?v0?+βn?1?(1?β)?θ1?+...+(1?β)?θn??
通過上面的公式可以發(fā)現(xiàn),θ\thetaθ的權(quán)重系數(shù)呈現(xiàn)出一個指數(shù)的變化趨勢。
在計算vnv_{n}vn?的時候看起來好像用到了所有的θ\thetaθ平均了之前所有的天數(shù),實際上只平均了一部分,當系數(shù)下降到峰值(1-β)的1/e(0.3678)時可以忽略不計,其中e(2.71828)表示的是自然常數(shù),即當權(quán)重系數(shù)小于峰值的0.3678時,就可以認為它對于結(jié)果沒有影響。(1??)1/?=1/e(1-\epsilon)^{1/\epsilon}=1/e(1??)1/?=1/e,其中?=(1?β)\epsilon=(1-\beta)?=(1?β),所以當β\betaβ等于0.9時,?\epsilon?等于0.1,所以0.9^10=1/e。所以十天以前的θ\thetaθ的影響可以忽略不計,就相當于平均了十天的溫度。 - 偏差修正
在使用指數(shù)加權(quán)平均算法計算的時候存在一個問題就是,剛開始使用指數(shù)加權(quán)算法計算的時候初始值都是非常小的,偏差修正就是用于修正初始值的。如果你對于初始值不太關(guān)注,就可以不用使用偏差修正。
偏差修正公式:vn′=vn1?βnv_{n}^{'}=\frac{v_{n}}{1-\beta^{n}}vn′?=1?βnvn??
當n越來越大時,βn\beta^nβn趨于0,vn′=vnv_{n}^{'}=v_{n}vn′?=vn?,所以偏差修正的作用僅在n較小的時候有用,即初始化的時候。
三、動量梯度下降算法
動量梯度下降算法在梯度下降算法的基礎(chǔ)上做了一些優(yōu)化,梯度下降算法的收斂如下圖所示
其中黑點表示的是起點,紅點表示的是終點。通過梯度下降算法不停的迭代,慢慢的從黑點移動到紅點的位置,通過上圖可以發(fā)現(xiàn)黑點的移動軌跡在y方向上一直存在上下波動,而這個對于黑點移動到紅點的位置沒有任何的幫助,反而是在浪費時間,因為我們更希望減少這種不必要的計算,加速x軸方向上的移動步伐,如下圖所示
而上圖正是動量梯度下降算法所追求的效果,那么它到底是如何實現(xiàn)的呢?
- 梯度下降算法
優(yōu)化參數(shù)權(quán)重www和偏置bbb,梯度下降算法參數(shù)更新公式如下:
w=w?α?dww=w-\alpha*d{w}w=w?α?dw
b=b?α?dbb=b-\alpha*d{b}b=b?α?db
動量梯度下降算法參數(shù)更新公式如下:
vw=β?vw+(1?β)?dwv_{w}=\beta*v_w+(1-\beta)*dwvw?=β?vw?+(1?β)?dw
bb=β?vb+(1?β)?dbb_b=\beta*v_b+(1-\beta)*dbbb?=β?vb?+(1?β)?db
w=w?α?vww=w-\alpha*v_ww=w?α?vw?
b=b?α?vbb=b-\alpha*v_bb=b?α?vb?
上式中α\alphaα表示學(xué)習(xí)率,通過上式可以發(fā)現(xiàn),動量梯度下降算法在更新參數(shù)的時候并不是直接使用的梯度,它還利用到以前的梯度,具體到多少,與β\betaβ的大小有關(guān),β\betaβ越大使用到以前的梯度越多,β\betaβ越小使用到以前的梯度越小。
因為在y軸方向上梯度是有正有負的,所以均值就近似為0,即在y軸方向上不會有太大的變化。而x軸方向上的梯度都是一致的,所以能夠為x軸方向上提供動量加速更新。由于動量梯度下降算法,在更新參數(shù)的時候不僅使用到了當前的梯度還使用到了以前梯度的均值作為動量,當陷入到局部極小值(梯度接近于0),在更新的時候動量梯度下降算法還可以利用以前梯度的均值來跳出局部極小值,而梯度下降算法只會陷入到局部極小值。在使用動量梯度下降算法的時候β\betaβ通常可以取0.9。
四、RMSprop算法
RMSprop算法全稱root mean square prop,RMSprop算法的思想和Moment算法的思想是一致的都是通過減少在y軸方向上的抖動,加大x軸方向上的移動步長。而在實現(xiàn)上略有不同,Moment主要是利用累積以前的梯度來實現(xiàn)加速,而RMSprop算法的思想是利用梯度下降算法在y軸方向上的梯度比較大,而在x軸方向上的梯度相對較小。在進行參數(shù)更新的時候,讓y軸方向上的梯度除以一個大的數(shù),這樣y軸更新的幅度就小。而x軸方向上的梯度除以一個小的數(shù),這樣x軸更新的幅度就大。從而實現(xiàn)了,減小了y軸方向上的更新步長,增大了x軸方向上的更新步長,使得算法能夠更快的收斂。更新公式如下:
Sdw=β?Sdw+(1?β)?dw2S_{dw}=\beta *S_{dw} +(1-\beta)*dw^2Sdw?=β?Sdw?+(1?β)?dw2
Sdb=β?Sdb+(1?β)?db2S_{db}=\beta * S_{db} + (1-\beta)*db^2Sdb?=β?Sdb?+(1?β)?db2
w=w?α?dwSdw+?w=w-\alpha * \frac{dw}{\sqrt{S_{dw}}+\epsilon}w=w?α?Sdw??+?dw?
b=b?α?dbSdb+?b=b-\alpha * \frac{db}{\sqrt{S_{db}}+\epsilon}b=b?α?Sdb??+?db?
為了避免在更新參數(shù)的時候,分母為0,所以需要在分母上加上一個極小的數(shù)?\epsilon?,通常取10?810^{-8}10?8。dw2dw^2dw2表示的是參數(shù)www的梯度的平方也稱為微分的平方。
五、Adam算法
Adam算法全稱Adaptive Moment Estimation,主要是結(jié)合了Moment算法和RMSprop算法。公式如下:
vdw=0,vdb=0,Sdw=0,Sdb=0v_{dw}=0,v_{db}=0,S_{dw}=0,S_{db}=0vdw?=0,vdb?=0,Sdw?=0,Sdb?=0
vdw=β1?vdw+(1?β)?dwv_{dw}=\beta_{1}*v_{dw}+(1-\beta)*dwvdw?=β1??vdw?+(1?β)?dw
vdb=β1b?vdb+(1?β)?dbv_{db}=\beta_{1}b*v_{db}+(1-\beta)*dbvdb?=β1?b?vdb?+(1?β)?db
Sdw=β?Sdw+(1?β)?dw2S_{dw}=\beta *S_{dw} +(1-\beta)*dw^2Sdw?=β?Sdw?+(1?β)?dw2
Sdb=β?Sdb+(1?β)?db2S_{db}=\beta * S_{db} + (1-\beta)*db^2Sdb?=β?Sdb?+(1?β)?db2
參數(shù)的更新:
w=w?α?vdwSdw+?w=w-\alpha * \frac{v_{dw}}{\sqrt{S_{dw}}+\epsilon}w=w?α?Sdw??+?vdw??
b=b?α?vdbSdb+?b=b-\alpha * \frac{v_{db}}{\sqrt{S_{db}}+\epsilon}b=b?α?Sdb??+?vdb??
在使用指數(shù)加權(quán)平均值算法的時候,可能存在初始化的偏差比較大的情況,可以通過下面的方法進行偏差修正:
vdw′=vdw1?βtv_{dw}^{'}=\frac{v_{dw}}{1-\beta^{t}}vdw′?=1?βtvdw??
Sdw′=Sdw1?βtS_{dw}^{'}=\frac{S_{dw}}{1-\beta^{t}}Sdw′?=1?βtSdw??
上式中的t表示的是迭代的次數(shù),通常情況下我們都不會太注意初始化值,因為函數(shù)收斂通常都需要迭代很多次。β1\beta_{1}β1?指的是Moment的參數(shù)通常取0.9,β2\beta_{2}β2?指的是RMSprop的參數(shù),通常取0.999,?\epsilon?主要是用來避免分母為0的情況取10?810^{-8}10?8。
六、總結(jié)
最后我們用兩張圖來比較一下算法的表現(xiàn),這張圖表示的是在同樣的等高線的情況下各個算法的收斂情況
下面這張圖表示的是不同算法在遇到鞍點時的表現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的一文搞懂深度学习中常用的优化算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20个Flutter实例视频教程-第03
- 下一篇: mysql定义shell变量_shell