神經網絡和反向傳播算法推導

注:由於自己畫圖實在太難畫,本文中基本所有插圖來源於算法糰子機器學習班,請勿轉載

1.普通的機器學習模型:

其實,基本上所有的基本機器學習模型都可以概括爲以下的特徵:根據某個函數,將輸入計算並輸出。圖形化表示爲下圖:

當我們的g(h)爲sigmoid函數時候,它就是一個邏輯迴歸的分類器。當g(h)是一個只能取0或1值的函數時,它就是一個感知機。那麼問題來了,這一類模型有明顯缺陷:當模型線性不可分的時候,或者所選取得特徵不完備(或者不夠準確)的時候,上述分類器效果並不是特別喜人。如下例:

我們可以很輕易的用一個感知機模型(感知器算法)來實現一個邏輯與(and),邏輯或(or)和邏輯或取反的感知器模型,(感知器模型算法鏈接),因爲上述三種模型是線性可分的。但是,如果我們用感知器模型取實現一個邏輯非異或(相同爲1,不同爲0),我們的訓練模型的所有輸出都會是錯誤的,該模型線性不可分!


                                          

2.神經網絡引入:

我們可以構造以下模型:

(其中,A代表邏輯與,B代表邏輯或取反,C代表邏輯或)

上述模型就是一個簡單的神經網絡,我們通過構造了三個感知器,並將兩個感知器的輸出作爲了另一個感知其的輸入,實現了我們想要的邏輯非異或模型,解決了上述的線性不可分問題。那麼問題是怎麼解決的呢?其實神經網絡的實質就是每一層隱藏層(除輸入和輸出的節點,後面介紹)的生成,都生成了新的特徵,新的特徵在此生成新的特徵,知道最新的特徵能很好的表示該模型爲止。這樣就解決了線性不可分或特徵選取不足或不精確等問題的產生。(以前曾介紹過線性不可分的實質就是特徵不夠)

神經網絡的模型結構如下:

(藍色,紅色,黃色分別代表輸入層,影藏層,輸出層)

在此我們介紹的神經網絡中的每一個訓練模型用的都是邏輯迴歸模型即g(h)是sigmoid函數。

我們可以將神經網絡表示如下:

3.神經網絡的預測結果(hypothesis函數)的計算和CostFunction的計算

預測結果的計算其實與普通的邏輯迴歸計算沒有多大區別。只是有時候需要將某幾個邏輯迴歸的輸出作爲其他邏輯迴歸模型的輸入罷了,比如上例的輸出結果爲:

那麼CostFunction的計算又和邏輯迴歸的CostFunction計算有什麼區別呢?

邏輯迴歸的CostFunction如下:

上述式子的本質是將預測結果和實際標註的誤差用某一種函數估算,但是我們的神經網絡模型有時候輸出不止一個,所以,神經網絡的誤差估算需要將輸出層所有的CostFunction相加:


k:代表第幾個輸出。

補充:神經網絡可以解決幾分類問題?

理論上,當輸出單元只有一個時,可以解決2分類問題,當輸出單元爲2時可以解決4分類問題,以此類推...

實質上,我們三個輸出單元時,可以解決三分類問題([1,0,0],[0,1,0],[0,0,1]),爲什麼如此設計?暫時留白,以後解決

ps:面試題:一個output機器,15%可能輸出1,85%輸出0,構造一個新的機器,使0,1輸出可能性相同? 答:讓output兩次輸出01代表0,10代表1,其餘丟棄

4.神經網絡的訓練

這兒也同於logistic迴歸,所謂的訓練也就是調整w的權值,讓我們再一次把神經網絡的CostFunction寫出來!

W代表所有層的特徵權值,Wij(l)代表第l層的第i個元素與第j個特徵的特徵權值

m代表樣本個數,k代表輸出單元個數

hw(x(i))k代表第i個樣本在輸出層的第k個樣本的輸出 y(i)k代表第i個樣本的第k個輸出

然後同於logistic迴歸,將所有的W更新即可。難處在於此處的偏導數怎麼求?首先得說說鏈式求導法則:

所以我們可以有:

接下來的問題就是有theta了,當我們要求的錯誤變化率是最後一層(最後一層既是輸出層的前一層)且只看一個輸出神經元時則:

多個相加即可

那麼中間層次的神經元變化率如何求得呢?我們需要研究l層和了+1層之間的關係,如下圖:

第l層的第i個Z與第l層的第i個a的關係就是取了一個sigmod函數,然而第l層的第i個a與和其對應的w相乘後在加上其他的節點與其權值的乘積構成了第l+1層的Z,好拗口,好難理解啊,看下式:


大體也就是這麼個情況,具體的步驟爲:

1.利用前向傳播算法,計算出每個神經元的輸出

2.對於輸出層的每一個輸出,計算出其所對應的誤差

3.計算出每個神經元的錯誤變化率即:

4.計算CostFunction的微分,即:

5.代碼:

點擊打開鏈接




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章