dropout 正則化( Dropout Regularization)
除了L2正則化,還有一個非常實用的正則化方法——Dropout( 隨機失活):

假設你在訓練上圖這樣的神經網絡,它存在過擬合,這就是 dropout 所要處理的,我們復制這個神經網絡, dropout 會遍歷網絡的每一層,並設置消除神經網絡中節點的概率。假設網絡中的每一層,每個節點都以拋硬幣的方式設置概率,每個節點得以保留和消除的概率都是 0.5,設置完節點概率,我們會消除一些節點,然后刪除掉從該節點進出的連線,最后得到一個節點更少,規模更小的網絡,然后用 backprop 方法進行訓練。


以上就是網絡精簡的一個樣本,對於每個訓練樣本,我們都將采用一個精簡后神經網絡來訓練它,這種方法似乎有點怪,單純遍歷節點,編碼也是隨機的,可它真的有效。
實施dropout的方法有幾種,最常用的是inverted dropout(反向隨機失活),例如在一個3層網絡中:首先要定義向量d,${d^{[3]}}$表示一個三層的 dropout 向量:
d3 = np.random.rand(a3.shape[0],a3.shape[1])
然后看它是否小於某數,我們稱之為 keep-prob, keep-prob 是一個具體數字 ,它表示保留某個隱藏單元的概率 ,例如 keep-prob 等於 0.8,它意味着消除任意一個隱藏單元的概率是 0.2,它的作用就是生成隨機矩陣 。
${d^{[3]}}$中的對應值為 1 的概率都是 0.8,對應為 0 的概率是 0.2,隨機數字小於 0.8。
接下來要做的就是從第三層中獲取激活函數,這里我們叫它 ${a^{[3]}}$:
a3 =np.multiply(a3,d3)
這里是元素相乘,也可寫為 :
a3 *= d3
乘法運算最終把 ${d^{[3]}}$中相應元素輸出 ,即讓 ${d^{[3]}}$中 0 元素與 ${a^{[3]}}$中相對元素歸零。 
如果用 python 實現該算法的話,${d^{[3]}}$ ,則是一個布爾型數組,值為 true 和 false,而不是1 和 0,乘法運算依然有效, python 會把 true 和 false 翻譯為 1 和 0 。
最后,我們向外擴展 ${a^{[3]}}$,用它除以 keep-prob 參數。
a3 /= keep-prob
keep-prob 參數:
不論 keep-prop 的值是多少 0.8, 0.9 甚至是 1,如果 keep-prop 設置為 1,那么就不存在 dropout,因為它會保留所有節點。 反向隨機失活( inverted dropout)方法通過除以 keep-prob,確保 ${a^{[3]}}$的期望值不變。 在測試階段,我們並未使用 dropout,自然也就不用拋硬幣來決定失活概率,以及要消除哪些隱藏單元了,因為在測試階段進行預測時,我們不期望輸出結果是隨機的,如果測試階段應用 dropout 函數,預測會受到干擾。
