第六章 優(yōu)化算法

1.Mini-batch梯度下降法

????????機(jī)器學(xué)習(xí)的應(yīng)用是高度依賴經(jīng)驗的過程,伴隨著大量迭代的過程,你需要訓(xùn)練諸多模型,才能找到合適的那一個。優(yōu)化算法能夠幫助你快速訓(xùn)練模型。

????????深度學(xué)習(xí)沒有在大數(shù)據(jù)領(lǐng)域發(fā)揮最大的效果,現(xiàn)在很容易去獲取大數(shù)據(jù)集,但在大數(shù)據(jù)集基礎(chǔ)上訓(xùn)練速度很慢,需要使用快速的優(yōu)化算法,大大提高個人和團(tuán)隊的效率。

圖6.1 batch和mini-batch對比? ? ??

????????之前介紹過,向量化能有效地同時對m個例子進(jìn)行計算,允許同時去處理整個訓(xùn)練集,而不需要不斷for循環(huán)很緩慢去計算。即是把訓(xùn)練樣本放入一個大矩陣中X=[x^{(1)}x^{(2)}x^{(m)}],把標(biāo)簽也放入一個大矩陣Y=[y^{(1)}y^{(2)}y^{(m)}]。

????????向量化能夠相對較快的去處理所有的m個樣本,但是m很大的話,處理速度仍然緩慢。比如有500萬個樣本,你需要處理完500萬個樣本后才能進(jìn)行下一步梯度下降。

????????我們可以先向量化處理部分樣本,到下一步梯度下降再向量化處理另外部分樣本,這樣梯度下降算法收斂速度就會很快。

????????把訓(xùn)練集分割成小一點的訓(xùn)練集,這些子集就是mini-batch。假設(shè)每個子集大小是1000個樣本,則X^{\{1 \}}=[x^{(1)}x^{(2)}x^{(1000)}]為第一個子集,X^{\{2\}}= [x^{(1001)}x^{(1002)}x^{(2000)}]為第二個子集等,維數(shù)為(n_x,1000);標(biāo)簽也類似分割,Y^{\{1 \}}=[Y^{(1)}Y^{(2)}Y^{(1000)}],Y^\{{2 \}}=[Y^{(1001)}Y^{(1002)}Y^{(2000)}],維數(shù)為(1,1000)。

????????統(tǒng)一符號:x^{(i)}表示第i個樣本,z^{[l]}表示第l層的z值,X{\{t \}}表示第t個mini-batch。

圖6.2 mini-batch完整過程? ? ??

????????如圖6.2,mini-batch完整過程為:

????????假設(shè)5000萬樣本,每個mini-batch為1000,總迭代數(shù)為50,

????????for in?range(0,50):

??????? ????for j?in?range(0,5000):????

???????????????? 步驟1:是向量化梯度下降

???????????????? 步驟2:是計算成本函數(shù)

???????????????? 步驟3:是反向計算

????????其實,mini-batch比batch多了for j?in?range(0,5000):這一步而已,每一次迭代batch就一次梯度下降,而mini-batch有5000次梯度下降。

2.理解Mini-batch梯度下降法

圖6.3 batch和mini-batch成本函數(shù)坐標(biāo)對比

????????在batch中,每次梯度下降都對應(yīng)全部訓(xùn)練集,成本函數(shù)值肯定是伴隨著迭代逐漸減少,如果出現(xiàn)增大那么算法肯定有問題,比如設(shè)置學(xué)習(xí)率過大。而在mini-batch中,每次梯度下降不是對應(yīng)全部訓(xùn)練集,每個子集都不一樣從而計算出的成本函數(shù)結(jié)果會不同,即會產(chǎn)生噪聲,成本函數(shù)值會出現(xiàn)忽高忽低,波動下降,但總體走勢是向下的。

圖6.4 設(shè)置mini-batch大小

????????如圖6.4,先說兩個極端,

????????當(dāng)mini-batch尺寸為m時,那么mini-batch就變成batch,梯度下降線路基本是順滑往前的(藍(lán)色);

