一、BP神經網絡的概念
BP神經網絡是一種多層的前饋神經網絡,其基本的特點是:信號是前向傳播的,而誤差是反向傳播的。詳細來說。對於例如以下的僅僅含一個隱層的神經網絡模型:

(三層BP神經網絡模型)
BP神經網絡的過程主要分為兩個階段。第一階段是信號的前向傳播,從輸入層經過隱含層。最后到達輸出層;第二階段是誤差的反向傳播,從輸出層到隱含層。最后到輸入層,依次調節隱含層到輸出層的權重和偏置,輸入層到隱含層的權重和偏置。
二、BP神經網絡的流程
在知道了BP神經網絡的特點后,我們須要根據信號的前向傳播和誤差的反向傳播來構建整個網絡。
1、網絡的初始化
如果輸入層的節點個數為
,隱含層的節點個數為
,輸出層的節點個數為
。
,隱含層的節點個數為
,輸出層的節點個數為
。輸入層到隱含層的權重
,隱含層到輸出層的權重為
,輸入層到隱含層的偏置為
,隱含層到輸出層的偏置為
。學習速率為
,激勵函數為
。當中激勵函數為
取Sigmoid函數。形式為:

2、隱含層的輸出
如上面的三層BP網絡所看到的,隱含層的輸出
為
為

3、輸出層的輸出

4、誤差的計算
我們取誤差公式為:

當中
為期望輸出。
為期望輸出。我們記
,則
能夠表示為

以上公式中。
,
,
。
,
,
。
5、權值的更新
權值的更新公式為:

這里須要解釋一下公式的由來:
這是誤差反向傳播的過程,我們的目標是使得誤差函數達到最小值。即
。我們使用梯度下降法:
。我們使用梯度下降法:
- 隱含層到輸出層的權重更新
則權重的更新公式為:

- 輸入層到隱含層的權重更新
當中

![\begin{matrix} \frac{\partial H_j}{\partial \omega _ij}=\frac{\partial g\left ( \sum_{i=1}^{n}\omega _{ij}x_i+a_j \right )}{\partial \omega _ij}\\ =g\left ( \sum_{i=1}^{n}\omega _{ij}x_i+a_j \right )\cdot \left [ 1-g\left ( \sum_{i=1}^{n}\omega _{ij}x_i+a_j \right ) \right ]\cdot \frac{\partial \left ( \sum_{i=1}^{n}\omega _{ij}x_i+a_j \right )}{\partial \omega _ij}\\ =H_j\left ( 1-H_j \right )x_i \end{matrix}](/image/aHR0cDovL2xhdGV4LmNvZGVjb2dzLmNvbS9naWYubGF0ZXg_XGJlZ2lue21hdHJpeH0mc3BhY2U7XGZyYWN7XHBhcnRpYWwmc3BhY2U7SF9qfXtccGFydGlhbCZzcGFjZTtcb21lZ2Emc3BhY2U7X2lqfT1cZnJhY3tccGFydGlhbCZzcGFjZTtnXGxlZnQmc3BhY2U7KCZzcGFjZTtcc3VtX3tpPTF9XntufVxvbWVnYSZzcGFjZTtfe2lqfXhfaSthX2omc3BhY2U7XHJpZ2h0JnNwYWNlOyl9e1xwYXJ0aWFsJnNwYWNlO1xvbWVnYSZzcGFjZTtfaWp9XFwmc3BhY2U7PWdcbGVmdCZzcGFjZTsoJnNwYWNlO1xzdW1fe2k9MX1ee259XG9tZWdhJnNwYWNlO197aWp9eF9pK2FfaiZzcGFjZTtccmlnaHQmc3BhY2U7KVxjZG90JnNwYWNlO1xsZWZ0JnNwYWNlO1smc3BhY2U7MS1nXGxlZnQmc3BhY2U7KCZzcGFjZTtcc3VtX3tpPTF9XntufVxvbWVnYSZzcGFjZTtfe2lqfXhfaSthX2omc3BhY2U7XHJpZ2h0JnNwYWNlOykmc3BhY2U7XHJpZ2h0JnNwYWNlO11cY2RvdCZzcGFjZTtcZnJhY3tccGFydGlhbCZzcGFjZTtcbGVmdCZzcGFjZTsoJnNwYWNlO1xzdW1fe2k9MX1ee259XG9tZWdhJnNwYWNlO197aWp9eF9pK2FfaiZzcGFjZTtccmlnaHQmc3BhY2U7KX17XHBhcnRpYWwmc3BhY2U7XG9tZWdhJnNwYWNlO19pan1cXCZzcGFjZTs9SF9qXGxlZnQmc3BhY2U7KCZzcGFjZTsxLUhfaiZzcGFjZTtccmlnaHQmc3BhY2U7KXhfaSZzcGFjZTtcZW5ke21hdHJpeH0=.png)
則權重的更新公式為:

6、偏置的更新
偏置的更新公式為:

- 隱含層到輸出層的偏置更新
則偏置的更新公式為:

- 輸入層到隱含層的偏置更新
當中
![\begin{matrix} \frac{\partial H_j}{\partial a_j}=\frac{\partial g\left ( \sum_{i=1}^{n}\omega _{ij}x_i+a_j \right )}{\partial a_j}\\ =g\left ( \sum_{i=1}^{n}\omega _{ij}x_i+a_j \right )\cdot \left [ 1-g\left ( \sum_{i=1}^{n}\omega _{ij}x_i+a_j \right ) \right ]\cdot \frac{\partial \left ( \sum_{i=1}^{n}\omega _{ij}x_i+a_j \right )}{\partial a_j}\\ =H_j\left ( 1-H_j \right ) \end{matrix}](/image/aHR0cDovL2xhdGV4LmNvZGVjb2dzLmNvbS9naWYubGF0ZXg_XGJlZ2lue21hdHJpeH0mc3BhY2U7XGZyYWN7XHBhcnRpYWwmc3BhY2U7SF9qfXtccGFydGlhbCZzcGFjZTthX2p9PVxmcmFje1xwYXJ0aWFsJnNwYWNlO2dcbGVmdCZzcGFjZTsoJnNwYWNlO1xzdW1fe2k9MX1ee259XG9tZWdhJnNwYWNlO197aWp9eF9pK2FfaiZzcGFjZTtccmlnaHQmc3BhY2U7KX17XHBhcnRpYWwmc3BhY2U7YV9qfVxcJnNwYWNlOz1nXGxlZnQmc3BhY2U7KCZzcGFjZTtcc3VtX3tpPTF9XntufVxvbWVnYSZzcGFjZTtfe2lqfXhfaSthX2omc3BhY2U7XHJpZ2h0JnNwYWNlOylcY2RvdCZzcGFjZTtcbGVmdCZzcGFjZTtbJnNwYWNlOzEtZ1xsZWZ0JnNwYWNlOygmc3BhY2U7XHN1bV97aT0xfV57bn1cb21lZ2Emc3BhY2U7X3tpan14X2krYV9qJnNwYWNlO1xyaWdodCZzcGFjZTspJnNwYWNlO1xyaWdodCZzcGFjZTtdXGNkb3Qmc3BhY2U7XGZyYWN7XHBhcnRpYWwmc3BhY2U7XGxlZnQmc3BhY2U7KCZzcGFjZTtcc3VtX3tpPTF9XntufVxvbWVnYSZzcGFjZTtfe2lqfXhfaSthX2omc3BhY2U7XHJpZ2h0JnNwYWNlOyl9e1xwYXJ0aWFsJnNwYWNlO2Ffan1cXCZzcGFjZTs9SF9qXGxlZnQmc3BhY2U7KCZzcGFjZTsxLUhfaiZzcGFjZTtccmlnaHQmc3BhY2U7KSZzcGFjZTtcZW5ke21hdHJpeH0=.png)

則偏置的更新公式為:

7、推斷算法迭代是否結束
有非常多的方法能夠推斷算法是否已經收斂,常見的有指定迭代的代數,推斷相鄰的兩次誤差之間的區別是否小於指定的值等等。
三、實驗的仿真
在本試驗中。我們利用BP神經網絡處理一個四分類問題,終於的分類結果為:

MATLAB代碼
主程序
%% BP的主函數
% 清空
clear all;
clc;
% 導入數據
load data;
%從1到2000間隨機排序
k=rand(1,2000);
[m,n]=sort(k);
%輸入輸出數據
input=data(:,2:25);
output1 =data(:,1);
%把輸出從1維變成4維
for i=1:2000
switch output1(i)
case 1
output(i,:)=[1 0 0 0];
case 2
output(i,:)=[0 1 0 0];
case 3
output(i,:)=[0 0 1 0];
case 4
output(i,:)=[0 0 0 1];
end
end
%隨機提取1500個樣本為訓練樣本,500個樣本為預測樣本
trainCharacter=input(n(1:1600),:);
trainOutput=output(n(1:1600),:);
testCharacter=input(n(1601:2000),:);
testOutput=output(n(1601:2000),:);
% 對訓練的特征進行歸一化
[trainInput,inputps]=mapminmax(trainCharacter');
%% 參數的初始化
% 參數的初始化
inputNum = 24;%輸入層的節點數
hiddenNum = 50;%隱含層的節點數
outputNum = 4;%輸出層的節點數
% 權重和偏置的初始化
w1 = rands(inputNum,hiddenNum);
b1 = rands(hiddenNum,1);
w2 = rands(hiddenNum,outputNum);
b2 = rands(outputNum,1);
% 學習率
yita = 0.1;
%% 網絡的訓練
for r = 1:30
E(r) = 0;% 統計誤差
for m = 1:1600
% 信息的正向流動
x = trainInput(:,m);
% 隱含層的輸出
for j = 1:hiddenNum
hidden(j,:) = w1(:,j)'*x+b1(j,:);
hiddenOutput(j,:) = g(hidden(j,:));
end
% 輸出層的輸出
outputOutput = w2'*hiddenOutput+b2;
% 計算誤差
e = trainOutput(m,:)'-outputOutput;
E(r) = E(r) + sum(abs(e));
% 改動權重和偏置
% 隱含層到輸出層的權重和偏置調整
dw2 = hiddenOutput*e';
db2 = e;
% 輸入層到隱含層的權重和偏置調整
for j = 1:hiddenNum
partOne(j) = hiddenOutput(j)*(1-hiddenOutput(j));
partTwo(j) = w2(j,:)*e;
end
for i = 1:inputNum
for j = 1:hiddenNum
dw1(i,j) = partOne(j)*x(i,:)*partTwo(j);
db1(j,:) = partOne(j)*partTwo(j);
end
end
w1 = w1 + yita*dw1;
w2 = w2 + yita*dw2;
b1 = b1 + yita*db1;
b2 = b2 + yita*db2;
end
end
%% 語音特征信號分類
testInput=mapminmax('apply',testCharacter',inputps);
for m = 1:400
for j = 1:hiddenNum
hiddenTest(j,:) = w1(:,j)'*testInput(:,m)+b1(j,:);
hiddenTestOutput(j,:) = g(hiddenTest(j,:));
end
outputOfTest(:,m) = w2'*hiddenTestOutput+b2;
end
%% 結果分析
%根據網絡輸出找出數據屬於哪類
for m=1:400
output_fore(m)=find(outputOfTest(:,m)==max(outputOfTest(:,m)));
end
%BP網絡預測誤差
error=output_fore-output1(n(1601:2000))';
k=zeros(1,4);
%找出推斷錯誤的分類屬於哪一類
for i=1:400
if error(i)~=0
[b,c]=max(testOutput(i,:));
switch c
case 1
k(1)=k(1)+1;
case 2
k(2)=k(2)+1;
case 3
k(3)=k(3)+1;
case 4
k(4)=k(4)+1;
end
end
end
%找出每類的個體和
kk=zeros(1,4);
for i=1:400
[b,c]=max(testOutput(i,:));
switch c
case 1
kk(1)=kk(1)+1;
case 2
kk(2)=kk(2)+1;
case 3
kk(3)=kk(3)+1;
case 4
kk(4)=kk(4)+1;
end
end
%正確率
rightridio=(kk-k)./kk
激活函數
%% 激活函數
function [ y ] = g( x )
y = 1./(1+exp(-x));
end
