BP神經網絡算法及Matlab實現


1. 算法原理

1.1 概述

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

1.2 算法分析

多層神經網絡結構

通常一個多層神經網絡由\(L\)​​層神經元組成,第一層稱作輸入層,最后一層稱作輸出層,中間層為隱含層

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

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)\)​為激活函數。

激活函數

作用:引入非線性因素,使得模型能夠較好地逼近非線性函數。

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神經網絡算法得到的結果有時候也會有比較大的差異,這也很正常,僅通過觸角和翅膀長度確實不易分辨。

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

3. 參考來源

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

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM