BP神經網絡算法及Matlab實現

1. 算法原理

1.1 概述

人工神經網絡無需事先肯定輸入輸出之間映射關係的數學方程,僅經過自身的訓練,學習某種規則,在給定輸入值時獲得最接近指望輸出值的結果。做爲一種智能信息處理系統,人工神經網絡實現其功能的核心是算法。BP神經網絡是一種按偏差反向傳播(簡稱偏差反傳)訓練的多層前饋網絡,其算法稱爲BP算法,它的基本思想是梯度降低法,利用梯度搜索技術,以期使網絡的實際輸出值和指望輸出值的偏差均方差爲最小。
BP神經網絡的計算過程正向計算過程反向計算過程組成。正向傳播過程,輸入模式從輸入層經隱單元層逐層處理,並轉向輸出層,每一層神經元的狀態隻影響下一層神經元的狀態。若是在輸出層不能獲得指望的輸出,則轉入反向傳播,將偏差信號沿原來的鏈接通路返回,經過修改各神經元的權值,使得偏差信號最小。html

1.2 算法分析

多層神經網絡結構算法

一般一個多層神經網絡由\(L\)​​層神經元組成,第一層稱做輸入層,最後一層稱做輸出層,中間層爲隱含層網絡

多層神經網絡的基本組成元素是神經元,單個神經元的模型以下:ide

image-20210803202615457
輸入層輸入向量:$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\)​個神經元的偏置。測試

所以獲得:優化

\[h_j^l=f(net_j^l) \\ net_j^l=\sum_{j=1}^{s_{l-1}}{w_{ij}^l+b_j^l} \]

其中\(net_j^l\)爲第\(l\)層第\(j\)個神經元的輸入,\(f(\cdot)\)​爲激活函數。spa

激活函數3d

做用:引入非線性因素,使得模型可以較好地逼近非線性函數。

BP神經網絡算法經常使用的激活函數:

  • Sigmod函數:

    \[f(x)=\frac{1}{1+e^x} \]

image-20210804000024960
  • Tanh函數(雙曲正切函數)

    \[f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} \]

    image-20210804001057704

偏置

做用:能夠理解爲加入一個與輸入\(X\)無關的常數項,使得逼近的效果更好。

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

偏差函數:

做用:衡量輸出結果與指望輸出的差距

假設有\(p\)​個訓練樣本\(\{(x(1),y(1)),(x(2),y(2)),...,(x(p),y(p))\}\)​,\(d(i)\)​爲對應\(x(i)\)​的指望輸出,假設單個訓練樣本有\(n\)​個輸出。定義偏差函數:

\[E=\frac{1}{p}\sum_{i=1}^p{E(i)} \]

其中\(E(i)\)爲單個樣本的訓練偏差:

\[E(i)=\frac{1}{2}\sum_{k=1}^n(d_k(i)-y_k(i))^2 \]

所以全局偏差函數:

\[E=\frac{1}{2p}\sum_{i=1}^p\sum_{k=1}^n{(d_k(i)-y_k(i))^2} \]

如何更新權重與偏置

偏差反向傳播更新權重與偏置

通常採用梯度降低法更新權重與偏置:

\[w_{ij}^l=w_{ij}^l-\alpha \frac{\partial E}{\partial w_{ij}^l} \\ b_{j}^l=b_j^l-\alpha \frac{\partial E}{\partial b_j^l} \]

其中\(\alpha\)爲學習速率,\(\alpha\in(0,1)\)。BP神經網絡算法關鍵就在與如何求解上述兩個偏導數,具體推導比較繁雜,這裏就不在敘述,相關參考將附在文末\(^{[2]}\)

1.3 回顧

最後咱們再經過一個示意圖,回顧BP神經網絡算法的整個流程。

image-20210804155659704
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];\)

散點圖以下:

img
試用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-')

結果還不錯的幾個圖

2
3 4

因爲訓練的樣本太少,因此結果不是很使人滿意。

案例二:蠓蟲分類

題目:依據的資料是觸角和翅膀的長度,已經測得了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神經網絡算法獲得的結果有時候也會有比較大的差別,這也很正常,僅經過觸角和翅膀長度確實不易分辨。

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

3. 參考來源

[1] BP神經網絡_百度百科 (baidu.com)

[2] BP神經網絡推導過程詳解 - Alex Yu - 博客園 (cnblogs.com)

[3] 專題 經過四個matlab建模案例完全精通BP神經網絡_嗶哩嗶哩_bilibili

[4] 最容易聽懂的BP神經網絡教程----萌新入門首選課_嗶哩嗶哩_bilibili

相關文章
相關標籤/搜索