计算机科学与技术学院计算智能BP神经网络分类学号:S316067050专业:软件工程学生姓名:左权任课教师:钱真2016年10月BP神经网络分类一、技术论述1.神经网络简述神经网络是一种可以适应复杂模型的非常灵活的启发式的统计模式识别技术。而反向传播算法是多层神经网络有监督训练中最简单也最一般的方法之一,它是线性LMS算法的自然延伸。网络基本的学习方法是从一个未训练网络开始,向输入层提供一个训练模式,再通过网络传递信号,并决定输出层的输出值。此处的这些输出都与目标值进行比较;任一差值对应一误差。该误差或准则函数是权值的某种标量函数,它在网络输出与期望输出匹配时达到最小。权值向着减小误差值的方向调整。一个BP神经网络的基本结构如下图所示,图中Wji,Wkj是需要学习的权值矩阵:2.三层BP神经网络一个三层神经网络是由一个输入层、一个隐含层和一个输出层组成,他们由可修正的权值互连。在这基础上构建的3-3-1神经网络,是由三个输入层、三个隐含层和一个输出层组成。隐含层单元对它的各个输入进行加权求和运算而形成标量的“净激活”。也就是说,净激活是输入信号与隐含层权值的内积。通常可把净激活写成:其中x为增广输入特征向量(附加一个特征值x0=1),w为权向量(附加一个值W0)。由上面的图可知,这里的下标i是输入层单元的索引值,j是隐含层单元的索引。Wji表示输入层单元i到隐含层单元j的权值。为了跟神经生物学作类比,这种权或连接被称为“突触”,连接的值叫“突触权”。每一个隐含层单元激发出一个输出分量,这个分量是净激活net的非线性函数f(net),即:这里需要重点认识激活函数的作用。激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数:(a)线性函数(LinerFunction)(b)阈值函数(ThresholdFunction)以上激活函数都属于线性函数,下面是两个常用的非线性激活函数:(c)S形函数(SigmoidFunction)(d)双极S形函数S形函数与双极S形函数的图像如下:由于S形函数与双极S形函数都是可导的,因此适合用在BP神经网络中。(BP算法要求激活函数可导)介绍完激活函数,类似的,每个输出单元在隐含层单元信号的基础上,使用类似的方法就可以算出它的净激活如下:同理,这里的下标k是输出层单元的索引值,nH表示隐含层单元的数目,这里把偏置单元等价于一个输入恒为y0=1的隐含层单元。将输出单元记为zk,这样输出单元对net的非线性函数写为:综合以上公式,显然输出zk可以看成是输入特征向量x的函数。当有c个输出单元时,可以这样来考虑此网络:计算c个判别函数,并通过使判别函数最大来将输入信号分类。在只有两种类别的情况下,一般只采用单个输出单元,而用输出值z的符号来标识一个输入模式。3.网络学习反向传播算法(BP算法)由两部分组成:信息的正向传递与误差的反向传播。在正向传播过程中,输入信息从输入经隐含层逐层计算传向输出层,第一层神经元的状态只影响下一层神经元的状态。如果输出层没有得到期望的输出,则计算输出层的误差变化值,然后转向反向传播,通过网络将误差信号沿原来的连接通路反传回来修改各层神经元的权值直至达到期望目标。神经网络的学习方法正是依赖以上两个步骤,对于单个模式的学习规则,考虑一个模式的训练误差,先定义为输出端的期望输出值tk(由教师信号给出)和实际输出值zk的差的平方和:定义目标函数:其中t和z是长度为c的目标向量和网络输出向量;w表示神经网络里的所有权值。反向传播算法学习规则是基于梯度下降算法的。权值首先被初始化为随机值,然后向误差减小的方向调整:其中η是学习率,表示权值的相对变化尺度。反向传播算法在第m次迭代时的权向量更新公式可写为:其中m是特定模式的索引。由于误差并不是明显决定于Wjk,这里需要使用链式微分法则:其中单元k的敏感度定义为:又有:综上所述,隐含层到输出层的权值更新为:输入层到隐含层的权值学习规则更微妙。再运用链式法则计算:其中:可以用上式来定义隐单元的敏感度:因此,输入层到隐含层的权值的学习规则就是:4.训练协议反向传播的随机协议和成批协议如下步骤所示:在成批训练中,所有的训练模式都先提供一次,然后将对应的权值更新相加,只有这时网络里的实际权值才开始更新。这个过程将一直迭代知道某停止准则满足。二、自编函数实现BP网络以下简单编写了一个3-3-1三层BP神经网络的构建与两种训练方法(写得比较杂乱),以下是基本步骤:1.构造3-3-1型的sigmoid网络,用以下表格中的w1和w2类的数据进行训练,并对新模式进行分类。利用随机反向传播(算法1),学习率η=0.1,以及sigmoid函数,其中a=1.716,b=2/3,作为其隐单元和输出单元的激活函数。2.构造三层神经网络,参数包括:输入层、中间层、输出层神经元向量,以及输入层到中间层的权值矩阵,中间层到输出层的权值矩阵,中间层神经元的偏置向量,输出层神经元的偏置向量等。其实质是定义上述变量的一维和二维数组。3.编写函数[net_j,net_k,y,z]=BackPropagation(x,Wxy,Wyz,Wyb,Wzb),实现BP网络的前馈输出。为了便于后续的学习算法的实现,该函数的输出变量包含:第j个隐单元对各输入的净激活net_j;第k个输出单元对各输入的净激活net_k;网络中隐藏层的输出y和输出单元的输出向量z。4.编写函数,实现BP网络的权值修正。其中,神经元函数,及其导数可参考:神经元函数:神经元函数导数:5.编写函数[NewWxy,NewWyz,NewWyb,NewWzb,J]=train(x,t,Wxy,Wyz,Wyb,Wzb),实现算法1和2所述的BP网络的训练算法,输出各权向量的变化量和当前目标函数值J。%函数:计算人工神经网络的各级输出%输入参数:%x:输入层神经元向量(3维)%Wxy:随机生成的从输入层到隐含层的权值矩阵%Wyz:随机生成的从隐含层到输出层的权值矩阵%Wyb:权值偏置向量%Wzb:权值偏置向量%内部变量与公式:%f(net)=a*tanh(b*net):Sigmoid激活函数%a:Sigmoid激活函数的参数%b:Sigmoid激活函数的参数%输出参数:%net_j:第j个隐单元对各输入的净激活%net_k:第k个输出单元对各输入的净激活%y:隐含层的输出向量%z:输出单元的输出向量function[net_j,net_k,y,z]=BackPropagation(x,Wxy,Wyz,Wyb,Wzb)%Sigmoid激活函数的参数a=1.716;b=2/3;net_j=Wxy*x'+Wyb;y=3.432./(1+exp(-1.333*net_j))-1.716;%a*tanh(b*net_j);%隐含层的输出net_k=Wyz'*y+Wzb;z=3.432./(1+exp(-1.333*net_k))-1.716;%a*tanh(b*net_k);%输出层结果%人工神经网络训练函数%输入参数:%x:输入层神经元向量(3维)%t:教师向量%Wxy:随机生成的从输入层到隐含层的权值矩阵%Wyz:随机生成的从隐含层到输出层的权值矩阵%Wyb:权值偏置向量%Wzb:权值偏置向量%内部变量与公式:%Error_xy:隐藏层反传回输入层的误差%Error_yz:输出层反传回隐藏层的误差%输出参数:%NewWxy:更新后的从输入层到隐含层的权值矩阵%NewWyz:更新后的从隐含层到输出层的权值矩阵%NewWyb:更新后的权值偏置向量%NewWzb:更新后的权值偏置向量function[NewWxy,NewWyz,NewWyb,NewWzb,J]=train(x,t,Wxy,Wyz,Wyb,Wzb)%基本参数设定Eta=0.01;%学习因子%Sigmoid激活函数的参数a=1.716;b=2/3;%计算训练样本经过神经网络后的输出[net_j,net_k,y,z]=BackPropagation(x,Wxy,Wyz,Wyb,Wzb);%计算当前目标函数值J=power(norm((t-z),2),2)/2;%计算输出层反传回隐藏层的敏感度Error_yz=(t-z).*(a*b-b/a*z.*z);%zz%计算隐藏层反传回输入层的敏感度Error_xy=Wyz*Error_yz.*(a*b-b/a*y.*y);%计算输出层到隐藏层的权值更新量delta_Wyz=Eta*y*Error_yz';%计算隐藏层到输入层的权值更新量delta_Wxy=Eta*Error_xy*x;%更新权值NewWxy=Wxy+delta_Wxy;NewWyz=Wyz+delta_Wyz;NewWyb=Wyb+Eta*Error_xy;NewWzb=Wzb+Eta*Error_yz;function[delta_Wxy,delta_Wyz,Error_xy,Error_yz,J]=BatchTrain(x,t,Wxy,Wyz,Wyb,Wzb)%基本参数设定Eta=0.01;%学习因子%Sigmoid激活函数的参数a=1.716;b=2/3;%计算训练样本经过神经网络后的输出[net_j,net_k,y,z]=BackPropagation(x,Wxy,Wyz,Wyb,Wzb);%计算当前目标函数值J=1/2*power(norm(t-z),2);%计算输出层反传回隐藏层的误差Error_yz=(t-z).*(a*b-b/a*z.*z);%计算隐藏层反传回输入层的误差Error_xy=Wyz*Error_yz.*(a*b-b/a*y.*y);%计算输出层到隐藏层的权值更新量delta_Wyz=Eta*Error_yz*y';%计算隐藏层到输入层的权值更新量delta_Wxy=Eta*Error_xy*x;%clearall;%closeall;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%BP神经网络实验%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear;closeall;%训练样本(3类)w1=[1.582.32-5.8;...0.671.58-4.78;...1.041.01-3.63;...-1.492.18-0.39;...-0.411.21-4.73;...1.393.162.87;...1.201.40-1.89;...-0.921.44-3.22;...0.451.33-4.38;...-0.760.84-1.96];w2=[0.210.03-2.21;...0.370.28-1.8;...0.181.220.16;...-0.240.93-1.01;...-1.180.39-0.39;...0.740.96-1.16;...-0.381.94-0.48;...0.020.72-0.17;...0.441.31-0.14;...0.461.490.68];w3=[-1.541.170.64;...5.413.45-1.33;...1.550.992.69;...1.863.191.51;...1.681.79-0.87;...3.51-0.22-1.39;...1.40-0.440.92;...0.440.831.97;...0.250.68-0.99;...-0.66-0.450.08];%初始化权值(随机初始化)Wxy=rand(3,3)*2-1;Wyz=rand(3,1)*2-1;Wyb=rand(3,1)*2-1;Wzb=rand()*2-1;w=[w1;w2];T=[1111111111-1-1-1-1-1-1-1-1-1-1];%教师向量%以下是随机反向传播算法delta_J=0.001;time=1;J(time)=2*delta_J;%只是让迭代开始,没什么作用detJ=2*delta_J;whiletime10000%detJdelta_Jnum=ceil(rand(1)*20);%选择产生一个1到20之间的随