深度学习:梯度下降算法改进
學(xué)習(xí)目標(biāo)
- 目標(biāo) - 了解深度學(xué)習(xí)遇到的一些問題
- 知道批梯度下降與MiniBatch梯度下降的區(qū)別
- 知道指數(shù)加權(quán)平均的意義
- 知道動量梯度、RMSProp、Adam算法的公式意義
- 知道學(xué)習(xí)率衰減方式
- 知道參數(shù)初始化策略的意義
 
- 應(yīng)用 - 無
 
深度學(xué)習(xí)難以在大數(shù)據(jù)領(lǐng)域發(fā)揮最大效果的一個原因是,在巨大的數(shù)據(jù)集基礎(chǔ)上進(jìn)行訓(xùn)練速度很慢。而優(yōu)化算法能夠幫助我們快速訓(xùn)練模型,提高計算效率。接下來我么就去看有哪些方法能夠解決我們剛才遇到的問題或者類似的問題
2.2.1 優(yōu)化遇到的問題
- 梯度消失
- 局部最優(yōu)
2.2.1.1 梯度消失
在梯度函數(shù)上出現(xiàn)的以指數(shù)級遞增或者遞減的情況分別稱為梯度爆炸或者梯度消失。
假設(shè)g(z) = z, b^{[l]} = 0g(z)=z,b?[l]??=0,對于目標(biāo)輸出有:\hat{y} = W^{[L]}W^{[L-1]}...W^{[2]}W^{[1]}X?y?^??=W?[L]??W?[L?1]??...W?[2]??W?[1]??X
- 對于W^{[l]}W?[l]??的值大于 1 的情況,激活函數(shù)的值將以指數(shù)級遞增;
- 對于W^{[l]}W?[l]??的值小于 1 的情況,激活函數(shù)的值將以指數(shù)級遞減。
在計算梯度時,根據(jù)不同情況梯度函數(shù)也會以指數(shù)級遞增或遞減,導(dǎo)致訓(xùn)練導(dǎo)數(shù)難度上升,梯度下降算法的步長會變得非常小,需要訓(xùn)練的時間將會非常長。
2.2.1.2 局部最優(yōu)
?
鞍點(saddle)是函數(shù)上的導(dǎo)數(shù)為零,但不是軸上局部極值的點。通常梯度為零的點是上圖所示的鞍點,而非局部最小值。減少損失的難度也來自誤差曲面中的鞍點,而不是局部最低點。
?
- 在訓(xùn)練較大的神經(jīng)網(wǎng)絡(luò)、存在大量參數(shù),并且成本函數(shù)被定義在較高的維度空間時,困在極差的局部最優(yōu)基本不會發(fā)生
- 鞍點附近的平穩(wěn)段會使得學(xué)習(xí)非常緩慢,而這也是需要后面的動量梯度下降法、RMSProp 以及 Adam 優(yōu)化算法能夠加速學(xué)習(xí)的原因,它們能幫助盡早走出平穩(wěn)段。
解決辦法有多種形式,通常會結(jié)合一些形式一起進(jìn)行
-  初始化參數(shù)策略(第一部分第四節(jié)提到) 
-  Mini梯度下降法 
- 梯度下降算法的優(yōu)化
- 學(xué)習(xí)率衰減
2.2.2 參數(shù)初始化策略(復(fù)習(xí))
由于在z={w}_1{x}_1+{w}_2{x}_2 + ... + {w}_n{x}_n + bz=w?1??x?1??+w?2??x?2??+...+w?n??x?n??+b公式中,當(dāng)輸入的數(shù)量n較大時,如果每個w_iw?i??的值都小一些,這樣它們的和得到的zz也會非常大,所以會造成我們之前在第一部分最后一節(jié)當(dāng)中介紹的。所以都會初始化比較小的值。
2.2.3 批梯度下降算法(Batch Gradient Descent)
- 定義:批梯度下降法(btach),即同時處理整個訓(xùn)練集。
其在更新參數(shù)時使用所有的樣本來進(jìn)行更新。對整個訓(xùn)練集進(jìn)行梯度下降法的時候,我們必須處理整個訓(xùn)練數(shù)據(jù)集,然后才能進(jìn)行一步梯度下降,即每一步梯度下降法需要對整個訓(xùn)練集進(jìn)行一次處理,如果訓(xùn)練數(shù)據(jù)集很大的時候,處理速度就會比較慢。
所以換一種方式,每次處理訓(xùn)練數(shù)據(jù)的一部分進(jìn)行梯度下降法,則我們的算法速度會執(zhí)行的更快。
2.2.3.1 Mini-Batch Gradient Descent
- 定義:Mini-Batch 梯度下降法(小批量梯度下降法)每次同時處理固定大小的數(shù)據(jù)集。
不同
- 種類: - mini-batch 的大小為 1,即是隨機(jī)梯度下降法(stochastic gradient descent)
 
