1. 程式人生 > >吳恩達deeplearning.ai課程系列筆記05(下)

吳恩達deeplearning.ai課程系列筆記05(下)

#寫在最前,deeplearning.ai系列課程相較於之前的Andrew Ng在coursera上2014釋出的機器學習課程內容更加豐富。 重要的是此次課程示例程式碼都是用python來實現,不需要去熟悉octave,對大部分需要用python來學習機器學習的同學來說是個福音! 原課程視訊請移步網易雲課堂或者coursera上學習。

#本文內容部分來自網路,只為自己學習以及分享供更多的人學習使用微笑

1、Dropout理解

所謂的dropout其實就是隨機的減少一些神經元,從而得到一個節點較小,規模較小的網路進行訓練。


那麼我們如何用程式碼來實現呢?

以第三層神經元為例,其實只需要短短几行程式碼就可以

keep_prob = 0.8# 設定神經元保留概率

d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob

a3 = np.multiply(a3, d3)

a3 /= keep_prob

最後一行程式碼,是為了保證下一層計算的時候期望值不變。

事實上,dropout也是產生權重收縮的效果。

當keep_prob = 1的時候,就會保留原始所有的神經元,即關閉dropout功能。

回到dropout為什麼會對過擬合問題產生比較好的問題上,可以參考另外兩篇連結:

知乎

2、其他正則化方法

資料擴增(Data augmentation):通過圖片的一些變換,得到更多的訓練集和驗證集。


簡單地說就是在無法增加額外訓練資料的情況下,可以對已有資料進行翻轉、放大,扭曲等處理得到新的資料來擴充原資料集,從而達到正則化的目的。

#莫名感覺有點投機,囧


還有一種叫做,early stopping:

假設我們訓練集的訓練誤差隨著迭代次數遞減,曲線如圖藍色曲線所示。這看起來貌似不錯,所以接下來我們看看驗證集的效果。

驗證集誤差在剛開始是遞減的,但是在箭頭所指處發生轉向(開始增加),所以我們發現錯誤就要及時糾正,那我們訓練到這就及時停下來。

3、歸一化輸入


從上圖中可以看到,歸一化的輸入資料分佈更加勻稱。


歸一化的好處是什麼呢?從上圖可以看出,歸一化後的資料,無論從哪個方向開始往中間收斂,路徑逗比較短,可以提高訓練效率。

4、梯度消失和梯度爆炸


如果W大於1, 由於L足夠大,最終會導致啟用函式的值將以指數級遞增,而當W小於1時,則會導致相反的情況。

這樣的情況對於導數也是同樣的道理,所以在計算梯度時,根據情況的不同,梯度函式會以指數級遞增或者遞減,導致訓練導數難度上升,梯度下降演算法的步長會變得非常非常小,需要訓練的時間將會非常長。在梯度函式上出現的以指數級遞增或者遞減的情況就分別稱為梯度爆炸或者梯度消失。

5、引數初始化問題


這裡為了得到較小的啟用函式值,設定較小的初始化w值,這裡稱為Xavier initialization。 
對引數進行初始化:

WL = np.random.randn(WL.shape[0],WL.shape[1])* np.sqrt(1/n)
雖然並沒有解決梯度爆炸和消失的問題,但在一定程度上可以緩解梯度的問題。

6、梯度的數值逼近與檢驗


所謂梯度檢驗,什麼意思呢?其實就是利用梯度逼近的方法,因為我們的主要目標是用一個較小的值去檢查這個梯度的近似值與我們通過反向傳播演算法所得到的梯度值進行比較,看其是否在誤差範圍內,從而來判斷我們的結果是否是可靠的。

具體來說,可以看圖



如果利用check裡面的公式得到的數值較大,那就說明,需要好好檢查你的訓練過程了。

至少圖中歐氏距離為誤差平方之和,然後求平方根。如果圖中公式完全看不懂的童鞋,建議再回過頭去多看看吳老師的視訊講解。

一些suggestion:

訓練過程中不要使用梯度檢驗,只在debug的時候使用,使用完畢關閉梯度檢驗的功能;如果梯度檢驗出現了錯誤,要檢查每一項,找出錯誤;記得加上正則化項;梯度檢驗不能與dropout同時使用。