????????當(dāng)mini-batch尺寸為1時,每個樣本就是一個子集,這樣會有很大噪聲(可以減少學(xué)習(xí)率減少噪聲),梯度下降線路就會曲曲折折很難收斂(紫色),這樣做就失去了向量化帶來的加速,效率過于低下;

????????在實踐中應(yīng)該選擇不大不小的mini-batch尺寸,這樣既可以得到向量化的加速,還不用每次迭代都計算全部訓(xùn)練集。

????????關(guān)于mini-batch尺寸的選擇:

????????如果訓(xùn)練集很?。?lt;2000樣本),就直接使用batch梯度下降;對于大的訓(xùn)練集則根據(jù)計算機(jī)內(nèi)存選擇mini-batch尺寸64(2^6)、128(2^7)、256(2^8)、512(2^9)。

3.指數(shù)加權(quán)平均

????????還有幾種可以加快訓(xùn)練模型的優(yōu)化方法,在這之前,先介紹下指數(shù)加權(quán)平均(統(tǒng)計學(xué)中叫指數(shù)加權(quán)移動平均)。

????????加權(quán)移動平均就是根據(jù)同一個移動段內(nèi)不同時間的數(shù)據(jù)對預(yù)測值的影響程度,分別給予不同的權(quán)數(shù),然后再進(jìn)行平均移動以預(yù)測未來值。

????????加權(quán)移動平均不像簡單移動平均法那樣,在計算平均值時對移動期內(nèi)的數(shù)據(jù)同等看待,而是根據(jù)愈是近期數(shù)據(jù)對預(yù)測值影響愈大這一特點,不同地對待移動期內(nèi)的各個數(shù)據(jù)。對近期數(shù)據(jù)給予較大的權(quán)數(shù),對較遠(yuǎn)的數(shù)據(jù)給予較小的權(quán)數(shù)。

圖6.5 使用加權(quán)平均計算倫敦一年的溫度趨勢

????????指數(shù)加權(quán)移動平均類似加權(quán)移動平均,不過在指數(shù)加權(quán)移動平均的計算方法中,包括的不是一段數(shù)據(jù),而是所有歷史數(shù)據(jù),對全部歷史價格數(shù)據(jù)分配了逐步減少的權(quán)重。每一個數(shù)據(jù)的權(quán)重都對后來的一個數(shù)據(jù)的權(quán)重按照指數(shù)形式遞減,因此,這種方法就得到了所謂指數(shù)加權(quán)移動平均的名稱。

????????如圖6.5,設(shè)v_0=0,則第一天指數(shù)加權(quán)平均為v_1=0.9 v_0+0.1θ_1,第二天指數(shù)加權(quán)平均為v_2=0.9 v_1+0.1θ_2 …第t天指數(shù)加權(quán)平均為v_t=0.9 v_{t-1}+0.1θ_t,0.9和0.1是人為設(shè)定的權(quán)值,連線v_0,v_1,…,v_t就是倫敦的一年的溫度趨勢(紅線),可通過該趨勢預(yù)測明年溫度變化。

圖6.6 指數(shù)加權(quán)平均

????????如圖6.5,把上面的權(quán)值0.9用β表示,則v_tv_t-1+(1-β)θ_t,v_t約等于最近1/(1-β)天的溫度指數(shù)加權(quán)平均值,

????????當(dāng)β=0.9時,v_t約等于最近10天的溫度平均值,趨勢線為紅色;

????????當(dāng)β=0.98時,v_t約等于最近50天的溫度平均值,趨勢線為綠色,此時的趨勢線比較緩和平滑,但會右移,出現(xiàn)一定延遲;

????????當(dāng)β=0.5時,v_t約等于最近2天的溫度平均值,趨勢線為黃色,此時趨勢線波動非常大,算的平均值很可能出現(xiàn)異常值,但該趨勢線能更快適應(yīng)溫度變化。

????????β是非常重要的參數(shù),往往中間某個值效果更好,比如β=0.9時的紅線相對更好平均了溫度。

4.理解指數(shù)加權(quán)平均

圖6.7 理解指數(shù)加權(quán)平均

