日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > pytorch >内容正文

pytorch

一文搞懂深度学习中常用的优化算法

發(fā)布時(shí)間:2023/12/10 pytorch 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文搞懂深度学习中常用的优化算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的時(shí)候需要使用到優(yōu)化算法,最終我們都是通過(guò)求解代價(jià)函數(shù)的最優(yōu)化問(wèn)題來(lái)求解模型的參數(shù)。有的時(shí)候,訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)模型可能需要幾百上千臺(tái)機(jī)器同時(shí)訓(xùn)練幾個(gè)月,通過(guò)使用優(yōu)化算法可以節(jié)省訓(xùn)練的時(shí)間加快模型的收斂。本篇文章主要介紹一下常用的優(yōu)化算法

  • 梯度下降算法
  • 指數(shù)加權(quán)平均算法
  • 動(dòng)量梯度下降
  • RMSprop算法
  • Adam優(yōu)化算法

常用的優(yōu)化算法在面試的時(shí)候也會(huì)經(jīng)常被問(wèn)到。

一、梯度下降算法

在訓(xùn)練模型之前會(huì)先定義一個(gè)代價(jià)函數(shù),然后通過(guò)不停的迭代訓(xùn)練數(shù)據(jù)利用梯度下降算法來(lái)減少每次迭代的誤差,從而使得代價(jià)函數(shù)最小化。梯度下降算法主要包括三種,隨機(jī)梯度下降、batch梯度下降、mini-batch梯度下降。最常用的是mini-batch梯度下降算法。

  • 隨機(jī)梯度下降
    隨機(jī)梯度下降算法是指在訓(xùn)練模型的時(shí)候,每次迭代只從訓(xùn)練數(shù)據(jù)中隨機(jī)抽取一個(gè)數(shù)據(jù)來(lái)計(jì)算梯度更新模型的參數(shù)。隨機(jī)梯度下降算法永遠(yuǎn)無(wú)法收斂,容易受到噪聲的干擾,訓(xùn)練時(shí)間長(zhǎng),代價(jià)函數(shù)最終會(huì)圍繞全局最小值或者局部極小值震蕩。
  • batch梯度下降
    batch梯度下降算法是指在訓(xùn)練模型的時(shí)候,每次迭代時(shí)使用所有的訓(xùn)練數(shù)據(jù)來(lái)計(jì)算梯度更新模型的參數(shù)。batch梯度下降算法適用于小數(shù)據(jù)集的訓(xùn)練,對(duì)于大數(shù)據(jù)集(大于2000)不太適應(yīng),因?yàn)槊看斡?xùn)練的時(shí)候都要使用所有的訓(xùn)練數(shù)據(jù),會(huì)導(dǎo)致需要消耗大量的內(nèi)存,增加電腦的計(jì)算量,計(jì)算時(shí)間長(zhǎng)。batch梯度下降不容易受到噪聲數(shù)據(jù)的干擾,在迭代的時(shí)候能夠保證向全局最小值或局部極小值的方向進(jìn)行收斂。
  • mini-batch梯度下降
    mini-batch梯度下降算法是指在訓(xùn)練模型的時(shí)候,每次迭代時(shí)會(huì)使用一個(gè)mini-batch數(shù)據(jù)來(lái)計(jì)算梯度更新模型的參數(shù),這個(gè)mini-batch通常取64、128、256、512,通常采用2^n作為一個(gè)mini-batch,符合電腦的內(nèi)存結(jié)構(gòu)在一定程度上可以加快計(jì)算機(jī)的計(jì)算速度,從而減少訓(xùn)練的時(shí)間。mini-batch梯度下降算法是最常用的梯度下降算法,mini-batch對(duì)計(jì)算機(jī)的內(nèi)存要求不高,收斂速度相對(duì)較快,在迭代的時(shí)候不能保證每次迭代都像全局最小值進(jìn)行收斂,但是整體的趨勢(shì)是向全局最小值進(jìn)行收斂的。當(dāng)mini-batch取1時(shí),就變成了隨機(jī)梯度下降算法,當(dāng)mini-batch的大小為整個(gè)訓(xùn)練數(shù)據(jù)集的大小時(shí)就變成了batch梯度下降。

二、指數(shù)加權(quán)平均值

