1. 程式人生 > >深入淺出|深度學習演算法之BP神經網路 詳細公式推導

深入淺出|深度學習演算法之BP神經網路 詳細公式推導

所謂神經網路,目前用得最廣泛的一個定義是“的神經網路是由具有適應性簡單單元組成的廣泛並行互連的網路,它的組織能夠模擬生物神經系統對真實世界物體所做出的互動反應”。

BP(back propagation)絡一種按照誤差逆向傳播演算法訓練的多層前饋神經網路,是目前應用最廣泛的神經網路

神經元模型

神經網路中最基本的單元是神經元模型(neuron)。在生物神經網路的原始機制中,每個神經元通常都有多個樹突(dendrite),一個軸突(axon)和一個細胞體(cell body),樹突短而多分支,軸突長而只有一個;在功能上,樹突用於傳入其它神經元傳遞的神經衝動,而軸突用於將神經衝動傳出到其它神經元,當樹突或細胞體傳入的神經衝動使得神經元興奮時,該神經元就會通過軸突向其它神經元傳遞興奮。神經元的生物學結構如下圖所示:

 

一直沿用至今的“M-P神經元模型”正是對這一結構進行了抽象,也稱“閾值邏輯單元“,其中樹突對應於輸入部分,每個神經元收到n個其他神經元傳遞過來的輸入訊號,這些訊號通過帶權重的連線傳遞給細胞體,這些權重又稱為連線權(connection weight)。細胞體分為兩部分,前一部分計算總輸入值(即輸入訊號的加權和,或者說累積電平),後一部分先計算總輸入值與該神經元閾值的差值,然後通過啟用函式(activation function)的處理,產生輸出從軸突傳送給其它神經元。M-P神經元模型如下圖所示:

與線性分類十分相似,神經元模型最理想的啟用函式也是階躍函式,即將神經元輸入值與閾值的差值對映為輸出值1

或0,若差值大於零輸出1,對應興奮;若差值小於零則輸出0,對應抑制。但階躍函式不連續,不光滑(定義域內不完全可導),故在M-P神經元模型中,採用Sigmoid函式來近似, Sigmoid函式將較大範圍內變化的輸入值擠壓到 (0,1) 輸出值範圍內,所以也稱為擠壓函式(squashing function)。

將多個神經元按一定的層次結構連線起來,就得到了神經網路。它是一種包含多個引數的模型,比方說10個神經元兩兩連線,則有100個引數需要學習(每個神經元有9個連線權以及1個閾值),若將每個神經元都看作一個函式,則整個神經網路就是由這些函式相互巢狀而成。

多次前饋神經網路有三部分組成,分別是輸入層(input layer)

,隱藏層(hide layer),輸出層(output layer)。隱藏層可以有,也可以沒有,輸入層和輸出層必須要有。沒有隱藏層的神經網路是線性的,只能處理線性可分的問題(線性可分問題從二維的角度就是分界線是一條直線,多維就是存線上性超平面將其分類)。一個沒有隱藏層且輸出層只有一個單元的神經網路就相當於線性的Logistic模型。



感知機與多層網路

感知機(Perceptron)是由兩層神經元組成的一個簡單模型,但只有輸出層是M-P神經元,即只有輸出層神經元進行啟用函式處理,也稱為功能神經元(functionalneuron);輸入層只是接受外界訊號(樣本屬性)並傳遞給輸出層(輸入層的神經元個數等於樣本的屬性數目),而沒有啟用函式。這樣一來,感知機與之前線性迴歸的思想基本是一樣的,都是通過對屬性加權與另一個常數求和,再使用sigmoid函式將這個輸出值壓縮到0-1之間,從而解決分類問題。不同的是感知機的輸出層應該可以有多個神經元,從而可以實現多分類問題,同時兩個模型所用的引數估計方法十分不同。

給定訓練集,則感知機的n+1個引數(n個權重+1個閾值)都可以通過學習得到。閾值Θ可以看作一個輸入值固定為-1的啞結點的權重ωn+1,即假設有一個固定輸入xn+1=-1的輸入層神經元,其對應的權重為ωn+1,這樣就把權重和閾值統一為權重的學習了。簡單感知機的結構如下圖所示:


感知機權重的學習規則如下:對於訓練樣本(x,y),當該樣本進入感知機學習後,會產生一個輸出值,若該輸出值與樣本的真實標記不一致,則感知機會對權重進行調整,若啟用函式為階躍函式,則調整的方法與Logistic迴歸類似(基於梯度下降法)。

感知機是通過逐個樣本輸入來更新權重,首先設定好初始權重(一般為隨機),逐個地輸入樣本資料,若輸出值與真實標記相同則繼續輸入下一個樣本,若不一致則更新權重,然後再重新逐個檢驗,直到每個樣本資料的輸出值都與真實標記相同。容易看出:感知機模型總是能將訓練資料的每一個樣本都預測正確,和決策樹模型總是能將所有訓練資料都分開一樣,感知機模型很容易產生過擬合問題。

由於感知機模型只有一層功能神經元,因此其功能十分有限,只能處理線性可分的問題,對於這類問題,感知機的學習過程一定會收斂(converge),因此總是可以求出適當的權值。

BP神經網路演算法

由上面可以得知:神經網路的學習主要蘊含在權重閾值,多層網路使用上面簡單感知機的權重調整規則顯然不夠用了,BP神經網路演算法即誤差逆傳播演算法正是為學習多層前饋神經網路而設計,BP神經網路演算法是迄今為止最成功的的神經網路學習演算法。

