花書《深度學(xué)習(xí)》《Deep Learning》學(xué)習(xí)筆記chapter 6

第6章在泛泛而談,初學(xué)者感覺很難了解到實(shí)際性的東西,不過也根據(jù)章節(jié)結(jié)構(gòu)結(jié)合相關(guān)資料做下梳理。

6.1 XOR

**

6.2 基于梯度的學(xué)習(xí)

參考鏈接:An overview of gradient descent optimization algorithms

梯度下降法:

擬合函數(shù):h(x)

損失函數(shù)J(\theta)

梯度:\frac{\partial{J(\theta)}}{\partial\theta}

迭代過程:沿著負(fù)梯度方向更新參數(shù)\theta = \theta - \alpha*\frac{\partial{J(\theta)}}{\partial\theta},其中\alpha為學(xué)習(xí)率(learning rate)或稱步長,直到達(dá)到終止條件。

(1)三種梯度下降變體

a.全量梯度下降法(Batch gradient descent)

采用全部訓(xùn)練樣本更新參數(shù)

for i in range ( nb_epochs ): # nb_epochs 為最大迭代次數(shù)
    params_grad = evaluate_gradient ( loss_function , data , params )
    params = params - learning_rate * params_grad

使用全部訓(xùn)練集,可以保證每次更新都會(huì)朝著正確的方向進(jìn)行,最后收斂于極值點(diǎn);但是學(xué)習(xí)時(shí)間太長,計(jì)算冗余且不能進(jìn)行在線模型參數(shù)更新。

b.隨機(jī)梯度下降法(Stochastic gradient descent)

每次從訓(xùn)練樣本中隨機(jī)取一個(gè)樣本來更新參數(shù)

for i in range ( nb_epochs ):
    np.random.shuffle( data )
    for example in data :
        params_grad = evaluate_gradient ( loss_function , example , params )
        params = params - learning_rate * params_grad

計(jì)算速度快,但每次更新不一定會(huì)按照正確的方向進(jìn)行,造成擾動(dòng),使得迭代次數(shù)增多,即收斂速度變慢,最終會(huì)收斂于極值點(diǎn)。

c.批量梯度下降(Mini-batch gradient descent)

每次從所有的訓(xùn)練樣本中選取一部分樣本來更新模型參數(shù)。

for i in range ( nb_epochs ):
    np.random.shuffle( data )
    for batch in get_batches ( data , batch_size =50):
        params_grad = evaluate_gradient ( loss_function , batch , params )
        params = params - learning_rate * params_grad

相對(duì)于SGD,更新過程更加穩(wěn)定;相對(duì)于全量梯度下降,學(xué)習(xí)速度加快。

(2)挑戰(zhàn)

  • 選擇合適的learning rate.lr過小,收斂速度太慢;lr過大,會(huì)出現(xiàn)在極值點(diǎn)附近震蕩


    來源:http://cs231n.github.io/neural-networks-3/
  • learnig rate schedules。目的是每次在更新參數(shù)時(shí)改變其學(xué)習(xí)速率。pytorch的learning rate schedule:LambdaLR,StepLR,MultiStepLR,ExponentialLR,CosineAnnealingLR,ReduceLROnPlateau

  • 模型的參數(shù)更新都是使用相同的學(xué)習(xí)速率。如果數(shù)據(jù)特征相對(duì)稀疏或者每個(gè)特征有著不同的分布,我們并不希望對(duì)所有參數(shù)適用相同的學(xué)習(xí)速率,對(duì)某些幾乎很少出現(xiàn)的特征用較大的學(xué)習(xí)速率。

  • 對(duì)于非凸目標(biāo)函數(shù),容易陷入局部極小值。在神經(jīng)網(wǎng)絡(luò)的過程中,要盡量避免這個(gè)問題。但Dauphin在《Identifying and attacking the saddle point problem in high-dimensional non-convex optimization》指出更嚴(yán)重的是鞍點(diǎn)(saddle point)(鞍點(diǎn)處的梯度為零,鞍點(diǎn)通常被相同誤差值的平面所包圍(這個(gè)平面又叫Plateaus,Plateaus是梯度接近于零的平緩區(qū)域,會(huì)降低神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)速度)。高位特征空間中這個(gè)鞍點(diǎn)附近的平坦區(qū)域范圍可能非常大,這使得SGD算法很難脫離區(qū)域,即可能會(huì)長時(shí)間卡在該點(diǎn)附近(因?yàn)樘荻仍谒芯S度上接近于零))