指數(shù)加權(quán)平均值,也被稱為移動(dòng)平均值,從名字可以看出來(lái)它其實(shí)也是一種求平均值的算法,在后面介紹動(dòng)量、RMSProp和Adam的時(shí)候都需要用到它。

  • 指數(shù)加權(quán)平均值計(jì)算方法
    公式: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?表示的是當(dāng)前的指數(shù)加權(quán)平均值,θ\thetaθ表示的是當(dāng)前的值,下面用一個(gè)例子來(lái)詳細(xì)介紹一下指數(shù)加權(quán)平均值的計(jì)算:
    我們有一組網(wǎng)站的訪問(wèn)量數(shù)據(jù):

    其中θ\thetaθ表示的是每天的訪問(wèn)量(萬(wàn)),下面我們來(lái)計(jì)算一下指數(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ù)對(duì)于加權(quán)平均值的影響
    指數(shù)加權(quán)平均值的計(jì)算公式:vn=β?vn?1+(1?β)?θnv_{n}=\beta*v_{n-1}+(1-\beta)*\theta_{n}vn?=β?vn?1?+(1?β)?θn?
    從公式可以看出,當(dāng)β\betaβ越大時(shí)結(jié)果與上一時(shí)刻的指數(shù)加權(quán)平均值vn?1v_{n-1}vn?1?的相關(guān)性越大,與當(dāng)前時(shí)刻θn\theta_{n}θn?相關(guān)性越小,導(dǎo)致的結(jié)果就是指數(shù)加權(quán)平均值無(wú)法更好的反映當(dāng)前的變化趨勢(shì),可能會(huì)導(dǎo)致曲線右移,曲線更平滑。如果當(dāng)β\betaβ越小時(shí),指數(shù)加權(quán)平均值能夠及時(shí)的反映出當(dāng)前的變化趨勢(shì),但是曲線的變化幅度會(huì)比較大。如下圖所示

    上圖中,橫軸表示的是天數(shù),縱軸表示的是溫度。通過(guò)上圖可以發(fā)現(xiàn),其中紅色曲線的β\betaβ為0.9,黃色曲線的β\betaβ小于0.9,綠色曲線的β\betaβ大于0.9,當(dāng)β\betaβ越來(lái)越大時(shí),指數(shù)加權(quán)平均值曲線會(huì)慢慢的向右移動(dòng),反映溫度的變化會(huì)延時(shí),曲線會(huì)越來(lái)平滑。
    指數(shù)加權(quán)平均算法相對(duì)于直接求平均值算法的優(yōu)勢(shì)在于,指數(shù)加權(quán)平均值只需要極小的空間就可以計(jì)算出近似平均值,而直接使用平均值算法需要保存以前所有的數(shù)據(jù),相對(duì)而言指數(shù)加權(quán)平均值的計(jì)算出來(lái)平均值的精度沒(méi)有那么高,它是犧牲了一定的精度來(lái)?yè)Q取空間和速度的。由于它在空間上具有極大的優(yōu)勢(shì),所以應(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??
    通過(guò)上面的公式可以發(fā)現(xiàn),θ\thetaθ的權(quán)重系數(shù)呈現(xiàn)出一個(gè)指數(shù)的變化趨勢(shì)。

    在計(jì)算vnv_{n}vn?的時(shí)候看起來(lái)好像用到了所有的θ\thetaθ平均了之前所有的天數(shù),實(shí)際上只平均了一部分,當(dāng)系數(shù)下降到峰值(1-β)的1/e(0.3678)時(shí)可以忽略不計(jì),其中e(2.71828)表示的是自然常數(shù),即當(dāng)權(quán)重系數(shù)小于峰值的0.3678時(shí),就可以認(rèn)為它對(duì)于結(jié)果沒(méi)有影響。(1??)1/?=1/e(1-\epsilon)^{1/\epsilon}=1/e(1??)1/?=1/e,其中?=(1?β)\epsilon=(1-\beta)?=(1?β),所以當(dāng)β\betaβ等于0.9時(shí),?\epsilon?等于0.1,所以0.9^10=1/e。所以十天以前的θ\thetaθ的影響可以忽略不計(jì),就相當(dāng)于平均了十天的溫度。
  • 偏差修正
    在使用指數(shù)加權(quán)平均算法計(jì)算的時(shí)候存在一個(gè)問(wèn)題就是,剛開(kāi)始使用指數(shù)加權(quán)算法計(jì)算的時(shí)候初始值都是非常小的,偏差修正就是用于修正初始值的。如果你對(duì)于初始值不太關(guān)注,就可以不用使用偏差修正。
    偏差修正公式:vn′=vn1?βnv_{n}^{'}=\frac{v_{n}}{1-\beta^{n}}vn?=1?βnvn??
    當(dāng)n越來(lái)越大時(shí),βn\beta^nβn趨于0,vn′=vnv_{n}^{'}=v_{n}vn?=vn?,所以偏差修正的作用僅在n較小的時(shí)候有用,即初始化的時(shí)候。

三、動(dòng)量梯度下降算法

動(dòng)量梯度下降算法在梯度下降算法的基礎(chǔ)上做了一些優(yōu)化,梯度下降算法的收斂如下圖所示

其中黑點(diǎn)表示的是起點(diǎn),紅點(diǎn)表示的是終點(diǎn)。通過(guò)梯度下降算法不停的迭代,慢慢的從黑點(diǎn)移動(dòng)到紅點(diǎn)的位置,通過(guò)上圖可以發(fā)現(xiàn)黑點(diǎn)的移動(dòng)軌跡在y方向上一直存在上下波動(dòng),而這個(gè)對(duì)于黑點(diǎn)移動(dòng)到紅點(diǎn)的位置沒(méi)有任何的幫助,反而是在浪費(fèi)時(shí)間,因?yàn)槲覀兏M麥p少這種不必要的計(jì)算,加速x軸方向上的移動(dòng)步伐,如下圖所示

而上圖正是動(dòng)量梯度下降算法所追求的效果,那么它到底是如何實(shí)現(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
    動(dòng)量梯度下降算法參數(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í)率,通過(guò)上式可以發(fā)現(xiàn),動(dòng)量梯度下降算法在更新參數(shù)的時(shí)候并不是直接使用的梯度,它還利用到以前的梯度,具體到多少,與β\betaβ的大小有關(guān),β\betaβ越大使用到以前的梯度越多,β\betaβ越小使用到以前的梯度越小。
    因?yàn)樵趛軸方向上梯度是有正有負(fù)的,所以均值就近似為0,即在y軸方向上不會(huì)有太大的變化。而x軸方向上的梯度都是一致的,所以能夠?yàn)閤軸方向上提供動(dòng)量加速更新。由于動(dòng)量梯度下降算法,在更新參數(shù)的時(shí)候不僅使用到了當(dāng)前的梯度還使用到了以前梯度的均值作為動(dòng)量,當(dāng)陷入到局部極小值(梯度接近于0),在更新的時(shí)候動(dòng)量梯度下降算法還可以利用以前梯度的均值來(lái)跳出局部極小值,而梯度下降算法只會(huì)陷入到局部極小值。在使用動(dòng)量梯度下降算法的時(shí)候β\betaβ通常可以取0.9。

四、RMSprop算法

RMSprop算法全稱root mean square prop,RMSprop算法的思想和Moment算法的思想是一致的都是通過(guò)減少在y軸方向上的抖動(dòng),加大x軸方向上的移動(dòng)步長(zhǎng)。而在實(shí)現(xiàn)上略有不同,Moment主要是利用累積以前的梯度來(lái)實(shí)現(xiàn)加速,而RMSprop算法的思想是利用梯度下降算法在y軸方向上的梯度比較大,而在x軸方向上的梯度相對(duì)較小。在進(jìn)行參數(shù)更新的時(shí)候,讓y軸方向上的梯度除以一個(gè)大的數(shù),這樣y軸更新的幅度就小。而x軸方向上的梯度除以一個(gè)小的數(shù),這樣x軸更新的幅度就大。從而實(shí)現(xiàn)了,減小了y軸方向上的更新步長(zhǎng),增大了x軸方向上的更新步長(zhǎng),使得算法能夠更快的收斂。更新公式如下:
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ù)的時(shí)候,分母為0,所以需要在分母上加上一個(gè)極小的數(shù)?\epsilon?,通常取10?810^{-8}10?8dw2dw^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)平均值算法的時(shí)候,可能存在初始化的偏差比較大的情況,可以通過(guò)下面的方法進(jì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ù),通常情況下我們都不會(huì)太注意初始化值,因?yàn)楹瘮?shù)收斂通常都需要迭代很多次。β1\beta_{1}β1?指的是Moment的參數(shù)通常取0.9,β2\beta_{2}β2?指的是RMSprop的參數(shù),通常取0.999,?\epsilon?主要是用來(lái)避免分母為0的情況取10?810^{-8}10?8

六、總結(jié)

最后我們用兩張圖來(lái)比較一下算法的表現(xiàn),這張圖表示的是在同樣的等高線的情況下各個(gè)算法的收斂情況

下面這張圖表示的是不同算法在遇到鞍點(diǎn)時(shí)的表現(xiàn)

總結(jié)

以上是生活随笔為你收集整理的一文搞懂深度学习中常用的优化算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。