1. 程式人生 > >BP神經網路演算法的理解

BP神經網路演算法的理解

BP神經網路在百度百科中的解釋就是:BP(back propagation)神經網路是1986年由Rumelhart和McClelland為首的科學家提出的概念,是一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用最廣泛的神經網路。大家應該對基本的神經網路模型有一定程度的瞭解,神經網路模型包含了很多神經元模型,每一個神經元都有著自己的權重,然後一般來說,典型的神經網路包含輸入層,隱藏層和輸出層,然後輸入層和隱藏層一般來說都會有自己的偏置項。如圖所示,我們可以看一個典型的神經網路模型:
經典神經網路模型

為了方便計算,我們將輸入項設成i1和i2,還有一個偏置項b1,同理,在隱藏層為h1,h2和一個偏置項b2,輸出層為o1和o2。wi表示層與層之間連線的權重,每一層的啟用函式我們使用常用的Sigmoid函式,然後我們對上圖的神經網路附上資料的初始值,可以得到下面這張圖:
帶權值的神經網路

在這張帶權值的神經網路圖中,我們可以正向計算出輸入層到隱藏層的輸出,也就是h1,就是權重和輸入值加上偏置項的和:
ne t h 1 =

w 1 i 1 + w 2
i 2 + b 1 {\text{ne}}{{\text{t}}_{h1}} = {w_1}*{i_1} + {w_2}*{i_2} + {b_1} ne t h 1 = 0.15 0.05 + 0.2 0.1 + 0.35 = 0.3775 {\text{ne}}{{\text{t}}_{h1}} = 0.15*0.05 + 0.2*0.1 + 0.35 = 0.3775
這個時候我們的啟用函式是Sigmoid函式:
f ( x ) = 1 1 + e x f(x) = \frac{1}{{1 + {e^{ - x}}}} 所以我們得到的h1就是f(0.3775):
f ( 0.3775 ) = 1 1 + e 0.3775 0.59327 f(0.3775) = \frac{1}{{1 + {e^{ - 0.3775}}}} \approx 0.59327
同樣的道理,我們可以得到h2的輸出:
f ( w 3 i 1 + w 4 i 2 + b 1 ) = f ( 0.3925 ) 0.59688 f({w_3}*{i_1} + {w_4}*{i_2} + {b_1}) = f(0.3925) \approx0.59688 在計算完隱藏層的輸出之後,接下來就是計算隱藏層到輸出層的計算,同樣的道理,上一輪計算的輸出就作為這一輪計算的輸入,就可以得到:
ne t o 1 = w 5 o u t h 1 + w 6 o u t h 2 + b 2 {\text{ne}}{{\text{t}}_{o1}} = {w_5}*ou{t_{h1}} + {w_6}*ou{t_{h2}} + {b_2} 我們將輸入層到隱藏層的輸出作為隱藏層到輸出層的輸入,然後可以計算得到:
ne t o 1 = 0.4 0.589327 + 0.45 0.59688 + 0.6 1.1059 {\text{ne}}{{\text{t}}_{o1}} = 0.4*0.589327 + 0.45*0.59688 + 0.6 \approx 1.1059 那麼加上啟用函式的處理我們可以得到: o u t o 1 = f ( n e t o 1 ) = f ( 1.1059 ) = 1 1 + e 1.1059 0.751365 ou{t_{o1}} = f(ne{t_{o1}}) = f(1.1059) = \frac{1}{{1 + {e^{ - 1.1059}}}} \approx 0.751365
同理我們可以計算得到o2的輸出:
o u t o 2 = f ( n e t o 2 ) = 0.772928 ou{t_{o2}} = f(ne{t_{o2}}) = 0.772928 這樣我們就得到了神經網路的正向傳播就結束了,兩個輸出0.751365和0.772928。但是這兩個輸出和我們實際的神經網路輸出0.01和0.99相差還是比較大的,這個時候為了縮小輸出值和真實值之間的誤差,我們就要對誤差進行神經網路的反向傳播,通過反向傳播來重新更新權值,然後重新計算輸出。
如上述所示,我們現在開始來計算反向傳播,首先我們要計算這個神經網路的總誤差,我們計算神經網路誤差的公式如下:
E t o t a l = 1 2 ( t a r g e t o u t p u t ) 2 {E_{total}} = \frac{1}{2}\sum {{{(target - output)}^2}} 通過這個公式我們就可以計算整個神經網路的誤差:

E o 1  =  1 2 ( t a r g e t o 1 o u t o 1 ) 2 = 1 2 ( 0.01 0.751365 ) 2 0.274811 {E_{o1}}{\text{ = }}\frac{1}{2}{(targe{t_{o1}} - ou{t_{o1}})^2} = \frac{1}{2}{(0.01 - 0.751365)^2} \approx 0.274811 同理我們可以計算得到o2的誤差: E o 2  =  1 2 ( t a r g e t o 2