吳恩達 DeepLearning.ai 課程提煉筆記(2-2)改善深層神經網路 --- 優化演算法

以下為在Coursera上吳恩達老師的DeepLearning.ai課程項目中,第二部分《改善深層神經網路:超參數調試、正則化以及優化》第二周課程「優化演算法」關鍵點的筆記。本次筆記幾乎涵蓋了全部小視頻課程的記錄。同時在閱讀以下筆記的同時,強烈建議學習吳恩達老師的視頻課程,視頻請至 Coursera 或者 網易雲課堂。


1. Mini-batch 梯度下降法

對整個訓練集進行梯度下降法的時候,我們必須處理整個訓練數據集,然後才能進行一步梯度下降,即每一步梯度下降法需要對整個訓練集進行一次處理,如果訓練數據集很大的時候,如有500萬或5000萬的訓練數據,處理速度就會比較慢。

但是如果每次處理訓練數據的一部分,即用其子集進行梯度下降,則我們的演算法速度會執行的更快。而處理的這些一小部分訓練子集即稱為Mini-batch。

演算法核心

對於普通的梯度下降法,一個epoch只能進行一次梯度下降;而對於Mini-batch梯度下降法,一個epoch可以進行Mini-batch的個數次梯度下降。

不同size大小的比較

普通的batch梯度下降法和Mini-batch梯度下降法代價函數的變化趨勢,如下圖所示:

  • batch梯度下降:
  1. 對所有m個訓練樣本執行一次梯度下降,每一次迭代時間較長;
  2. Cost function 總是向減小的方向下降。
  • 隨機梯度下降:
  1. 對每一個訓練樣本執行一次梯度下降,但是丟失了向量化帶來的計算加速;
  2. Cost function總體的趨勢向最小值的方向下降,但是無法到達全局最小值點,呈現波動的形式。
  • Mini-batch梯度下降:
  1. 選擇一個 1<size<m 的合適的size進行Mini-batch梯度下降,可以實現快速學習,也應用了向量化帶來的好處;
  2. Cost function的下降處於前兩者之間。

Mini-batch 大小的選擇

  • 如果訓練樣本的大小比較小時,如 mleqslant 2000 時 ------ 選擇batch梯度下降法;
  • 如果訓練樣本的大小比較大時,典型的大小為: 2^{6}、2^{7}、cdots、2^{10}
  • Mini-batch的大小要符合CPU/GPU內存。

2. 指數加權平均

指數加權平均的關鍵函數:

v_{t} = eta v_{t-1}+(1-eta)	heta_{t}

下圖是一個關於天數和溫度的散點圖:

  • eta =0.9 時,指數加權平均最後的結果如圖中紅色線所示;
  • eta =0.98 時,指數加權平均最後的結果如圖中綠色線所示;
  • eta =0.5 時,指數加權平均最後的結果如下圖中黃色線所示;

理解指數加權平均

例子,當 eta =0.9 時:

v_{100} = 0.9v_{99}+0.1	heta_{100}\v_{99} = 0.9v_{98}+0.1	heta_{99}\v_{98} = 0.9v_{97}+0.1	heta_{98}\ ldots

展開,有:

v_{100}=0.1	heta_{100}+0.9(0.1	heta_{99}+0.9(0.1	heta_{98}+0.9v_{97}))\=0.1	heta_{100}+0.1	imes0.9	heta_{99}+0.1	imes(0.9)^{2}	heta_{98}+0.1	imes(0.9)^{3}	heta_{97}+cdots

上式中所有 	heta 前面的係數相加起來為1或者接近於1,稱之為偏差修正。

總體來說存在, (1-varepsilon)^{1/varepsilon}=dfrac{1}{e} ,在我們的例子中, 1-varepsilon=eta=0.9 ,即 0.9^{10}approx 0.35approxdfrac{1}{e} 。相當於大約10天後,係數的峰值(這裡是0.1)下降到原來的 dfrac{1}{e} ,只關注了過去10天的天氣。

指數加權平均實現

v_{0} =0\ v_{1}= eta v_{0}+(1-eta)	heta_{1}\ v_{2}= eta v_{1}+(1-eta)	heta_{2}\ v_{3}= eta v_{2}+(1-eta)	heta_{3}\ ldots

