dropout原理與實現

轉載自:http://blog.csdn.net/nini_coded/article/details/79302800

dropout作爲一種預防CNN過擬合的正則化方法被Hinton等人在2012年的經典論文《ImageNet Classification with Deep Convolutional》中提出。dropout的原理很簡單:在一次訓練時的迭代中,對每一層中的神經元(總數爲N)以概率P隨機剔除,用餘下的(1-P)×N個神經元所構成的網絡來訓練本次迭代中的數據(batchsize個樣本)。

關於dropout能夠較好減輕CNN過擬合的原因,看了一些論文和博客,目前有多種不同的解釋,大致整理如下。

在設計網絡時,設定的每層神經元代表一個學習到的中間特徵(即幾個權值的組合),網絡所有神經元共同作用來表徵輸入數據的特定屬性(如圖像分類中,表徵所屬類別)。當相對於網絡的複雜程度(即網絡的表達能力、擬合能力)而言數據量過小時,出現過擬合,顯然這時各神經元表示的特徵相互之間存在許多重複和冗餘。

dropout的直接作用是減少中間特徵的數量,從而減少冗餘,即增加每層各個特徵之間的正交性(數據表徵的稀疏性觀點也恰好支持此解釋)。

解釋到這裏,可能會問:要減少特徵冗餘,設計網絡時直接減少神經元的數量就可以了,爲什麼要有dropout?

針對一個任務和擁有的數據集,一開始無法知道多大的網絡才能充分地學習到我們需要數據特徵,考慮到通常網絡越複雜對訓練數據的擬合效果越好(不代表泛化性能越好),因此一般都會設計一個較大的通用網絡來訓練。這樣一來,神經元數量就事先確定了,要想在出現過擬合時減少冗餘、儘可能地增加特徵正交性,當然可以嘗試簡化網絡,但這樣可能會明顯降低網絡擬合能力(而且簡化網絡並不能直接增加特徵間的正交性)。一個折中的辦法就是dropout,由於隨機性,使每一次迭代訓練時,整體來看都在更新不同的一些參數(因此這也可以看做是進行了數據擴增),使得各個特徵(權值)不用每一次迭代時都一起更新、互相產生關聯和影響,這樣也就弱化了各個特徵之間由於數據量太小導致產生的過多的相互作用,緩解了過擬合。

dropout帶來的缺點是可能減慢收斂速度:由於每次迭代只有一部分參數更新,可能導致梯度下降變慢。

原理簡介:
在沒有dropout時,正向傳播如下:
這裏寫圖片描述
加入dropout後:
這裏寫圖片描述
測試時,需要每個權值乘以P:
這裏寫圖片描述
其中的Bernoulli函數,作用是以概率P隨機生成一個由0、1組成的向量。

實現:
官方源碼如下:

#dropout函數實現  
def dropout(x, level):  # level爲神經元丟棄的概率值,在0-1之間
    if level < 0. or level >= 1:
        raise Exception('Dropout level must be in interval [0, 1[.')  
    retain_prob = 1. - level  
    # 利用binomial函數,生成與x一樣的維數向量。
    # 神經元x保留的概率爲p,n表示每個神經元參與隨機實驗的次數,通常爲1,。
    # size是神經元總數。  
    sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)
    # 生成一個0、1分佈的向量,0表示該神經元被丟棄 
    # print sample  
    x *=sample
    # print x  
    x /= retain_prob  
    return x 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章