第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)練集肴盏,可以保證每次更新都會朝著正確的方向進(jìn)行科盛,最后收斂于極值點(diǎn);但是學(xué)習(xí)時間太長菜皂,計算冗余且不能進(jìn)行在線模型參數(shù)更新贞绵。
b.隨機(jī)梯度下降法(Stochastic gradient descent)
每次從訓(xùn)練樣本中隨機(jī)取一個樣本來更新參數(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ìn)行恍飘,造成擾動榨崩,使得迭代次數(shù)增多,即收斂速度變慢章母,最終會收斂于極值點(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
相對于SGD乳怎,更新過程更加穩(wěn)定彩郊;相對于全量梯度下降,學(xué)習(xí)速度加快蚪缀。
(2)挑戰(zhàn)
-
選擇合適的learning rate.lr過小秫逝,收斂速度太慢;lr過大椿胯,會出現(xiàn)在極值點(diǎn)附近震蕩
learnig rate schedules筷登。目的是每次在更新參數(shù)時改變其學(xué)習(xí)速率。pytorch的learning rate schedule:LambdaLR,StepLR,MultiStepLR,ExponentialLR,CosineAnnealingLR,ReduceLROnPlateau
模型的參數(shù)更新都是使用相同的學(xué)習(xí)速率哩盲。如果數(shù)據(jù)特征相對稀疏或者每個特征有著不同的分布前方,我們并不希望對所有參數(shù)適用相同的學(xué)習(xí)速率狈醉,對某些幾乎很少出現(xiàn)的特征用較大的學(xué)習(xí)速率。
對于非凸目標(biāo)函數(shù)惠险,容易陷入局部極小值苗傅。在神經(jīng)網(wǎng)絡(luò)的過程中,要盡量避免這個問題班巩。但Dauphin在《Identifying and attacking the saddle point problem in high-dimensional non-convex optimization》指出更嚴(yán)重的是鞍點(diǎn)(saddle point)(鞍點(diǎn)處的梯度為零渣慕,鞍點(diǎn)通常被相同誤差值的平面所包圍(這個平面又叫Plateaus,Plateaus是梯度接近于零的平緩區(qū)域抱慌,會降低神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)速度)逊桦。高位特征空間中這個鞍點(diǎn)附近的平坦區(qū)域范圍可能非常大,這使得SGD算法很難脫離區(qū)域抑进,即可能會長時間卡在該點(diǎn)附近(因?yàn)樘荻仍谒芯S度上接近于零))
(3)梯度下降優(yōu)化算法(Gradient descent optimization algorithms)
a.Momentum
沖量梯度下降法就是在原來的梯度上加上了沖量(積累量)强经。個人理解就是當(dāng)梯度與沖量方向一致時,增加參數(shù)更新的增量寺渗,加快了收斂匿情;當(dāng)梯度與沖量方向不一致時,減少了增量信殊,使得參數(shù)更新過程的震蕩減少炬称。本質(zhì)上與SGD沒有區(qū)別。
b.Nesterov accelerated gradient
NAG比Momentum的速度更快涡拘,因?yàn)榘言瓉碛嬎?img class="math-inline" src="https://math.jianshu.com/math?formula=%5Cnabla_%7B%5Ctheta%7DJ(%5Ctheta)" alt="\nabla_{\theta}J(\theta)" mathimg="1">換成計算玲躯,就是在提前計算了下一個梯度。
c.Adagrad
前面的兩種方法鲸伴,在更新參數(shù)時府蔗,學(xué)習(xí)速率并沒有發(fā)生變化晋控。Adagrad是一種自適應(yīng)學(xué)習(xí)速率的梯度優(yōu)化算法汞窗。對于更新頻繁的參數(shù),學(xué)習(xí)速率會較小赡译,對于更新不頻繁的參數(shù)仲吏,學(xué)習(xí)速率會較大,挺適合處理適合處理稀疏特征數(shù)據(jù)蝌焚。
是個對角矩陣裹唆,其中第i行的對角元素為過去到當(dāng)前第i個參數(shù)的梯度的平方和,為平滑參數(shù),避免分母為0只洒,通常取1e-8许帐。開根號只是為了優(yōu)化下算法性能。
從公式可以看出毕谴,的對角元素的值是不斷累加的成畦,學(xué)習(xí)速率衰減很快距芬。為了避免學(xué)習(xí)速率衰減過快的問題,提出Adadelta算法
d.Adadelta
學(xué)習(xí)率衰減的分母采用梯度平方的移動平均循帐。
得到
上式有個問題在于和的單位不匹配框仔,故采用參數(shù)更新的平方的移動平均來替代學(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)于對的范數(shù)跛梗,將其泛化到范數(shù)。雖然當(dāng)p值較大時棋弥,數(shù)值會變得不穩(wěn)定茄袖。但當(dāng)p—>時,得到:
=
用替代Adam中的得到
h.Nadam
借鑒Adam和NAG算法
先看下NAG算法嘁锯,在提前計算下一個梯度宪祥,即
Nadam中把這種“先見之明”的思想用到了對參數(shù)的更新上,可以看下這個過程:
,
先記下這個“先見之明”家乘,之后會用到
回顧Adam的公式
蝗羊,拆分得到,
=
應(yīng)用下“先見之明”,Nadam對參數(shù)的更新為
來一張現(xiàn)成的圖對比下上文提到的幾個梯度:
從左圖中可以看到仁锯,SGD很慢耀找,但會往正確的方向前進(jìn),Momentum和NAG速度較快业崖,但有很大的偏離野芒,NAG由于提前預(yù)估下一梯度的位置,因此對偏離的響應(yīng)會快一點(diǎn)双炕。而 Adagrad狞悲、Adadelta與RMSprop由于具有自適應(yīng)學(xué)習(xí)率的能力,能夠快速在正確的方向上得到收斂妇斤。
從右圖可以看出摇锋,SGD基本就在鞍點(diǎn)附近震蕩,很難脫離鞍點(diǎn)站超。而Momentum和NAG本質(zhì)沒有自適應(yīng)學(xué)習(xí)率荸恕,一開始仍然在鞍點(diǎn)附近震蕩,但由于速度會比SGD快死相,蕩久了然后脫離了鞍點(diǎn)融求。其他三種Adagrad、Adadelta與RMSprop很快脫離了鞍點(diǎn)算撮。