Andrew Ng機器學習課程筆記(四)之神經網路

bzt820801發表於2017-08-16

Andrew Ng機器學習課程筆記(四)之神經網路

版權宣告:本文為博主原創文章,轉載請指明轉載地址

http://www.cnblogs.com/fydeblog/p/7365730.html

前言

學習了Andrew Ng課程,開始寫了一些筆記,現在寫完第5章了,先把這5章的內容放在部落格中,後面的內容會陸續更新!

這篇部落格主要記錄Andrew Ng課程第四章和第五章的神經網路,主要介紹前向傳播演算法,反向傳播演算法,神經網路的多類分類,梯度校驗,引數隨機初始化,引數的更新等等

1.神經網路概述

之前說的線性迴歸還是邏輯迴歸都有這樣一個缺點:當特徵太多時,計算的負荷會非常大。

舉個例子說,通過圖片來識別圖片上描述的是不是汽車,假設圖片畫素是50X50,並且我們將所有的畫素視為特徵,則會有2500個特徵,如果我們要進一步將兩兩特徵組合構成一個多項式模型,則會有約25002/2 個(接近3百萬個)特徵。普通的邏輯迴歸模型,不能有效地處理這麼多的特徵,這時候我們需要神經網路。

神經網路是根據人的神經元設計而成的,它的效果圖如下:

第一層成為輸入層(Input Layer),最後一層稱為輸出層(Output Layer),中間一層成為隱藏層(Hidden Layers)

通常我們為每一層都增加一個偏差單位(bias unit):

2. 前向傳播演算法

前向傳播演算法是指從原始特徵從左往右一層層對映到最終的輸出層,拿上面已經增加偏差單位的神經網路為例;

它的啟用單元和輸出分別表達為:

特徵前的係數為特徵的權重,括號內的數代表權重所在的層數,下標第一個數代表特徵的所連線的神經元,第二個數代表特徵的序號。

看看hθ(x)的表示式,其實就是以a0,a1,a2,a3按照Logistic Regression的方式輸出hθ(x),神經網路就像是Logistic Regression,只不過我們把Logistic Regression中的輸入向量[x1~x3]變成了中間層的可以看做更為高階的特徵值, 也就是x0,x1,x2,x3的進化體, 並且它們是由x與決定的,因為是梯度下降的,所以a是變化的,並且變得越來越厲害, 所以這些更高階的特徵值遠比僅僅將x次方厲害,也能更好的預測新資料。

3. 神經網路直觀解釋--AND 函式

我們可以用這樣的一個神經網路表示AND 函式:

X1 , X2 屬於 {0,1}

Y= X1 AND X2

其中θ0 =-30, θ1 =20, θ2 =20

我們的輸出函式h(x)即為:hθ(x) = g(-30+20*X1+20*X2)

我們知道g(x)的影象是:

這就是我們的AND函式。這可以說是一個簡單的感知機模型。

4.多類分類

如果我們要訓練一個神經網路演算法來識別路人、汽車、摩托車和卡車,在輸出層我們應該有4個值。例如,第一個值為1或0用於預測是否是行人,第二個值用於判斷是否為汽車。

輸入向量x有三個維度,兩個中間層,輸出層4個神經元分別用來表示4類,也就是每一個資料在輸出層都會出現[a b c d]T,且a,b,c,d中僅有一個為1,表示當前類。下面是該神經網
絡的可能結構示例:

分類結果

神經網路演算法的輸出結果為四種可能情形之一:

5. 神經網路代價函式

在邏輯迴歸中,我們只有一個輸出變數,又稱標量(scalar),也只有一個因變數y,但是在神經網路中,我們可以有很多輸出變數,我們的hθ(x)是一個維度為K的向量,並且我們訓練集中的因變數也是同樣維度的一個向量,因此我們的代價函式會比邏輯迴歸更加複雜一些,為:

其實就是將維度為K的向量分次求代價函式並求和,正則化有一點不一樣,最外層排除了每一層θ0後,每一層的θ矩陣的和,最裡層的迴圈j迴圈所有的行( 由 sl +1 層的啟用單元數決定),迴圈i則迴圈所有的列,由該層(sl 層)的啟用單元數所決定。

即:hθ(x)與真實值之間的距離為每個樣本-每個類輸出的加和,對引數進行regularization的bias項處理所有引數的平方和

