人工神經網絡無需事先肯定輸入輸出之間映射關係的數學方程,僅經過自身的訓練,學習某種規則,在給定輸入值時獲得最接近指望輸出值的結果。做爲一種智能信息處理系統,人工神經網絡實現其功能的核心是算法。BP神經網絡是一種按偏差反向傳播(簡稱偏差反傳)訓練的多層前饋網絡,其算法稱爲BP算法,它的基本思想是梯度降低法,利用梯度搜索技術,以期使網絡的實際輸出值和指望輸出值的偏差均方差爲最小。
BP神經網絡的計算過程由正向計算過程和反向計算過程組成。正向傳播過程,輸入模式從輸入層經隱單元層逐層處理,並轉向輸出層,每一層神經元的狀態隻影響下一層神經元的狀態。若是在輸出層不能獲得指望的輸出,則轉入反向傳播,將偏差信號沿原來的鏈接通路返回,經過修改各神經元的權值,使得偏差信號最小。html
多層神經網絡結構:算法
一般一個多層神經網絡由\(L\)層神經元組成,第一層稱做輸入層,最後一層稱做輸出層,中間層爲隱含層。網絡
多層神經網絡的基本組成元素是神經元,單個神經元的模型以下:ide
第\(l\)層的隱含層向量:\(H^l=(h_1^l,h_2^l,...,h_j^l,...,h_{s_l}^l) (l=2,3,...,L-1,j=1,2,...,s_l);\)函數
輸出層輸出向量:\(Y=(y_1,y_2,...,y_k,...,y_n);\)學習
設\(w_{ij}^l\)爲從第\(l-1\)層的第\(i\)個神經元與第\(l\)層的第\(j\)個神經元之間的鏈接權重,\(b_j^l\)爲第\(l\)層第\(j\)個神經元的偏置。測試
所以獲得:優化
其中\(net_j^l\)爲第\(l\)層第\(j\)個神經元的輸入,\(f(\cdot)\)爲激活函數。spa
激活函數:3d
做用:引入非線性因素,使得模型可以較好地逼近非線性函數。
BP神經網絡算法經常使用的激活函數:
偏置:
做用:能夠理解爲加入一個與輸入\(X\)無關的常數項,使得逼近的效果更好。
偏差函數:
做用:衡量輸出結果與指望輸出的差距
假設有\(p\)個訓練樣本\(\{(x(1),y(1)),(x(2),y(2)),...,(x(p),y(p))\}\),\(d(i)\)爲對應\(x(i)\)的指望輸出,假設單個訓練樣本有\(n\)個輸出。定義偏差函數:
其中\(E(i)\)爲單個樣本的訓練偏差:
所以全局偏差函數:
如何更新權重與偏置:
偏差反向傳播更新權重與偏置
通常採用梯度降低法更新權重與偏置:
其中\(\alpha\)爲學習速率,\(\alpha\in(0,1)\)。BP神經網絡算法關鍵就在與如何求解上述兩個偏導數,具體推導比較繁雜,這裏就不在敘述,相關參考將附在文末\(^{[2]}\)。
最後咱們再經過一個示意圖,回顧BP神經網絡算法的整個流程。
優點:
主要用於如下四個方面:
劣勢:
(1) 進行數據預處理
(2) 創建BP神經網絡模型
(3) 利用樣本進行訓練
(4) 返回訓練結束的模型
在創建BP神經網絡模型以及訓練(即更新權重與偏置)Matlab有自帶的函數,在實現BP神經網絡算法的時候,咱們直接調用這些函數就能夠。
爲了可以更清晰地瞭解算法的實現過程,這裏選取比較簡單的數據進行演示。
案例一:曲線擬合
題目:建立BP神經網絡
輸入向量 \(P=[0,1,2,3,4,5,6,7,8,9,10];\)
指望輸出 \(T=[0,1,2,3,4,3,2,1,2,3,4];\)
散點圖以下:
Matlab代碼:
close all; clearvars; clear; %清空工做環境 P = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; T = [0, 1, 2, 3, 4, 3, 2, 1, 2, 3, 4]; %因爲feedforwardnet函數自動對樣本進行歸一化和劃分訓練、驗證、測試集,因此就不用手動將數據進行歸一化處理,但不知道有沒有打亂順序 net = feedforwardnet(5, 'traingd'); %是'5'是指隱含層有5個神經元,這裏只有一個隱含層,多個隱含層神經元的個數設置爲[5,3,...] net.trainParam.lr = 0.01; %學習速率 net.trainParam.epochs = 10000; %最大訓練次數 net.trainParam.goal = 1e-6; %最小偏差,達到該精度,中止訓練 net.trainParam.show = 50; %每50次展現訓練結果 net = train(net, P, T); %訓練 Y = net(P); %輸出 perf = perform(net, Y, T);%偏差 plot(P, T, P, Y, 'r-')
結果還不錯的幾個圖:
因爲訓練的樣本太少,因此結果不是很使人滿意。
案例二:蠓蟲分類
題目:依據的資料是觸角和翅膀的長度,已經測得了9 支Af 和6 支Apf 的數據以下:
Af: (1.24,1.72),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),(1.40,1.70),
(1.48,1.82),(1.54,1.82),(1.56,2.08).
Apf: (1.14,1.78),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).
試對觸角和翼長分別爲(1.24,1.80),(1.28,1.84)與(1.40,2.04)的3 個標本加以識別。
Matlab代碼:
clearvars; close all; %清空工做環境 %導入數據,第一列爲觸角長度,第二列爲翅膀長度 x_1 = [1.24, 1.72; 1.36, 1.74; 1.38, 1.64; 1.38, 1.82; 1.38, 1.90; 1.40, 1.70; 1.48, 1.82; 1.54, 1.82; 1.56, 2.08]; %Af蠓蟲 x_2 = [1.14, 1.78; 1.18, 1.96; 1.20, 1.86; 1.26, 2.00; 1.28, 2.00; 1.30, 1.96]; %Apf蠓蟲 x = [x_1; x_2]'; %合併轉置,由於feedforwardnet函數以一列爲單個樣本 goal = [ones(1, 9), zeros(1, 6); zeros(1, 9), ones(1, 6)]; %(1,0)表示爲Af蠓蟲,(0,1)表示Apf蠓蟲 x_recognize = [1.24, 1.80; 1.28, 1.84; 1.40, 2.04]'; %識別的樣本 plot(x_1(:, 1), x_1(:, 2), 'ro', 'DisplayName', 'Af'); %繪製Af的散點圖 hold on; plot(x_2(:, 1), x_2(:, 2), 'bo', 'DisplayName', 'Apf'); %繪製Apf的散點圖 plot(x_recognize(1, :), x_recognize(2, :), 'yo', 'DisplayName', '識別' ); %繪製識別樣本的散點圖 xlabel('觸角長度'); ylabel('翅膀長度'); legend; net = feedforwardnet([3, 2], 'trainlm'); %兩層隱含層,相應神經元個數分別爲3和2,採用L-M優化算法,效果比較好 net.trainParam.max_fail = 1000; net.trainParam.lr = 0.05; %學習速率 net.trainParam.epochs = 10000; %最大訓練次數 net.trainParam.goal = 1e-15; %最小偏差,達到該精度,中止訓練 net.trainParam.show = 50; %每50次展現訓練結果 net = train(net, x, goal); %訓練 y0 = sim(net, x) %輸出 perf = perform(net, goal, y0)%偏差 ym = sim(net, x_recognize) %識別
下圖是蠓蟲的散點圖,能夠看出這三個樣本仍是比較難分類的,肉眼幾乎很難判斷。利用BP神經網絡算法獲得的結果有時候也會有比較大的差別,這也很正常,僅經過觸角和翅膀長度確實不易分辨。
[2] BP神經網絡推導過程詳解 - Alex Yu - 博客園 (cnblogs.com)