BP神經網路演算法
1. 演算法原理
1.1 概述
人工神經網路無需事先確定輸入輸出之間映射關係的數學方程,僅通過自身的訓練,學習某種規則,在給定輸入值時得到最接近期望輸出值的結果。作為一種智慧資訊處理系統,人工神經網路實現其功能的核心是演算法。BP神經網路是一種按誤差反向傳播(簡稱誤差反傳)訓練的多層前饋網路,其演算法稱為BP演算法,它的基本思想是梯度下降法,利用梯度搜索技術,以期使網路的實際輸出值和期望輸出值的誤差均方差為最小。
BP神經網路的計算過程由正向計算過程和反向計算過程組成。正向傳播過程,輸入模式從輸入層經隱單元層逐層處理,並轉向輸出層,每一層神經元的狀態隻影響下一層神經元的狀態。如果在輸出層不能得到期望的輸出,則轉入反向傳播,將誤差訊號沿原來的連接通路返回,通過修改各神經元的權值,使得誤差訊號最小。
1.2 演算法分析
多層神經網路結構:

通常一個多層神經網路由$L$層神經元組成,第一層稱作==輸入層==,最後一層稱作==輸出層==,中間層為==隱含層==。
多層神經網路的基本組成元素是神經元,單個神經元的模型如下:

輸入層輸入向量:$X=(x_1,x_2,…,x_i,…,x_m);$
第\(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)\)為激活函數。
激活函數:
作用:引入非線性因素,使得模型能夠較好地逼近非線性函數。
BP神經網路演算法常用的激活函數:
- Sigmod函數:
\[f(x)=\frac{1}{1+e^x}
\]

– Tanh函數(雙曲正切函數)
$$
f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
$$

**偏置**:
作用:可以理解為加入一個與輸入\(X\)無關的常數項,使得逼近的效果更好。

如果用$y=x$去逼近,效果不如人意,相反如果加入一個常數項,使得$y=x+2$,效果則會好很多。

**誤差函數**:
作用:衡量輸出結果與期望輸出的差距
假設有\(p\)個訓練樣本\(\{(x(1),y(1)),(x(2),y(2)),…,(x(p),y(p))\}\),\(d(i)\)為對應\(x(i)\)的期望輸出,假設單個訓練樣本有\(n\)個輸出。定義誤差函數:
\]
其中\(E(i)\)為單個樣本的訓練誤差:
\]
因此全局誤差函數:
\]
如何更新權重與偏置:
誤差反向傳播更新權重與偏置
一般採用梯度下降法更新權重與偏置:
b_{j}^l=b_j^l-\alpha \frac{\partial E}{\partial b_j^l}
\]
其中$\alpha \(為學習速率,\)\alpha\in(0,1)\(。BP神經網路演算法關鍵就在與如何求解上述兩個偏導數,具體推導比較繁雜,這裡就不在敘述,相關參考將附在文末\)^{[2]}$。
1.3 回顧
最後我們再通過一個示意圖,回顧BP神經網路演算法的整個流程。

##### 1.4 優劣勢
優勢:
主要用於以下四個方面:
- 函數逼近
- 模式識別
- 分類
- 數據壓縮
劣勢:
- 學習速度慢,需要多次學習才能收斂
- 採用梯度下降法,容易陷入局部最小值
- 網路層數、神經元個數的選取沒有理論指導,主要憑藉經驗
- 網路推廣能力有限
2. Matlab實現
2.1 演算法實現步驟
(1) 進行數據預處理
(2) 建立BP神經網路模型
(3) 利用樣本進行訓練
(4) 返回訓練結束的模型
2.2 案例
在建立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];\)
散點圖如下:

試用BP神經網路演算法對上圖進行擬合,並將擬合效果繪圖展示。
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神經網路演算法得到的結果有時候也會有比較大的差異,這也很正常,僅通過觸角和翅膀長度確實不易分辨。

這是訓練誤差比較低情況下的一個輸出,顯示識別樣本中第一、第二為Af類型的蠓蟲,第三為Apf類型的蠓蟲。

3. 參考來源
[2] BP神經網路推導過程詳解 – Alex Yu – 部落格園 (cnblogs.com)
[3] 專題 通過四個matlab建模案例徹底精通BP神經網路_嗶哩嗶哩_bilibili
[4] 最容易聽懂的BP神經網路教程—-萌新入門首選課_嗶哩嗶哩_bilibili