除了L2正則化之外,還有一個很常用的正則化技巧就是Dropout(隨機失活)。它的主要思想就是隨機丟棄網絡每一層的一些神經元。
原理和實現
首先從原理上來理解一下什麼是Dropout正則化。如下圖所示(圖片來源於吳恩達老師深度學習課程課件),左圖爲一個正常的網絡,進行Dropout正則化就是對於每一層的單元,根據一定的概率來“刪除”掉他們,如下面右圖所示,以0.5的保留概率(keep-prob)進行Dropout之後,剩下的神經元組成了一個比較簡單的網絡。
實現Dropout的方法很多,最常用的是inverted dropout。以一個深層神經網絡的某一個隱藏層爲例來解釋怎麼進行Dropout正則化。首先假設對於第 層,其激活函數值爲 ,我們設置的保留概率 ,這意味着隱藏層的每一個神經元被以0.8的概率得到保留。
可以將inverted dropout方法歸納爲四步:
- 根據 生成和 同形的隨機概率矩陣 ,
Dl = np.random.rand(Al.shape[0], Al.shape[1])
- 將 轉化爲0-1矩陣,
Dl = Dl < keep_prob
- 將 和 中的元素一一對應, 爲1表示對應的神經元被保留,爲0表示捨棄掉,
Al = Al * Dl
- 爲了確保 的期望值不變,將 除以 ,
Al = Al / keep_prob
需要注意的是,在反向傳播的時候,也需要像上面一樣進行dropout操作,和前向傳播關閉相同的神經元,即,對於某一層的 ,應該進行以下計算:
dAl = dAl * Dl
dAl = dAl / keep_prob
另一點是,Dropout正則化只在訓練階段實施,在測試階段只需要利用訓練好的參數進行正向預測,而不需要進行神經元的隨機失活。
理解
Dropout正則化的作用可以從兩方面理解:1)通過隨機的神經元失活使得網絡更小,有效防止過擬合;2)由於每個隱藏神經元都可能被清楚,因此網絡的輸出不會偏向於某一個特徵,這樣Dropout會產生類似於L2範數的效果。
代碼
代碼可以在我Github上找到。