第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ù):
損失函數(shù)
梯度:
迭代過程:沿著負(fù)梯度方向更新參數(shù)
,其中
為學(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ū)別。

b.Nesterov accelerated gradient
NAG比Momentum的速度更快,因?yàn)榘言瓉碛?jì)算換成計(jì)算
,就是在提前計(jì)算了下一個(gè)梯度。
c.Adagrad
前面的兩種方法,在更新參數(shù)時(shí),學(xué)習(xí)速率并沒有發(fā)生變化。Adagrad是一種自適應(yīng)學(xué)習(xí)速率的梯度優(yōu)化算法。對(duì)于更新頻繁的參數(shù),學(xué)習(xí)速率會(huì)較小,對(duì)于更新不頻繁的參數(shù),學(xué)習(xí)速率會(huì)較大,挺適合處理適合處理稀疏特征數(shù)據(jù)。
是個(gè)對(duì)角矩陣,其中第i行的對(duì)角元素
為過去到當(dāng)前第i個(gè)參數(shù)
的梯度的平方和,
為平滑參數(shù),避免分母為0,通常取1e-8。開根號(hào)只是為了優(yōu)化下算法性能。
從公式可以看出,的對(duì)角元素的值是不斷累加的,學(xué)習(xí)速率衰減很快。為了避免學(xué)習(xí)速率衰減過快的問題,提出Adadelta算法
d.Adadelta
學(xué)習(xí)率衰減的分母采用梯度平方的移動(dòng)平均。
得到
上式有個(gè)問題在于和
的單位不匹配,故采用參數(shù)更新的平方的移動(dòng)平均來替代學(xué)習(xí)率。
得到
(當(dāng)前
未知)
e.RMSprop
RMSprop其實(shí)就是Adadelta的中間形式,即
f.Adam
Adam算法式結(jié)合了RMSprop和Momentum,即
在進(jìn)行偏差修正。(可以了解下指數(shù)加權(quán)平均的偏差修正(Bias correction in exponentially weighted averages)),得到:
最終得到參數(shù)的更新公式為:
g.AdaMax
中的
就相當(dāng)于對(duì)
的
范數(shù),將其泛化到
范數(shù)。雖然當(dāng)p值較大時(shí),數(shù)值會(huì)變得不穩(wěn)定。但當(dāng)p—>
時(shí),得到:
=
用替代Adam中的
得到
h.Nadam
借鑒Adam和NAG算法
先看下NAG算法,在提前計(jì)算下一個(gè)梯度,即
Nadam中把這種“先見之明”的思想用到了對(duì)參數(shù)的更新上,可以看下這個(gè)過程:
,
先記下這個(gè)“先見之明”,之后會(huì)用到
回顧Adam的公式
,拆分
得到,
=
應(yīng)用下“先見之明”,Nadam對(duì)參數(shù)的更新為
來一張現(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)。

