一、BP网络简介
反向传播网络(Back-Propagation Network,简称BP网络)是将W-H学习规则一般化,对非线性可微分函数进行权值训练的多层网络。其中,权值的调整采用反向传播(Back-propagation)的学习算法。它是一种多层前向反馈神经网络,其神经元的变换函数是S型函数。BP网络输出量为0到1之间的连续量,可实现从输入到输出的任意的非线性映射。
BP网络主要用于下述方面:
1、函数逼近:用输入矢量和相应的输出矢量训练一个网络逼近一个函数;
2、模式识别和分类:用一个特定的输出矢量将它与输入矢量联系起来;把输入矢量以所定义的合适方式进行分类;
3、数据压缩:减少输出矢量维数以便于传输或存储。
BP网络具有一层或多层隐含层,其激活函数必须是处处可微的,因此BP网络经常使用的是S型的对数或正切激活函数和线性函数。
BP网络特点有以下几点:
1、输入和输出是并行的模拟量;
2、网络的输入输出关系是各层连接的权因子决定,没有固定的算法;
3、权因子通过学习信号调节,学习越多,网络越聪明;
4、隐含层越多,网络输出精度越高,且个别权因子的损坏不会对网络输出产生大的影响;
5、只有当希望对网络的输出进行限制,如限制在0和1之间,那么在输出层应当包含S型激活函数;
6、在一般情况下,均是在隐含层采用S型激活函数,而输出层采用线性激活函数。
BP算法由两部分组成,信息的正向传递与误差的反向传播:
1、正向传播过程中,输入信息从输入层经隐含层逐层计算传向输出层,每一层神经元的状态只影响下一层神经元的状态;
2、如果在输出层未得到期望的输出,则计算输出层的误差变化值,然后转向反向传播,通过网络将误差信号沿原来的连接通路反传回来修改各层神经元的权值直至达到期望目标。
二、利用BP网络做正弦函数逼近
已经证明,两层S型线性网络,如果S型层有足够的神经元,则能够训练出任意输入和输出之间的有理函数关系。
本文设计了一个含有3个神经元的两层S型线性网络,对g(p)=1+sin(Π/4*p)的正弦函数进行逼近,并在Matlab中实现(没有调用Matlab已有的函数),代码如下:
clear;
i = 4;
s = 3; %神经元个数
maxEpoch = 100000; %最大训练次数
errGoal = 0.001; %期望误差最小值
alpha = 0.1; %学习效率
p = -2 : 0.1 : 2;
t = 1 + sin(i * pi * 0.25 * p);
[m,n] = size(p);
w1 = rand(s,m);
b1 = rand(s,1);
w2 = rand(1,s);
b2 = rand(1,1);
count = 0;
while(count < maxEpoch)
modNum = mod(count, n) + 1;
if(modNum == 1)
sse = 0;
end
%正向传播,计算网络输出
a0 = p(:,modNum);
a1 = logsig(w1 * a0 + b1);
a2 = w2 * a1 + b2;
%计算误差平方和
e = t(modNum) - a2;
sse = sse + abs(e)^2;
if(modNum == n & sse < errGoal)
break;
end
%反向传播,计算敏感性
s2 = -2 * e;
s1 = diag((1-a1).*a1) * (w2)' * s2;
%更新权值矩阵及阈值
w2 = w2 - alpha * s2 * (a1)';
b2 = b2 - alpha * s2;
w1 = w1 - alpha * s1 * (a0)';
b1 = b1 - alpha * s1;
count = count + 1;
end
%图表输出
x = -2 : 0.1 : 2;
f=[];
y = 1 + sin(i * pi * 0.25 * x);
figure,plot(x,y,'k-')
for i = -2 : 0.1 : 2
f=[f,w2 * logsig(w1 * i + b1) + b2];
end
hold on
plot(x,f,'b-')
利用BP网络做函数逼近只是对BP算法有了一个大概的了解,希望把其运用到数字识别中,可以有效的提高数字识别的准确度。今天在LMS算法识别数字中,加入了20组含有随机噪声的样本后,识别效果稍有改善,所以有些期待BP算法的效果。
Resources & Reference:
1、何建华-神经网络讲义-part4-BP网络.ppt
2、Backpropagation.pdf