使用 Mini-Batch 梯度下降法,對整個訓(xùn)練集的一次遍歷(epoch)只做 mini-batch個樣本的梯度下降,一直循環(huán)整個訓(xùn)練集。
2.2.3.2 批梯度下降與Mini-Batch梯度下降的區(qū)別
batch梯度下降法和Mini-batch 梯度下降法代價函數(shù)的變化趨勢如下:
?
那么對于梯度下降優(yōu)化帶來的影響
2.2.3.3 梯度下降優(yōu)化影響
- batch 梯度下降法: - 對所有 m 個訓(xùn)練樣本執(zhí)行一次梯度下降,每一次迭代時間較長,訓(xùn)練過程慢;
- 相對噪聲低一些,成本函數(shù)總是向減小的方向下降。
 
- 隨機(jī)梯度下降法(Mini-Batch=1): - 對每一個訓(xùn)練樣本執(zhí)行一次梯度下降,訓(xùn)練速度快,但丟失了向量化帶來的計算加速;
- 有很多噪聲,需要適當(dāng)減小學(xué)習(xí)率,成本函數(shù)總體趨勢向全局最小值靠近,但永遠(yuǎn)不會收斂,而是一直在最小值附近波動。
 
?
因此,選擇一個合適的大小進(jìn)行 Mini-batch 梯度下降,可以實現(xiàn)快速學(xué)習(xí),也應(yīng)用了向量化帶來的好處,且成本函數(shù)的下降處于前兩者之間。
2.2.3.4 大小選擇
- 如果訓(xùn)練樣本的大小比較小,如m\le2000m≤2000時,選擇 batch 梯度下降法;
- 如果訓(xùn)練樣本的大小比較大,選擇 Mini-Batch 梯度下降法。為了和計算機(jī)的信息存儲方式相適應(yīng),代碼在 mini-batch 大小為 2 的冪次時運行要快一些。典型的大小為2^6, 2^7,2^8,2^92?6??,2?7??,2?8??,2?9??,mini-batch 的大小要符合 CPU/GPU 內(nèi)存。
需要根據(jù)經(jīng)驗快速嘗試,找到能夠最有效地減少成本函數(shù)的值。
那么第二種方式是通過優(yōu)化梯度下降過程,會比梯度下降算法的速度更快些
2.2.4 指數(shù)加權(quán)平均
指數(shù)加權(quán)平均(Exponentially Weight Average)是一種常用的序列數(shù)據(jù)處理方式,通常用在序列場景如金融序列分析、溫度變化序列分析。
假設(shè)給定一個序列,例如北京一年每天的氣溫值,圖中藍(lán)色的點代表真實數(shù)據(jù)。
?
那么這樣的氣溫值變化可以理解成優(yōu)化的過程波動較大,異常較多。那么怎么平緩一些呢,這時候就要用到加權(quán)平均值了,如指數(shù)加權(quán)平均值。首先看一些效果。
?
這條紅線怎么計算出來?通過指數(shù)加權(quán)的公式即:
S_t = \begin{cases} Y_1, &t = 1 \\ \beta S_{t-1} + (1-\beta)Y_t, &t > 1 \end{cases}S?t??={?Y?1??,?βS?t?1??+(1?β)Y?t??,???t=1?t>1??
其中Y_{t}Y?t??為 t 下的實際值,S_{t}S?t??為t下加權(quán)平均后的值,\betaβ為權(quán)重值。
上圖的紅線中,\betaβ為0.9, 那么第一天的溫度,第二天的溫度,第三天的溫度計算為?S_{1} = Y1S?1??=Y1
S_{2} = 0.9 S_{1} + 0.1 Y_{2}S?2??=0.9S?1??+0.1Y?2??
......
S_{99} = 0.9 S_{98} + 0.1 Y_{99}S?99??=0.9S?98??+0.1Y?99??
S_{100} = 0.9 S_{99} + 0.1 Y_{100}S?100??=0.9S?99??+0.1Y?100??
......
假設(shè)就100天,那么合并的結(jié)果S_{100} = 0.1 Y_{100} + 0.1 * 0.9 Y_{99} + 0.1 * {(0.9)}^2 Y_{98} + {...}S?100??=0.1Y?100??+0.1?0.9Y?99??+0.1?(0.9)?2??Y?98??+...
下圖中,當(dāng)取權(quán)重值 β=0.98 時,可以得到圖中更為平滑的綠色曲線。而當(dāng)取權(quán)重值\betaβ=0.5 時,得到圖中噪點更多的黃色曲線。\betaβ越大相當(dāng)于求取平均利用的天數(shù)越多,曲線自然就會越平滑而且越滯后。這些系數(shù)被稱作偏差修正(Bias Correction)**
?
?
?
上述點數(shù)據(jù),我們是否可以理解成梯度下降的過程,每一迭代優(yōu)化計算出來的梯度值,
2.2.5 動量梯度下降法
動量梯度下降(Gradient Descent with Momentum)是計算梯度的指數(shù)加權(quán)平均數(shù),并利用該值來更新參數(shù)值。動量梯度下降法的整個過程為:
S_{dW^{[l]}} = \beta S_{dW^{[l]}} + (1 - \beta) dW^{[l]}S?dW?[l]????=βS?dW?[l]????+(1?β)dW?[l]??
S_{db^{[l]}} = \beta S_{db^{[l]}} + (1 - \beta) db^{[l]}S?db?[l]????=βS?db?[l]????+(1?β)db?[l]??
W^{[l]} := W^{[l]} - \alpha S_{dW^{[l]}}W?[l]??:=W?[l]???αS?dW?[l]????
b^{[l]} := b^{[l]} - \alpha S_{db^{[l]}}b?[l]??:=b?[l]???αS?db?[l]????
那么這樣梯度下降過程會有什么變化,如下圖所示:
?
使用動量梯度下降時,通過累加過去的梯度值來減少抵達(dá)最小值路徑上的波動,加速了收斂,因此在橫軸方向下降得更快,從而得到圖中紅色或者紫色的曲線。當(dāng)前后梯度方向一致時,動量梯度下降能夠加速學(xué)習(xí);而前后梯度方向不一致時,動量梯度下降能夠抑制震蕩。
我們可以這樣形象的理解,小球在向下運動過程中會有加速度,導(dǎo)致越來越快,由于\betaβ的存在使得不會一直加速運行。
2.2.6 RMSProp 算法
RMSProp(Root Mean Square Prop)算法是在對梯度進(jìn)行指數(shù)加權(quán)平均的基礎(chǔ)上,引入平方和平方根。
s_{dw} = \beta s_{dw} + (1 - \beta)(dw)^2s?dw??=βs?dw??+(1?β)(dw)?2??
s_{db} = \beta s_{db} + (1 - \beta)(db)^2s?db??=βs?db??+(1?β)(db)?2??
w := w - \alpha \frac{dw}{\sqrt{s_{dw} + \epsilon}}w:=w?α?√?s?dw??+??????dw??
b := b - \alpha \frac{db}{\sqrt{s_{db} + \epsilon}}b:=b?α?√?s?db??+??????db??
其中\(zhòng)epsilon?是一個非常小的數(shù),防止分母太小導(dǎo)致不穩(wěn)定,當(dāng) dw 或 db 較大時,(dw)^{2}, (db)^{2}(dw)?2??,(db)?2??會較大,進(jìn)而s_dws?d??w也會較大,最終使得\frac{db}{\sqrt{s_{db} + \epsilon}}?√?s?db??+??????db??等結(jié)果變得非常小。
最終RMSProp 有助于減少抵達(dá)最小值路徑上的擺動,并允許使用一個更大的學(xué)習(xí)率 α,從而加快算法學(xué)習(xí)速度。
2.2.7 Adam算法
Adam 優(yōu)化算法(Adaptive Moment Estimation,自適應(yīng)矩估計)將 Momentum 和 RMSProp 算法結(jié)合在一起。
假設(shè)用每一個 mini-batch 計算 dW、db,第tt次迭代時:
v_{dW} = \beta_1 v_{dW} + (1 - \beta_1) dWv?dW??=β?1??v?dW??+(1?β?1??)dW
v_{db} = \beta_1 v_{db} + (1 - \beta_1) dbv?db??=β?1??v?db??+(1?β?1??)db
v^{corrected}_{dW^{[l]}} = \frac{v_{dW^{[l]}}}{1 - (\beta_1)^t}v?dW?[l]???corrected??=?1?(β?1??)?t????v?dW?[l]??????
s_{dW} = \beta_2 s_{dW} + (1 - \beta_2) {(dW)}^2s?dW??=β?2??s?dW??+(1?β?2??)(dW)?2??
s_{db} = \beta_2 s_{db} + (1 - \beta_2) {(db)}^2s?db??=β?2??s?db??+(1?β?2??)(db)?2??
s^{corrected}_{dW^{[l]}} = \frac{s_{dW^{[l]}}}{1 - (\beta_1)^t}s?dW?[l]???corrected??=?1?(β?1??)?t????s?dW?[l]??????
其中l(wèi)l為某一層,tt為移動平均第次的值
Adam 算法的參數(shù)更新:
?
2.2.8 TensorFlow Adam算法API
- tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999,epsilon=1e-08,name='Adam')
Adam 優(yōu)化算法有很多的超參數(shù):
- 學(xué)習(xí)率\alphaα:需要嘗試一系列的值,來尋找比較合適的
- β1:常用的缺省值為 0.9
- β2:Adam 算法的作者建議為 0.999
- ?:Adam 算法的作者建議為epsilon的默認(rèn)值1e-8
注:β1、β2、? 通常不需要調(diào)試
2.2.9 學(xué)習(xí)率衰減
如果設(shè)置一個固定的學(xué)習(xí)率 α
- 在最小值點附近,由于不同的 batch 中存在一定的噪聲,因此不會精確收斂,而是始終在最小值周圍一個較大的范圍內(nèi)波動。
- 如果隨著時間慢慢減少學(xué)習(xí)率 α 的大小,在初期 α 較大時,下降的步長較大,能以較快的速度進(jìn)行梯度下降;而后期逐步減小 α 的值,即減小步長,有助于算法的收斂,更容易接近最優(yōu)解。
最常用的學(xué)習(xí)率衰減方法:\alpha = \frac{1}{1 + decay\_rate * epoch\_num} * \alpha_0α=?1+decay_rate?epoch_num??1???α?0??
其中,decay_rate為衰減率(超參數(shù)),epoch_num為將所有的訓(xùn)練樣本完整過一遍的次數(shù)。
還有一種指數(shù)衰減
- \alpha = 0.95^{epoch\_num} * \alpha_0α=0.95?epoch_num???α?0??
對于大型的數(shù)據(jù)模型,需要使用這些方式去自動進(jìn)行學(xué)習(xí)率衰減。而一些小型網(wǎng)絡(luò)可以直接手動進(jìn)行調(diào)整
那么最后我們來看一張動態(tài)度,表示不同優(yōu)化的算法的效果圖
?
2.2.10 其它非算法優(yōu)化的方式-標(biāo)準(zhǔn)化輸入
對網(wǎng)絡(luò)輸入的特征進(jìn)行標(biāo)準(zhǔn)化,能夠緩解梯度消失或者梯度爆炸
- 標(biāo)準(zhǔn)化公式: - x = \frac{x - \mu}{\sigma}x=?σ??x?μ??
 
