第十章 神經網絡參數的反向傳播算法
代價函數
重點講解神經網絡在分類問題中的應用。
假設有如下的神經網絡和訓練集:
下面第一種是二進制分類問題,第二種是多類别分類問題:
為神經網路定義代價函數,即使用的是邏輯回歸中代價函數:
在神經網絡來中,這裡不再僅有一個邏輯回歸輸出單元,取而代之的是K個,是以應用到神經網絡中的代價函數如下:
表示第i個輸出。
反向傳播算法
這一節中主要介紹讓代價函數最小化的算法。
使用梯度下降法求解代價函數
的最小值,需要知道
。
先給出一個樣本(x, y)時的正向傳播過程:
這裡實作了把前向傳播向量化,使得可以計算神經網絡結構裡每個神經元的激活值。
為了計算導數項,采用一種叫做反向傳播的算法,反向傳播這個名稱源于我們從輸出層開始計算δ項,然後傳回上一層計算隐藏層的δ項,繼續往前計算,類似把輸出層的誤差反向傳播給上一層,這就是反向傳播。
設定
為第l層j節點的誤差,計反向傳播算過程如下:
如何實作反向傳播算法?
訓練集:
①設定
(Δ表示大寫的δ)它被累加用來算出偏導數。
②
周遊訓練集,先使用正向傳播算法計算出激活值
,然後用反向傳播算法計算出對應的誤差項
(不需要計算
,因為不需要對輸入層考慮誤差項),最後将使用Δ來累積前面寫好的偏導數項。
③最後加上正則化項
了解反向傳播
為了更好地了解反向傳播,首先進一步研究反向傳播的過程。
下面是正向傳播的過程:
下面是反向傳播的過程:
可以看作是第l層第j單元中得到的激活項的“誤差”。
正式的說:
看一下如何計算
和
:
通過以上的圖解過程,可以對反向傳播有一個更直覺的了解。
使用注意:展開參數
這一節将介紹一個細節的實作過程:怎樣把參數從矩陣展開成向量,以便于在進階最優化步驟中的使用。
在上面的函數中,我們需要傳遞的參數為向量。
而事實上,在我們的神經網絡中可以發現θ和梯度都為矩陣形式,是以我們需要把矩陣換為向量傳遞,在函數中将向量轉換為矩陣使用。
下面舉一個例子:
實作過程:
應用于學習算法中:
假設有一些初始參數值
,需要取這些參數,把它們展開為一個長向量,稱為初始化θ。然後作為參數θ的初始設定,傳入優化函數fminunc。
另外一件事是實作待見函數costFunction:
通過對上述内容的學習,我對怎樣進行參數的矩陣表達式和向量表達式之間的來回轉換有了更清晰的認識。使用矩陣表達式的好處,當你的參數以矩陣的形式存儲時,進行正向傳播和反向傳播時,會覺得更加友善;當你将參數存儲存為矩陣時,也更容易充分利用。向量化實作相反地,向量表達式的優點是:如果你有像thetaVec或者DVec這樣的矩陣,當使用一些進階的優化算法時,這些算法通常要求把所有的參數要展開成一個長向量的形式。
梯度檢測
下面給出一個梯度檢測的例子:
(1)梯度的數值估計
由導數的幾何意義如下:
該點導數的計算公式:
考慮到θ是向量的情況,有
,由此我們可以想到一種檢測梯度的方式來估計所有的偏導項:
為了估算導數的實作過程:
在神經網絡中,使用這種方法時,使用for循環完成對神經網絡中代價函數的所有偏導數的計算,與在反向傳播中得到梯度進行比較:
, 驗證計算出的導數gradApprox是否非常接近反向傳播計算出的導數DVec。如果兩種方法計算出的導數一樣或非常接近,就可以确信反向傳播的實作是正确的。
總結:(1)通過反向傳播來計算DVec(可能是
的矩陣展開形式);
(2)實作數值上的梯度檢驗計算出gradApprox;
(3)確定DVec和gradApprox都能得到相似的值;
(4)用反向傳播代碼進行學習的時候要關掉梯度檢驗。
注意:在運作算法之前(比如多次疊代的梯度下降或是多次疊代訓練分類器進階優化算法),要確定禁用梯度檢驗代碼。如果在每次梯度下降疊代或者每次代價函數的内循環裡都運作一次梯度檢驗,程式會變得非常慢。(因為梯度檢驗比反向傳播算法要慢得多)
随機初始化
當調用梯度下降法或者進階的優化算法時,需要為θ賦上一個初始值,想一想,我們能和邏輯回歸中那樣給初始值設為全0嗎?
不行,根據正向傳播算法,如果初始值都一樣,則每層的單元值
會相同;
同樣,根據反向傳播算法,每個
會相同,如此一來,每次更新後,輸入到每層的各個單元值相同。
是以每次更新後,這些隐藏單元的每個參數的輸入都是相等的,意味着即使梯度下降進行了一次疊代,它們還是以相同的函數作為輸入計算。
是以為了解決這樣的問題,在神經網絡中對參數進行初始化時要使用随機初始化的思想:
初始化的範圍
是
。
組合
在進行神經網絡的訓練時,首先就是選擇神經網絡的結構(神經網絡之間的連接配接模式),
接着是對輸入單元和輸出單元的選擇,然後是對隐藏元單元個數和隐藏層的數目的選擇(兩種:一個隐藏層;大于一個隐藏層,但每一層的隐藏單元個數一樣)。
訓練神經網絡的實作步驟:
(1) 建構一個神經網絡,然後随機初始化權重(通常很小,接近于0);
(2) 執行前向傳播算法,即對神經網絡輸入任意一個
計算出對應的
值,也就是一個輸出值y的向量;
(3) 通過代碼計算出代價函數
;
(4) 執行反向傳播算法來算出這些偏導數項
;
(5) 使用梯度檢驗來比較這些已經計算得到的偏導數項,把用反向傳播算法得到的偏導數值與用數值方法得到的估計值進行比較,
確定兩種方法得到相近的值,接下來最重要的一點是停用梯度檢驗;
(6) 使用一個最優化算法(梯度下降算法或進階優化算法:LBFGS算法、共轭梯度法或其他内置到fminunc函數中的方法),
将這些方法和反向傳播算法相結合去最小化代價函數
。
注:神經網絡中的代價函數
是一個非凸函數。
梯度下降法在神經網絡中的應用的直覺了解:
神經網絡的學習和反向傳播算法是一個複雜的過程,在學習的過程中有不了解的地方也沒有關系,可以繼續學習之後的課程,
在實作算法的過程中在仔細的複習,神經網絡學習的例子:自動駕駛。