详解BP神经网络
#BackPropagation Neuron NetWok
??BP神經網絡學習算法可以說是目前最成功的神經網絡學習算法。顯示任務中使用神經網絡時,大多數是使用BP算法進行訓練.
??在我看來BP神經網絡就是一個”萬能的模型+誤差修正函數“,每次根據訓練得到的結果與預想結果進行誤差分析,進而修改權值和閾值,一步一步得到能輸出和預想結果一致的模型。舉一個例子:比如某廠商生產一種產品,投放到市場之后得到了消費者的反饋,根據消費者的反饋,廠商對產品進一步升級,優化,從而生產出讓消費者更滿意的產品。這就是BP神經網絡的核心。
??下面就讓我們來看看BP算法到底是什么東西。BP網絡由輸入層、隱藏層、輸出層組成。給定訓練集***D***={(x1,y1),(x2,y2…(xn,yn)},其中xn?Rd,yn?Rl,表示輸入示例由d個屬性組成,輸出l維實值變量。現在,我們看看如何求得輸出值,以及怎么由輸出值調整權值和閾值。
???????
?? 神經元是以生物研究及大腦的響應機制而建立的拓撲結構網絡,模擬神經沖突的過程,多個樹突的末端接受外部信號,并傳輸給神經元處理融合,最后通過軸突將神經傳給其它神經元或者效應器。神經元的拓撲結構如圖:
?????????????
??對于第i個神經元,X1、X2、…、Xj為神經元的輸入,輸入常為對系統模型關鍵影響的自變量,W1、W2、…、Wj為連接權值調節各個輸入量的占重比。將信號結合輸入到神經元有多種方式,選取最便捷的線性加權求和可得neti神經元凈輸入:
Netin=∑i=1nwi?xiNet_{in}=\sum_{i=1}^{n}{w_i*x_i}Netin?=i=1∑n?wi??xi?
??θ\thetaθi表示該神經元的閾值,根據生物學中的知識,只有當神經元接收到的信息達到閾值是才會被激活。因此,我們將NetinNet_{in}Netin?和θj\theta_jθj?進行比較,然后通過激活函數處理以產生神經元的輸出。
??激活函數:激活函數這里我們不多重述。如果輸出值有一定的范圍約束,比如用來分類,一般我們用的最多的是Sigmod函數,它可以把輸入從負無窮大到正無窮大的信號變換成0到1之間輸出。如果沒有約束的話,我們可以使用線性激活函數(即權值相乘之和)。這樣我們得到的輸出為:
yj=f(Netin?θj)y_j=f(Net_{in}-\theta_j)yj?=f(Netin??θj?)
??我們可以將公式化簡一下,設第一個輸入永遠值為θ\thetaθ,權值為-1,則我們可以得到公式:
yj=f(∑i=0nwi?xi)y_j=f(\sum_{i=0}^nw_i*x_i)yj?=f(i=0∑n?wi??xi?)
??其中w0=-1,x0=θ\thetaθj,其中f為選擇的激活函數。
??已經知道在BP神經網絡模型中,我們有三層結構,輸入層、隱藏層、輸出層,因此輸入層到隱藏層的權值,設為vihv_{ih}vih?,隱藏層第h個神經元的閾值我們設為γh\gamma_hγh?。隱藏層到輸出層的權值,設為whjw_{hj}whj?,輸出層第j個神經元的閾值我們用θj\theta_jθj?表示。在下面這張圖里,有d輸入神經元,q個隱藏神經元,隱藏有q個隱藏神經元閾值,lll個輸出神經元,因此有lll個輸出神經元閾值。
??其中βj\beta_jβj?中的bh=f(αh?γh)b_h=f(\alpha_h-\gamma_h)bh?=f(αh??γh?)。隱藏層和輸出層的激活函數,在這里我們暫時全部用SigmodSigmodSigmod函數。
??在某個訓練示例(xk,yk)(x_k,y_k)(xk?,yk?)中,假設神經網絡的訓練輸出為yk,=(y1k,,y2k,,?,ylk,)y_{k^,}=({y_1^{k^,},y_2^{k^,},\cdots,y_l^{k^,}})yk,?=(y1k,?,y2k,?,?,ylk,?),輸出為lll維向量,其中
yik,=f(βi?θi)y_i^{k^,}=f(\beta_i-\theta_i)yik,?=f(βi??θi?)
??那么這次預測結果的誤差我們可以用最小二乘法表示:
Ek=12∑j=1l(yjk,?yjk)2E_k=\frac{1}{2}\sum_{j=1}^l(y_j^{k^,}-y_j^k)^2Ek?=21?j=1∑l?(yjk,??yjk?)2
??而我們現在要做的就是根據這個誤差去調整(d+l+1)q+l(d+l+1)q+l(d+l+1)q+l個參數的值,一步一步縮小EkE_kEk?。那么從現在開始,我們就要進入數學的世界了。這里我們使用最常用的算法:梯度下降法來更新參數。函數永遠是沿著梯度的方向變化最快,那么我們對每一個需要調整的參數求偏導數,如果偏導數>0,則要按照偏導數相反的方向變化;如果偏導數<0,則按照此方向變化即可。于是我們使用-1*偏導數則可以得到參數需要變化的值。同時我們設定一個學習速率η\etaη,這個學習速率不能太快,也不能太慢。太快可能會導致越過最優解;太慢可能會降低算法的效率。(具體設多少就屬于玄學調參的領域了)。因此我們可以得到一個參數調整公式:
Param+=?η?Ek?ParamParam+=-\eta\frac{\partial E_k}{\partial Param}Param+=?η?Param?Ek??
??首先我們看看隱藏層到輸出層的權值調整值:
Δwhj=?η?Ek?whj\Delta w_{hj}=-\eta\frac{\partial E_k}{\partial w_{hj}}Δwhj?=?η?whj??Ek??
??好,我們從上到下縷一縷這個偏導該怎么求,我們把每一個公式都羅列出來:
#####??1.輸入層到隱藏層:
αh=∑i=1dvih?xi???????(1)\alpha_h=\sum_{i=1}^dv_{ih}*x_i \cdots \cdots \cdots \cdots \cdots \cdots \cdots(1)αh?=i=1∑d?vih??xi????????(1)
∣x1x2x3?xd∣?∣v11v12v13?v1qv21v22v23?w2q???????????????vd1wd2wd3?wdq∣\begin{vmatrix} x_1 &x_2 &x_3&\cdots& x_d \end{vmatrix} \cdot \begin{vmatrix} v_{11} &v_{12} &v_{13}& \cdots& v_{1q} \\ v_{21} &v_{22} &v_{23}& \cdots& w_{2q} \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ v_{d1} &w_{d2}&w_{d3} &\cdots & w_{dq} \end{vmatrix}∣∣?x1??x2??x3????xd??∣∣??∣∣∣∣∣∣∣∣∣∣∣∣?v11?v21????vd1??v12?v22????wd2??v13?v23????wd3?????????v1q?w2q????wdq??∣∣∣∣∣∣∣∣∣∣∣∣?
#####??2.經過隱藏層的激活函數:
bh=f(αh?γh)???????(2)b_h=f(\alpha_h-\gamma_h) \cdots \cdots \cdots \cdots \cdots \cdots \cdots(2)bh?=f(αh??γh?)???????(2)
#####??3.隱藏層到輸出層:
βj=∑h=1qwhj?bh???????(3)\beta_j=\sum_{h=1}^qw_{hj}*b_h \cdots\cdots \cdots \cdots \cdots \cdots \cdots(3)βj?=h=1∑q?whj??bh????????(3)
#####??用矩陣表示
∣b1b2b3?bq∣?∣w11w12w13?w1lw21w22w23?w2l???????????????wq1wq2wq3?wql∣\begin{vmatrix} b_1 &b_2 &b_3&\cdots& b_q \end{vmatrix} \cdot \begin{vmatrix} w_{11} &w_{12} &w_{13}& \cdots& w_{1l} \\ w_{21} &w_{22} &w_{23}& \cdots& w_{2l} \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ \cdot & \cdot &\cdot & \cdot &\cdot \\ w_{q1} &w_{q2}&w_{q3} &\cdots & w_{ql} \end{vmatrix}∣∣?b1??b2??b3????bq??∣∣??∣∣∣∣∣∣∣∣∣∣∣∣?w11?w21????wq1??w12?w22????wq2??w13?w23????wq3?????????w1l?w2l????wql??∣∣∣∣∣∣∣∣∣∣∣∣?
#####??4.經過輸出層的激活函數:
yjk,=f(βj?θj)???????(4))y_j^{k^,}=f(\beta_j-\theta_j)\cdots \cdots \cdots \cdots \cdots \cdots \cdots(4))yjk,?=f(βj??θj?)???????(4))
#####??5.誤差:
Ek=12∑j=1l(yjk,?yjk)2???????(5)E_k=\frac{1}{2}\sum_{j=1}^l(y_j^{k^,}-y_j^k)^2 \cdots \cdots \cdots \cdots \cdots \cdots \cdots(5)Ek?=21?j=1∑l?(yjk,??yjk?)2???????(5)
??綜上我們可以得知whjw_{hj}whj?先影響βj\beta_jβj?,再影響yjk,y_j^{k^,}yjk,?,最后影響EkE_kEk?,(一個www權值只會影響一個β\betaβ)所以我們可得:
Δwhj=?η?Ek?whj=?η?Ek?yjk,??yjk,?βj??βj?whj?(6)\Delta w_{hj}=-\eta\frac{\partial E_k}{\partial w_{hj}}=-\eta\frac{\partial E_k}{\partial y_j^{k^,}}\cdot \frac{\partial y_j^{k^,}}{\partial \beta_j} \cdot\frac{\partial \beta_j}{\partial w_{hj}}\cdots(6)Δwhj?=?η?whj??Ek??=?η?yjk,??Ek????βj??yjk,????whj??βj???(6)
其中?βj?whj=bh\frac{\partial \beta_j}{\partial w_{hj}}=b_h?whj??βj??=bh?,前面提到過,bhb_hbh?是第h個隱藏神經元的輸出。
gj=?Ek?yjk,??yjk,?βj=(yjk,?yjk)?f’(βj?θj)?(7)g_j=\frac{\partial E_k}{\partial y_j^{k^,}}\cdot \frac{\partial y_j^{k^,}}{\partial \beta_j}=(y_j^{k^,}-y_j^k)\cdot f^{’}(\beta_j-\theta_j) \cdots(7)gj?=?yjk,??Ek????βj??yjk,??=(yjk,??yjk?)?f’(βj??θj?)?(7)
??而我們選擇的激活函數是SigmodSigmodSigmod函數,該函數具有一個很好的性質
f(x)=11+e?x?f′(x)=f(x)(1?f(x))?(8)f(x)=\frac{1}{1+e^{-x}}\cdots f^{'}(x)=f(x)(1-f(x)) \cdots(8)f(x)=1+e?x1??f′(x)=f(x)(1?f(x))?(8)
??所以我們有:
f′(βj?θj)=f(βj?θj)?(1?f(βj?θj))=yjk′?(1?yjk′)?(9)f^{'}(\beta_j-\theta_j)=f(\beta_j-\theta_j)\cdot (1-f(\beta_j-\theta_j))=y_j^{k^{'}}\cdot (1-y_j^{k^{'}}) \cdots(9)f′(βj??θj?)=f(βj??θj?)?(1?f(βj??θj?))=yjk′??(1?yjk′?)?(9)
??綜合formula(6)(7)(9)formula(6)(7)(9)formula(6)(7)(9)我們可得:
Δwhj=?η?Ek?whj=?ηgibh=?η(yjk′?yjk)?yjk′?(1?yjk′)?bh?(10)\Delta w_{hj}=-\eta\frac{\partial E_k}{\partial w_{hj}}=-\eta g_i b_h=-\eta (y_j^{k^{'}}-y_j^k) \cdot y_j^{k^{'}}\cdot (1-y_j^{k^{'}})\cdot b_h \cdots(10)Δwhj?=?η?whj??Ek??=?ηgi?bh?=?η(yjk′??yjk?)?yjk′??(1?yjk′?)?bh??(10)
####??同理:
Δθj=?η?Ek?θj=?η?Ek?yjk′??yjk′?θj=η?gj?(11)\Delta \theta_j=-\eta \frac{\partial E_k}{\partial \theta_j}=-\eta \frac{\partial E_k}{\partial y_j^{k^{'}}}\cdot\frac{\partial y_j^{k^{'}}}{\partial \theta_j}=\eta\cdot g_j \cdots(11)Δθj?=?η?θj??Ek??=?η?yjk′??Ek????θj??yjk′??=η?gj??(11)
??我們再看看Δvih\Delta v_{ih}Δvih?的值怎么求,還是由formula(1),(2),(3),(4),(5)formula(1),(2),(3),(4),(5)formula(1),(2),(3),(4),(5)推導,一個vvv權值會影響所有的β\betaβ
Δvih=?ηehxi????(12)\Delta v_{ih}=-\eta e_h x_i \cdots\cdots\cdots\cdots(12)Δvih?=?ηeh?xi?????(12)
Δγh=ηeh???(13)\Delta \gamma_h=\eta e_h \cdots \cdots\ \cdots(13)Δγh?=ηeh?????(13)
??其中
eh=(∑j=1l?Ek?βj??βj?bj)?f′(αh?γh)=(∑j=1l(yjk,?yjk)?f’(βj?θj)?whj)?f′(αh?γh)???(14)e_h=(\sum_{j=1}^l \frac{\partial E_k}{\partial \beta_j}\cdot \frac{\partial \beta_j}{\partial b_j})\cdot f^{'}(\alpha_h-\gamma_h)=(\sum_{j=1}^l(y_j^{k^,}-y_j^k)\cdot f^{’}(\beta_j-\theta_j) \cdot w_{hj})\cdot f^{'}(\alpha_h-\gamma_h) \cdots \cdots \cdots(14)eh?=(j=1∑l??βj??Ek????bj??βj??)?f′(αh??γh?)=(j=1∑l?(yjk,??yjk?)?f’(βj??θj?)?whj?)?f′(αh??γh?)???(14)
####??至此,我們所有得公式都推導完畢了,剩下做的就是設定一個迭代終止條件,可以是誤差小于一定值時終止遞歸,也可以是設定迭代次數。這樣一個BP神經網絡模型就算是設計結束。
??java實現代碼和實驗數據在我的github上面
總結
- 上一篇: 微型计算机控制技术学科认识,微型计算机控
- 下一篇: 数学教育与计算机教育ppt,计算机基础教