Dropout 上


From 《白話深度學習與TensorFlow》

        Dropout 顧名思義是“丟棄”,在一輪訓練階段丟棄一部分網絡節點,比如可以在其中的某些層上臨時關閉一些節點,讓他們既不輸入也不輸出,這樣相當於網絡的結構發生了改變。而在下一輪訓練過程中再選擇性地臨時關閉一些節點,原則上都是隨機性。這樣每一次訓練相當於網絡的一部分所形成的一個子網絡或者子模型。而這種情況同時也在一種程度上降低了VC維的數量,減小過擬合的風險。在最終的分類階段將所有的節點都置於有效狀態,這樣就可以把訓練中得到的所有子網絡並聯使用,形成一個由多個VC維較低的部分的分類模型所組成的完整的分類模型。

在TensorFlow中設置訓練當中的Dropout比例只要加入以下代碼就可以:

keep_pro=tf.placeholder(tf.float32)

h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)

 

From 《Deep Learning》

       先看一下bagging(bagging aggregating)吧,bagging是通過結合幾個模型降低泛化誤差的技術。主要想法是分別訓練幾個不同的模型,然后讓所有模型表決測試樣例的輸出,被稱為模型平均(model averaging)。Bagging學習是,定義k個不同的模型,從訓練集有放回采樣構造k個不同的數據集,然后在訓練集i上訓練模型i。

        Dropout 提供了一種廉價的Bagging集成近似,能夠訓練和評估指數級數量的神經網絡。Dropout訓練的集成包括所有從基礎網絡除去非輸出單元后形成的子網絡。最先進的網絡基於一系列仿射變換和非線性變換,我們只需要將一些單元的輸出乘以零就能夠有效地刪除一個單元。

計算方便是Dropout的一個優點。

Dropout的另一個顯著優點是不怎么限制使用的模型或者訓練過程。

Dropout是一個正則化技術,它減少了模型的有效容量。目前為止,Dropout仍然是最廣泛使用的隱式集成方法。

一種關於Dropout的重要見解是,通過隨機行為訓練網絡並平均多個隨機決定進行預測,實現了一種參數共享的Bagging形式。

Dropout不僅僅是訓練一個Bagging的集成模型,而且是共享隱藏單元的集成模型。

Dropout正則化每個隱藏單元不僅是一個很好的特征,更需要在許多情況下是良好的特征。

相比於獨立模型集成獲得泛化誤差改進,Dropout會帶來額外的改進。

Dropout強大的大部分原因來自施加到隱藏單元的掩碼噪聲。Dropout的另一個重要方面是噪聲是乘性的。

另一種深度學習算法——批標准化,在訓練時向隱藏單元引入加性和乘性噪聲重新參數化模型。

批標准化的目的是改善優化,但是噪聲具有正則化的效果,有時沒有必要再使用Dropout.

(正則化:

)

 補充:

1.dropout解決的問題---過擬合(https://blog.csdn.net/loveliuzz/article/details/82912349)

過擬合是指模型訓練到一定程度后,在訓練集上得到的測試誤差遠大於在測試集上得到的誤差。

導致過擬合的直接原因是模型學習了太多噪聲模式,並錯誤的將其視為數據模式;導致過擬合的主要原因有:
1. 訓練數據集太小
2. 模型太復雜
3. 過度訓練

常用的過擬合解決方案

知道了產生過擬合的原因,就可以制定相應的解決方案,一般而言,解決的主要方法有:增加訓練數據量、減少模型的復雜度、添加正則項等。在深度學習中,以上方法都可以使用,但是dropout是一個更加高效、簡單的防止過擬合的方法。

dropout為什么可以防止過擬合

我們知道“隨機森林”是一種不容易發生過擬合的算法,其采用的方法是“bagging”,即通過對多個樹的輸出結果加權平均,得出最后的結果。而每棵樹都是在不同的訓練集上、設置不同的參數得到的,因此是一種典型的通過多個不同參數,甚至不同類型的模型來降低方差的一種方法。這種方法對傳統的機器學習算法、或者小型的NN模型可行,但是當數據量很大、模型很復雜的時候,我們不能訓練多個不同的模型出來做”bagging”,因為深度神經網絡的訓練是一個很耗時的過程,需要大量的計算資源和時間。
dropout則為這種思想提供了一種“廉價”的解決方案,因為每一次迭代的過程中,我們會隨機dropout掉一些神經元(至於在那一層做dropout,需要看不同的情況),如果設置的dropout的值為0.5,則表示每個神經元有50%的概率被留下來,50%的概率被”抹去“。這就相當於我們從原來的神經網絡中隨機采樣了50%的節點,組成了一個新的神經網絡,這個是原來的神經網絡的一個子網絡,但是規模要比原來的神經網絡小很多,並且訓練代價也比較小, 這個新的子網絡就相當於是”隨即森林“中的一個子樹(sub-tree)了。我們多次迭代優化,每次迭代優化都會做這樣的”隨機采樣“,從原來的網絡中構造一個子網絡(sub-network),而每次構造的網絡也都不盡相同,這就使得學習到的sub-network在結果上差異性,最后再對這些每個迭代學習到的不同的sub-network做一個”bagging“來得到最終的輸出結果。

dropout中的一些細節問題

    • 如何對多個不同的sub-network做bagging:這里並沒有做真正意義上的bagging,我們預測的時候,其實使用的整個完整的神經網絡,並沒有做任何dropout。這里面有一個”權值共享“的概念,正是這個概念讓dropout的計算變得可行。因為每次迭代都會產生不用的sub-network,優化不同的權值,這必然使得前后兩次之間的sub-network有相同的神經元被保留下來,那么這些神經元對應的權值沒有必要在重新開始優化,而是繼續沿用上一個迭代優化好的值。這就大大減少了優化單個sub-network的時間,使得在很少的時間內,這個sub-network就可以得到不錯的泛化效果。否則,每個迭代步驟都要從新初始化權值矩陣,開始優化,這又是一個巨大的計算開銷。
    • train 和 test 的時候,dropout的概率怎么設置:按照原始的論文中,假設dropout的值是 p%,原始神經網絡的神經元個數是N,因為在訓練的過程中只有 p% 的神經元被保留下來,相應也只有p%的需要被優化的權值保留下來,這導致dropout后sub-network的輸出也是整個原始神經網絡的輸出值的p%。所以,在測試的是時候使用的整個神經網絡,我們只需要將每一層的權值矩陣乘以p%就可以保證測試網絡的輸出期望和訓練網絡的輸出期望值大小一致了。
  • 為什么很少見CNN層加dropout: 這種情況確實不多見,典型的TextCNN模型,就是沒有在卷積層加dropout。但是原始論文中確實又指出可以在卷積層做dropout ,只是收益並不是太明顯。另外,dropout對於具有大量參數的全連接效果最好,而CNN的卷積層不是全連接,參數不是很多,所以效果不明顯。論文還建議如果在CNN中加,最好是在開始的層加dropout,越往后的層,越是要小心加dropout。
  • 神經網絡加上dropout后,test loss 比 train loss還要小:正常,在不考慮測試集采樣偏差的情況下,這種情況的解釋是:每次train loss是在一個batch上計算的,而單個batch又是在一個通過dropout得到的sub-network計算得到的,即相當於在單顆樹上得到的train loss;而測試的時候,用的整個神經網絡,即相當於在整個”森林“上做預測,結果當然會好一下。

 

訓練有scale,測試不用管。

訓練沒scale,測試要乘p。

https://yq.aliyun.com/articles/68901

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM