零基礎 神經網路優化之dropout和梯度校驗

2022-02-05 21:07:57 字數 2680 閱讀 6195

一、序言

dropout和l1、l2一樣是一種解決過擬合的方法,梯度檢驗則是一種檢驗「反向傳播」計算是否準確的方法,這裡合併簡單講述,並在文末提供完整示例**,**中還包含了之前l2的示例,全都是在「深層神經網路解析」這篇基礎之上修改的。

二、dropout

簡單來說dropout就是在每次訓練時「隨機」失效網路中部分神經元,大概就是下圖這麼個意思。

讓神經元隨機消失辦法很簡單,我們將每一層的輸出y中部分位,置為0即可。回顧一下神經元的輸出值y:

a = np.dot(w, in) + b

y = relu(a)

對於輸入層,in就是img,對於其他層in就是上一層的輸出y,a是權重w與輸入in的矩陣乘積,y是a在0-1間的對映,表示概率。對於w與in的乘積運算,我們若在in中插入若干個0值,其計算結果(相乘後是累加)對下一層是沒有影響的,所以將in(y)中某些位置為0就相當於將上一層某些神經元刪除了。

具體到實現上,先按y的形狀生成0-1的隨機數

d = np.random.rand(y.shape[0], y.shape[1]) 

接著將小於keep_prob的數全部置為0其他的置為1,keep_prob就是刪除的神經元比例,如0.5就刪除50%。

d = d < keep_prob

然後用y乘以d,按keep_prob的比例刪除輸出值(也即是下一層的輸入)。

y = y * d

最後還需要用y除以keep_prob,目的是將訓練和測試時的「期望」保持一致。

y = y / keep_prob

簡單理解「期望「就是在訓練時我們刪除了一定比例的神經元,但是實際使用時這些神經元可都是在的,所以y除以keep_prob就是讓二者的」期望「保持一致。

三、梯度校驗

梯度校驗基於這麼乙個事實:神經網路是乙個「混沌」系統,增加一些引數、減少一些引數、寫錯一些引數,又比如前面dropout方法中刪除一些神經元對整體網路的執行似乎沒有影響,你不會得到乙個明確的報錯,有時訓練得到的結果表現的可能還不錯(有時甚至更好了)。我們需要一些手段來做一些「基本」的檢測吧?

梯度校驗就是這麼乙個「基本檢測」,他的原理是「用另一種路徑」來重新計算δw,如果你計算的δw與反向傳播計算的δw「差不多」,那說明大方向上你的網路是ok的,至少「優化」的方向是正確的。

我們知道δw的計算是在損失函式的基礎上對w進行求導,求導的結果即是w優化的方向(使cost趨向於0)。

在「反向傳播」的解析中,我們的損失函式公式是標籤值減去**結果:

cost = ( label - y )^2

而後用cost對w求導可以得到δw使cost值趨向於0:

δw = ( label - y )*x

上式是利用對cost求導得到的,驗證上式計算結果是否正確的另一種路徑則是回歸「求導」的本質:當自變數的增量趨於零時,因變數的增量與自變數的增量之商的極限。用數學公式表達出來就是:

上式中a是乙個趨向於0的極小值,我們可以隨便取乙個,比如10的-7次方(0.0000001)。上式中j(w+a)和j(w-a)可以通過向前傳播和損失計算得到,這種方式可以稱為極值法,而後與反向傳播求得的δw作比較,下式是乙個比較科學的比較方法(二範數):

四、多維神經網路的梯度檢驗

上一節簡述了梯度檢驗的原理,然鵝放到實際應用時有點抓蝦,因為前面的公式範例只能契合單神經元的情況,將公式應用到多層神經網路還需要做一些修改。最主要的修改在於,我們要將w、b、dw、db轉為一維向量.

乙個簡單的w示例如下:

w =

對於多層的神經網路來說,w+a、w-a不是將w中所有元素都加減a,而是每個元素依次操作,錯誤示例如下:

w + a =   #這個是錯誤的示範!!!

正確的示例如下:

w + a = 

w + a = 

以此類推。

為了便於計算,我們可以將w和dw都轉為一維向量:

w = [1,2,3,4,5,6,7,8,9,10]

因為梯度校驗速度真的非常非常慢,為了加快測試的速度,我們可以將網路做的更簡單、將訓練資料減少,實際使用時可以是所有訓練資料都一起上,慢就慢點吧。

需要注意的是,如果你要做梯度校驗,那dropout必須得先關掉(將keep_prob設為1),原因很好理解,dropout使神經網路在訓練時隨機「刪除」了部分神經元,使用極值法計算δw時需要做兩次向前傳播,兩次隨機刪除的神經元肯定不一樣,反向傳播刪除的神經元也不一樣,自然最後計算的difference就不準確了。

五、總結

本文簡單講了下神經網路的優化方法dropout和反向傳播的檢驗方法「梯度校驗」,其中dropout需要與之前的l2優化結合起來看。

零基礎 神經網路優化之mini batch

一 前言 回顧一下前面講過的兩種解決過擬合的方法 1 l0 l1 l2 在向前傳播 反向傳播後面加個小尾巴 2 dropout 訓練時隨機 刪除 一部分神經元 本篇要介紹的優化方法叫mini batch,它主要解決的問題是 實際應用時的訓練資料往往都太大了,一次載入到電腦裡可能記憶體不夠,其次執行速...

零基礎 神經網路優化之動量梯度下降

一 序言 動量梯度下降也是一種神經網路的優化方法,我們知道在梯度下降的過程中,雖然損失的整體趨勢是越來越接近0,但過程往往是非常曲折的,如下圖所示 特別是在使用mini batch後,由於單次參與訓練的少了,這種 曲折 被放大了好幾倍。前面我們介紹過l2和dropout,它們要解決的也是 曲折 的問...

零基礎入門深度學習 5 迴圈神經網路

在前面的文章系列文章中,我們介紹了全連線神經網路和卷積神經網路,以及它們的訓練和使用。他們都只能單獨的取處理乙個個的輸入,前乙個輸入和後乙個輸入是完全沒有關係的。但是,某些任務需要能夠更好的處理序列的資訊,即前面的輸入和後面的輸入是有關係的。不過讀者不用擔心,本文將一如既往地對複雜的東西剝繭抽絲,幫...