1. 程式人生 > >(CNN)卷積神經網路(四)dropout

(CNN)卷積神經網路(四)dropout

第一篇文章介紹了卷積神經網路的資料輸入形式和權值的初始化:CNN)卷積神經網路(一) 第二篇文章介紹了卷積操作,常用的啟用函式(CNN)卷積神經網路(二)
第三篇介紹了卷積神經網路的池化層,視覺化理解以及用數學的角度理解卷積操作:(CNN)卷積神經網路(三)
這裡寫圖片描述

dropout

第一種理解方式
大家應該都有了解過整合學習吧,不瞭解也沒關係,在我看來,整合學習最牛逼的想法就是利用自主取樣的方式採集不同的樣本子集,然後每個樣本子集都訓練一個模型,因為資料不一樣,所以每個模型的側重點不一樣,也就導致了模型之間具有比較大差異性。

我們用同樣的想法在神經網路中,就有了dropout這個操作,有人稱呼它為隨機失活,如下圖所示:
這裡寫圖片描述

然後,相當於多個不同的模型合起來得到最終的模型,能很好的緩解過擬合的出現
這裡寫圖片描述

為什麼dropout能達到比較好的效果?

第二種理解方式:
無論是神經網路還是機器學習,我們都希望自己的模型有一定的泛化能力,因為神經網路記資料真的是太擅長了,但我們並不希望它記住那麼多東西,比如一隻貓,它有毛,有耳朵,這些資訊,因為這樣的信心,老虎,狗都有,我們更希望網路能記住表徵貓這種動物特性的資訊。所以,肯定會有一部分資訊是冗餘的,我們希望神經網路不要記住這些冗餘的資訊,它是怎麼做到的呢?

就是dropout,在調整神經網路的過程中,在某一些節點處出現了這些冗餘資訊,在某些節點處沒有這些冗餘資訊,那神經網路就會知道哪部分資訊對分類是有用的,哪些資訊是冗餘的,dropout讓某些神經元失活,讓某些神經元被啟用,不就剛好完成了這個操作嗎?
這裡寫圖片描述


舉個小栗子吧,假如有兩個特徵,有一隻耳朵,有尾巴,假如這兩個特徵同時出現的時候,能判定它是一隻貓,當只有有尾巴這個特徵的時候,也能判定它是一隻貓,但只有有一隻耳朵這個特徵的時候,就不能判定它是一隻貓,那神經網路就知道有一隻耳朵這個特徵在分類是否是貓這個問題時,是個冗餘資訊,那分類的時候就不用它了嘛。

dropout會讓每一層都的神經元都以一定的概率失活,用程式碼理解一下:

#設定保持一個神經元啟用狀態的概率
p = 0.5

def train_step(x):
    #三層神經網路前向運算
    H1 = np.maximum(0,np.dot(W1,X)+b1)
    U1 = np.random.rand(*H1.shape) <p #第一次Dropout
H1 *= U1 #drop H2 = np.maximum(0,np.dot(W2,H1)+b2) U2 = np.random.rand(*H2.shape) < p #第二次Dropout H2 *= U2 #drop out = np.dot(W3,H2) + b3 def predict(X): H1 = np.maximum(0,np.dot(W1,X) + b1)*p #這裡也要以這樣的概率開啟,相當於數學期望 H2 = np.maximum(0,np.dot(W2,H1) + b2)*p out = np.dot(W3,H2) + b3

一點小提醒:
b = 0.8
a = 0.8<0.5 #python中True為1,False為0
b *=a
print(b)

得到0.0

但是,仔細觀察你會發現,在預測的時候,乘上這樣一個概率會比較慢,我們不管你訓練得有多慢,但最後預測的時候一定是要求一定要快的,所以我們把這個概率移動訓練階段:

#設定保持一個神經元啟用狀態的概率
p = 0.5

def train_step(x):
    #三層神經網路前向運算
    H1 = np.maximum(0,np.dot(W1,X)+b1)
    U1 = (np.random.rand(*H1.shape) <p)/p #第一次Dropout,同時除以p
    H1 *= U1 #drop
    H2 = np.maximum(0,np.dot(W2,H1)+b2)
    U2 = (np.random.rand(*H2.shape) < p)/p #第二次Dropout,同時除以p
    H2 *= U2 #drop
    out = np.dot(W3,H2) + b3
    #省略一長串
def predict(X):
    H1 = np.maximum(0,np.dot(W1,X) + b1)  #這裡也要以這樣的概率開啟
    H2 = np.maximum(0,np.dot(W2,H1) + b2)
    out = np.dot(W3,H2) + b3

深度學習的本質是什麼?

在圖片處理中,因為圖片具有不變性,因此可以使用滑動視窗,也就是卷積,在圖片上滑動收集圖片的資訊,也正因為用了卷積操作,才降低的 運算量(減少引數)。