《MATLAB神经网络编程》 化学工业出版社 读书笔记
第四章 前向型神经网络 4.3 BP传播网络

本文是《MATLAB神经网络编程》书籍的阅读笔记,其中涉及的源码、公式、原理都来自此书,若有不理解之处请参阅原书



一,BP网络的限制

在人工神经网络的应用中,绝大部分的神经网络模型采用了BP网络及其变化形式,但这并不说明BP网络是完美的,其各种算法依然存在一定的局限性。BP网络的局限性主要有以下几个方面。
1,学习速率与稳定性的矛盾。
梯度算法进行稳定学习要求的学习速率较小,所以通常学习过程的收敛速度较慢。附加动量法通常比简单的梯度算法快,因为在保证稳定学习的同时,其可以采用很高的学习速率,但是对于许多实际应用仍然太慢。以上两种方法通常只适用于希望增加训练次数的情况。如果有足够的存储空间,即对于中、小规模的神经网络通常可采用Levenberg-Mrquardt算法:如果存储空间不足,则可采用其他多种快速算法,如对于大规模神经网络采用trainscg或者trainrp算法更合适。
2,学习速率的选择缺乏有效的方法。
对于非线性网络,选择学习速率是一件十分困难的事情。对于现行网络,学习速率选择的太大,会容易导致学习不稳定;反之,学习速率选择的太小,则可能导致无法容忍的过长的训练时间。不同于线性网络,还没有找到一个简单易行的方法以解决非线性网络选择学习速率的问题。对于快速训练算法,其默认参数值通常有裕量。
3,训练过程可能陷于局部最小
从理论上说,多层BP网络可以实现任意可实现的线性和非线性函数的映射,从而克服了感知器和线性神经网络的局限性。但是在实际应用中,BP网络通常在训练过程中也可能找不到某个具体问题的解,比如在训练过程中陷入局部最小的情况。当BP网络在训练过程中陷入误差性能函数的局部最小时,可以通过改变其初始值和经过多次训练来获得全局最小。
4,没有确定隐层神经元个数的有效方法
确定多层神经网络隐层神经元数也是一个很重要的问题,太少的神经元会导致网络“欠适配”,太多的隐层神经元会导致“过适配”。


二,BP方法的改进。

由于在人工神经网络中,反向传播法占了非常重要的地位,所以最近十几年来,许多研究人员对其做了深入的研究,提出了许多改进方法。主要目标是为了加快训练速度、避免陷入局部最小和改善其他能力。本文主要讨论前面两种性能的改建方法。
1,附加动量法
附加动量法使网络在修正其权值时,不仅考虑误差在梯度上的作用,还考虑在误差曲面上变化趋势的影响,其作用如同一个低通滤波器,其允许网络忽略网络上的微小变化特性。在没有附加动量的作用下,网络可能陷入浅的局部极小值,利用附加动量的作用则可能划过这些极小值。
该方法是在反向传播法的基础上,在每一个权值的变化上加上一项正比于前次权值变化量的值,并根据反向传播法来产生新的权值变化。带有附加动量因子的权值调节公式为:

其中,k为训练次数;mc为动量因子,一般取值0.95左右。

附加动量法的实质是将最后一次权值变化的影响通过一个动量因子来传递。当动量因子取值为0时,权值的变化根据梯度下降法产生;当动量因子取值为1时,新的权值变化则设置为最后一次权值的变化,而依据梯度法产生的变化部分则被忽略了。以此方式,当增加了动量项后,促使权值的调节向着误差曲面底部的平均方向变化,当网络权值进入误差曲面底部的平坦区时,δi将会变得很小,于是 :

从而防止了:Δw_ij(k)=0的出现,有助于使网络从误差曲面局部极小值中跳出。
根据附加动量法的设计原则,当修正的权值在误差中导致太大的增长结果时,新的权值应该被取消而不被采用,并使动量停止下来,以使网络不进入较大的误差曲面;当新的误差变化率对于其旧值超过一个事先设定的最大误差变化率时,也得取消所计算的权值变化。 其最大误差变化率可以是任何大于或等于1的值,典型值取1.04。所以在进行附加动量法的训练程序设计时必须加进条件判断以正确使用其权值修正公式。
训练过程中对采用动量法的判断条件是:

所有这些判断过程的细节均包含在MATLAB工具箱的traingdm函数中,只要在调用 train的算法项中选用“traingdm”即可,另外需要对 动量因子赋值:

net.trainParam.mc=0.95
如果不赋值,表示函数的默认值为0.9。其他值不用赋。


【例4-36】采用附加动量法的反向传播网络的训练。
源码:

clear all;
% 初始化
P=[-6.0 -6.1 -4.1 -4.05 5.0 -5.1 6.0 6.1];
T=[0 0 0.97 0.99 0.01 0.03 1.0 1.0];
[R,Q]=size(P);
[S,Q]=size(T);
disp('The bias B is fixed at 3.0 and will not learn');
Z1=menu('Intialize Weight with:',...                  %作菜单'W0=[-0.9]; B0=3;',...                            %按给定的初始值'Pick Values with Mouse/Arrow Keys',...           %用鼠标在图上任点初始值'Random Intial Condition [Default];')             %随机初始值(缺省情况)
disp('');
B0=3;
if Z1==1W0=[-0.9];
elseif Z1==3W0=rand(S,R);
end
% 作权值-误差关系图并标注初始值
% 作网络误差曲线图
error1=[];
net=newcf(minmax(P),[1],{'logsig'});  %创建非线性单层网络
net.b{1}=B0;
j=[-1:0.1:1];
for i=1:21net.iw{1,1}=j(i);y=sim(net,P);err=sumsqr(y-T);error1=[error1 err]
end
plot(j,error1)             %网络误差曲线图
hold on;
Z2=menu('Use momentiurn constant of:',...  %作菜单'0.0',...'0.95 [Default]');
if Z1==2[W0,dummy]=ginput(1);
end
disp('');
% 训练网络
if Z2==1momentum=0;
elsemomentum=0.95;
end
ls=[]; error=[];w=[];
max_epoch=500; err_goal=0.01;
lp.lr=0.05;  lp.mc=momentum;         %赋初值
err_ratio=1.04;
W=W0; B=B0;
A=logsig(W0*P+B0*ones(1,8));
E=T-A; SSE=sumsqr(E);
for epoch=1:max_epochif SSE<err_goalepoch=epoch-1;break;endD=A.*(1-A).*E;gW=D*P';dw=learngdm([],[],[],[],[],[],[],gW,[],[],lp,ls);  %权值的增量ls.dw=dw;             %赋学习状态中的权值增量TW=W+dw;              %变化后的权值TA=logsig(TW*P+B*ones(1,8));TE=T-TA; TSSE=sumsqr(TE);       %求输出结果if TSSE>SSE*err_ratio           %判断赋动量因子mc=0;elseif TSSE<SSEmc=momentum;endW=TW; A=TA; E=TE; SSE=TSSE;error=[error TSSE];          %记录误差w=[w W];                     %记录权值
end
plot(w,error,'or');              %作误差随权值的变化图
hold off;
disp('按任意键继续'); pause;
figure; plot(error);             %训练误差图

误差曲线如下:

可见误差曲面上有两个误差最小值,左边的是局部极小值,右边的是全局最小值。
如果动量因子mc取值为0,网络以纯梯度法进行训练,此时训练结果如下:

其误差的变化趋势是以简单的方式”滚到“局部极小值的底部就停止再也不动了。

当采用附加动量法之后,网络的训练则可以自动的避免陷入这个局部极小值。这个结果如下图:

左边是误差记录,右边的是带有附加动量的训练结果。网络的训练误差先是落入局部极小值,在附加动量的作用下,继续向前产生一个正向斜率的运动,并跳出较浅的峰值,落入全局最小值。然后,仍然在附加动量的作用下,达到一定的高度后(即产生一个SSE>1.04*SSE)自动返回,并像弹子滚动一样来回左右摆动,直至停留在最小值点上。


2,自适应学习速率
对于一个特定的问题,要选择适当的学习速率不是一件容易的事情。通常是凭借经验获取(经验是最难的地方),即使这样,训练开始初期功效较好的学习速率,不见得对后来的训练也合适。为了解决这一问题,人们自然回想到使网络在训练过程中自动调整学习速率。通常调整学习速率的准则是:检查权值的修正值是否真正降低了误差函数,如果的确如此,说明所选取的学习速率值小了,可以对其增加一个量;如果不是这样,则产生了过调,那么就应该减小学习速率的值。 与采用附加动量法时的判断条件相仿,当新的误差超过旧的误差一定的倍数时,学习速率将减少;否则其学习速率保持不变;当新的误差小于旧的误差时,学习速率将被增加。 此方法可以保证网络稳定学习,使其误差继续下降,提高学习速率,使其以更大的学习速率进行学习。一旦学习速率调的过大,而不能保证误差继续减小,即应该减小学习速率,直到其学习过程稳定为止。
下式是一种自适应学习速率的调整公式:

初始学习速率η(0)的选取范围可以有很大的随意性。
实践证明,采用自适应学习速率的网络训练次数只是固定学习速率网络训练次数的几十分之一,所以具有自适应学习速率的网络训练是极有效的训练方法。


3,弹性BP算法

BP网络通常采用S型激活函数的隐含层。S型函数常被称为”压扁“函数它把一个无限的输入范围压缩到 一个有限的输出范围。其特点是当输入很大时,斜率接近0,这将导致算法中的梯度幅值很小,可能使得对网络权值的修正过程几乎 停顿下来。
弹性BP算法只取偏导数的符号,而不考虑偏导数的幅值。偏导数的符号决定权值更新的方向 ,而权值变化的大小由一个独立的”更新值“确定。如如果在两次连续的迭代中,目标 函数对某个权值的偏导数的符号不变号,则增大相应的”更新值“(如在前一次”更新值“的基础上乘以1.3);若变号,则减少相应的“更新值”(如在前一次“更新值”的基础上乘以0.5)。
在弹性BP算法中,当训练发生振荡时,权值的变化量将会减少;当在几次迭代过程中权值都朝一个方向变化时,权值的变化量将增大。因此,一般来说,弹性BP算法的收敛速度要比前述几种方法快得多,而且算法也不复杂,更不需要消耗更多的内存。



上述三种改进算法的存取量要求相差不大,各个算法的收敛速度依次加快,其中弹性BP收敛速度远远大于前面两者。大量实际应用已经证明弹性BP算法非常有效。因此,在实际应用的网络训练中,当采用附加动量法乃至可变学习速率的BP算法仍然达不到训练要求时,可以采用弹性BP算法。

