天天看點

Dropout原理,代碼淺析

Dropout原理介紹

一:引言

因為在機器學習的一些模型中,如果模型的參數太多,而訓練樣本又太少的話,這樣訓練出來的模型很容易産生過拟合現象。在訓練bp網絡時經常遇到的一個問題,過拟合指的是模型在訓練資料上損失函數比較小,預測準确率較高(如果通過畫圖來表示的話,就是拟合曲線比較尖,不平滑,泛化能力不好),但是在測試資料上損失函數比較大,預測準确率較低。

常用的防治過拟合的方法是在模型的損失函數中,需要對模型的參數進行“懲罰”,這樣的話這些參數就不會太大,而越小的參數說明模型越簡單,越簡單的模型則越不容易産生過拟合現象。是以在添權重值懲罰項後,應用梯度下降算法疊代優化計算時,如果參數theta比較大,則此時的正則項數值也比較大,那麼在下一次更新參數時,參數削減的也比較大。可以使拟合結果看起來更平滑,不至于過拟合。

Dropout是hintion最近2年提出的;為了防止模型過拟合,Dropout可以作為一種trikc供選擇。在hinton的論文摘要中指出,在每個訓練批次中,通過忽略一半的特征檢測器(讓一半的隐層節點值為0),可以明顯地減少過拟合現象。這種方式可以減少特征檢測器間的互相作用,檢測器互相作用是指某些檢測器依賴其他檢測器才能發揮作用。

 二  Dropout方法

訓練階段:

1.Dropout是在标準的bp網絡的的結構上,使bp網的隐層激活值,以一定的比例v變為0,即按照一定比例v,随機地讓一部分隐層節點失效;在後面benchmark實驗測試時,部分實驗讓隐層節點失效的基礎上,使輸入資料也以一定比例(試驗用20%)是部分輸入資料失效(這個有點像denoising autoencoder),這樣得到了更好的結果。

2.去掉權值懲罰項,取而代之的事,限制權值的範圍,給每個權值設定一個上限範圍;如果在訓練跟新的過程中,權值超過了這個上限,則把權值設定為這個上限的值(這個上限值得設定作者并沒有說設定多少最好,後面的試驗中作者說這個上限設定為15時,最好;為啥?估計是交叉驗證得出的實驗結論)。

這樣處理,不論權值更新量有多大,權值都不會過大。此外,還可以使算法使用一個比較大的學習率,來加快學習速度,進而使算法在一個更廣闊的權值空間中搜尋更好的權值,而不用擔心權值過大。

測試階段:

在網絡前向傳播到輸出層前時隐含層節點的輸出值都要縮減到(1-v)倍;例如正常的隐層輸出為a,此時需要縮減為a(1-v)。

這裡我的解釋是:假設比例v=0.5,即在訓練階段,以0.5的比例忽略隐層節點;那麼假設隐層有80個節點,每個節點輸出值為1,那麼此時隻有40個節點正常工作;也就是說總的輸出為40個1和40個0;輸出總和為40;而在測試階段,由于我們的權值已經訓練完成,此時就不在按照0.5的比例忽略隐層輸出,假設此時每個隐層的輸出還是1,那麼此時總的輸出為80個1,明顯比dropout訓練時輸出大一倍(由于dropout比例為0.5);是以為了得到和訓練時一樣的輸出結果,就縮減隐層輸出為a(1-v);即此時輸出80個0.5,總和也為40.這樣就使得測試階段和訓練階段的輸出“一緻”了。(個人見解)

三  Dropout原理分析

Dropout可以看做是一種模型平均,所謂模型平均,顧名思義,就是把來自不同模型的估計或者預測通過一定的權重平均起來,在一些文獻中也稱為模型組合,它一般包括組合估計群組合預測。

Dropout中哪裡展現了“不同模型”;這個奧秘就是我們随機選擇忽略隐層節點,在每個批次的訓練過程中,由于每次随機忽略的隐層節點都不同,這樣就使每次訓練的網絡都是不一樣的,每次訓練都可以單做一個“新”的模型;此外,隐含節點都是以一定機率随機出現,是以不能保證每2個隐含節點每次都同時出現,這樣權值的更新不再依賴于有固定關系隐含節點的共同作用,阻止了某些特征僅僅在其它特定特征下才有效果的情況。

這樣dropout過程就是一個非常有效的神經網絡模型平均方法,通過訓練大量的不同的網絡,來平均預測機率。不同的模型在不同的訓練集上訓練(每個批次的訓練資料都是随機選擇),最後在每個模型用相同的權重來“融合”,介個有點類似boosting算法。

四 代碼詳解

首先先介紹一個基于matlab deeplearning toolbox版本的dropout代碼,主要參考(tornadomeet大牛部落格),如果了解DenoisingAutoencoder的訓練過程,則這個dropout的訓練過程如出一轍;不需要怎麼修改,就可以直接運作,因為在toolbox中已經修改完成了。

這個過程比較簡單,而且也沒有使用L2規則項,來限制權值的範圍;主要是用于了解dropout網絡,在訓練樣本比較少的情況下,dropout可以很好的防止網絡過拟合。

訓練步驟:

1.提取資料(隻提取2000個訓練樣本)

2 初始化網絡結構:這裡主要利用nnsetup函數建構一個[784 100 10]的網絡。由于是練習用途,是以不進行pre_training。

3 采用minibatch方法,設定dropout比例nn.dropoutFraction=0.5;利用nntrain函數訓練網絡。

按比例随機忽略隐層節點:

if(nn.dropoutFraction > 0)

           if(nn.testing)%測試階段實作mean network,詳見上篇博文

                nn.a{i} = nn.a{i}.*(1 - nn.dropoutFraction);

           else%訓練階段使用

                nn.dropOutMask{i} =(rand(size(nn.a{i}))>nn.dropoutFraction);

                nn.a{i} =nn.a{i}.*nn.dropOutMask{i};

           end

end

>> a=rand(1,6)

>> temp=(rand(size(a))>0.5)

>> dropout_a=a.*temp

結果:

隐層值 0.1576 0.9706 0.9572 0.4854 0.8003 0.1419
随機選擇 1 1 1
結果 0.1576 0.9572 0.8003

隐層值按照比例變為0.

誤差delta反向傳播實作:

%  delta(i)=delta(i+1)*W(i)*a(i)*(1-a(i))  ;之後再進行dropout

if(nn.dropoutFraction>0)

   d{i} = d{i} .* [ones(size(d{i},1),1) nn.dropOutMask{i}];

end

權值更新值delta_w實作:

%  delta_w(i)=delta(i+1)*a(i)

for i = 1 : (n - 1)

    if i+1==n

       nn.dW{i} = (d{i + 1}' * nn.a{i}) / size(d{i + 1}, 1);

    else

   nn.dW{i} = (d{i + 1}(:,2:end)' * nn.a{i}) / size(d{i + 1}, 1);

    end

end

測試樣本錯誤率:15.500%   without  dropout

測試樣本錯誤率:12.100%   with  dropout

參考文獻:

http://www.cnblogs.com/tornadomeet/p/3258122.html

繼續閱讀