(3)梯度下降優(yōu)化算法(Gradient descent optimization algorithms)

a.Momentum

沖量梯度下降法就是在原來的梯度上加上了沖量(積累量)。個(gè)人理解就是當(dāng)梯度與沖量方向一致時(shí),增加參數(shù)更新的增量,加快了收斂;當(dāng)梯度與沖量方向不一致時(shí),減少了增量,使得參數(shù)更新過程的震蕩減少。本質(zhì)上與SGD沒有區(qū)別。
v_t = \gamma v_{t-1}+\eta \nabla_{\theta}J(\theta)
\theta = \theta - v_t

有無沖量的參數(shù)更新過程

b.Nesterov accelerated gradient

NAG比Momentum的速度更快,因?yàn)榘言瓉碛?jì)算\nabla_{\theta}J(\theta)換成計(jì)算\nabla_{\theta}J(\theta-\gamma v_{t-1}),就是在提前計(jì)算了下一個(gè)梯度。
v_t = \gamma v_{t-1}+\eta \nabla_{\theta}J(\theta-\gamma v_{t-1})
\theta = \theta - v_t

c.Adagrad

前面的兩種方法,在更新參數(shù)時(shí),學(xué)習(xí)速率\eta并沒有發(fā)生變化。Adagrad是一種自適應(yīng)學(xué)習(xí)速率的梯度優(yōu)化算法。對(duì)于更新頻繁的參數(shù),學(xué)習(xí)速率會(huì)較小,對(duì)于更新不頻繁的參數(shù),學(xué)習(xí)速率會(huì)較大,挺適合處理適合處理稀疏特征數(shù)據(jù)。

\theta_{t+1} = \theta_{t}-\frac{\eta}{\sqrt{G_t+\epsilon}}\odot g_t

G_t是個(gè)對(duì)角矩陣,其中第i行的對(duì)角元素e_{ii}為過去到當(dāng)前第i個(gè)參數(shù)\theta_i的梯度的平方和,\epsilon為平滑參數(shù),避免分母為0,通常取1e-8。開根號(hào)只是為了優(yōu)化下算法性能。

從公式可以看出,G_t的對(duì)角元素的值是不斷累加的,學(xué)習(xí)速率衰減很快。為了避免學(xué)習(xí)速率衰減過快的問題,提出Adadelta算法

d.Adadelta

學(xué)習(xí)率衰減的分母采用梯度平方的移動(dòng)平均。

得到

E[g^2]_t = \gamma E[g_{t-1}^2]+(1-\gamma)g_t^2

\theta_{t+1} = \theta_{t}-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}\odot g_t

上式有個(gè)問題在于\eta\theta的單位不匹配,故采用參數(shù)更新的平方的移動(dòng)平均來替代學(xué)習(xí)率。

得到

E[\triangle \theta^2 ]_t = \gamma E[\triangle \theta_{t-1}^2]+(1-\gamma)\triangle \theta_t^2

\theta_{t+1} = \theta_{t}-\frac{\sqrt{E[\triangle \theta^2 ]_{t-1}}}{\sqrt{E[g^2]_t+\epsilon}}\odot g_t(當(dāng)前\triangle \theta_t未知)

e.RMSprop

RMSprop其實(shí)就是Adadelta的中間形式,即

\theta_{t+1} = \theta_{t}-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}\odot g_t

f.Adam

Adam算法式結(jié)合了RMSprop和Momentum,即

m_t = \beta_1m_{t-1}+(1-\beta_1)g_t

v_t = \beta_2v_{t-1}+(1-\beta_2)g_t^2

在進(jìn)行偏差修正。(可以了解下指數(shù)加權(quán)平均的偏差修正(Bias correction in exponentially weighted averages)),得到:

