2020-5-21 吳恩達-改善深層NN-w1 深度學習的實用層面(1.6 Dropout 正則化-inverted dropout反向隨機失活)

1.視頻網站:mooc慕課https://mooc.study.163.com/university/deeplearning_ai#/c
2.詳細筆記網站(中文):http://www.ai-start.com/dl2017/
3.github課件+作業+答案:https://github.com/stormstone/deeplearning.ai

除了L2正則化,還有一個非常實用的正則化方法——“Dropout(隨機失活)”,本節介紹它的工作原理。
在這裏插入圖片描述

1.工作原理

假設你在訓練上圖這樣的NN,它存在過擬合,dropout會遍歷網絡的每一層,並設置消除神經網絡中節點的概率。
0在這裏插入圖片描述

如上圖。
假設網絡中的每一層,每個節點都以拋硬幣的方式設置概率,每個節點得以保留和消除的概率都是0.5,設置完節點概率,我們會消除一些節點,然後刪除掉從該節點進出的連線。
在這裏插入圖片描述

最後得到一個節點更少,規模更小的網絡,再用backprop方法進行訓練。

上面介紹的是一個樣本精簡的例子。對於其它樣本,我們照舊以拋硬幣的方式設置概率,保留一類節點集合,刪除其它類型的節點集合,都將採用一個精簡後NN來訓練它。

這種方法似乎有點怪,單純遍歷節點,編碼也是隨機的,可它真的有效。不過可想而知,我們針對每個訓練樣本訓練規模極小的網絡,最後你可能會認識到爲什麼要正則化網絡,因爲我們在訓練極小的網絡。

2.反向隨機失活 inverted dropout

2.1訓練階段

實現Dropout有幾種方法。最常用的方法是inverted dropout(反向隨機失活)

出於完整性考慮,我們用一個三層(l=3)網絡來說明,編碼中應該涉及整個3層,在這裏只以某一層中實施dropout過程爲例。

step1.
定義d3表示一個三層的dropout向量矩陣。

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

然後看它是否小於某數,我們稱之爲keep-pro,d3<keepprobd3<keep-prob
keep-prob是一個具體數字。拋硬幣的例子它是0.5,而這裏它定義爲0.8,它表示保留某個隱藏單元的概率,或者說消除任意一個隱藏單元的概率是0.2,它的作用就是生成隨機矩陣。

keep-prob = 0.8

歸納一下,d3是一個矩陣,keep-prob=0.8。每個樣本和每個隱藏單元在d3中的對應值爲1的概率都是0.8,對應爲0的概率是0.2。

step2.
接下來要做的就是從第三層中獲取激活函數,這裏我們叫它a3,它包含了要計算的激活函數。

a3 =np.multiply(a3,d3) #a3*=d3

這裏是元素相乘,也可寫爲a3*=d3,它的作用就是過濾d3中所有等於0的元素。而各個元素等於0的概率只有20%,乘法運算最終把d3中相應元素輸出,即讓d3中0元素與a3中相對元素歸零。

用python實現該算法,d3是一個布爾型數組,值爲true和false,而不是1和0,乘法運算依然有效,python會把true和false翻譯爲1和0。

step3.關鍵
最後,我們用a3除以0.8,或者除以keep-prob參數。注意:step2執行完,a3只有初始值的0.8(有0.2被過濾了)。

a3 /=  keep-prob

解釋一下爲什麼要這麼做。
爲方便起見,我們假設第三隱藏層上有50個單元或者說50個神經元。保留和刪除它們的概率分別爲80%和20%,這意味着最後被刪除或歸零的單元平均有10個(50×20%=10)。

現在我們看下Z[4]Z[4]=W[4]a[3]+b[4]Z^{[4]}=W^{[4]}a^{[3]}+b^{[4]}
我們的預期是,a3減少20%,也就是說中a[3]有20%的元素被歸零。爲了不影響Z[4]的期望值,我們需要用W[4]a[3]/0.8W^{[4]}a^{[3]}/0.8,它將會修正或彌補減少的20%,a3的期望值不會變,所以 a3 /= keep-prob 就是所謂的dropout方法

它的功能是,不論keep-prop的值是多少,例如0.8,0.9甚至是1,(如果keep-prop設置爲1,那麼就不存在dropout,因爲它會保留所有節點。)反向隨機失活(inverted dropout)方法通過除以keep-prob,確保a3的期望值不變。即:第三層單元減少,但是Z[4]Z^{[4]}不變。

事實證明,在測試階段,當我們評估一個NN時,使用反向隨機失活方法會讓測試階段變得更容易,因爲它的數據擴展問題變少。

目前實施dropout最常用的方法就是Inverted dropout。
Dropout早期的迭代版本都沒有除以keep-prob,所以在測試階段,平均值會變得越來越複雜,不過那些版本已經不再使用了。

你會發現,不同的訓練樣本,清除不同的隱藏單元也不同。實際上,如果你通過相同訓練集多次傳遞數據,每次訓練數據的梯度不同,則隨機對不同隱藏單元歸零,有時卻並非如此。

比如,需要將相同隱藏單元歸零,第一次迭代梯度下降時,把一些隱藏單元歸零,第二次迭代梯度下降時,也就是第二次遍歷訓練集時,對不同類型的隱藏層單元歸零。矩陣向量d3用來決定第三層中哪些單元歸零,無論用前向傳播foreprop還是反向傳播backprop,上面例子裏我們只介紹了前向傳播foreprob。

2.2測試階段-不使用dropout函數

如何在測試階段訓練算法?方法就是不使用dropout函數。

在測試階段,我們已經給出了X,或是想預測的變量,用的是標準計數法。
我們用第0層的激活函數a[0]標註爲測試樣本X,a[0]=Xa^{[0]}=X,我們在測試階段不使用dropout函數,尤其是像下列情況:

z[1]=W[1]a[0]+b[1]z^{[1]}=W^{[1]}a^{[0]}+b^{[1]}
a[1]=g[1](z[1])a^{[1]}=g^{[1]}(z^{[1]})
z[2]=W[2]a[1]+b[2]z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}
a[2]=......a^{[2]}=......

以此類推直到最後一層,預測值爲y^\hat y
顯然在測試階段,我們並未使用dropout,自然也就不用拋硬幣來決定失活概率,以及要消除哪些隱藏單元了。

因爲在測試階段進行預測時,我們不期望輸出結果是隨機的,如果測試階段應用dropout函數,預測會受到干擾。理論上,你只需要多次運行預測處理過程,每一次不同的隱藏單元會被隨機歸零(dropout)。但是這個過程計算效率低,得出的結果也幾乎相同,與不使用dropout函數產生的結果極爲相似。

Inverted dropout函數在除以keep-prob時可以記住上一步的操作,目的是確保即使在測試階段不執行dropout來調整數值範圍,激活函數a的預期結果也不會發生變化,所以沒必要在測試階段額外添加尺度參數,這與訓練階段不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章