1. 程式人生 > >深度學習總結(十)——dropout

深度學習總結(十)——dropout

這裡寫圖片描述

1. Inverted dropout

大家都知道dropout是一個概率值,它表示的是a[l] (第l層的輸入)中的元素以多大的概率置零。這裡我們用它的對偶變數keep-prob代替dropout,它表示的是以多大的概率保留元素。可見dropout+keep-prob=1。

現在我們以一個三層的神經網路為例,討論keep-drop在神經網路中是如何發生作用的。

import numpy as np

keep_prod = 0.8
a3 = np.random.rand(3,4)
print("a3-before",a3)
d3 = np.random.rand(a3.shape[0
],a3.shape[1])<keep_prod print("d3",d3) a3=np.multiply(a3,d3) print("a3-after",a3)

上述程式碼顯示的是第三層中keep-drop的執行過程,a[3]為第3層的輸出結果,d[3]為keep-drop的index陣列,它與a[3]同樣大小,元素非0即1。兩者對應位置相乘,a[3]中d[3]的1對應的位置,元素值保留,否則置為零。這就是keep-prod的過程,輸出如下所示:

a3-before 
[[ 0.6016695   0.733025    0.38694513  0.17916196]
 [ 0.39412193
0.22803599 0.16931667 0.30190426] [ 0.8822327 0.64064634 0.40085393 0.72317028]] d3 [[False True True False] [ True False True True] [ True True True True]] a3-after [[ 0. 0.733025 0.38694513 0. ] [ 0.39412193 0. 0.16931667 0.30190426] [ 0.8822327 0.64064634 0.40085393 0.72317028
]]

然後通過z[4]=w[4]a[3]+b[4]獲得該層的輸出。通過keep-drop後,我們發現a[3]中的元素以20%(假設keep-prod=0.8)的概率置零,這就使得a[3]的期望約變為原來的0.8倍。那麼就意味著z[4]的期望也將變為原來的0.8倍。而在測試時,我們是不使用keep-drop的(會使得測試結果變得隨機),這就造成了訓練和測試時輸入輸出的期望不一致,會影響模型的泛化能力。為此,我們新增以下操作:

a3/=keep_prob

來保證訓練和測試時輸入輸出的期望一致,這個過程我們稱之為inverted dropout。這也是目前最主要的dropout實現方式。

2. dropout的一些使用說明

一般一次訓練迭代中,隱含層的引數為0的點應該是一樣的。不同的迭代中才會不一樣。因為同一次迭代中,不同訓練樣本的梯度不一樣,最好不要兩個變數一起變。

Dropout會產生收縮權重平方範數的效果,即壓縮權重。並完成一些預防過擬合的外層正則化。Dropout被正式作為一種正則化的替代形式,L2對不同權重的衰減是不同的,它取決於倍增的啟用函式的大小。Dropout的功能類似於L2正則化,與L2正則化不同的是,被應用的方式不同dropout也會有所不同,甚至更適用於不同的輸入範圍。

不同層的keep-prob可以不一樣,引數多的層,keep-prob可以設定小一些,少的可以設定大一些,或者為1。

如果你覺得某一層比其它層更容易過擬合,你可以把該層的keep-drop設得比其它層低一些,但是你需要使用交叉驗證來搜尋更多的超引數。你也可以有的層用dropout,有的不用,這樣在應用dropout的層只含有一個超級引數。

Dropout主要用在計算機視覺領域,因為資料量不夠,容易過擬合,需要dropout。

Dropout的一大缺點就是成本函式J不再被明確定義。因為每次迭代的過程中,都會隨機移除一些點,你很難檢查梯度下降的效能。