\overset{\wedge}{m_t} = \frac{m_t}{1-\beta_1^t}

\overset{\wedge}{v_t} = \frac{v_t}{1-\beta_2^t}

最終得到參數(shù)的更新公式為:

\theta_{t+1} = \theta_t-\frac{\eta}{\sqrt{\overset{\wedge}{v_t}}+\epsilon}\odot\overset{\wedge}{m_t}

g.AdaMax

v_t中的g_t^2就相當(dāng)于對(duì)g_tL^2范數(shù),將其泛化到L^p范數(shù)。雖然當(dāng)p值較大時(shí),數(shù)值會(huì)變得不穩(wěn)定。但當(dāng)p—>\infty時(shí),得到:

u_t = \beta_2^{\infty}v_{t-1}+(1-\beta_2)|g_t|^{\infty}

=max(\beta_2v_{t-1},|g_t|)

u_t替代Adam中的\sqrt{\overset{\wedge}{v_t}}+\epsilon得到

\theta_{t+1} = \theta_t-\frac{\eta}{u_t}\odot\overset{\wedge}{m_t}

h.Nadam

借鑒Adam和NAG算法

先看下NAG算法,在提前計(jì)算下一個(gè)梯度,即\nabla J(\theta-\gamma m_{t-1})

m_t = \gamma m_{t-1}+\eta \nabla_{\theta}J(\theta-\gamma m_{t-1})
\theta = \theta - m_t

Nadam中把這種“先見之明”的思想用到了對(duì)參數(shù)\theta的更新上,可以看下這個(gè)過程:

m_t = \gamma m_{t-1}+\eta \nabla_{\theta}J(\theta)
\theta = \theta - (\gamma m_t+\eta g_t) , g_t=\nabla_{\theta}J(\theta)

先記下這個(gè)“先見之明”,之后會(huì)用到

回顧Adam的公式

\theta_{t+1} = \theta_t-\frac{\eta}{\sqrt{\overset{\wedge}{v_t}}+\epsilon}\overset{\wedge}{m_t},拆分\overset{\wedge}{m_t}得到,

\theta_{t+1} = \theta_t-\frac{\eta}{\sqrt{\overset{\wedge}{v_t}}+\epsilon}\frac{ \beta_1m_{t-1}+(1-\beta_1)g_t}{1-\beta_1^t}

=\theta_t-\frac{\eta}{\sqrt{\overset{\wedge}{v_t}}+\epsilon}(\overset{\wedge}{m}_{t-1}+\frac{ (1-\beta_1)g_t}{1-\beta_1^t})

應(yīng)用下“先見之明”,Nadam對(duì)參數(shù)的更新為
\theta_{t+1}= \theta_t-\frac{\eta}{\sqrt{\overset{\wedge}{v_t}}+\epsilon}(\overset{\wedge}{m}_{t}+\frac{ (1-\beta_1)g_t}{1-\beta_1^t})

來一張現(xiàn)成的圖對(duì)比下上文提到的幾個(gè)梯度:


來源:http://cs231n.github.io/neural-networks-3/,原地址是動(dòng)圖

從左圖中可以看到,SGD很慢,但會(huì)往正確的方向前進(jìn),Momentum和NAG速度較快,但有很大的偏離,NAG由于提前預(yù)估下一梯度的位置,因此對(duì)偏離的響應(yīng)會(huì)快一點(diǎn)。而 Adagrad、Adadelta與RMSprop由于具有自適應(yīng)學(xué)習(xí)率的能力,能夠快速在正確的方向上得到收斂。
從右圖可以看出,SGD基本就在鞍點(diǎn)附近震蕩,很難脫離鞍點(diǎn)。而Momentum和NAG本質(zhì)沒有自適應(yīng)學(xué)習(xí)率,一開始仍然在鞍點(diǎn)附近震蕩,但由于速度會(huì)比SGD快,蕩久了然后脫離了鞍點(diǎn)。其他三種Adagrad、Adadelta與RMSprop很快脫離了鞍點(diǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容