這個公式其實與特征工程中的處理是一樣的,\muμ為平均值,\sigmaσ為標(biāo)準(zhǔn)差。標(biāo)準(zhǔn)化的目的是所有特征的平均值為0,標(biāo)準(zhǔn)差為1。這屬于機(jī)器學(xué)習(xí)基本的內(nèi)容不過多進(jìn)行敘述。
?
?
那么這種有什么好處?主要是對于損失函數(shù)帶來的好處.
- 標(biāo)準(zhǔn)化前的損失函數(shù)
?
- 標(biāo)準(zhǔn)化后的損失函數(shù)
?
這樣的話,對于梯度下降無論從哪個位置開始迭代,都能以相對較少的迭代次數(shù)找到全局最優(yōu)解。可以加速網(wǎng)絡(luò)的學(xué)習(xí)。
理解這個原理,其實還是最初的這樣的公式:z={w}_1{x}_1+{w}_2{x}_2 + ... + {w}_n{x}_n + bz=w?1??x?1??+w?2??x?2??+...+w?n??x?n??+b
如果激活函數(shù)的輸入X近似設(shè)置成均值為 0,標(biāo)準(zhǔn)方差為 1,神經(jīng)元輸出 z 的方差就正則化到1了。雖然沒有解決梯度消失和爆炸的問題,但其在一定程度上確實減緩了梯度消失和爆炸的速度。
2.2.11 總結(jié)
-  掌握參數(shù)初始化策略的優(yōu)點 
-  掌握Mini-batch的特點以及優(yōu)勢 
- 掌握梯度下降算法優(yōu)化的目的以及效果 - 掌握指數(shù)移動平均值的好處
- 掌握動量梯度下降法的優(yōu)點以及RMSProp、Adam的特點
- 掌握學(xué)習(xí)率衰減方式
 
- 掌握標(biāo)準(zhǔn)化輸入帶來的網(wǎng)絡(luò)學(xué)習(xí)速度的提升
總結(jié)
以上是生活随笔為你收集整理的深度学习:梯度下降算法改进的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 在Lumen中引入钉钉SDK
- 下一篇: 深度学习正则化
