深度學習之BP神經網路(三)

深度學習之BP神經網路(三)

4 人贊了文章

線性神經網路只能解決線性可分的問題,這與其單層網路的結構有關。BP神經網路是包含多個隱藏層的網路,具備處理線性不可分問題的能力。到20世紀80年代中期,Rumelhart、McClelland提出了著名的誤差方向傳播演算法(Error Back Propagtion, BP),解決了多層神經網路的學習問題,極大促進神經網路的發展,這種神經網路被稱為BP神經網路。

本文章通過《人工神經網路理論、設計及應用》書中介紹的BP神經網路一節,進行python的代碼實現;

BP網路模型

上圖是三層感知器,輸入向量X=( x_{1},x_{2}, ...... x_{n} ),其中 x_{0} = -1是為隱藏層神經元引入閾值而設置的。隱藏層輸入向量Y=(y_{1},y_{1}......y_{m}) ,其中 y_{0} =-1 是為輸出層神經元引入的閾值設置的。輸出層輸出向量O=( o_{1},o_{2}......o_{l} ) ,期望輸出向量d=( d_{1},d_{2}......d_{l} )。輸入層到隱藏層的權值矩陣V=( v_{1},v_{2}......v_{j} ) , 隱藏層到輸出層的權值W=( w_{1},w_{2}......w_{k} )。

推導:

輸出層 : O_{k} = f(net_{k}) , k=1,2,...l (方程1.1)

net_{k} = Sigma w_{jk}y_{j} ,k = 1,2...... l (方程1.2)

對於隱藏層: y_{j} = f(net_{j}) , j = 1,2,......m (方程1.3)

net_{j} = Sigma v_{ij}x_{i} , j = 1,2,....m (方程1.4)

以上兩公式的 f(x) 均是單極性sigmoid函數:

f(x) = frac{1}{1 + e^{-x}}

因為 f(x) 連續,可導特點,得到公式 : f^{}(x) = f(x)[1-f(x)] (方程1.5)

有時候根據需求,也可以採用雙極性sigmoid函數

f(x) = frac{1-e^{-x}}{1 + e^{-x}}

輸出目標,目標函數: E = frac{1}{2}(d-o)^2 = frac{1}{2}Sigma(d_{k} - o_{k})^2 (方程1.6)

上面的目標函數展開到隱藏層:E = frac{1}{2} Sigma[d_{k} - f(Sigma w_{jk}y_{j})]^2 (方程1.7)

進一步展開到輸入層: E = frac{1}{2}Sigma [d_{k}- f[Sigma w_{jk}f(Sigma v_{ij}x_{i})]]^2 (方程1.8)

上面方程1.8,可以看出網路誤差是各層權值 W_{jk}V_{ij} 的函數。

通過梯度下降法,我們可以得到調整隱藏層和輸出層的權值函數

Delta W_{jk} = -etafrac{vartheta E}{vartheta w_{jk}} j=0,1,2,3....m; k = 1,2,....l (方程1.9)

Delta v_{ij} = -etafrac{vartheta E}{vartheta v_{ij}} i = 0,1,2,3...n; j = 1,2,3,....m (方程1.10)

我們依次對權值推導

針對方程1.9:

Delta W_{jk} = -etafrac{vartheta E}{vartheta w_{jk}} =  -etafrac{vartheta E}{vartheta net_{k}} frac{vartheta net_{k}}{vartheta w_{jk}} (方程1.11)

針對方程1.10:

Delta v_{ij} = -etafrac{vartheta E}{vartheta v_{ij}} =  -etafrac{vartheta E}{vartheta net_{j}} frac{vartheta net_{j}}{vartheta v_{ij}} (方程1.12)

下面我們對方程1.11推導:

上圖中得到方程 Delta w_{jk} = eta (d_{k} - o_{k}) f^{}(net_k) * y_{i} 因為我們有方程1.5,我們可以將方程再次寫為:

Delta w_{jk} = eta (d_{k} - o_{k}) o_{k}(1-o_{k}) * y_{i} (方程1.15,調整輸出層權值函數)

Delta v_{ij} = eta (Sigma [(d_k - o_k)o_k(1-o_k)w_{jk}])y_j(1-y_i)x_i (方程1.16,調整隱藏層權值函數)

下面是python代碼:

import numpy as npdef logsig(x): return 1/(1+np.exp(-x))def fit(x, y, learning_rate=0.1, epochs=10000): #隱藏層 hiddennum = 8 w1 = 2*np.random.rand(x.shape[1],hiddennum) -0.1 w2 = 2*np.random.rand(hiddennum, y.shape[1]) -0.1 for n in range(epochs): #正向傳播 hiddenout = logsig(np.dot(x,w1)) networkout = logsig(np.dot(hiddenout,w2)) err = y - networkout delta2 = (y - networkout)*( networkout * ( 1 - networkout )) delta1 = np.dot(delta2, w2.T) * (hiddenout * (1 - hiddenout )) w2 += learning_rate*np.dot(hiddenout.T, delta2) w1 += learning_rate*np.dot(x.T,delta1) print(n, time iter error is ,sum(sum(err**2))) return w1, w2x = np.array([[0,0],[0,1],[1,0],[1,1]])y = np.array([[0],[1],[1],[0]])v1, w2 = fit(x, y)hiddenout = logsig(np.dot(x, v1) )networkout = logsig(np.dot(hiddenout, w2))print(networkout)

輸出結果,可以很好的分類:

BP神經網路的局限性

1、不好求出全局最小值

因為誤差函數是關於隱藏層的權值和輸出層的權值的函數,如方程1.8

E=frac{1}{2}Sigma [d_{k}- f[Sigma w_{jk}f(Sigma v_{ij}x_{i})]]^2

該方程在三維空間形狀如下:

E是我們得到的誤差值,W1和W2分別代表隱藏層和輸出層的權值,當E是最小時候,我們可以得出擬合的權值,但是也有可能是局部最小值,解決方法可以選擇合適的初始權值

2、BP神經網路不支持太多隱藏層,因為學習信號反向傳播過程會越變越弱,容易陷入局部極小值。

3、隱藏層是一個灰箱,容易掩蓋業務背景細節。無法很好給客戶解釋背後原理。

推薦閱讀:

Python Shell 中敲擊方向鍵顯示「^[[C^[[D」,原因是什麼?如何修復?
做python爬蟲需要會web後端嗎,不會的話能做嗎?
3. Examples 例子
Python · 樸素貝葉斯(零)· 簡介
python3機器學習經典實例-第八章解剖時間序列和時序數據33

TAG:深度學習DeepLearning | 機器學習 | Python |