神经网络优化篇:详解dropout 正则化(Dropout Regularization)
dropout 正則化
除了\(L2\)正則化,還有一個非常實用的正則化方法——“Dropout(隨機失活)”。
假設在訓練上圖這樣的神經網絡,它存在過擬合,這就是dropout所要處理的,復制這個神經網絡,dropout會遍歷網絡的每一層,并設置消除神經網絡中節點的概率。假設網絡中的每一層,每個節點都以拋硬幣的方式設置概率,每個節點得以保留和消除的概率都是0.5,設置完節點概率,會消除一些節點,然后刪除掉從該節點進出的連線,最后得到一個節點更少,規模更小的網絡,然后用backprop方法進行訓練。
這是網絡節點精簡后的一個樣本,對于其它樣本,照舊以拋硬幣的方式設置概率,保留一類節點集合,刪除其它類型的節點集合。對于每個訓練樣本,都將采用一個精簡后神經網絡來訓練它,這種方法似乎有點怪,單純遍歷節點,編碼也是隨機的,可它真的有效。不過可想而知,針對每個訓練樣本訓練規模小得多的網絡,最后可能會認識到為什么要正則化網絡,因為在訓練規模小得多的網絡。
如何實施dropout呢?方法有幾種,接下來要講的是最常用的方法,即inverted dropout(反向隨機失活),出于完整性考慮,用一個三層(\(l=3\))網絡來舉例說明。編碼中會有很多涉及到3的地方。只舉例說明如何在某一層中實施dropout。
首先要定義向量\(d\),\(d^{[3]}\)表示網絡第三層的dropout向量:
d3 = np.random.rand(a3.shape[0],a3.shape[1])
然后看它是否小于某數,稱之為keep-prob,keep-prob是一個具體數字,上個示例中它是0.5,而本例中它是0.8,它表示保留某個隱藏單元的概率,此處keep-prob等于0.8,它意味著消除任意一個隱藏單元的概率是0.2,它的作用就是生成隨機矩陣,如果對\(a^{[3]}\)進行因子分解,效果也是一樣的。\(d^{[3]}\)是一個矩陣,每個樣本和每個隱藏單元,其中\(d^{[3]}\)中的對應值為1的概率都是0.8,對應為0的概率是0.2,隨機數字小于0.8。它等于1的概率是0.8,等于0的概率是0.2。
接下來要做的就是從第三層中獲取激活函數,這里叫它\(a^{[3]}\),\(a^{[3]}\)含有要計算的激活函數,\(a^{[3]}\)等于上面的\(a^{[3]}\)乘以\(d^{[3]}\),a3 =np.multiply(a3,d3),這里是元素相乘,也可寫為\(a3*=d3\),它的作用就是讓\(d^{[3]}\)中所有等于0的元素(輸出),而各個元素等于0的概率只有20%,乘法運算最終把\(d^{\left\lbrack3 \right]}\)中相應元素輸出,即讓\(d^{[3]}\)中0元素與\(a^{[3]}\)中相對元素歸零。
如果用python實現該算法的話,\(d^{[3]}\)則是一個布爾型數組,值為true和false,而不是1和0,乘法運算依然有效,python會把true和false翻譯為1和0,大家可以用python嘗試一下。
最后,向外擴展\(a^{[3]}\),用它除以0.8,或者除以keep-prob參數。
下面解釋一下為什么要這么做,為方便起見,假設第三隱藏層上有50個單元或50個神經元,在一維上\(a^{[3]}\)是50,通過因子分解將它拆分成\(50×m\)維的,保留和刪除它們的概率分別為80%和20%,這意味著最后被刪除或歸零的單元平均有10(50×20%=10)個,現在看下\(z^{\lbrack4]}\),\(z^{[4]} = w^{[4]} a^{[3]} + b^{[4]}\),的預期是,\(a^{[3]}\)減少20%,也就是說\(a^{[3]}\)中有20%的元素被歸零,為了不影響\(z^{\lbrack4]}\)的期望值,需要用\(w^{[4]} a^{[3]}/0.8\),它將會修正或彌補所需的那20%,\(a^{[3]}\)的期望值不會變,劃線部分就是所謂的dropout方法。
它的功能是,不論keep-prop的值是多少0.8,0.9甚至是1,如果keep-prop設置為1,那么就不存在dropout,因為它會保留所有節點。反向隨機失活(inverted dropout)方法通過除以keep-prob,確保\(a^{[3]}\)的期望值不變。
事實證明,在測試階段,當評估一個神經網絡時,也就是用綠線框標注的反向隨機失活方法,使測試階段變得更容易,因為它的數據擴展問題變少。
據了解,目前實施dropout最常用的方法就是Inverted dropout,建議大家動手實踐一下。Dropout早期的迭代版本都沒有除以keep-prob,所以在測試階段,平均值會變得越來越復雜,不過那些版本已經不再使用了。
現在使用的是\(d\)向量,會發現,不同的訓練樣本,清除不同的隱藏單元也不同。實際上,如果通過相同訓練集多次傳遞數據,每次訓練數據的梯度不同,則隨機對不同隱藏單元歸零,有時卻并非如此。比如,需要將相同隱藏單元歸零,第一次迭代梯度下降時,把一些隱藏單元歸零,第二次迭代梯度下降時,也就是第二次遍歷訓練集時,對不同類型的隱藏層單元歸零。向量\(d\)或\(d^{[3]}\)用來決定第三層中哪些單元歸零,無論用foreprop還是backprop,這里只介紹了foreprob。
如何在測試階段訓練算法,在測試階段,已經給出了\(x\),或是想預測的變量,用的是標準計數法。用\(a^{\lbrack0]}\),第0層的激活函數標注為測試樣本\(x\),在測試階段不使用dropout函數,尤其是像下列情況:
\(z^{[1]} = w^{[1]} a^{[0]} + b^{[1]}\)
\(a^{[1]} = g^{[1]}(z^{[1]})\)
\(z^{[2]} = \ w^{[2]} a^{[1]} + b^{[2]}\)
\(a^{[2]} = \ldots\)
以此類推直到最后一層,預測值為\(\hat{y}\)。
顯然在測試階段,并未使用dropout,自然也就不用拋硬幣來決定失活概率,以及要消除哪些隱藏單元了,因為在測試階段進行預測時,不期望輸出結果是隨機的,如果測試階段應用dropout函數,預測會受到干擾。理論上,只需要多次運行預測處理過程,每一次,不同的隱藏單元會被隨機歸零,預測處理遍歷它們,但計算效率低,得出的結果也幾乎相同,與這個不同程序產生的結果極為相似。
Inverted dropout函數在除以keep-prob時可以記住上一步的操作,目的是確保即使在測試階段不執行dropout來調整數值范圍,激活函數的預期結果也不會發生變化,所以沒必要在測試階段額外添加尺度參數,這與訓練階段不同。
\(l=keep-prob\)
這就是dropout。
總結
以上是生活随笔為你收集整理的神经网络优化篇:详解dropout 正则化(Dropout Regularization)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旗舰WiFi6路由器的入门选择(WiFi
- 下一篇: 一文聊透 Linux 缺页异常的处理 —