計算機視覺秋招準備(2):一文看懂dropout

1. Dropout出現的原因

在機器學習的模型中,如果模型的參數太多,而訓練樣本又太少,訓練出來的模型很容易產生過擬合的現象。在訓練神經網絡的時候經常會遇到過擬合的問題,過擬合具體表現在:模型在訓練數據上損失函數較小,預測準確率較高;但是在測試數據上損失函數比較大,預測準確率較低。

過擬合是很多機器學習的通病。如果模型過擬合,那麼得到的模型幾乎不能用。爲了解決過擬合問題,一般會採用模型集成的方法,即訓練多個模型進行組合。此時,訓練模型費時就成爲一個很大的問題,不僅訓練多個模型費時,測試多個模型也是很費時。

綜上所述,訓練深度神經網絡的時候,總是會遇到兩大缺點:

(1)容易過擬合

(2)費時

Dropout可以比較有效的緩解過擬合的發生,在一定程度上達到正則化的效果。

2. 什麼是Dropout

在2012年,Hinton在其論文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。當一個複雜的前饋神經網絡被訓練在小的數據集時,容易造成過擬合。爲了防止過擬合,可以通過阻止特徵檢測器的共同作用來提高神經網絡的性能。

在2012年,Alex、Hinton在其論文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用於防止過擬合。並且,這篇論文提到的AlexNet網絡模型引爆了神經網絡應用熱潮,並贏得了2012年圖像識別大賽冠軍,使得CNN成爲圖像分類上的核心算法模型。

隨後,又有一些關於Dropout的文章《Dropout:A Simple Way to Prevent Neural Networks from Overfitting》、《Improving Neural Networks with Dropout》、《Dropout as data augmentation》。

從上面的論文中,我們能感受到Dropout在深度學習中的重要性。那麼,到底什麼是Dropout呢?

Dropout可以作爲訓練深度神經網絡的一種trick供選擇。在每個訓練批次中,通過忽略一半的特徵檢測器(讓一半的隱層節點值爲0),可以明顯地減少過擬合現象。這種方式可以減少特徵檢測器(隱層節點)間的相互作用,檢測器相互作用是指某些檢測器依賴其他檢測器才能發揮作用。

Dropout說的簡單一點就是:我們在前向傳播的時候,讓某個神經元的激活值以一定的概率p停止工作,這樣可以使模型泛化性更強,因爲它不會太依賴某些局部的特徵,如圖1所示。

3. Dropout的具體工作流程

假設我們要訓練這樣一個神經網絡,

輸入是x輸出是y,正常的流程是:我們首先把x通過網絡前向傳播,然後把誤差反向傳播以決定如何更新參數讓網絡進行學習。使用Dropout之後,過程變成如下:

(1)首先隨機(臨時)刪掉網絡中一半的隱藏神經元,輸入輸出神經元保持不變(圖3中虛線爲部分臨時被刪除的神經元)

(2) 然後把輸入x通過修改後的網絡前向傳播,然後把得到的損失結果通過修改的網絡反向傳播。一小批訓練樣本執行完這個過程後,在沒有被刪除的神經元上按照隨機梯度下降法更新對應的參數(w,b)。

(3)然後繼續重複這一過程:

. 恢復被刪掉的神經元(此時被刪除的神經元保持原樣,而沒有被刪除的神經元已經有所更新)
. 從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉(備份被刪除神經元的參數)。
. 對一小批訓練樣本,先前向傳播然後反向傳播損失並根據隨機梯度下降法更新參數(w,b) (沒有被刪除的那一部分參數得到更新,刪除的神經元參數保持被刪除前的結果)。
不斷重複這一過程。

4. Dropout在神經網絡中的使用

Dropout的具體工作流程上面已經詳細的介紹過了,但是具體怎麼讓某些神經元以一定的概率停止工作(就是被刪除掉)?代碼層面如何實現呢?

下面,我們具體講解一下Dropout代碼層面的一些公式推導及代碼實現思路。

(1)在訓練模型階段

無可避免的,在訓練網絡的每個單元都要添加一道概率流程。

對應的公式變化如下:

  •  . 沒有Dropout的網絡計算公式:

  • . 採用Dropout的網絡計算公式:

