为了方便推导,利用此网络进行BP网络的推导。
STEP 1
输入层到隐含层:
神经元h1的输出o1:(此处用到激活函数): ,
隐含层到输出层:
SETP 2
计算总误差
(累加,这里只计算一个输出)
隐含层到输出层的权值更新:
其中
利用
激活函数求导可得
*outh1
令 =
=
*
更新权值
=
隐含层到隐含层的权值更新:
更新权值
重复以上过程,可设置迭代次数,直至满足误差要求
matlab code:
clear all
clc
close all
i1=0.05; i2=0.10;
o1=0.01; o2=0.99;
w1=0.15; w2=0.20;w3=0.25; w4=0.30; b1=0.35;
w5=0.40; w6=0.45;w7=0.50; w8=0.55; b2=0.6;
% alpha=38.9
% epoch=6000;
alpha=0.5
epoch=1000;
for k=1:epoch
%forward:hidden layers
net_h1=w1*i1+w2*i2+b1*1;
out_h1=1/(1+exp(-net_h1));
net_h2=w3*i1+w4*i2+b1*1;
out_h2=1/(1+exp(-net_h2));
%forward:outputlayer
net_o1=w5*out_h1+w6*out_h2+b2*1;
net_o2=w7*out_h1+w8*out_h2+b2*1;
out_o1=1/(1+exp(-net_o1));
out_o2=1/(1+exp(-net_o2));
% cost function
E_total(k)=((out_o1-o1)^2+(out_o2-o2)^2)/2;
% backward:output layer
dE_dw5=-(o1-out_o1)*out_o1*(1-out_o1)*out_h1;
dE_dw6=-(o1-out_o1)*out_o1*(1-out_o1)*out_h2;
dE_dw7=-(o2-out_o2)*out_o2*(1-out_o2)*out_h1;
dE_dw8=-(o2-out_o2)*out_o2*(1-out_o2)*out_h2;
% backward:hidden layer
dE_douto1=-(o1-out_o1);
douto1_dneto1=out_o1*(1-out_o1);
%dEo1_douth1=-(o1-out_o1)*out_o1*(1-out_o1)
dEo1_dneto1=dE_douto1*douto1_dneto1;
dEo1_douth1=dEo1_dneto1*w5;
dEo1_douth2=dEo1_dneto1*w6;
dE_douto2=-(o2-out_o2);
douto2_dneto2=out_o2*(1-out_o2);
%dEo1_douth1=-(o1-out_o1)*out_o1*(1-out_o1)
dEo2_dneto2=dE_douto2*douto2_dneto2;
dEo2_douth1=dEo2_dneto2*w7;
dEo2_douth2=dEo2_dneto2*w8;
dE_dw1=(dEo1_douth1+dEo2_douth1)*out_h1*(1-out_h1)*i1;
dE_dw2=(dEo1_douth1+dEo2_douth1)*out_h1*(1-out_h1)*i2;
dE_dw3=(dEo1_douth2+dEo2_douth2)*out_h2*(1-out_h2)*i1;
dE_dw4=(dEo1_douth2+dEo2_douth2)*out_h2*(1-out_h2)*i2;
w1=w1-alpha*dE_dw1;
w2=w2-alpha*dE_dw2;
w3=w3-alpha*dE_dw3;
w4=w4-alpha*dE_dw4;
w5=w5-alpha*dE_dw5;
w6=w6-alpha*dE_dw6;
w7=w7-alpha*dE_dw7;
w8=w8-alpha*dE_dw8;
end
v_E_total_k=E_total(k)
plot(E_total)