深度学习Deep Learning: dropout策略防止过拟合
本文參考 hogo在youtube上的視頻 :https://www.youtube.com/watch?v=UcKPdAM8cnI
一、理論基礎
dropout的提出是為了防止在訓練過程中的過擬合現象,那就有人想了,能不能對每一個輸入樣本訓練一個模型,然后在test階段將每個模型取均值,這樣通過所有模型共同作用,可以將樣本最有用的信息提取出來,而把一些噪聲過濾掉。
那如何來實現這種想法呢?在每一輪訓練過程中,我們對隱含層的每個神經元以一定的概率p舍棄掉,這樣相當于每一個樣本都訓練出一個模型。假設有H個神經元,那么就有2H種可能性,對應2H模型,訓練起來時間復雜度太高。我們通過權重
共享(weights sharing)的方法來簡化訓練過程,每個樣本所對應模型是部分權重共享的,只有被舍棄掉那部分權重不同。
使用dropout可以使用使一個隱含結點不能與其它隱含結點完全協同合作,因此其它的隱含結點可能被舍棄,這樣就不能通過所有的隱含結點共同作用訓練出復雜的模型(只針對某一個訓練樣本),我們不能確定其它隱含結點此時是否被激活,這樣
就有效的防止了過擬合現象。
如下圖所示,在訓練過程中神經元以概率p出現,而在測試階段它一直都存在。
注:如果有多個隱含層,那么對每一個隱含層分別使用dropout策略
?
1.1 訓練階段
forward propagation
在前向傳播過程中,使用掩模m(k)uq將部分隱含層結點舍棄。
backpropagation
反向傳播階段,即權重調整階段,通過掩模只調整那些未被舍棄的結點的權重。
1.2 測試階段
在前面介紹過,我們可能訓練出很多種模型,在測試階段對其取平均,有兩種取平均的方法:
假設有兩個模型m1,m2,輸出分別為O1,O2,最終輸出為O
?1、mixture
O = (O1+O2) / 2
2、product (geometric mean)
O = sqrt( O1*O2 )
以上這兩種方法都是非常耗時的,我們使用一種挖的方法,即對模型的輸出乘以0.5(假設dropout的概率是0.5),如果僅包含一個隱含結點,那么這種方法與geometric mean結果相同,反之,也可以很好的近似。
如果dropout的概率是0.5,那么就對所有輸出乘以0.5,
dropout是在每一輪的權重調整時(backpropagation時)在隱含層以一定的概率舍棄某些神經元(一般取0.5),因此每個神經元只以上一層的一部分神經元相關,即隱含層每個神經元相當于單獨訓練,即每個神經元模型獨立。
1.3 對輸入層的dropout
以上講的是如何在隱含層做dropout,其實也可以在輸入層做dropout,這就是前面提到的denoising策略,只是我們以比較大的概率將輸入保留下來?。
?
1.4 denoising and dropout
- denoising用于輸入層,dropout用于隱含層
- denoising是用于無監督訓練,dropout用于有監督訓練,denoising可用于有監督訓練的預訓練過程。
- 兩者都用來防止過擬合
二、實驗部分
本實驗使用deepLearnToolbox 工具包,將autoencoder模型使用dropout前后的結果進行比較。
dropout并沒有明顯的降低誤差率,可能需要調參吧。。作者在論文中的效果非常之明顯。
誤差率:
without dropout 0.18300?
with dropout : 0.144000
?
實驗主要代碼:
nn.dropoutFraction = 0.5; 用來設置dropout的百分比,一般0.5的效果最好。 load mnist_uint8; train_x = double(train_x(1:2000,:)) / 255; test_x = double(test_x(1:1000,:)) / 255; train_y = double(train_y(1:2000,:)); test_y = double(test_y(1:1000,:));%% //實驗一without dropout rand('state',0) sae = saesetup([784 100]); sae.ae{1}.activation_function = 'sigm'; sae.ae{1}.learningRate = 1 opts.numepochs = 10; opts.batchsize = 100; sae = saetrain(sae , train_x , opts ); visualize(sae.ae{1}.W{1}(:,2:end)');nn = nnsetup([784 100 10]);% //初步構造了一個輸入-隱含-輸出層網絡,其中包括了% //權值的初始化,學習率,momentum,激發函數類型,% //懲罰系數,dropout等nn.W{1} = sae.ae{1}.W{1};opts.numepochs = 10; % //Number of full sweeps through data opts.batchsize = 100; % //Take a mean gradient step over this many samples [nn, L] = nntrain(nn, train_x, train_y, opts); [er, bad] = nntest(nn, test_x, test_y); str = sprintf('testing error rate is: %f',er); disp(str)%% //實驗二:with dropout rand('state',0) sae = saesetup([784 100]); sae.ae{1}.activation_function = 'sigm'; sae.ae{1}.learningRate = 1;opts.numepochs = 10; opts.bachsize = 100; sae = saetrain(sae , train_x , opts ); figure; visualize(sae.ae{1}.W{1}(:,2:end)');nn = nnsetup([784 100 10]);% //初步構造了一個輸入-隱含-輸出層網絡,其中包括了% //權值的初始化,學習率,momentum,激發函數類型,% //懲罰系數,dropout等 nn.dropoutFraction = 0.5; nn.W{1} = sae.ae{1}.W{1}; opts.numepochs = 10; % //Number of full sweeps through data opts.batchsize = 100; % //Take a mean gradient step over this many samples [nn, L] = nntrain(nn, train_x, train_y, opts); [er, bad] = nntest(nn, test_x, test_y); str = sprintf('testing error rate is: %f',er); disp(str)?
參考文獻:
hintin dropout youtube視頻:https://www.youtube.com/watch?v=5t-mVtrFVyY
hogo dropout youtube視頻:https://www.youtube.com/watch?v=UcKPdAM8cnI
deepLearn Toolbox使用:?http://www.cnblogs.com/dupuleng/articles/4340293.html
hinton原文 Dropout:?A simple Way to prevent Neural Networks from Overfitting
?
from:?http://www.cnblogs.com/dupuleng/articles/4341265.html
總結
以上是生活随笔為你收集整理的深度学习Deep Learning: dropout策略防止过拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [caffe]深度学习之图像分类模型Al
- 下一篇: 深度学习Deep learning:四十