上面公式中Bernoulli函數是爲了生成概率r向量,也就是隨機生成一個0、1的向量。

代碼層面實現讓某個神經元以概率p停止工作,其實就是讓它的激活函數值以概率p變爲0。比如我們某一層網絡神經元的個數爲1000個,其激活函數輸出值爲y1、y2、y3、......、y1000,我們dropout比率選擇0.4,那麼這一層神經元經過dropout後,1000個神經元中會有大約400個的值被置爲0。

注意: 經過上面屏蔽掉某些神經元,使其激活值爲0以後,我們還需要對向量y1……y1000進行縮放,也就是乘以1/(1-p)。如果你在訓練的時候,經過置0後,沒有對y1……y1000進行縮放(rescale),那麼在測試的時候,就需要對權重進行縮放,操作如下。

測試階段Dropout公式:

5. 爲什麼說Dropout可以解決過擬合?

(1)取平均的作用: 先回到標準的模型即沒有dropout,我們用相同的訓練數據去訓練5個不同的神經網絡,一般會得到5個不同的結果,此時我們可以採用 “5個結果取均值”或者“多數取勝的投票策略”去決定最終結果。例如3個網絡判斷結果爲數字9,那麼很有可能真正的結果就是數字9,其它兩個網絡給出了錯誤結果。這種“綜合起來取平均”的策略通常可以有效防止過擬合問題。因爲不同的網絡可能產生不同的過擬合,取平均則有可能讓一些“相反的”擬合互相抵消。dropout掉不同的隱藏神經元就類似在訓練不同的網絡,隨機刪掉一半隱藏神經元導致網絡結構已經不同,整個dropout過程就相當於對很多個不同的神經網絡取平均。而不同的網絡產生不同的過擬合,一些互爲“反向”的擬合相互抵消就可以達到整體上減少過擬合。

(2)減少神經元之間複雜的共適應關係: 因爲dropout程序導致兩個神經元不一定每次都在一個dropout網絡中出現。這樣權值的更新不再依賴於有固定關係的隱含節點的共同作用,阻止了某些特徵僅僅在其它特定特徵下才有效果的情況 。迫使網絡去學習更加魯棒的特徵 ,這些特徵在其它的神經元的隨機子集中也存在。換句話說假如我們的神經網絡是在做出某種預測,它不應該對一些特定的線索片段太過敏感,即使丟失特定的線索,它也應該可以從衆多其它線索中學習一些共同的特徵。從這個角度看dropout就有點像L1,L2正則,減少權重使得網絡對丟失特定神經元連接的魯棒性提高。

(3)Dropout類似於性別在生物進化中的角色:物種爲了生存往往會傾向於適應這種環境,環境突變則會導致物種難以做出及時反應,性別的出現可以繁衍出適應新環境的變種,有效的阻止過擬合,即避免環境改變時物種可能面臨的滅絕。

6. pytorch中Dropout的使用

將模型整體的training狀態參數傳入dropout函數

Class DropoutFC(nn.Module):
   def __init__(self):
       super(DropoutFC, self).__init__()
       self.fc = nn.Linear(100,20)
 
   def forward(self, input):
       out = self.fc(input)
       out = F.dropout(out, p=0.5, training=self.training)
       return out
 
Net = DropoutFC()
Net.train()

或者直接使用nn.Dropout() (nn.Dropout()實際上是對F.dropout的一個包裝, 也將self.training傳入了)

Class DropoutFC(nn.Module):
  def __init__(self):
      super(DropoutFC, self).__init__()
      self.fc = nn.Linear(100,20)
      self.dropout = nn.Dropout(p=0.5)
 
  def forward(self, input):
      out = self.fc(input)
      out = self.dropout(out)
      return out
Net = DropoutFC()
Net.train()
 

7. pytoch中dropout源碼