MATLAB神经网络编程(八)——BP神经网络的限制与改进相关推荐

  1. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  2. (Matlab)遗传算法优化的BP神经网络实现回归预测

    目录 摘要: 1.BP神经网络介绍: 2.遗传算法原理介绍: 3.遗传算法优化的BP神经网络: 4.算例分析: 5.Matlab代码实现 摘要: 基于Matalb平台,将遗传算法(GA)与BP神经网络 ...

  3. 【Matlab树叶分类】BP神经网络植物叶片分类【含GUI源码 916期】

    一.代码运行视频(哔哩哔哩) [Matlab树叶分类]BP神经网络植物叶片分类[含GUI源码 916期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  4. BP神经网络优化 | MATLAB基于遗传算法优化BP神经网络(GA-BP)的预测模型(含完整代码)

    文章目录 前言 一.遗传算法描述 二.优化思路 三.完整代码 预测结果 前言 首先需要安装一下遗传算法工具箱,可参考这篇博客 MATLAB遗传算法工具箱安装包及安装方法(图解)_周杰伦今天喝奶茶了吗的 ...

  5. 【BP数据预测】基于matlab鸟群算法优化BP神经网络数据预测【含Matlab源码 1772期】

    一.鸟群算法优化BP神经网络简介 1 BP 神经网络 BP神经网络是一种按误差逆向传播算法训练的多层前馈网络, 主要由输入层.中间层和输出层组成, 拓扑结构如图1所示. BP 神经网络是通过不断对样本 ...

  6. bp神经网络时间序列预测,bp神经网络有几个阶段

    什么是BP神经网络? . BP算法的基本思想是:学习过程由信号正向传播与误差的反向回传两个部分组成:正向传播时,输入样本从输入层传入,经各隐层依次逐层处理,传向输出层,若输出层输出与期望不符,则将误差 ...

  7. 神经网络初认识——BP神经网络(7月18,再次认识)

    BP神经网络--Error back Propagtion BP网络属于多层前向神经网络,BP网络是前向神经网络的核心部分,也是整个人工神经网络体系的精华,解决非线性问题**广泛应用在分类识别,逼近, ...

  8. bp神经网络预测模型原理,BP神经网络预测模型

    深度学习与神经网络有什么区别 深度学习与神经网络关系2017-01-10最近开始学习深度学习,基本上都是zouxy09博主的文章,写的蛮好,很全面,也会根据自己的思路,做下删减,细化. 五.DeepL ...

  9. 提高bp神经网络预测精度,bp神经网络数据预处理

    bp神经网络对输入数据和输出数据有什么要求 p神经网络的输入数据越多越好,输出数据需要反映网络的联想记忆和预测能力.BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数 ...

  10. bp神经网络时间序列预测,bp神经网络数据预处理

    怎么用已经训练好的BP神经网络进行预测下一个值? 谷歌人工智能写作项目:神经网络伪原创 bp神经网络如何用于预测 如何人工神经网络来预测下一个数值 newff函数建立BP神经网络,历史数据作为样本,例 ...

最新文章

  1. electron 利用 electron-builder实现自动更新
  2. Docker 初步认识
  3. python怎么处理数据_python panda怎么处理数据
  4. 安装mysql5.6.10_windows下安装mysql(mysql-installer-community-5.6.10.1)详细教程
  5. Win7笔记本查看无线网卡是否“支持的承载网络”的方法
  6. php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能
  7. 如何用Pygame写游戏(十六)
  8. 浅谈js模块化:commons、AMD、CMD、ES6几种模块化的用法及各自的特点
  9. 信号与槽是如何实现的_铺天盖地的吐槽,结果却是卖到断货?iPhone12魅力何在?...
  10. pytorch tensor操作:tensor与numpy转换
  11. focal loss dice loss源码_扒源码:sharding loss in Pytorch
  12. android sqlite 保存图片,android-如何将图像在Sqlite数据库中另存为blob?
  13. 修改pip下载存放和安装位置
  14. 一款轻量级android图表组件SimpleChart-Kotlin
  15. 运维工程师绩效考核表_运维服务工程师考核表
  16. 基于遗传算法的柔性车间调度优化(Matlab代码实现)
  17. 如何查看steam游戏销量_如何查看您在Steam游戏上花费的金钱和时间
  18. stc12c5a60s2c语言程序,STC12C5A60S2单片机 花样流水灯(小鸟归巢)C程序
  19. 华为手机NFC模拟加密的门禁卡详细教程
  20. 微信小程序开发前准备

热门文章

  1. [Mugeda HTML5技术教程之14]案例分析:制作网页游戏
  2. python随机生成数据库数据之一步一步教你数据造假成为道德主席-取名器-.-xswl-pydbgen || Faker
  3. QOpenGL入门教程(二)—— 第一个QOpenGLWidget程序
  4. vue路由跳转动态title标题信息
  5. 基于electron-vue开发的微信小程序反编译客户端
  6. 带你用Inkscape临摹酷狗音乐Logo
  7. 数字图像处理课程实习——边缘检测与图像分割
  8. 缺失值补充--SimpleImputer
  9. 微信小程序数组push报错
  10. 强烈推荐的几个数据清洗小工具箱