深度學習總結(十)——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 ]]
然後通過
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不再被明確定義。因為每次迭代的過程中,都會隨機移除一些點,你很難檢查梯度下降的效能。