1.BP神經網絡訓練過程論述
BP網絡結構有3層:輸入層、隱含層、輸出層,如圖1所示。
圖1 三層BP網絡結構
3層BP神經網絡學習訓練過程主要由4部分組成:輸入模式順傳播(輸入模式由輸入層經隱含層向輸出層傳播計算)、輸出誤差逆傳播(輸出的誤差由輸出層經隱含層傳向輸入層)、循環記憶訓練(模式順序傳播與誤差逆傳播的計算過程反復交替循環進行)和學習結果判別(判定全局誤差是否趨向極小值)。
下面具體介紹和分析用梯度下降法訓練BP神經網絡,在第1次輸入樣品(1=1,2,……,N)進行訓練時各個
參數的表達及計算方法。
(1)確定參數。
- 輸入向量為X=[x1,x2,…,xn]T(n—輸入層單元個數);
- 輸出向量Y=[y1,y2,…,yq]T(q—輸出層單元個數);
- 希望輸出向量O=[o1,o2,…,oq]T;
- 隱含層輸出向量B=[b1,b2,…,bp]T(p—隱含層單元個數);
- 初始化輸入層至隱含層的連接權值Wj=[wj1,wj2,…,wjt,…,wjn]T,j=1,2,…,p;
- 初始化隱含層至輸出層的連接權值Wk=[wk1,wk2,…,wkj,…,wkp]T,k=1,2,…,q。
(2)輸入模式順序傳播。
這一過程主要是利用輸入模式求出它對應的實際輸出。
- 激活函數用S型函數,即:
這里之所以選S型函數為BP神經網絡神經元的激活函數,是因為它是連續可微分的,而且更接近於生物神經元的信號輸出形式。
- 計算隱含層j單元的輸出值:
閾值在學習過程中和權值一樣不斷被修改,閾值的作用反應在函數的輸出曲線上,
圖3 閾值的作用
由圖可見閾值的作用相當於輸出值移了個單位。同理可求出輸出端的激活值和輸出值。
(3)輸出誤差的傳播。
在第(2)步的模式順傳播計算中得到網絡的實際輸出值,當這些實際的輸出值與希望的輸出值不一樣時或者說誤差大於所限定的數值時,就要對網絡進行校正。
①輸出層的校正誤差為:
②隱含層各單元的校正誤差為:
③對於輸出層至隱含層連接權和輸出層閾值的校正量為:
α為學習系數,α>0。
④隱含層至輸入層的校正量為:
(4)循環記憶訓練。對於BP神經網絡輸入的每一組訓練模式,一般都要經過數百次甚至上萬次的循環記憶訓練,才能使網絡記住這一模式。這種循環記憶訓練實際上就是反復重復上面介紹的輸入模式。
(5)學習結果的判別。判別的目的主要是檢查輸出誤差是否已經小到可以允許的程度。學習或者說訓練的過程是網絡全局誤差趨向於極小值的過程。
2.BP神經網絡分類器設計
任務一:2bit異或問題,輸入及其對應的輸出
input=[0 0 ;
0 1;
1 0;
1 1];
output=[0;1;1;0];
2個輸入神經元,2個隱含層神經元,1個輸出層神經元,MATLAB代碼如下:
% % % % % % % % % % % % % % %
% name:bpnet1.m
% function:solve 2bit XOR Problem with a Neural bpnetwork
% input:no
% return:no
% programer:LI Xin
% % % % % % % % % % % % % % %
clear;clc;close all;
sigma=0.01;%精度控制參數
alpha=0.8;%學習率
M=10000;%循環的最大次數
in_num=2; %輸入節點個數
mid_num=2;%隱含層神經元個數
out_num=1;%輸出層神經元個數
input=[0 0 ;
0 1;
1 0;
1 1];
output=[0;1;1;0];
hide_s=zeros(1,mid_num);%隱含層的激活值
hide_o=zeros(1,mid_num);%隱含層的輸出值
delta_h=zeros(1,mid_num);%隱含層各聯結權的修改量組成的向量
sita_h = rand(1,mid_num) ;%隱含層的閾值
sita_o=rand(1,out_num) ;%輸出層閾值
output_o=zeros(1,out_num);%輸出層的輸出值
output_s=zeros(1,out_num);%輸出層的激活值
delta_o=zeros(1,out_num); %輸出層各聯結權的修改量組成的向量
T=4;%樣本個數
w=rand(in_num,mid_num,'double');%初始化輸入層到隱含層連接權值
v=rand(mid_num,out_num,'double'); %初始化隱含層到輸出層連接權值
E = sigma + 1;
N = 0;
while((E>sigma)&&(N<M))
N=N+1;
for t=1:T
for i=1:mid_num
hide_s(i)=0;
for j=1:in_num
hide_s(i)=hide_s(i)+w(j,i)*input(t,j);
end
hide_s(i)=hide_s(i)-sita_h(i); % 計算隱含層各神經元的激活值hide_s
hide_o(i)=1.0/(1.0+exp(-hide_s(i))); %隱含層神經元的輸出值
end
for i=1:out_num
output_s(i)=0;
for j=1:mid_num
output_s(i)=output_s(i)+v(j,i)*hide_o(j);
end
output_s(i)=output_s(i)-sita_o(i); %計算輸出層各神經元的激活值output_s
output_o(i)=1.0/(1.0+exp(-output_s(i))); % 輸出層神經元的輸出值
end
for i=1:out_num
delta_o(i)=output_o(i) * ( 1 - output_o(i) ) * ( output(t,i) - output_o(i) );
%輸出層的校正誤差delta_o=(o-y)y(1-y)
sita_o(i)=sita_o(i)-alpha*delta_o(i); %輸出層閾值校正量
end
for i=1: mid_num
Z = 0;
for j=1:out_num
Z = Z+v(i,j) * delta_o(j);
end
delta_h(i) = Z * hide_o(i) * ( 1 - hide_o(i) ); %隱含層的校正誤差
sita_h(i) = sita_h(i)-alpha * delta_h(i); %隱含層閾值校正量
end
for i=1: mid_num
for j=1:out_num
v(i,j) = v(i,j) +alpha * hide_o(i) * delta_o(j); %輸出層至隱含層權值校正
end
end
for i=1:in_num
for j=1: mid_num
w(i,j) = w(i,j)+alpha * input(t,i) * delta_h(j); %隱含層至輸入層權值的校正
end
end
end
E=0;
for t=1:T
for i=1:mid_num
hide_s(i) = 0;
for j=1:in_num
hide_s(i) = hide_s(i)+w(j,i) * input(t,j);
end
hide_s(i) = hide_s(i)-sita_h(i); %計算隱含層各神經元的激活值hide_s
hide_o(i) = 1.0 / ( 1.0 + exp(-hide_s(i)) ); %隱含層神經元的輸出值
end
for i=1: out_num
output_s(i) = 0;
for j=1:mid_num
output_s(i) = output_s(i)+v(j,i) * hide_o(j);
end
output_s(i) = output_s(i)-sita_o(i); %計算輸出層各神經元的激活值output_s
output_o(i) = 1.0 / ( 1.0 + exp(-output_s(i)) ); %輸出層神經元的輸出值
end
error = 0;
for i=1:out_num
error = error +( output_o(i) - output(t,i)) * ( output_o(i) - output(t,i) );
end
E = E +error / 2;
end
end
str=sprintf('網絡學習%d次結束,誤差為:%d,各層權值如下:',N,E);
disp(str)
disp('輸入層到隱藏層權值:');
for i=1:in_num
for j=1:mid_num
str=sprintf('w[%d,%d]=%d',i,j,w(i,j)) ;
disp(str)
end
end
disp('隱藏層到輸出層權值:');
for i=1:mid_num
for j=1:out_num
str=sprintf('v[%d,%d]=%d',i,j,v(i,j));
disp(str)
end
end
disp('對應着樣本實際輸出為:')
for t=1: T
str=sprintf('第%d個樣本',t);
disp(str)
for i=1:mid_num
hide_s(i) = 0;
for j=1:in_num
hide_s(i) = hide_s(i)+w(j,i) * input(t,j);
end
hide_s(i) = hide_s(i)-sita_h(i); %計算隱含層各神經元的激活值hide_s
hide_o(i) = 1.0 / ( 1.0 + exp(-hide_s(i)) ); %隱含層神經元的輸出值
end
for i=1: out_num
output_s(i) = 0;
for j=1:mid_num
output_s(i) = output_s(i)+v(j,i) * hide_o(j);
end
output_s(i) = output_s(i)-sita_o(i); %計算輸出層各神經元的激活值output_s
output_o(i) = 1.0 / ( 1.0 + exp(-output_s(i)) ); %輸出層神經元的輸出值
end
disp('輸入樣本')
disp(input(t,:))
disp('輸出樣本')
disp(output_o)
end
任務二:識別問題,輸入輸出如下:
input=[0 0 0 0 0 0 0 1;
0 0 0 0 0 0 1 0 ;
0 0 0 0 0 1 0 0 ;
0 0 0 0 1 0 0 0 ;
0 0 0 1 0 0 0 0 ;
0 0 1 0 0 0 0 0 ;
0 1 0 0 0 0 0 0 ;
1 0 0 0 0 0 0 0 ];
output=[0 0 0 0 0 0 0 1;
0 0 0 0 0 0 1 0 ;
0 0 0 0 0 1 0 0 ;
0 0 0 0 1 0 0 0 ;
0 0 0 1 0 0 0 0 ;
0 0 1 0 0 0 0 0 ;
0 1 0 0 0 0 0 0 ;
1 0 0 0 0 0 0 0 ];
8個輸入神經元,3個隱含層神經元,8個輸出層神經元,詳細代碼與任務一差別不大,在此不再贅述,詳見附件bpnet2.m
3.實驗過程
對於任務一的異或問題,令學習率為0.8,迭代次數上限10000次,精度0.01,寫好代碼后運行結果如下:
網絡學習2054次結束,誤差為:9.987865e-03,各層權值如下:
輸入層到隱藏層權值:
w[1,1]=-4.319853e+00
w[1,2]=-6.118312e+00
w[2,1]=4.479814e+00
w[2,2]=5.661403e+00
隱藏層到輸出層權值:
v[1,1]=-6.512379e+00
v[2,1]=6.853598e+00
對應着樣本實際輸出為:
第1個樣本
輸入樣本
0 0
輸出樣本
0.0724
第2個樣本
輸入樣本
0 1
輸出樣本
0.9411
第3個樣本
輸入樣本
1 0
輸出樣本
0.9128
第4個樣本
輸入樣本
1 1
輸出樣本
0.0605
可見其學習后的輸出和期望輸出差距不大。
對於任務二的識別問題,令學習率為0.8,迭代次數上限10000次,精度0.01,寫好代碼后運行結果如下:
網絡學習5786次結束,誤差為:9.998725e-03,各層權值如下:
輸入層到隱含層權值:
w[1,1]=-3.179389e+00
w[1,2]=4.680957e+00
w[1,3]=-2.814682e+00
w[2,1]=5.307254e+00
w[2,2]=3.485574e+00
w[2,3]=5.443434e+00
w[3,1]=-5.120963e+00
w[3,2]=-3.003381e+00
w[3,3]=-2.533489e-01
w[4,1]=1.072151e-01
w[4,2]=-4.017080e+00
w[4,3]=5.120281e+00
w[5,1]=5.281661e+00
w[5,2]=-4.188798e+00
w[5,3]=1.327247e-01
w[6,1]=-4.166501e+00
w[6,2]=3.666821e+00
w[6,3]=4.480010e+00
w[7,1]=4.666180e+00
w[7,2]=4.637388e+00
w[7,3]=-2.178645e+00
w[8,1]=3.595688e-01
w[8,2]=-1.660022e+00
w[8,3]=-5.989204e+00
隱藏層到輸出層權值:
v[1,1]=-7.888675e+00
v[1,2]=7.121264e+00
v[1,3]=-1.422755e+01
v[1,4]=-1.645257e+00
v[1,5]=1.155231e+01
v[1,6]=-8.289016e+00
v[1,7]=8.183556e+00
v[1,8]=1.246045e+00
v[2,1]=6.724860e+00
v[2,2]=3.464005e+00
v[2,3]=-8.313719e+00
v[2,4]=-8.505718e+00
v[2,5]=-8.905993e+00
v[2,6]=4.500327e+00
v[2,7]=5.055143e+00
v[2,8]=-7.146627e+00
v[3,1]=-8.436705e+00
v[3,2]=7.793561e+00
v[3,3]=-2.065419e+00
v[3,4]=1.213004e+01
v[3,5]=-6.566507e-01
v[3,6]=7.878356e+00
v[3,7]=-8.415250e+00
v[3,8]=-1.719139e+01
對應着樣本實際輸出為:
第1個樣本
輸入樣本
0 0 0 0 0 0 0 1
輸出樣本
Columns 1 through 7
0.0056 0.0000 0.0275 0.0001 0.0319 0.0000 0.0151
Column 8
0.9546
第2個樣本
輸入樣本
0 0 0 0 0 0 1 0
輸出樣本
Columns 1 through 7
0.0154 0.0232 0.0000 0.0000 0.0055 0.0000 0.9731
Column 8
0.0207
第3個樣本
輸入樣本
0 0 0 0 0 1 0 0
輸出樣本
Columns 1 through 7
0.0150 0.0234 0.0028 0.0144 0.0000 0.9735 0.0000
Column 8
0.0000
第4個樣本
輸入樣本
0 0 0 0 1 0 0 0
輸出樣本
Columns 1 through 7
0.0000 0.0188 0.0000 0.0225 0.9645 0.0000 0.0094
Column 8
0.0229
第5個樣本
輸入樣本
0 0 0 1 0 0 0 0
輸出樣本
Columns 1 through 7
0.0000 0.0163 0.0236 0.9647 0.0238 0.0178 0.0000
Column 8
0.0000
第6個樣本
輸入樣本
0 0 1 0 0 0 0 0
輸出樣本
Columns 1 through 7
0.0046 0.0000 0.9598 0.0287 0.0003 0.0054 0.0000
Column 8
0.0280
第7個樣本
輸入樣本
0 1 0 0 0 0 0 0
輸出樣本
Columns 1 through 7
0.0000 0.9647 0.0000 0.0034 0.0040 0.0110 0.0159
Column 8
0.0000
第8個樣本
輸入樣本
1 0 0 0 0 0 0 0
輸出樣本
Columns 1 through 7
0.9768 0.0000 0.0130 0.0000 0.0000 0.0210 0.0191
Column 8
0.0122
4.實驗總結
可見本次實驗較好的完成了bp神經網絡的建模,在學習率和誤差精度上都達到了要求,通過這次實驗深入的理解了神經網絡的結構和各參數之間的作用,為以后的科研學習打下了一定基礎,對於第二個任務要比第一個任務計算耗時大很多,可見bp神經網絡是收斂速度比較慢。