一般而言,只需包含一個足夠多神經元的隱層,就能以任意精度逼近任意複雜度的連續函式,故下面以訓練單隱層的前饋神經網路為例,介紹BP神經網路的演算法思想。


上圖為一個單隱層前饋神經網路的拓撲結構,BP神經網路演算法也使用梯度下降法(gradient descent),以單個樣本的均方誤差的負梯度方向對權重進行調節。可以看出:BP演算法首先將誤差反向傳播給隱層神經元,調節隱層到輸出層的連線權重與輸出層神經元的閾值;接著根據隱含層神經元的均方誤差,來調節輸入層到隱含層的連線權值與隱含層神經元的閾值。BP演算法基本的推導過程與感知機的推導過程原理是相同的,下面給出調整隱含層到輸出層的權重調整規則的推導過程:

BP演算法的最終目標是要最小化整個訓練集D上的累積誤差



學習率η∈(0,1)控制著沿反梯度方向下降的步長,若步長太大則下降太快容易產生震盪,若步長太小則收斂速度太慢,一般地常把η設定為0.1,有時更新權重時會將輸出層與隱含層設定為不同的學習率。BP演算法的基本流程如下所示:


BP演算法的更新規則是基於每個樣本的預測值與真實類標的均方誤差來進行權值調節,即BP演算法每次更新只針對於單個樣例。需要注意的是:BP演算法的最終目標是要最小化整個訓練集D上的累積誤差。

BP神經網路matlab實現的基本步驟

1、資料歸一化

2、資料分類,主要包括打亂資料順序,抽取正常訓練用資料、變數資料、測試資料

3、建立神經網路,包括設定多少層網路(一般3層以內既可以,每層的節點數(具體節點數,尚無科學的模型和公式方法確定,可採用試湊法,但輸出層的節點數應和需要輸出的量個數相等),設定隱含層的傳輸函式等

4、指定訓練引數進行訓練,這步非常重要

5、完成訓練後,就可以呼叫訓練結果,輸入測試資料,進行測試

6、資料進行反歸一化

7、誤差分析、結果預測或分類,作圖等

應用案例




問題的matlab程式碼:
P=[0.2286 0.1292 0.0720 0.1592 0.1335 0.0733 0.1159 0.0940 0.0522 0.1345 0.0090 0.1260 0.3619 0.0690 0.1828;
   0.2090 0.0947 0.1393 0.1387 0.2558 0.0900 0.0771 0.0882 0.0393 0.1430 0.0126 0.1670 0.2450 0.0508 0.1328;
   0.0442 0.0880 0.1147 0.0563 0.3347 0.1150 0.1453 0.0429 0.1818 0.0378 0.0092 0.2251 0.1516 0.0858 0.0670;
   0.2603 0.1715 0.0702 0.2711 0.1491 0.1330 0.0968 0.1911 0.2545 0.0871 0.0060 0.1793 0.1002 0.0789 0.0909;
   0.3690 0.2222 0.0562 0.5157 0.1872 0.1614 0.1425 0.1506 0.1310 0.0500 0.0078 0.0348 0.0451 0.0707 0.0880;
   0.0359 0.1149 0.1230 0.5460 0.1977 0.1248 0.0624 0.0832 0.1640 0.1002 0.0059 0.1503 0.1837 0.1295 0.0700;
   0.1759 0.2347 0.1829 0.1811 0.2922 0.0655 0.0774 0.2273 0.2056 0.0925 0.0078 0.1852 0.3501 0.1680 0.2668;
   0.0724 0.1909 0.1340 0.2409 0.2842 0.0450 0.0824 0.1064 0.1909 0.1586 0.0116 0.1698 0.3644 0.2718 0.2494;
   0.2634 0.2258 0.1165 0.1154 0.1074 0.0657 0.0610 0.2623 0.2588 0.1155 0.0050 0.0978 0.1511 0.2273 0.3220]';
T=[1 0 0;1 0 0;1 0 0;
   0 1 0;0 1 0;0 1 0;
   0 0 1;0 0 1;0 0 1]';
%輸入向量的最大值和最小值
threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];
net=newff(threshold,[31 3],{'tansig','logsig'},'trainlm');
%訓練次數為1000,訓練目標為0.01,學習速率為0.1
net.trainParam.epochs=1000;
net.trainParam.goal=0.01;
LP.lr=0.1;
net = train(net,P,T);
%測試資料,和訓練資料不一致
P_test=[0.2101 0.0950 0.1298 0.1359 0.2601 0.1001 0.0753 0.0890 0.0389 0.1451 0.0128 0.1590 0.2452 0.0512 0.1319;
        0.2593 0.1800 0.0711 0.2801 0.1501 0.1298 0.1001 0.1891 0.2531 0.0875 0.0058 0.1803 0.0992 0.0802 0.1002;
        0.2599 0.2235 0.1201 0.1171 0.1102 0.0683 0.0621 0.2597 0.2602 0.1167 0.0048 0.1002 0.1521 0.2281 0.3205]';
Y=sim(net,P_test)

%計算訓練誤差res(P106)
t=[1 0 0;
   0 1 0;
   0 0 1];
error=Y-t
res=norm(error)



參考書籍:《機器學習》 周志華 著  清華大學出版社