1. 程式人生 > >Andrew Ng機器學習課程筆記(四)之神經網絡

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

sca 優化 介紹 www 之間 output 現在 利用 href

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的代碼
④利用反向傳播方法計算所有偏導數
⑤利用數值檢驗方法檢驗這些偏導數
⑥使用優化算法來最小化代價函數

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