????????如圖6.7,設(shè)β=0.9,展開指數(shù)加權(quán)平均v_{100}=0.1θ_{100} + 0.1*0.9θ_{99}+0.1*(0.9)2θ_{98}+…,可以看出權(quán)重成指數(shù)級遞減,v_t約等于(β)^i<1/e即最近1/(1-β)天指數(shù)加權(quán)平均。

????????比如當(dāng)β=0.9,(0.9)^{10}≈1/e,v_t約等于最近10天1/(1-β)=10 指數(shù)加權(quán)平均;

????????當(dāng)β=0.98,(0.98)^{50}≈1/e,v_t約等于最近50天1/(1-β)=50 指數(shù)加權(quán)平均。

圖6.8 實施指數(shù)加權(quán)平均

????????如圖6.7,在實際應(yīng)用中,計算指數(shù)加權(quán)平均步驟為:先設(shè)定v_0=0,然后計算v_1,v_2v_3,…,只占一行代碼節(jié)約內(nèi)存運算快,當(dāng)然結(jié)果沒有算數(shù)平均那么精準(zhǔn),但是從計算和內(nèi)存效率來說這是個很好的方法。

5.指數(shù)加權(quán)平均的偏差修正


圖6.9 偏差修正

????????為了使指數(shù)加權(quán)平均計算結(jié)果更加精確,我們需要加入偏差修正。如圖6.9,實際上當(dāng)β=0.98時得到的不是綠線,而是紫線,起點偏低。為了得到綠線,應(yīng)使v_t/(1-β^t),t越小對v_t影響越大,t越大對v_t影響越小,最終得到的是綠線。

6.動量(Momentum)梯度下降

????????有一種方法叫動量梯度下降,收斂速度快于一般梯度下降。該方法一句話說明就是:先計算梯度的指數(shù)加權(quán)平均數(shù),并利用該指數(shù)加權(quán)平均數(shù)更新權(quán)重。

圖6.10 動量梯度下降

????????如圖6.10,假設(shè)紅點是最低點,無論是batch還是mini-batch,下降過程中都是像藍(lán)線一樣不斷擺動,從而無法使用過大學(xué)習(xí)率。而動量梯度下降能都很大程度減少擺動,收斂路線為紅線,動量梯度下降過程為:

????????先計算出dw、db,

????????然后計算指數(shù)加權(quán)平均v_{dw}v_{dw}-(1-β)dw,v_{db}v_{db}-(1-β)db,

????????最后w=w-αv_{dw},b=b-αv_{db}。

????????其他步驟和一般梯度下降一樣,梯度下降過程中每一步不再是獨立的,而是受前面梯度的制約,

????????在縱軸(擺動方向)通過指數(shù)加權(quán)平均后接近零,

????????而在橫軸(收斂方向)由于dw、db總是和橫軸方向一致,所以通過指數(shù)加權(quán)平均后依舊很大,相當(dāng)于給橫軸方向增加了動量,從而快速地收斂。

????????在實際應(yīng)用中,可以不使用指數(shù)加權(quán)平均的偏差修正,因為經(jīng)過十次左右的指數(shù)加權(quán)平均后,計算的結(jié)果就會恢復(fù)正常值。

7.RMSprop

????????還有一種方法叫RMSprop,全稱是root mean square prop,也可以加速梯度下降。

圖6.11 RMSprop梯度下降

????????RMSprop梯度下降過程為:

????????先計算出dw、db,

????????然后計算平方項指數(shù)加權(quán)平均s_{dw}s_{dw}-(1-β)dw^2,s_{db}s_{db}-(1-β)db^2,平方是為了避免出現(xiàn)負(fù)數(shù),s_{dw}只是為了增大或減小α,不改變正負(fù),

????????最后w=w-(α/√(s_{dw}+ε))*dw,b=b-(α/√(s_{db}+ε))*db,為防止s_{dw}、s_{db}為零,一般會加上值為10^{-8}的ε,

????????其他步驟和一般梯度下降一樣,從α/√(s_{dw}+ε)、α/√(s_{db}+ε)可以看出,RMSprop梯度下降原理是梯度大則讓學(xué)習(xí)率小,梯度小則讓學(xué)習(xí)率大,從而讓收斂過程的擺動減小。

8.Adam優(yōu)化算法

