人工神经网络及其应用实例人工神经网络是在现代神经科学研究成果基础上提出的一种抽象数学模型,它以某种简化、抽象和模拟的方式,反映了大脑功能的若干基本特征,但并非其逼真的描写。人工神经网络可概括定义为:由大量简单元件广泛互连而成的复杂网络系统。所谓简单元件,即人工神经元,是指它可用电子元件、光学元件等模拟,仅起简单的输入输出变换y(x)的作用。下图是3中常用的元件类型:线性元件:y0.3x,可用线性代数法分析,但是功能有限,现在已不太常用。21.510.50-0.5-1-1.5-2-6-4-20246连续型非线性元件:ytanh(x),便于解析性计算及器件模拟,是当前研究的主要元件之一。Page1of25离散型非线性元件:y21.510.50-0.5-1-1.5-2-6-4-202461,x01,x0,便于理论分析及阈值逻辑器件实现,也是当前研究的主要元件之一。21.510.50-0.5-1-1.5-2-6-4-20246Page2of25每一神经元有许多输入、输出键,各神经元之间以连接键(又称突触)相连,它决定神经元之间的连接强度(突触强度)和性质(兴奋或抑制),即决定神经元间相互作用的强弱和正负,共有三种类型:兴奋型连接、抑制型连接、无连接。这样,N个神经元(一般N很大)构成一个相互影响的复杂网络系统,通过调整网络参数,可使人工神经网络具有所需要的特定功能,即学习、训练或自组织过程。一个简单的人工神经网络结构图如下所示:上图中,左侧为输入层(输入层的神经元个数由输入的维度决定),右侧为输出层(输出层的神经元个数由输出的维度决定),输入层与输出层之间即为隐层。输入层节点上的神经元接收外部环境的输入模式,并由它传递给相连隐层上的各个神经元。隐层是神经元网络的内部处理层,这些神经元在网络内部构成中间层,不直接与外部输入、输出打交道。人工神经网络所具有的模式变换能力主要体现在隐层的神经元上。输出层用于产生神经网络的输出模式。多层神经网络结构中有代表性的有前向网络(BP网络)模型、Page3of25多层侧抑制神经网络模型和带有反馈的多层神经网络模型等。本文主要探讨前向网络模型。多层前向神经网络不具有侧抑制和反馈的连接方式,即不具有本层之间或指向前一层的连接弧,只有指向下一层的连接弧。代表是BP神经网络:输入模式由输入层进入网络,经中间各隐层的顺序变换,最后由输出层产生一个输出模式,如下图所示:输入层隐层输出层多层前向神经网络由隐层神经元的非线性处理衍生它的能力,这个任务的关键在于将神经元的加权输入非线性转换成一个输出的非线性激励函数。下图给出了一个接收n个输入x1,x2,,xn的神经元:b1x1w1x2w2ywnxnPage4of25y(wjjb)神经元的输出由下式给出:nxj1这里输入的加权和(括号内部分)由一个非线性函数传递,b表示与偏差输入相关的权值,wj表示与第j个输入相关的权值。使用最广泛的函数是S形函数,其曲线家族包括对数函数和双曲正切函数,这些都可用来对人口动态系统、经济学系统等建模。另外所用的其他函数有高斯函数、正弦函数、反正切函数,在此不一一展开介绍,本文主要使用的激励函数是对数函数,函数表达式为:yL(u)函数曲线如下图所示:10.80.60.40.2011eu-0.2-10-8-6-4-20246810对于有限输入量,对数函数输出范围为y(0,1)。在输入为u0时,输出值为中间值y0.5。输出在u0附近随着输入的增加以相对快的Page5of25t1eueuueuwExbE速率增加并非常慢地到达上限。对于u0,输出起初减少得很快,然后随着下限的接近将会变慢。训练神经元的规则有很多种,这里首先介绍利用delta规则的学习,神经元选择为一个单输入单输出的简单情形,数学描述如下:uwxb,y11eu该神经元具有一个输入x,权重为w,偏差输入为b,目标输出为t,预报输出为y。则预报误差为:Etyt111eu1ewxb为消除当误差在整个输入模式上求和时引起的误差符号问题,在delta规则里使用的误差指示是平方误差,定义为:11221wxb)2根据delta规则,最优权值(使平方误差最小)可以在训练过程中从初始权值出发,沿负梯度方向下降得到。将平方误差对w,b(神经元的可调整参数)进行微分,得:uEeu(1eu)2wbExuw(1eu)2Eub(1eu)2根据delta原则,权值改变应与误差梯度的负值成比例,引入学习率,每次迭代中的权值改变可表示为:euw(1eu)2beu(1eu)2Page6of25wijjiEw学习率决定了沿梯度方向的移动速度,以确定新的权值。大的值会加快权值的改变,小的值则减缓了权值的改变。第i次迭代后的新权值可表示为:wi1wiEeu(1eu)2xbi1biEeu(1eu)2如果将偏差输入b视为输入x的一部分,令x01,w0b,可以得到对于多输入神经元的权值修正式:1eu(1eu)2xj,j0,1,2,,n总之,利用delta规则的有监督的学习可以按如下方法来实现:一个输入模式(x0,x1,x2,,xn)通过连接被传递,它的初始权值被设置为任意值。对加权的输入求和,产生输出y,然后y与给定的目标输出t做比较决定此模式的平方误差。输入和目标输出不断地被提出,在每一次迭代或每一个训练时间后利用delta规则进行权值调整直到得到可能的最小平方误差。delta规则在每一步中通过导数寻找在误差平面中某个特定点局部区域的斜率,它总是应用这个斜率从而试图减小局部误差,因此,delta规则不能区分误差空间中的全局最小点和局部最小点,它本身不能克服单层神经网络的局限,无法直接应用到多层神经网络(易陷入局部最小点),但它的一般形式是多层神经网络中的学习算法——反传算法的核心。在多层前向神经网络的训练过程中,误差导数或关于权值的误差Page7of25,uiajij,i1,2,zv,vbiiy表面的斜率对权值的调整是至关重要的,在网络训练期间,所有的输出神经元和隐含神经元权值必须同时调整,因此,有必要找出关于所有权值的误差导数。由于网络层数增多,平方误差与权值的连接没有之前单个神经元时那么直接,故可以使用链式规则的概念来找到导数。下面对一个含有一层隐含神经元的BP网络进行讨论,网络结构如下图所示:x011a0ma01y1b1y01x11b0x211zbman1ymxn1anm各个神经元的输入输出关系为:yi11euinj0x,mmi0设目标输出为t,则平方误差定义为:Page8of25yi,i0,1,2,bi,i1,2,yieuiuiuiajiui(tz)bixj,i1,2,12使用链式法则,分别列出平方误差对所有网络参数的导数:v(tz)biv,myiv,muiyiuiyi(1eui)2,i1,2,,majixj,i1,2,,m,j0,1,2,,n在实际的编程过程中,我们需要的是bi和aji,所以如果有需要,也可以直接采用以下整理之后的形式:bi(tz)yi,i0,1,2,,majieui(1eui)2,m,j0,1,2,,n研究表明,两层网络在其隐层中使用S形激励函数,在输出层中使用线性传输函数,就几乎可以以任意精度逼近任意感兴趣的函数,只要隐层中有足够的单元可用。问题1:试使用BP神经网络去逼近正弦函数的正半周,如下:tsin(x),x[0,]由于输入量x仅有一维,故BP神经网络结构可以设计为:Page9of25,uiajij,i1,2zv,vbiiy(tz)bixj,i1,2,j0,1biibkbi(tz)yi,i0,1,2aaji(tz)bixj,i1,2,j0,1aji(1eui)2x01a01y1y01a02b1b0a11b21zx1xa12y2各个神经元的输入输出关系为:yi11eui1j0x2i0根据之前的推导,平方误差对所有网络参数的导数为:bi(tz)yi,i0,1,2ajieui(1eui)2网络参数修正方程为:k1bikak1jijikkeui为加快寻找最优权值的速度,可以使用动量法。之前的方法中,收敛到最优权值的速度取决于学习率的大小,但是过大的学习率会导致来回震荡,不能稳定到最优权值点。动量法的引入,使得较大的学习率也可以具有较好的稳定性,即提供了在学习期间到达最优权值时Page10of25的稳定性。这种方法基本上是将过去权值变化的平均值附加到每一次权值变化的新权值增量,从而使网络权值的变化更平滑。数学表示如下:wk1wk(1)(w)式中,是一个在0和1之间的动量参数,wk是在前一个训练时间里的权值变化。使用动量法的实际效果是:基本上,如果以前积累的变化与之前方向所暗示的是同一个方向时,动量部分就会加速当前权值改变;如果当前积累的变化是相反的方向,动量将阻止当前的变化。据此编写MATLAB程序,源代码如下:beta=0.1;miu=0.8;fori=1:1:101;x1(1,i)=(i-1)*pi/100;t(1,i)=sin(x1(1,i));endx0=1;y0=1;a01=rand();a02=rand();a11=rand();a12=rand();b0=rand();b1=rand();b2=rand();delta_a01=0;delta_a02=0;delta_a11=0;delta_a12=0;delta_b0=0;delta_b1=0;delta_b2=0;k=1;total_error=0;Page11of25while1u1=a01*x0+a11*x1(1,k);u2=a02*x0+a12*x1(1,k);temp1=exp(-u1)/((1+exp(-u1))^2);temp2=exp(-u2)/((1+exp(-u2))^2);y1=1/(1+exp(-u1));y2=1/(1+exp(-u2));z=b0*y0+b1*y1+b2*y2;total_error=total_error+(t(1,k)-z)^2/2;delta_b0=miu*delta_b0+(1-miu)*beta*sum((t(1,k)-z)*y0);b0=b0+delta_b0;delta_b1=miu*delta_b1+(1-miu)*beta*sum((t(1,k)-z)*y1);b1=b1+delta_b1;delta_b2=miu*delta_b2+(1-miu)*beta*sum((t(1,k)-z)*y2