因為,在計算當前時刻的平均值,只需要前一天的平均值和當前時刻的值,所以在數據量非常大的情況下,指數加權平均在節約計算成本的方面是一種非常有效的方式,可以很大程度上減少計算機資源存儲和內存的佔用。

指數加權平均的偏差修正

在我們執行指數加權平均的公式時,當 eta=0.98 時,我們得到的並不是圖中的綠色曲線,而是下圖中的紫色曲線,其起點比較低。

  • 原因:

v_{0}=0\v_{1}=0.98v_{0}+0.02	heta_{1}=0.02	heta_{1}\v_{2}=0.98v_{1}+0.02	heta_{2}=0.98	imes0.02	heta_{1}+0.02	heta_{2}=0.0196	heta_{1}+0.02	heta_{2}

如果第一天的值為如 40 ,則 v_{1}=0.02	imes40=8 ,得到的值要遠小於實際值,後面幾天的情況也會由於初值引起的影響,均低於實際均值。

  • 偏差修正:

使用 v_{1}=0.02	imes40=8

t=2 時:

 1-eta^{t}=1-(0.98)^{2}=0.0396

 dfrac{v_{2}}{0.0396}=dfrac{0.0196	heta_{1}+0.02	heta_{2}}{0.0396}

偏差修正得到了綠色的曲線,在開始的時候,能夠得到比紫色曲線更好的計算平均的效果。隨著 t 逐漸增大, eta^{t} 接近於0,所以後面綠色的曲線和紫色的曲線逐漸重合了。

雖然存在這種問題,但是在實際過程中,一般會忽略前期均值偏差的影響。

3. 動量(Momentum)梯度下降法

動量梯度下降的基本思想就是計算梯度的指數加權平均數,並利用該梯度來更新權重。

在我們優化 Cost function 的時候,以下圖所示的函數圖為例:

在利用梯度下降法來最小化該函數的時候,每一次迭代所更新的代價函數值如圖中藍色線所示在上下波動,而這種幅度比較大波動,減緩了梯度下降的速度,而且我們只能使用一個較小的學習率來進行迭代。

如果用較大的學習率,結果可能會如紫色線一樣偏離函數的範圍,所以為了避免這種情況,只能用較小的學習率。

但是我們又希望在如圖的縱軸方向梯度下降的緩慢一些,不要有如此大的上下波動,在橫軸方向梯度下降的快速一些,使得能夠更快的到達最小值點,而這裡用動量梯度下降法既可以實現,如紅色線所示。

演算法實現

eta 常用的值是0.9。

在我們進行動量梯度下降演算法的時候,由於使用了指數加權平均的方法。原來在縱軸方向上的上下波動,經過平均以後,接近於0,縱軸上的波動變得非常的小;但在橫軸方向上,所有的微分都指向橫軸方向,因此其平均值仍然很大。最終實現紅色線所示的梯度下降曲線。

演算法本質解釋

在對應上面的計算公式中,將Cost function想像為一個碗狀,想像從頂部往下滾球,其中:

  • 微分項 dw,db 想像為球提供的加速度;
  • 動量項 v_{dw},v_{db} 相當於速度;

小球在向下滾動的過程中,因為加速度的存在使得速度會變快,但是由於 eta 的存在,其值小於1,可以認為是摩擦力,所以球不會無限加速下去。

4. RMSprop

除了上面所說的Momentum梯度下降法,RMSprop(root mean square prop)也是一種可以加快梯度下降的演算法。

同樣演算法的樣例實現如下圖所示:

這裡假設參數b的梯度處於縱軸方向,參數w的梯度處於橫軸方向(當然實際中是處於高維度的情況),利用RMSprop演算法,可以減小某些維度梯度更新波動較大的情況,如圖中藍色線所示,使其梯度下降的速度變得更快,如圖綠色線所示。

在如圖所示的實現中,RMSprop將微分項進行平方,然後使用平方根進行梯度更新,同時為了確保演算法不會除以0,平方根分母中在實際使用會加入一個很小的值如 varepsilon=10^{-8}

5. Adam 優化演算法

Adam (Adaptive Moment Estimation)優化演算法的基本思想就是將 Momentum 和 RMSprop 結合起來形成的一種適用於不同深度學習結構的優化演算法。