6. 反向傳播演算法

這裡說一句,由於推導過程是有點複雜,吳恩達老師直接給出了相應的結論,要是有疑問,可以看清華大學深研院袁博老師的神經網路章中的層次分明,責任到人一節,這裡附上鍊接http://www.xuetangx.com/courses/course-v1:TsinghuaX+80240372X+sp/about

當然,也可以看看相關的部落格,這裡推薦我朋友的一篇部落格http://www.cnblogs.com/xuhongbin/p/6666826.html,也有推導過程,不過袁博老師還是講得不錯的,推薦看視訊。

下面以下圖為例,來說說這個反向傳播演算法

這個演算法是由輸出層的誤差一層層反向傳播到輸入層的,由於輸入層是特徵實際值,所以不會算輸入層的誤差(即不存在誤差),到第二層即可停止。反向傳播演算法是基於梯度下降的策略,通過算出每層的誤差(除第一層),根據誤差的情況,來迭代更新每層的權重。

一般分這幾步

先算出輸出層的誤差

(這裡的L等於4)

根據這個誤差在計算L-1到2層的誤差

計算公式如下:

這裡的g’(z(3))等於g(z(3))(1-g(z3)) ,因為g(x)=1/(1+exp(-x)),它的導數就是這樣的性質。

算出每個層的誤差後,然後進行權重的更新

7. 梯度校驗

當我們對一個較為複雜的模型(例如神經網路)使用梯度下降演算法時,可能會存在一些不容易察覺的錯誤,意味著,雖然代價看上去在不斷減小,但最終的結果可能並不是最優解。

為了避免這樣的問題,我們採取一種叫做梯度的數值檢驗方法。

這種方法的思想是通過估計梯度值來檢驗我們計算的導數值是否真的是我們要求的。

對梯度的估計採用的方法是在代價函式上沿著切線的方向選擇離兩個非常近的點然後計算兩個點的平均值用以估計梯度。 即對於某個特定的θ,我們計算出在θ-ε處和θ+ε的代價值(ε是一個非常小的值, 通常選取 0.001),然後求兩個代價的平均,用以估計在θ處的代價值,如圖所示

Octave(matlab也行) 中程式碼如下:
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)

當θ是一個向量時, 我們則需要對偏導數進行檢驗,如下

最後我們還需要對通過反向傳播方法計算出的偏導數進行檢驗,將估計的值與算出的值進行比較即可。

8. 隨機初始化

任何優化演算法都需要一些初始的引數。到目前為止我們都是初始所有引數為0,這樣的初始方法對於邏輯迴歸來說是可行的,但是對於神經網路來說是不可行的。如果我們令所有的初始引數都為0,這將意味著我們第二層的所有啟用單元都會有相同的值。同理,如果我們初始所有的引數都為一個非0的數,結果也是一樣的。

我們通常初始引數為正負ε之間的隨機值,假設我們要隨機初始一個尺寸為10×11 的參
數矩陣,程式碼如下:

Theta1 = rand(10, 11) * (2*eps) – eps

9. 引數更新——動量(Momentum)

這一點吳恩達老師沒說,我是看袁博老師介紹的,試想一下,如果代價函式中間有一小段水平的空間,這時候偏導等於0的,引數立即停止更新,就無法更新到我們想要的引數(即一小段水平面還有更低數值的代價函式),這時候在引數更新表示式上加一個動量就能解決這個問題,表示式如下:

將前一回的引數更新迭代到當前時刻,這樣在導數為0(即 ),引數更新還是有動力的,還能前進一小段,可以通過水平區域,達到更低數值的代價函式。

10. 綜合

使用神經網路的步驟分兩步:確定網路結構和訓練神經網路

(1)   確定網路結構

①第一層的單元數即我們訓練集的特徵數量。
②最後一層的單元數是我們訓練集的結果的類的數量。

③確定隱藏層的層數和每個中間層的單元數。

(2)   訓練神經網路

①引數的隨機初始化
②利用正向傳播方法計算所有的hθ(x)
③編寫計算代價函式J的程式碼
④利用反向傳播方法計算所有偏導數
⑤利用數值檢驗方法檢驗這些偏導數
⑥使用優化演算法來最小化代價函式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章