BP神经网络结构框图
函数信号正向传播:输入——隐层——输出,最终得到估算出来的误差
误差信号反向调整:输出——隐层——输入,通过代价函数J(误差的平方和),采用梯度下降法对于权值进行逐一调整
隐层输入in=输入层输入X*输入与隐层间的权值W1-阈值theta
隐层输出out=f(隐层输入),其中f为sigmoid函数=(1/(1+exp(-β*in)))
输出层y=w2*out
例题:
训练样本:
input=[0,0.1,0.2,0.3,0.4]
output=[4,2,2,2,2]
clear all;
close all;
%训练样本
NUM=5;
input=[0,0.1,0.2,0.3,0.4];%输入
output=[4,2,2,2,2];%期望输出
w1=rand(1,5);
w2=rand(1,5);
theta=rand(1,5);
beta=rand(1,5);
learn_rate1=0.0015;
learn_rate2=0.0015;
learn_rate3=0.0015;
learn_rate4=0.0015;
j=[];
for k=1:200000
%清空输出存储值
for i=1:NUM
yout(i)=0;%网络输出
end
%正向传播
for i=1:NUM
z(i)=w1(i)*input(i)-theta(i);%隐层输入
fz(i)=1/(1+exp(-beta(i)*z(i)));%隐层输出
yout(i)=w2(i)*fz(i);%输出层输出
end
for i=1:NUM
error(i)=0;%清空误差
end
for i=1:NUM
error(i)=output(i)-yout(i);%计算误差=样本值-网络输出值
end
J=0;
for i=1:NUM
J=J+error(i)^2/2;%计算目标函数
end
j(end+1)=J;
if J<0.001
break;
end
%反向调整
%目标函数对w2求偏导
for i=1:NUM
J_w2(i)=-error(i)*fz(i);
end
%目标函数对w1求偏导
for i=1:NUM
J_w1(i)=-error(i)*w2(i)*beta(i)*exp(-beta(i)*z(i))*fz(i)^2*input(i);
end
%目标函数对beta求偏导
for i=1:NUM
J_beta(i)=-error(i)*w2(i)*z(i)*exp(-beta(i)*z(i))*fz(i)^2;
end
%目标函数对theta求偏导
for i=1:NUM
J_theta(i)=error(i)*w2(i)*beta(i)*exp(-beta(i)*z(i))*fz(i)^2;
end
%参数调整
for i=1:NUM
w1(i)=w1(i)-learn_rate1*J_w1(i);%逐一调整参数
w2(i)=w2(i)-learn_rate2*J_w2(i);
beta(i)=beta(i)-learn_rate3*J_beta(i);
theta(i)=theta(i)-learn_rate4*J_theta(i);
end
end
% times
figure(1) ;
hold on;
plot(input,yout,'b');
plot(input,output,'r');
figure(2);
plot((1:k),j,'b');