# Dropout > 深度學習之所以強大是因為它的網路擁有許多參數,然而當訓練資料太少且神經網路太過於強時,往往會有overfitting的現象。為了解決此現象,有提出以下幾種方法。 - Getting more data - Regularization - Dropout 什麼是Dropout --- ![](https://i.imgur.com/mMRJVqH.png) 如果對random forest有點概念的話,會發現它是一種不容易發生overfitting的方法,其採用的方法是bagging,把多個樹的輸出結果做平均,得出最後的結果。而每棵樹都是在不同的訓練集上、設定不同的參數得到的;但是當每一個network參數量都很大時,訓練其實很耗時間。 如上圖所示,Dropout就是將一部分的神經元移除,其實是把這些神經元從輸入到輸出的連結斷掉。給定一個隨機的機率p,決定有多少個神經元被drop。文章中把dropout的network稱為thinned network,換句話說,thinned network是由被保留下來的神經元所組成。透過多次迭代,每次迭代都會做隨機取樣,從原來的網路中構造一個thinned network,而每次的網路結構也都不盡相同,這就使得學習在結果上差異性,最後再對這些每個迭代學習到的不同的thinned network做一個bagging來得到最終的輸出結果。 文章中提到,如果一個network有n個神經元,而每個神經元都可能被關閉或不被關閉,可以視為是一個 2^n^個神經元所組成的network。這些thinned network有一個特點,叫做**權值共享**,所以參數的總數還是O(2^n^)。因為每次dropout都會產生不同的network,更新不同的權值,因為權值共享的關係,這些神經元對應的權值沒有必要在重新開始更新,而是繼續沿用上一個更新好的值。這就大大減少了更新參數的時間,這個network就可以得到不錯的泛化效果。 Train and Test --- - Train: 如果整個network神經元總數為1000個,在訓練過程中我們給定的機率p為40%,被保留下來的神經元就會有400個神經元被關閉,600個神經元被保留下來, - Test: 不需要再做dropout的動作,是使用整個神經網路,只需要將每一層的權值矩陣乘以p%就可以保證測試網路的輸出期望和訓練網路的輸出期望值大小一致了。 - ![](https://i.imgur.com/GeqJoEU.png) Model Description --- 以下是正常的神經網路計算方式,其中f為activation function \begin{gather*}z^(l+i) = w_i^(l+i) * y^l + b^(l+i)\end{gather*} \begin{gather*}y^(l+i) = f(z^(l+i))\end{gather*} dropout情況時, \begin{gather*}r_j^(l) ∼ Bernoulli(p) \end{gather*} \begin{gather*}y^(l) = r^(l)∗ y^(l)\end{gather*} \begin{gather*}z^(l+i) = w_i^(l+i) * y^l + b^(l+i)\end{gather*} \begin{gather*}y^(l+i) = f(z^(l+i))\end{gather*} ![](https://i.imgur.com/C4hsFHB.png) ###### tags: `ML`