????????Adam優(yōu)化算法是由Momentum和RMSprop結(jié)合而成,適合各種類型神經(jīng)網(wǎng)絡(luò),是圈內(nèi)普遍認(rèn)可的優(yōu)化算法。

圖6.12 Adam梯度下降

????????Adam梯度下降過程為:

????????先初始化v_{dw}=0,s_{dw}=0,v_{db}=0,s_{db}=0,

????????接著計算出dw,db,

????????接著計算v_{dw}=β_1v_{dw}-(1-β_1)dw,v_{db}=β_1v_{db}-(1-β_1)db,

????????s_{dw}=β_2s_{dw}-(1-β_2)dw^2,s_{db}=β_2s_{db}-(1-β_2)db^2,

????????接著偏差修正v_{dw}^{correct}=v_{dw}/(1-β_1^t),v_{db}^{correct}=v_{db}/(1-β_1^t),

????????s_{dw}^{correct}=s_{dw}/(1-β_2^t),s_{db}^{correct}=s_{db}/(1-β_2^t),

????????最后w=w-(α/√(s_{dw}^{correct}+ε))*v_{dw}^{correct},b=b-(α/√(s_{db}^{correct}+ε))*v_{db}^{correct}

????????上面過程涉及到的超參數(shù)有:

????????學(xué)習(xí)率α,需要不斷嘗試不同值找到最適合的值;

????????Momentum的β1,一般設(shè)置為0.9,

????????RMSProp的β2,一般設(shè)置為0.999,

????????ε就無所謂了,給個10^{-8}即可。

9.學(xué)習(xí)率衰減

????????加快學(xué)習(xí)還有一個辦法就是,隨著時間慢慢減少學(xué)習(xí)率,稱之為學(xué)習(xí)率衰減。

圖6.13 學(xué)習(xí)率衰減

?????????如圖6.13,如果學(xué)習(xí)率一直不變并且一直很大,那么神經(jīng)網(wǎng)絡(luò)就會在最低點附近大步跨越很難收斂到最低點,如圖中藍(lán)線;正確做法是一開始設(shè)置較大學(xué)習(xí)率,然后慢慢減小,那么久很容易找到最低點,如圖中綠線。

圖6.14 學(xué)習(xí)率衰減方法

對于學(xué)習(xí)率衰減的方法可以使用公式α=(1 / (1 + decay-rate * epoch-num)) * α_0。其中decay-rate是衰減率,epoch-num是迭代代數(shù),α_0是一開始設(shè)定的學(xué)習(xí)率。

圖6.15 其他學(xué)習(xí)率衰減方法

?????????還有其他學(xué)習(xí)率衰減方法,比如讓學(xué)習(xí)率呈指數(shù)下降的α=0.95^{epoch-num}*α_0;比如某常數(shù)除于代數(shù)的平方根α= (K /√epoch-num) * α_0,或者某常數(shù)除于mini-batch的次數(shù)t的平方根α= (K /√t) * α_0;比如學(xué)習(xí)率離散下降;比如手動調(diào)整學(xué)習(xí)率,訓(xùn)練過程中每隔段時間就手動調(diào)整一次學(xué)習(xí)率。

10.局部最優(yōu)的問題

圖6.16 描述局部最優(yōu)問題

????????如圖6.16左圖所示,在深度學(xué)習(xí)初期,總會擔(dān)心算法會有局部最優(yōu)問題,算法會在困在某個局部最優(yōu),而無法到達(dá)全局最優(yōu)。

????????實際上這種情況是不用擔(dān)心的,在高維空間上比如有20000個參數(shù),那么形成局部最低點的情況是每個參數(shù)的圖像都是U形狀,即可能性是2^{-20000},這顯然微乎其微。大多數(shù)遇到的是鞍點,即該點有參數(shù)是U形狀,有的是∩形狀。

圖6.17 鞍點的問題

????????鞍點是不會導(dǎo)致局部最優(yōu)問題的,當(dāng)算法走到鞍點時,會朝∩形狀方向走。鞍點也不會使學(xué)習(xí)變慢,因為會有Adam等優(yōu)化算法在平緩階段加速前進(jìn)。

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

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

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