def dropout(input, p=0.5, training=True, inplace=False):
    # type: (Tensor, float, bool, bool) -> Tensor
    r"""
    During training, randomly zeroes some of the elements of the input
    tensor with probability :attr:`p` using samples from a Bernoulli
    distribution.
    See :class:`~torch.nn.Dropout` for details.
    Args:
        p: probability of an element to be zeroed. Default: 0.5
        training: apply dropout if is ``True``. Default: ``True``
        inplace: If set to ``True``, will do this operation in-place. Default: ``False``
    """
    if not torch.jit.is_scripting():
        if type(input) is not Tensor and has_torch_function((input,)):
            return handle_torch_function(
                dropout, (input,), input, p=p, training=training, inplace=inplace)
    if p < 0. or p > 1.:
        raise ValueError("dropout probability has to be between 0 and 1, "
                         "but got {}".format(p))
    return (_VF.dropout_(input, p, training)
            if inplace
            else _VF.dropout(input, p, training))

8. pytorch中的bagging思想

bagging是一種集成方法(ensemble methods),可以通過集成來減小泛化誤差(generalization error)。bagging的最基本的思想是通過分別訓練幾個不同分類器,最後對測試的樣本,每個分類器對其進行投票。在機器學習上這種策略叫model averaging。
model averaging 之所以有效,是因爲並非所有的分類器都會產生相同的誤差,只要有不同的分類器產生的誤差不同就會對減小泛化誤差非常有效。 對於bagging方法,允許採用相同的分類器,相同的訓練算法,相同的目標函數。但是在數據集方面,新數據集與原始數據集的大小是相等的。每個數據集都是通過在原始數據集中隨機選擇一個樣本進行替換而得到的。意味着,每個新數據集中會存在重複的樣本。在數據集建好之後,用相同的學習算法分別作用於每個數據集就得到了幾個分類器。 

我們可以把dropout類比成將許多大的神經網絡進行集成的一種bagging方法。 但是每一個神經網絡的訓練是非常耗時和佔用很多內存的,訓練很多的神經網絡進行集合分類就顯得太不實際了。 但是,dropout可以訓練所有子網絡的集合,這些子網絡通過去除整個網絡中的一些神經元來獲得。 如下圖所示: 

如何移除一個神經元呢,我們通過仿射和非線性變換,試神經元的輸出乘以0。

每次我們加載一個樣本到minibatch,然後隨機的採樣一個不同的二進制掩膜作用在所有的輸出,輸入,隱藏節點上。每個節點的掩膜都是獨立採樣的。採樣一個掩膜值爲1的概率是固定的超參數。

bagging與dropout訓練的對比

(1)在bagging中,所有的分類器都是獨立的,而在dropout中,所有的模型都是共享參數的。

(2)在bagging中,所有的分類器都是在特定的數據集下訓練至收斂,而在dropout中沒有明確的模型訓練過程。網絡都是在一步中訓練一次(輸入一個樣本,隨機訓練一個子網絡)。

(3)(相同點)對於訓練集來說,每一個子網絡的訓練數據是通過原始數據的替代採樣得到的子集。???(自己的理解:每一個輸入一個樣本初始化某一個子網絡)。

(4)類比於Bagging方法,Dropout可被認爲是一種實用的大規模深度神經網絡的模型集成算法。由於傳統意義上的Bagging涉及多個模型的同時訓練和評估,當網絡規模龐大時,這種集成方法需要消耗大量的時間和空間。Dropout在小批量級別的操作,提供了一種輕量級的Bagging集成近似,能夠實現指數級別數量神經網絡的訓練與評測。

(5)對於包含N個神經元節點的網絡,在Dropout的作用下可看作爲2^N個模型的集成。

dropout的優勢

(1)very computationally cheap在dropout訓練階段,每一個樣本每一次更新只需要O(n) ,同時要生成n個二進制數字與每個狀態相乘。除此之外,還需要O(n)的額外空間存儲這些二進制數字,直到反向傳播階段。

(2)沒有很顯著的限制模型的大小和訓練的過程。

9. dropout的缺點

(1)dropout 的一大缺點是成本函數無法被明確定義。因爲每次迭代都會隨機消除一些神經元結點的影響,因此無法確保成本函數單調遞減。

(2)明顯增加訓練時間,因爲引入 dropout 之後相當於每次只是訓練的原先網絡的一個子網絡,爲了達到同樣的精度需要的訓練次數會增多。dropout 的缺點就在於訓練時間是沒有 dropout 網絡的 2-3 倍
 

 

參考:https://blog.csdn.net/program_developer/article/details/80737724

https://blog.csdn.net/daizongxue/article/details/79123134

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章