首页资源分类DSP > matlab神经网络

matlab神经网络

已有 445500个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:神经网络

    分    享:

    文档简介

    matlab神经网络工具箱

    文档预览

    第 2 章 感知神经网络 感知器是一种前馈神经网络,是神经网络中的一种典型结构。感知器具有分层结构,信 息从输入层进入网络,逐层向前传递至输出层。根据感知器神经元变换函数、隐层数以及权 值调整规则的不同,可以形成具有各种功能特点的神经网络。 2.1 单层感知器 1958 年,美国心理学家 Frank Posenblatt 提出一种具有单层计算单元的神经网络,称为 Perceptron,即感知器。感知器模拟人的视觉接受环境信息,并由神经冲动进行信息传递。 感知器研究中首次提出了自组织、自学习的思想,而且对所能解决的问题存在着收敛算法, 并能从数学上严格证明,因而对神经网络的研究起了重要的推动作用。 单层感知器的结构与功能都非常简单,以至于目前在解决实际问题时很少被采用,但由 于它在神经网络研究中具有重要的意义,是研究其他网络的基础,而且较易学习和理解,适 合作为学习神经网络的起点。 2.1.1 感知器模型 单层感知器是指只有一层处理单元的感知器,如果包括输入层在内,应为两层。其拓扑 结构如图 2-1 所示。图中输入层也称为感知层,有n个神经元节点,这些节点只负责引入外 部信息,自身无信息处理能力,每个节点接收一个输入信号,n个输入信号构成输入列向量 X。输出层也称为处理层,有m个神经元节点,每个节点均具有信息处理能力,m个节点向外 部输出处理信息,构成输出列向量O。两层之间的连接权 值用权值列向量Wj表示,m个权向量构成单层感知器的权 值矩阵W。3 种列向量分别表示为 X = (x1, x2 ,L, xn )T O = (o1, o2 ,L, om )T Wj = (w1j, w2 j ,L, wij,L, wnj )T j = 1, 2,L, m 图 2-1 单层感知器 由第 1 章介绍的神经元数学模型知,对于处理层中任一节点,其净输入 net′j 为来自输入 层各节点的输入加权和。 n ∑ net′j = wijxi (2-1) i =1 输出 oj 由节点的变换函数决定,离散型单计算层感知器的变换函数一般采用符号函数。 24 n ∑ oj = sgn(net′j − Tj ) = sgn( wijxi ) = sgn(WjT X ) i=1 2.1.2 感知器的功能 (2-2) 为便于直观分析,考虑图 2-2 中单计算节点感知器的情况。不难看出,单计算节点 感知器实际上就是一个 M-P 神经元模型,由于采用了符号变换函数,又称为符号单元。 式(2-2)可进一步表达为 oj = ⎧1 ⎨⎩ −1 WjT X > 0 WjT X < 0 下面分三种情况讨论单计算节点感知器的功能。 1)设输入向量 X = (x1, x2 )T ,则两个输入分量在几何上构成一个二维平面,输入样本可 以用该平面上的一个点表示。节点 j 的输出为 oj = ⎧1 ⎨⎩ −1 w1jx1 + w2 jx2 − Tj > 0 w1jx1 + w2jx2 − Tj < 0 则由方程 w1jx1 + w2 jx2 − Tj = 0 (2-3) 确定的直线成为二维输入样本空间上的一条分界线。线上方的样本用*表示,它们使 netj >0,从而使输出为 1;线下方的样本用○表示,它们使 netj <0,从而使输出为−1,如 图 2-3 所示。显然,由感知器权值和阈值确定的直线方程规定了分界线在样本空间的位置,从 而也确定了如何将输入样本分为两类。假如分界线的初始位置不能将*类样本同 类样本正确 分开,改变权值和阈值,分界线也会随之改变,因此总可以将其调整到正确分类的位置。 图 2-2 单计算节点感知器 图 2-3 单计算节点感知器对二维样本的分类 2)设输入向量 X =(x1, x2 , x3)T ,则三个输入分量在几何上构成一个三维空间。节点 j 的 输出为 oj = ⎧1 ⎩⎨−1 w1jx1 + w2 j x2 + w3jx3 − Tj > 0 w1jx1 + w2 j x2 + w3jx3 − Tj < 0 25 则由方程 w1j x1 + w2 jx2 + w3jx3 − Tj = 0 (2-4) 确定的平面成为三维输入样本空间上的一个分界平面。平面上方的样本用*表示,它们使 netj >0,从而使输出为 1;平面下方的样本用 表示,它们使 netj <0,从而使输出为−1。 同样,由感知器权值和阈值确定的平面方程规定了分界平面在样本空间的方向与位置,从而 也确定了如何将输入样本分为两类。假如分界平面的初始位置不能将*类样本同 类样本正确 分开,改变权值和阈值即改变了分界平面的方向与位置,因此总可以将其调整到正确分类的 位置。 3)将上述两个特例推广到 n 维空间的一般情况,设输入向量 X =(x1, x2 , x3)T ,则 n 个 输入分量在几何上构成一个 n 维空间,由方程 w1jx1 + w2jx2 + L + wnjxn − Tj = 0 (2-5) 可定义一个 n 维空间上的超平面。此平面可以将输入样本分为两类。 通过以上分析可以看出,一个最简单的单计算节点感知器具有分类功能。其分类原理是 将分类知识存储于感知器的权向量(包含了阈值)中,由权向量确定的分类判决界面将输入 模式分为两类。 下面研究用单计算节点感知器实现逻辑运算问题。 首先,用感知器实现逻辑“与”功能。逻辑“与”的真值表及感知器结构如下: x1 x2 y 0 0 0 0 1 0 1 0 0 1 1 1 从真值表中可以看出,四个样本的输出有两种情况,一种使输出为 0,另一种使输出为 1,因此属于分类问题。用感知器学习规则进行训练,得到的连接权值标在图 2-4 中。令净 输入为零,可得到分类判决方程为 0.5x1 + 0.5x2 − 0.75 = 0 由图 2-5 可以看出,该方程确定的直线将输出为 1 的样本点*和输出为 0 的样本点 正确 分开了。从图中还可以看出,该直线并不是唯一解。 图 2-4 “与”逻辑感知器 图 2-5 “与”运算的分类 同样,可以用感知器实现逻辑“或”功能。逻辑“或”的真值表如下: 26 x1 x2 y 0 0 0 0 1 1 1 0 1 1 1 1 从真值表中可以看出,四个样本的输出也分两类,一类使输出为 0;另一类使输出为 1。用感知器学习规则进行训练,得到的连接权值为 w1 = w2 = 1 , T = −0.5 ,令净输入为零, 得分类判决方程为 x1 + x2 − 0.5 = 0 该直线能把图 2-6 中的两类样本分开,显然,该直线也不是唯一解。 2.1.3 感知器的局限性 以上两例说明单计算节点感知器可具有逻辑“与”和逻辑“或”的功能。那么它是否也 具有“异或”功能呢?请看下面一个例子。 【例 2-1】 能否用感知器实现“异或”功能? “异或”的真值表如下: x1 x2 y 0 0 0 0 1 1 1 0 1 1 1 0 表中的四个样本也分为两类,但把它们标在图 2-7 的平面坐标系中可以发现,任何直线 也不可能把两类样本分开。 如果两类样本可以用直线、平面或超平面分开,称为线性可分,否则为线性不可分。由 感知器分类的几何意义可知,由于净输入为 0 确定的分类判决方程是线性方程,因而它只能 解决线性可分问题而不可能解决线性不可分问题。由此可知,单计算层感知器的局限性是: 仅对线性可分问题具有分类能力。 图 2-6 “或”运算的分类 图 2-7 “异或”问题的线性不可分性 2.1.4 感知器的学习算法 考虑到训练过程是感知器权值随每一步调整改变的过程,为此用 t 表示学习步数和序 号,将权值看做 t 的函数。t=0 对应学习开始前的初始状态,此时对应的权值为初始化值。 27 训练可按如下步骤进行: 1)对各权值 w0j (0), w1j (0),L, wnj (0) , j = 1, 2,L, m ,( m 为计算层的节点数)赋予较小 的非零随机数。 2)输入样本对 {X p , D p} ,其中 X p = (−1, x1p , x2p ,L , xnp ) , D p = (d1p , d2p ,L, dmp ) 为期望 的输出向量(教师信号),上标 p 代表样本对的模式序号,设样本集中的样本总数为 P,则 p = 1, 2,L, P 。 3)计算各节点的实际输出 ojp (t) = sgn[W T j (t ) X p], j = 1, 2,L, m 。 4)调整各节点对应的权值, Wj (t + 1) = W j (t ) + η[ d p j − ojp (t)]X p , j = 1, 2,L, m ,其中η 为学习速率,用于控制调整速度,η 值太大会影响训练的稳定性,太小则使训练的收敛速度 变慢,一般取 0 < η ≤1。 5)返回到步骤 2)输入下一对样本。 以上步骤周而复始,直到感知器对所有样本的实际输出与期望输出相等。 许多学者已经证明,如果输入样本线性可分,无论感知器的初始权向量如何取值,经过 有限次调整后,总能够稳定到一个权向量,该权向量确定的超平面能将两类样本正确分开。 应当看到,能将样本正确分类的权向量并不是唯一的,一般初始权向量不同,训练过程和所 得到的结果也不同,但都能满足误差为 0 的要求。 【例 2-2】 某单计算节点感知器有 3 个输入。给定三对训练样本如下: X 1 = (−1,1, −2, 0)T d1 = −1 X 2 = (−1, 0,1.5, −0.5)T d 2 = −1 X 3 = (−1, −1,1, 0.5)T d3 =1 设初始权向量 W (0) = (0.5,1, −1,0)T , η = 0.1 。注意,输入向量中第一个分量 x0 恒等 于-1,权向量中第一个分量为阈值,试根据以上学习规则训练该感知器。 解: 第一步:输入 X1 ,得 W T X1 = (0.5,1, −1, 0)(−1,1, −2,0)T = 2.5 o1(0) = sgn(2.5) = 1 W (1) = W (0) + η[d1 − o1(0)]X 1 = (0.5,1, −1, 0)T + 0.1(−1 − 1)(−1,1, −2, 0)T = (0.7, 0.8, −0.6, 0)T 第二步:输入 X 2 ,得 W T X 2 = (0.7, 0.8, −0.6, 0)(−1, 0,1.5, −0.5)T = −1.6 o2 (1) = sgn(−1.6) = −1 W (2) = W (1) + η[d 2 − o2 (1)]X 2 = (0.7, 0.8, −0.6, 0)T + 0.1[−1 − (−1)](−1, 0,1.5, −0.5)T = (0.7, 0.8, −0.6, 0)T 由于 d 2 = o2 (1) ,所以W (2) = W (1) 。 第三步:输入 X 3 ,得 28 W T X 3 = (0.7,0.8, −0.6,0)(−1, −1,1, −0.5)T = −2.1 o3 (2) = sgn(−2.1) = −1 W (3) = W (2) +η[d 3 − o3 (2)]X 3 = (0.7,0.8, −0.6,0)T + 0.1[1 − (−1)](−1, −1,1, 0.5)T 第四步:继续输入 X 进行训练,直到 d p − o p = 0 , p = 1, 2,3 。 2.1.5 单层感知器的MATLAB实现 MATLAB 的神经网络工具箱为单层感知器的设计、训练和学习等提供了丰富的工具函 数。与算法相关的感知器工具函数见表 2-1。 函数名 newp ( ) hardlim ( ) learnp ( ) train ( ) 表 2-1 MATLAB 中单层感知器常用的工具函数名称和基本功能 功能 生成一个感知器 硬限幅激活函数 感知器的学习函数 神经网络训练函数 函数名 sim ( ) mae ( ) plotpv ( ) plotpc ( ) 功能 神经网络仿真函数 平均绝对误差性能函数 在坐标图上给出样本点 在已绘制的图上加分类线 下面对表 2-1 中的工具函数的使用进行说明,并通过一个实例来说明如何使用表中的工 具函数建立一个对样本进行分类的感知器神经网络。 1.newp( ) 功能:创建一个感知器神经网络的函数。 格式:net=newp(RP,S,TF,LF) 说明:net 为生成的感知器神经网络;PR 为一个 R×2 的矩阵,由 R 组输入向量中的最 大值和最小值组成;S 表示神经元的个数;TF 表示感知器的激活函数,默认值为硬幅激活函 数 hardlim();LF 表示网络的学习函数,默认值为 learnp()。 【例 2-3】 用 newp()函数设计一个单输入和一个神经元的感知器神经网络,输入的最 小值和最大值为[0 2]。 net=newp([0 2],1); 可以用下面的语句来观察生成一个什么样的神经网络。 inputweights=net.inputweights{1,1}; 得到 inputweights = delays: 0 initFcn: 'initzero' learn: 1 learnFcn: 'learnp' learnParam: [] size: [1 1] 29 userdata: [1x1 struct] weightFcn: 'dotprod' 从中可以看到,默认的学习函数为 learnp(),后面会讨论。网络输入给 hardlim()传递函 数的量为数量积 dotprod,即输入量和权值矩阵的乘积,然后再加上阈值。默认的初始化函 数为 initzero( ),即权值的初始值置为 0。 同样, biases=net.biases{1} biases = initFcn: 'initzero' learn: 1 learnFcn: 'learnp' learnParam: [] size: 1 userdata: [1x1 struct] 阈值的默认初始值也为 0。 2.hardlim( ) 功能:硬限幅激活函数。 格式:A=hardlim(N) 说明:函数 hardlim(N)在给定网络的输入向量矩阵 N 时,返回该层的输出向量矩阵 A。 当 N 中的元素大于或等于零时,返回的值为 1;否则,为 0。也就是说,如果网络的输入达 到阈值,则硬限幅传输函数的输出为 1;否则,为 0。 3.learnp( ) 功能:感知器的权值和阈值学习函数。 格式:① [dW,LS]=learnp(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) ② [ db,LS]=learnp(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,LS) 说明:dW 为权值变化矩阵;db 为返回阈值调整量;LS 为当前学习状态;W 为 S×R 的 权值矩阵(可省略);P 为 R×Q 的输入向量矩阵;Z 为 S×Q 的输入层的权值矩阵(可省 略);N 为 S×Q 的网络输入矩阵(可省略);E 为误差向量,E=T-Y;T 为网络的目标向量 (可省略);A 为网络的实际输出向量(可省略);gW 为 S×R 的与性能相关的权值梯度矩阵 (可省略);gA 为 S×Q 的与性能相关的输出梯度值矩阵(可省略);D 为 S×S 的神经元距离 矩阵(可省略);LP 为学习参数(可省略);LS 为学习函数声明(可省略);b 为 S×1 的阈值 向量;ones(1,Q)为 1×Q 的全为 1 的向量。 4.train( ) 功能:神经网络训练函数。 格式:[net,tr,Y,E,Pf,Af]=train(NET,P,T,Pi,Ai,VV,TV) 说明:net 为训练后的网络;tr 为训练记录;Y 为网络输出向量;E 为误差向量;Pf 为 训练终止时的输入延迟状态;Af 为训练终止时的层延迟状态;NET 为训练前的网络;P 为 网络的输入向量矩阵;T 为网络的目标矩阵,默认值为 0;Pi 表示初始输入延时,默认值 为 0;Ai 表示初始的层延时,默认值为 0;VV 为验证矢量(可省略);TV 为测试向量 30 (可省略)。 网络训练函数是一种通用的学习函数,训练函数重复地把一组输入向量应用到一个网络 上,每次都更新网络,直到达到了某种准则,停止准则可能是达到最大的学习步数、最小的 误差梯度或误差目标等。 5.sim( ) 功能:对网络进行仿真。 格式:① [Y,Pf,Af,E,perf]=sim(NET,P,Pi,Ai,T) ② [Y,Pf,Af,E,perf]=sim(NET,{Q,TS},Pi,Ai,T) ③ [Y,Pf,Af,E,perf]=sim(NET,Q,Pi,Ai,T) 说明:Y 为网络的输出;Pf 表示最终的输入延时状态;Af 表示最终的层延时状态;E 为实际输出与目标向量之间的误差;perf 为网络的性能值;NET 为要测试的网络对象;P 为 网络的输入向量矩阵;Pi 为初始的输入延时状态(可省略);Ai 为初始的层延时状态(可省 略);T 为目标向量(可省略)。式①、②用于没有输入的网络,其中 Q 为批处理数据的个 数,TS 为网络仿真的时间步数。 下面通过一个简单的例子来解释 sim( )函数是如何应用的。 【例 2-4】 设计一个输入为二维向量的感知器网络,其边界值已定。 net=newp([-2 2;-2 2],1); 和上面的例子一样,权值和阈值的初始值为 0。如果不想预置为 0,则必须单独生成。 例如,两个权值和阈值分别为[-1,1]和 1,应用如下语句: net.IW{1,1}=[-1,1]; net.b{1}=[1]; 应用下面语句检验一下: net.IW{1,1} ans = -1 1 net.b{1} ans = 1 下面来看这个感知器网络对两个输入信号的输出如何,两个输入信号分别位于感知器 两个边界。 第一个输入信号 p1=[1;1]; a1=sim(net,p1) a1 = 1 第二个输入信号: 31 p2=[1;-1]; a2=sim(net,p2) a2 = 0 由此看出,输出是正确的,感知器为输入信号进行了正确的分类。 若将两个输入信号组成一个数列,则输出量也为一个数列。 p3={[1;1],[1;-1]}; a3=sim(net,p3) a3 = [1] [0] 6.mae( ) 功能:平均绝对误差性能函数。 格式:perf=mae(E,w,pp) 说明:perf 表示平均绝对误差和;E 为误差矩阵或向量(网络的目标向量与输出向量之 差);w 为所有权值和阈值向量(可忽略);pp 为性能参数(可忽略)。 【例 2-5】 感知器最重要的也是最实用的功能是对输入向量进行分类。本例尝试建立 一个感知器模型,实现电路“或”门的功能,从而实现对输入的分类。 “或”门输入/输出见表 2-2,由此可得出网络的输入向量 P 和目标向量 T。其中,P=[0 0 1 1;0 1 0 1];T=[0 1 1 1]。 本例的 MATLAB 代码为 表 2-2 “或”门输入/输出 P=[0 0 1 1;0 1 0 1]; T=[0 1 1 1]; net=newp(minmax(P),1); Y=sim(net,P) net.trainParam.epochs=20; net=train(net,P,T); Y=sim(net,P); err1=mae(Y-T) 输入 00 01 10 11 输出 0 1 1 1 输出为 Y= 1111 TRAINC, Epoch 0/20 TRAINC, Epoch 4/20 TRAINC, Performance goal met. Y= 0111 err1 = 0 由此可见,感知器训练以前的输出是不符合要求的,经过四次训练后的输出已经和目标 32 向量一致了。训练过程的误差曲线如图 2-8 所示。 本例创建的感知器只有一个神经元,符合神经 网络的设计原则,即在设计神经网络时,在同样可 以完成任务的情况下,尽量采用简单的结构。因为 结构简单的神经网络计算负担轻,运行速度一般比 较快。感知器的传递函数和学习函数都采用默认 值,分别为 hardlim()和 learnp(),这里因为网络的 输出为 0-1 的二值结构,只有采用 hardlim()才满足 要求,输入向量中不存在奇异值,元素之间的距离 也比较小,因此,采用 learnp()就足够了。 利用 train()函数对网络进行训练,训练的结果 非常理想,训练后的网络成功实现了“或”功能。 图 2-8 训练过程的误差曲线 利用平均绝对误差函数 mae()计算网络的性能,结果为 0,从另一个方面说明了网络的性能 是非常好的。 利用自适应函数 adapt()同样可以达到训练的效果。采用以下的代码对网络进行训练: while mae(e) [net,Y,e]=adapt(net,P,T); end Y=sim(net,P) 网络的输出为 Y= 0111 7.plotpv( ) 功能:绘制样本点的函数。 格式:① plotpv(P,T) ② plotpv(P,T,V) 说明:P 定义了 n 个 2 或 3 维的样本,是一个 2×n 维或 3×n 维的矩阵;T 表示各样本点 的类别,是一个 n 维的向量;V=[x_min x_max y_min y_max]为一设置绘图坐标值范围的向 量。利用 plotpv()函数可在坐标图中绘出给定的样本点及其类别,不同的类别使用不同的符 号。如果 T 只含一元向量,则目标为 0 的输入向量在坐标图中用符号“o”表示;目标为 1 的输入向量在坐标图中用符号“+”表示。如果 T 含二元向量,则输入向量在坐标图中所采 用的符号分别为:[0 0] 用“○”表示;[0 1] 用“+”表示:[1 0] 用“*”表示;[1 1] 用 “×”表示。 8.plotpc( ) 功能:在存在的图上绘制出感知器的分类线函数 格式:① plotpc(W,B) ② plotpc(W,B,H) 说明:硬特性神经元可将输入空间用一条直线(如果神经元有两个输入),或用一个平 33 面(如果神经元有三个输入),或用一个超平面(如果神经元有三个以上输入)分成两个区 域。plotpc(W,B)对含权矩阵 W 和偏差向量 B 的硬特性神经元的两个或三个输入画一个 分类线。这一函数返回分类线的句柄以便以后调用。plotpc(W,B,H)包含从前的一次调用中返 回的句柄。它在画新分类线之前,删除旧线。 【例 2-6】 本例的目标在于演示标准学习函数 learnp()的应用。要求建立一个感知器网 络,对一组存在奇异值的输入向量 P 进行分类。 网络的输入向量 P 和目标向量 T 分别为 P=[0 0.5 1.2 20;0 0.6 1.1 90]; T=[0 1 0 1]; 其中,T 表明了输入向量的分类情况。输入的 向量分布如图 2-9 所示,其中的一个坐标点与其他 点的距离都很大,而另外三个点相对比较集中。因 此,输入向量中存在奇异值。 本例的 MATLAB 代码为 P=[0 0.5 1.2 20;0 0.6 1.1 90]; T=[0 1 0 1]; net=newp(minmax(P),1); net.trainParam.epochs=200; net=train(net,P,T); figure; plotpv(P,T); plotpc(net,iw{1},net.b{1}); 显示结果: 图 2-9 输入向量分布 T= 0101 TRAINC, Epoch 0/200 TRAINC, Epoch 25/200 TRAINC, Epoch 50/200 TRAINC, Epoch 75/200 TRAINC, Epoch 91/200 TRAINC, Performance goal met. 训练过程中的误差曲线如图 2-10 所示,从图中可以看出,网络的训练过程出现了振 荡,而且训练次数也比较多。 训练得到的分类线的图形,由于奇异值的存在,样本点相对比较集中,因此无法看出网 络的分类性能。接下来将局部放大,检查网络的分类性能。其代码如下: figure; plotpv(P,T); plotpc(net.IW{1},net.b{1}); %限制坐标起点和终点 34 axis([-2 2 -2 2]) 局部放大后的分类线如图 2-11 所示,两类样本点中分别有一个位于分类线上,由此可 见,输入样本中的奇异点对于网络的分类性能影响很大。 图 2-10 训练误差曲线 图 2-11 局部放大后的分类线 2.2 多层感知器 前面介绍了单层感知器,它的最大缺点是只能解决线性可分的分类模式问题,要增强网 络的分类能力,唯一的方法是采用多层网络结构,即在输入层与输出层之间增加一个隐含 层,从而构成多层感知器(Multilayer Perceprons,MLP)。这种由输入层、隐含层(可以是 一层或者多层)和输出层构成的神经网络称为多层前向神经网络。 多层感知器是对单层感知器的推广,它能够成功解决单层感知器所不能解决的非线性可 分问题。其拓扑结构如图 2-12 所示。 图 2-12 多层感知器模型 1)多层感知器含有一层或多层隐单元。隐单元从输入模式中获得了更多有用的信息, 使网络可以完成更复杂的任务。 2)多层感知器中每个神经元的激活函数采用可微的函数,如 sigmoid()函数 式中 vi = 1+ 1 exp(−ui ) ui——第i个神经元的输入信号; vi——第i个神经元的输出信号。 (2-6) 35 第 4 章 BP 神经网络 Minsky 和 Papert 的论点曾使许多人对神经网络的研究失去了信心,但仍有许多学者坚 持这方面的研究。Rumelhart、McClelland 和他们的同事洞察到神经网络信息处理的重要性, 于 1985 年发展了 BP 网络学习算法,实现了 Minsky 的多层网络设想。 BP 网络是一种多层前馈型神经网络,其神经元的传递是 S 型函数,输出量为 0 到 1 之 间的连续量,它可以实现从输入到输出的任意非线性映射。由于权值的调整采用反向传播学 习算法,因此也常称其为 BP 网络(Back Propagation Network)。 目前,在人工神经网络的实际应用中,绝大部分的神经网络模型都采用 BP 网络及其变 化形式。它也是前向网络的核心部分,体现了人工神经网络的精华。 BP 网络主要用于以下四个方面。 1)函数逼近:用输入向量和相应的输出向量训练一个网络逼近一个函数。 2)模式识别:用一个待定的输出向量将它与输入向量联系起来。 3)分类:把输入向量所定义的合适方式进行分类。 4)数据压缩:减少输出向量维数以便于传输或存储。 4.1 BP 网络模型结构 4.1.1 神经元模型 图 4-1 给出一个基本的 BP 神经元模型,它具有 R 个输入,每个输入都通过一个适当的 权值 w 和下一层相连,网络输出可表示为 图 4-1 BP 神经元模型 a = f (wp + b) (4-1) f 就是表示输入/输出关系的传递函数。 BP 网络中隐层神经元的传递函数通常用 log-sigmoid 型函数 logsig()、tansigmoid 型函数 92 tansig()以及纯线性函数 purelin()。其传递函数如图 4-2 所示。 如果 BP 网络的最后一层是 sigmoid 型神经元,那么整个网络的输出就限制在一个较小 的范围内;如果 BP 网络的最后一层是 purelin 型线性神经元,那么整个网络的输出可以取任 意值。 图 4-2 神经元传递函数 BP 网络所采用的传递函数均是可微的单调递增函数。在 BP 网络的训练过程中,计算函 数 logsig()、tansig()、purelin()的导数非常重要,神经网络工具箱提供的求导函数依次为 dlogsig()、dtansig()、dpurelin()。在工作空间输入缀有'deriv'的指令就可以找到相应传递函数 的导数函数。例如: tansig('deriv') ans = dtansig 这些函数都是设计 BP 网络时要经常用到的。如果用户在实际应用中需要用到其他函 数,可以自定义。MATLAB 系统提供了丰富的扩展功能。 4.1.2 前馈型神经网络结构 前馈型网络通常有一个或多个隐层,隐层中的神经元均采用 S 型传递函数,输出层的神 经元采用线性传递函数。图 4-3 所示就是一个典型的 BP 网络结构,有一个隐层,隐层神经 元数目为 S,隐层采用 S 型神经元函数 logsig(),具有 R 个输入。 隐层的非线性传递函数神经元可以学习输入输出之间的线性和非线性关系,线性输出层 是为了拓宽网络输出。如果需要限定网络输出(例如约束在 0 和 1 之间),则可以采用 S 型 传递函数(如 logsig()等)。 图 4-4 就是一个典型的两层 BP 网络,隐层神经元传递函数 tansig(),输出层神经元传递 函数 purelin()。 93 图 4-3 BP 网络结构 图 4-4 两层 BP 网络结构 4.2 BP 神经网络构建与算法 4.2.1 BP神经网络构建 本小节介绍 BP 神经网络的构建、初始化和仿真,并举例说明这些网络操作如何实现及 网络的学习算法。 1.构建神经网络 训练神经网络之前需要构造一个网络构架,函数 newff()就是用来构建神经网络的。它 需要四个输入条件,依次是:由 R 维的输入样本最大最小值构成的 R×2 维矩阵、各层的神 经元个数、各层神经元的传递函数以及训练用函数的名称。 假设需要构建一个两层神经网络,其输入向量是二维的,输入向量的范围为[-1 2;0 5],第一层(隐层)有三个神经元,传递函数是 tansig();第二层(输出层)是单个神经元, 传递函数是线性的,训练函数选择 traingd()。至此就生成了初始化待训练的神经网络。 2.权值初始化 前馈型神经网络在训练之间必须要对权值和阈值进行初始化,newff()函数可以自动完成 这一过程,但是无法重新赋初值。如果想重新初始化,可以应用 init()函数,使网络恢复初始 94 化的情况。 3.网络仿真 给定网络结构和输入变量 p ,就可以应用 sim()函数计算相应的网络输出 a 。 【例 4-1】 net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd' ); net=init(net); p=[1;2]; a=sim(net,p) 输出的 a 结果为: a= -1.0411 若输入 p 为: p=[1 3 2;2 4 1]; a=sim(net,p) 输出的 a 结果为: a= -1.0411 -1.3032 -0.6094 上例演示了对应一维和多维输入情况下的仿真(可能每次结果不同,这是因为前面初始 化的网络是随机的,对应的网络不同,结果自然不同)。 4.2.2 BP网络的学习算法 无论是函数逼近还是模糊识别,都必须对神经网络进行训练。训练之前首先需要样本, 样本中包含输入向量 P 以及相应的期望输出向量 T,训练过程中应不断调整权值和阈值,使 得神经网络的表现函数达到最小。前馈型神经网络的表现函数默认为网络输出 a 和期望输出 向量 T 的均方差 msa。 BP 网络学习规则的指导思想是:对网络权值和阈值的修正要沿着表现函数下降最快的 方向——负梯度方向。 xk+1 = xk − ak gk (4-2) 式中, xk 是当前的权值和阈值矩阵; gk 是当前表现函数的梯度; ak 是学习速率。下面介绍 BP 算法的推导过程。 假设三层 BP 网络,输入节点 xi ,隐层节点 yj ,输出节点 zi 。输入节点与隐层节点间的 网络权值为 wji ,隐层节点与输出节点间的网络权值为 vlj 。当输出节点的期望值为 tl 时,模 型的计算公式如下: 隐层节点的输出 ∑ yj = f ( wji xi − θ j ) = f (netj ) i (4-3) 95 其中 输出节点的计算输出 其中 输出节点的误差 ∑ netj = wji xi − θ j i ∑ zl = f ( vlj yj −θl ) = f (netl ) j ∑ netl = vlj yj −θl j ∑ ∑ ∑ E = 1 2 l (tl − zl )2 = 1 2 l (tl − f ( j vlj − θl ))2 ∑ ∑ ∑ = 1 2 l (tl − f ( j vlj f ( j wji xi −θ j ) − θl ))2 1.误差函数对输出节点求导 ∑ ∂E = n ∂E × ∂zk = ∂E × ∂zl ∂vlj k=1 ∂zk ∂vlj ∂zl ∂vlj E 是多个 zk 的函数,但只有一个 zl 与 vlj 有关,各 zk 间相互独立,其中 ∑ ∂E ∂zl =1 2 k ⎡ ⎢−2(tk ⎣ − zk ) × ∂zk ∂zl ⎤ ⎥ ⎦ = −(tl − zl ) ∂zl ∂vlj = ∂zl ∂netl × ∂netl ∂vlj = f ′(netl ) × yj 则 ∂E ∂vlj = −(tl − zl ) × f ′(netl ) × yj 2.误差函数对隐层节点求导 ∑ ∑ ∂E = ∂E × ∂zl × ∂yj ∂wji l j ∂zl ∂yj ∂wji E 是多个 zl 的函数,针对某一个 wji ,对应一个 yj ,它与所有 zl 有关,其中 ∑ ∂E = 1 ∂zl 2 k ⎡ ⎢−2(tk ⎣ − zk ) × ∂zk ∂zl ⎤ ⎥ ⎦ = −(tl − zl ) ∂zl ∂y j = ∂zl ∂netl × ∂netl ∂yj = f ′(netl ) × ∂netl ∂y j = f ′(netl ) × vlj ∂y j ∂wji = ∂yj ∂net j × ∂netj ∂wji = f ′(netl ) × xi 则 96 (4-4) (4-5) (4-6) (4-7) ∑ ∑ ∂E ∂wji =− l (tl − zl ) × f ′(netl ) × vlj × f ′(netj ) ⋅ xi = − l δlvlj f ′(netj ) × xi 设隐层节点误差为 ∑ δ ′j = f ′(netj ) × δlvlj l (4-8) 则 ∂E ∂wji = −δ j′xi 由于权值的修正 Δvlj 、 Δwji 正比于误差函数沿梯度下降,则有 ∑ δ j′ = f ′(netj ) × l δ l Δvlj = −η ∂E ∂vlj = ηδl yj vlj (k + 1) = vlj (k) + Δvlj = vlj (k) + ηδl yj δl = −(tl − zl ) × f ′(netl ) Δwji = −δ j′ ∂E ∂wji = η′δ j′xi wji (k + 1) = wji (k) + Δwji = wji (k) + η′δ j′xi ∑ δ j′ = f ′(netj ) × δlvlj l ∑ 式中,隐层节点误差 δ j′ 中的 δlvlj 表示输出节点 zl 的误差 δl 通过权值 vlj 向节点 yj 反向传播 成为隐层节点的误差。 l 3.阈值的修正 阈值θ 也是变化值,在修正权值的同时也需要修正,原理同权值修正一样。 (1)误差函数对输出节点阈值求导 其中 ∂E = ∂E × ∂zl ∂θl ∂zl ∂θl (4-9) ∂E ∂zl = −(tl − zl ) ∂zl ∂θl = ∂zl ∂netl × ∂netl ∂θl = f ′(netl ) × (−1) 则 阈值修正 ∂E ∂θl = (tl − zl ) × f ′(netl ) = δl Δθl =η ∂E ∂θl = ηδl θl (k + 1) = θl (k) +ηδl (4-10) 97 (2)误差函数对隐层节点阈值求导 ∑ ∂E = ∂E × ∂zl × ∂yj ∂θ j l ∂zl ∂yj ∂θ j (4-11) 其中 ∂E ∂zl = −(tl − zl ) ∂zl ∂yj = f ′(netj ) × vlj ∂yj ∂θ j = ∂y j ∂net j × ∂net j ∂θ j = f ′(netj) × (−1) = − f ′(netj ) 则 ∑ ∑ ∂E = ∂θ j l (tl − zl ) × f ′(netl ) × vlj × f ′(netj ) = l δlvlj f ′(netj ) =δ j′ 阈值修正 Δθ j = η′ ∂E ∂θ j = η′δ j′ θ j (k + 1) = θ j (k) + η′δ j′ 4.传递函数 f(x)的导数 S 型函数 f (x) = 1 1+ e−x 则 对输出节点 f ′(x) = f (x) × (1 − f (x)) f ′(netk ) = f (netk ) × (1 − f (netk )) (4-12) 对隐层节点 zl = f (netl ) f ′(netl ) = zl × (1 − zl ) yj = f (netj ) f ′(netl ) = yj × (1 − yj ) 求函数梯度有两种方法:递增和批处理。递增模式,就是每增加一个输入样本,重新计 算一次梯度并调整权值;批处理模式,就是利用所有的输入样本计算梯度,然后调整权值。 4.3 BP 网络的神经网络工具箱函数 BP 网络即反向传播网络。在此一律使用 BP 网络作为反向传播网络的简称。 与前面的感知器和线性网络不同,BP 网络是一个前向多层网络,它利用误差反向传播 算法对网络进行训练。它包含了神经网络理论中最为精华的部分,由于其结构简单、可塑性 98 强,故在函数逼近、模式识别、信息分类及数据压缩等领域得到了广泛的应用。由于它的数 学意义明确,学习算法步骤分明,使得应用背景更加广泛。 MATLAB R2007 神经网络工具箱中包含了许多用于 BP 网络分析与设计的函数,本 节将详细说明这些函数的功能、调用格式、参数特性和注意事项等。BP 网络的常用函数 见表 4-1。 函数类型 前向网络创建函数 传递函数 学习函数 性能函数 显示函数 表 4-1 BP 网络的常用函数表 函数名称 newcf() newff() newfftd() logsig() dlogsig() tansig() dtansig() purelin() dpurelin() learngd() learngdm() mse() msereg() plotperf() plotes() plotep() errsurf() 函数用途 创建级联前向网络 创建前向 BP 网络 创建存在输入延迟的前向网络 S 型的对数函数 logsig 的导函数 S 型的正切函数 tansig 的导函数 纯线性函数 purelin 的导函数 基于梯度下降法的学习函数 梯度下降动量的学习函数 均方误差函数 均方误差规范化函数 绘制网络的性能 绘制一个单独神经元的误差曲面 绘制权值和阈值在误差曲面上的位置 计算单个神经元的误差曲面 4.3.1 BP网络创建函数 (1)newcf() 该函数用于创建级联前向 BP 网络,其调用格式为 net=newcf net=newcf(PR, [S1 S2...SN],{TF1 TF2...TFN},BTF,BLF PF) 其中, net=newcf:用于在对话框中创建一个 BP 网络。 PR:由每组输入(共有 R 组输入)元素的最大值和最小值组成的 R×2 维矩阵。 Si:第 i 层的长度,共计 N 层。 BTF:BP 网络的训练函数,默认为“trainlm”。 BLF:权值和阈值的 BP 学习算法,默认为“learngdm”。 PF:网络的性能函数,默认为“mse”。 99 注意:参数 TFi 可以采用任意的可微传递函数,比如 tansig()、logsig()和 purelin()等;训 练函数可以是任意的 BP 训练函数,如 trainlm()、trainbfg()、trainrp()和 trainged()等。值得指 出的是,BTF 默认采用 trainlm()是因为该函数的速度很快,但该函数的一个重要缺陷是运行 过程会消耗大量的内存资源。如果您的计算机内存不够大,不建议采用 BTF 的默认函数 trainlm(),而建议采用训练函数 trainbfg()或 trainrp(),虽然这两个函数的运行速度比较慢,但 它们的共同特点是内存占用量小,不至于出现训练过程死机的情况。 (2)newff() 该函数用于创建一个 BP 网络。其调用格式为 net=newff net=newff(PR, [S1 S2...SN],{TF1 TF2...TFN},BTF,BLF PF) 其中, net=newff:用于在对话框中创建一个 BP 网络。 其他参数含义请参见函数 newcf。 (3)newfftd() 该函数用于创建一个存在输入延迟的前向网络。其调用格式为 net=newfftd net=newfftd(PR, ID [S1 S2...SN],{TF1 TF2...TFN},BTF,BLF PF) 其中, net=newfftd:用于在对话框中创建一个 BP 网络。 其他参数含义参见 newcf。 4.3.2 神经元上的传递函数 传递函数是 BP 网络的重要组成部分。传递函数又称为激活函数,必须是连续可微的。 BP 网络经常采用 S 型的对数或正切函数和线性函数。 (1)logsig() 该传递函数为 S 型的对数函数。其调用格式为 A=logsig(N) info=logsig(code) 其中, N:Q 个 S 维的输入列向量。 A:函数返回值,位于区间(0,1)中。 info=logsig(code):依据 code 值的不同返回不同的信息,包括: deriv——返回微分函数的名称。 name——返回函数全称。 output——返回输出值域。 active——返回有效的输入区间。 100 下面以一组简单的代码产生一个对数 S 型的传递函数为例: n=-10:0.1:10; a=logsig(n) plot(n,a) grid 运行结果如图 4-5 所示。可见,函数 logsig()可将神经元的输入(范围为整个实数集)映 射到区间(0,1)中,又由于该函数为可微函数,因此非常适合于利用 BP 算法训练神经网络。 图 4-5 logsig()函数运行结果 注意:MATLAB R2007 按照此形式的函数来计算对数传递函数的值: n = 2 /(1 + exp(−2n)) (2)dlogsig() 该函数为 logsig 的导函数。其调用格式为 dA_dN=dlogsig(N,A) 其中, N:S×Q 维网络的输入。 A:S×Q 维网络的输出。 dA_dN:函数返回值,输出对输入的导数。 注意:MATLAB R2007 按照此形式的函数来计算对数传递函数的值: y = x * (1 − x) 。 【例 4-2】 某 BP 网某层的 3 个神经元,其传递函数均为 S 型的对数函数,试利用函 数 dlogsig()求解输出对输入的导数。 MATLAB 代码如下: N=[0.1;0.8;-0.7]; A=logsig(N) dA_dN=dlogsig(N,A) 运行结果如下: A= 0.5250 0.6900 0.3318 101 dA_dN = 0.2494 0.2139 0.2217 (3)tansig() 该函数为双曲正切 S 型传递函数。其调用格式为: A=tansig(N) info=tansig(code) 其中, N:Q 个 S 维的输入列向量; A:函数返回值,位于区间(-1,1)中。 info=tansig(code)的含义请参见 info=logsig(code)。 以下代码可绘制一个双曲线正切 S 型传递函数: n=-10:0.1:10; a=tansig(n); plot(a,n) grid 运行结果如图 4-6 所示。 图 4-6 tansig()函数运行结果 注意:MATLAB R2007 按照此形式的函数来计算双曲正切传递函数的值: n = 2 /(1 + exp (−2n)) −1 。 (4)dtansig() 该函数为 tansig 的导函数。其调用格式为 Da_dN=dtansig(N,A) 各参数的意义请参见 dlogsig,其原型函数为 y = 1− x2 。 (5)purelin() 该函数为线性传递函数。其调用格式为 102 A= purelin(N) info= purelin(code ) 其中, N:Q 个 S 维的输入列向量; A:函数返回值,A=N。 info= purelin(code)的含义请参见 info= logsig(code)。 下面以一组简单的代码产生一个线性 S 型传递函数为例: n=-10:0.1:10; a=purelin(n); plot(a,n) grid 运行结果如图 4-7 所示。 图 4-7 purelin()函数运行结果 注意:MATLAB R2007 按照此形式的函数来计算 purelin: y = x 。 (6)dpurelin() 该函数为 purelin 的导函数。其调用格式为 Da_dN=dpurelin(N,A) 各参数的含义请参见 dlogsig,原型函数为常数函数 x = 1 。 4.3.3 BP网络学习函数 (1)learngd() 该函数为梯度下降权值/阈值学习函数,它通过神经元的输入和误差,以及权值和阈值 的学习速率来计算权值或阈值的变化率。其调用格式为 [dW,ls]=learngd(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) [db,ls]=learngd(b,ones(1,Q),Z,N,A,T,E,gW,gA,D,LP,LS) info=learngd(code) 其中, W:S×R 维的权值矩阵。 103

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。