演算法實現

  • 初始化: V_{dw} = 0,S_{dw}=0,V_{db}=0,S_{db} = 0
  • t 次迭代:
    • Compute dw,db on the current mini-batch
    • V_{dw}=eta_{1}V_{dw}+(1-eta_{1})dw,V_{db}=eta_{1}V_{db}+(1-eta_{1})db ----- 「Momentum」
    • S_{dw}=eta_{2}S_{dw}+(1-eta_{2})(dw)^{2},S_{db}=eta_{2}S_{db}+(1-eta_{2})(db)^{2} ----- 「RMSprop」
    • V_{dw}^{corrected} = V_{dw}/(1-eta_{1}^{t}),V_{db}^{corrected} = V_{db}/(1-eta_{1}^{t}) ----- 偏差修正
    • S_{dw}^{corrected} = S_{dw}/(1-eta_{2}^{t}),S_{db}^{corrected} = S_{db}/(1-eta_{2}^{t}) ----- 偏差修正
    • w:=w-alphadfrac{V_{dw}^{corrected}}{sqrt{S_{dw}^{corrected}}+varepsilon},b:=b-alphadfrac{V_{db}^{corrected}}{sqrt{S_{db}^{corrected}}+varepsilon}

超參數的選擇

  • alpha :需要進行調試;
  • eta_{1} :常用預設值為0.9, dw 的加權平均;
  • eta_{2} :推薦使用0.999, dw^{2} 的加權平均值;
  • varepsilon :推薦使用 10^{-8}

6. 學習率衰減

在我們利用 mini-batch 梯度下降法來尋找Cost function的最小值的時候,如果我們設置一個固定的學習速率 alpha ,則演算法在到達最小值點附近後,由於不同batch中存在一定的雜訊,使得不會精確收斂,而一直會在一個最小值點較大的範圍內波動,如下圖中藍色線所示。

但是如果我們使用學習率衰減,逐漸減小學習速率 alpha ,在演算法開始的時候,學習速率還是相對較快,能夠相對快速的向最小值點的方向下降。但隨著 alpha 的減小,下降的步伐也會逐漸變小,最終會在最小值附近的一塊更小的區域里波動,如圖中綠色線所示。

學習率衰減的實現

  • 常用: alpha = dfrac{1}{1+decay\_rate*epoch\_num}alpha_{0}
  • 指數衰減: alpha = 0.95^{epoch\_num}alpha_{0}
  • 其他: alpha = dfrac{k}{epoch\_num}cdotalpha_{0}
  • 離散下降(不同階段使用不同的學習速率)

7. 局部最優問題

在低維度的情形下,我們可能會想像到一個Cost function 如左圖所示,存在一些局部最小值點,在初始化參數的時候,如果初始值選取的不得當,會存在陷入局部最優點的可能性。

但是,如果我們建立一個高維度的神經網路。通常梯度為零的點,並不是如左圖中的局部最優點,而是右圖中的鞍點(叫鞍點是因為其形狀像馬鞍的形狀)。

在一個具有高維度空間的函數中,如果梯度為0,那麼在每個方向,Cost function可能是凸函數,也有可能是凹函數。但如果參數維度為2萬維,想要得到局部最優解,那麼所有維度均需要是凹函數,其概率為 2^{-20000} ,可能性非常的小。也就是說,在低維度中的局部最優點的情況,並不適用於高維度,在梯度為0的點更有可能是鞍點,而不是局部最小值點。

在高緯度的情況下:

  • 幾乎不可能陷入局部最小值點;
  • 處於鞍點的停滯區會減緩學習過程,利用如Adam等演算法進行改善。

本文將同時更新在我的CSDN博客

吳恩達Coursera深度學習課程 DeepLearning.ai 提煉筆記(2-2)-- 優化演算法

歡迎關注,一起學習一起進步喲。^_^

推薦閱讀:

[CV] 通俗理解『卷積』——從傅里葉變換到濾波器
?直播預告丨今日頭條李磊:談機器人創作的技術實現與行業未來
【相剋相生】國美公司名稱變更, 淺談新零售前景
Alpha Zero 碎碎念
要做的事情太多,蘋果在AI領域已落於下風

TAG:深度学习DeepLearning | 机器学习 | 人工智能 |