深度學習可能存在過擬合問題——高方差,有兩個解決辦法,一是正則化,另乙個是準備更多的資料,但由於無法時時刻刻準備足夠多的訓練資料或者獲取資料的成本高,所以通常使用正則化的方法來避免過擬合。正則化的主要方法有:l2正則化
dropout
資料增廣
early stopping
bagging
在樣本中增加雜訊
本篇介紹dropout正則化:
dropout(隨機失活)也是一種非常使用的正則化方法。
1. dropout工作原理
假設在訓練下圖的神經網路時,它存在過擬合(這就是dropout做要處理的),dropout會遍歷網路的每一層,並設計消除神經網路中節點的概率。
假設網路中的每一層,每乙個節點都以拋硬幣的方式設定概率,每個節點得以保留和消除的概率都是0.5,設定完節點概率,會消除一些節點,最後得到乙個節點更少,網路規模更小的網路,然後使用backprop方法進行訓練。
這是網路節點精簡後的乙個樣本,對於其他樣本,重複這一過程。
2. dropout實現
在訓練階段:
我們設定乙個保留因子keep_prop,表示保留某個隱藏單元的概率,可以是0.5,0.8等。
假設我們對上圖中的第三層進行實施dropout,設keep_prop=0.8,意味著消除每乙個神經單元的概率為0.2。若從第三層中獲取啟用函式的值為a3(是乙個向量),為a3中的每乙個值乘以乙個以1或0(為0的概率是20%),得到新的a3值。最後向外擴充套件a3,用它除以0.8(即keep_prop引數)。
a3 /= keep_prop
解釋以下為什麼這麼做?
假設第三個隱藏層上有50個單元或者神經元,keep_prop=0.8,那麼保留和刪除它們的概率分別為80%和20%,這意味著有最後被刪除或者歸零的單元平均有10(50x20%=10)個,那麼在下一層第四層z4,z4=w4 * a3+b4,我們的預期是a3減少20%,也就是a3中有20%的元素被歸零,為了不影響z4的期望值,需要用w4*a3/0.8,它將會修正或者彌補損失的20%,保證a3的期望值不會變。
在測試階段:
與訓練階段不同,測試階段不需要額外新增尺度引數,inverted dropout函式會在除以keep-prop時可以記住上一步操作,可以確保在測試階段不執行dropout來調整數值範圍,啟用函式的預期結果也不會發生變化,使測試階段變得容易。
注:如果在訓練階段使用dropout,部分神經元置零後,沒有對a3進行修正,那麼在測試階段,就需要對權重進行縮放,即w(test) = keep_prop * w。
3. 為什麼dropout可以起到正則化作用
直觀上理解,即不依賴於任何乙個特徵,因為該特徵可能隨時被清除。如下圖所示的紫色單元,它不能依靠任何特徵,所以,他不願意把所有賭注放在乙個節點上,不願意給任何乙個輸入加上太多權重,因為它有可能會被刪除,因此該單元將通過這種方式積極地傳播開,並為單元的四個輸入增加一點權重,通過傳播所有權重,dropout 將產生收縮權重的平方範數的效果,和我們之前講過的?2正則化類似,實施 dropout的結果是它會壓縮權重,並完成一些預防過擬合的外層正則化。
4. dropout的缺點
dropout 一大缺點就是代價函式?不再被明確定義,每次迭代,都會隨機移除一些節點,如果再三檢查梯度下降的效能,實際上是很難進行複查的。定義明確的代價函式?每次迭代後都會下降,因為我們所優化的代價函式 j 實際上並沒有明確定義,或者說在某種程度上很難計算。
深度神經網路正則化
在深層網路學習中,為了防止過擬合問題,正則化是個有效措施。以下是用tensorflow搭建的小例子,配合tensorboard。import tensorflow as tf import os os.environ tf cpp min log level 2 cpu加速 def get weig...
神經網路的正則化
神經網路的vc dimension的值與神經元的個數以及權重的個數有關。所以個數越多,神經網路模型越強大越複雜。相應的就有可能出現過擬合的現象。那麼如何預防過擬合呢,有兩種方法。正則化項,這是最常見的方法,不同的是,神經網路用梯度下降法優化權重,所以需要損失函式是可導得,如果使用l1正則化項,就不可...
神經網路正則化方法
在訓練資料不夠多時,或者overtraining時,常常會導致overfitting 過擬合 其直觀的表現如下圖所示,隨著訓練過程的進行,模型複雜度增加,在training data上的error漸漸減小,但是在驗證集上的error卻反而漸漸增大 因為訓練出來的網路過擬合了訓練集,對訓練集外的資料卻...