【转】漫谈ANN(2):BP神经网络

上一次我们讲了M-P模型,它实际上就是对单个神经元的一种建模,还不足以模拟人脑神经系统的功能。由这些人工神经元构建出来的网络,才能够具有学习、联想、记忆和模式识别的能力。BP网络就是一种简单的人工神经网络。我们的第二话就从BP神经网络开始漫谈吧。

BP的来源

“时势造英雄”,一个伟大的人物的登场总是建立在历史的需求之下,所以我们剖析一个人,得先看看他的出身时代。同样的道理,在讲BP网络的特性和用途之前,我们需要先了解一下它的来源和诞生原因,以便理解它的重要性。

1.1 最简单的神经网络结构——感知器

在1958年,美国心理学家Frank Rosenblatt提出一种具有单层计算单元的神经网络,称为感知器(Perceptron)。它其实就是基于M-P模型的结构。我们可以看看它的拓扑结构图。

这个结构非常简单,如果你还记得前面所讲的M-P神经元的结构的话,这个图其实就是输入输出两层神经元之间的简单连接(如果忘了可以看看第一话的模型示意图)。

由第一话的(2)中我们知道输入层各节点的输入加权和

 

netj=i=1nωijxi

 

我们一般采用符号函数来当作单层感知器的传递函数,即输出

 

oj=sgn(netjTj)=sgn(i=0nωijxi)=sgn(WTjX)

 

公式(2)可以进一步表达为:

 

oj={11,,WTjX>0WTjX<0

 

1.2 风中之烛——单层感知器的局限性

虽然单层感知器简单而优雅,但它显然不够聪明——它仅对线性问题具有分类能力。什么是线性问题呢?简单来讲,就是用一条直线可分的图形。比如,逻辑“与”和逻辑“或”就是线性问题,我们可以用一条直线来分隔0和1。

1)逻辑“与”的真值表和二维样本图如图2:

2)逻辑“或”的真值表如图3:

为什么感知器就可以解决线性问题呢?这是由它的传递函数决定的。这里以两个输入分量 x1 和 x2 组成的二维空间为例,此时节点 j 的输出为

oj={11,,   ω1jx1+ω2jx2Tj>0   ω1jx1+ω2jx2Tj<0

 

所以,方程

ω1jx1+ω2jx2Tj=0

 

确定的直线就是二维输入样本空间上的一条分界线。对于三维及更高维数的推导过程可以参考其他的Tutorials。

如果要让它来处理非线性的问题,单层感知器网就无能为力了。例如下面的“异或”,就无法用一条直线来分割开来,因此单层感知器网就没办法实现“异或”的功能。

仅对线性可分问题具有分类能力,这就是单层感知器的局限所在。显然它能够解决的实际问题是很有限的。也正因为这样,单层感知器在解决实际问题时很少被采用。

1.3 心有余而力不足——多层感知器的瓶颈

既然一条直线无法解决分类问题,当然就会有人想到用弯曲的折线来进行样本分类。我们常常听到一句批评人笨的话“你这人脑袋就是不会转弯!”大意就是如此,脑袋会转弯的人才善于解决问题。所以,人们请来了单层感知器他哥——多层感知器来帮忙。所谓多层感知器,就是在输入层和输出层之间加入隐层,,以形成能够将样本正确分类的凸域。多层感知器的拓扑结构如图5所示。

我们可以比较一下单层感知器和多层感知器的分类能力:

由上图可以看出,随着隐层层数的增多,凸域将可以形成任意的形状,因此可以解决任何复杂的分类问题。实际上,Kolmogorov理论指出:双隐层感知器就足以解决任何复杂的分类问题

多层感知器确实是非常理想的分类器,但问题也随之而来:隐层的权值怎么训练?对于各隐层的节点来说,它们并不存在期望输出,所以也无法通过感知器的学习规则来训练多层感知器。因此,多层感知器心有余而力不足,虽然武功高强,但却无力可施。

1.4 山重水复疑无路——ANN的低潮期

1966年,Minisky和Papert在他们的《感知器》一书中提出了上述的感知器的研究瓶颈,指出理论上还不能证明将感知器模型扩展到多层网络是有意义的。这在人工神经网络的历史上书写了极其灰暗的一章。对ANN的研究,始于1890年开始于美国著名心理学家W.James对于人脑结构与功能的研究,半个世纪后W.S.McCulloch和W.A.Pitts提出了M-P模型,之后的1958年Frank Rosenblatt在这个基础上又提出了感知器,此时对ANN的研究正处在升温阶段,《感知器》这本书的出现就刚好为这刚刚燃起的人工神经网络之火泼了一大盆冷水。一时间人们仿佛感觉对以感知器为基础的ANN的研究突然间走到尽头,看不到出路了。于是,几乎所有为ANN提供的研究基金都枯竭了,很多领域的专家纷纷放弃了这方面课题的研究。

1.5 柳暗花明又一村——ANN研究的复苏和BP神经网络的诞生

所以说真理的果实总是垂青于能够忍受寂寞的科学家。尽管ANN的研究陷入了前所未有的低谷, 但仍有为数不多的学者忍受住寂寞,坚持致力于ANN的研究。在长达10年的低潮时期之间,相 继有一些开创性的研究成果被提出来,但还不足以激起人们对于ANN研究的热情。一直到上世 纪80年代,两个璀璨的成果诞生了:1982年美国加州理工学院的物理学家John J.Hopfield博 士的Hopfield网络和David E.Rumelhart以及James L.McCelland研究小组发表的《并行分布 式处理》。这两个成果重新激起了人们对ANN的研究兴趣,使人们对模仿脑信息处理的智能计 算机的研究重新充满了希望。

前者暂不讨论,后者对具有非线性连续变换函数的多层感知器的误差反向传播(Error Back Propagation)算法进行了详尽的分析,实现了 Minsky 关于多层网络的设想。Error Back Propagation算法的简称就是BP算法,以BP算法实现的多层感知器网络就是BP网络。

所以,BP网络本质上并不是一个新的网络,而是使用BP学习算法的多层感知器网络。

BP算法的基本思想

前面我们说到,多层感知器在如何获取隐层的权值的问题上遇到了瓶颈。既然我们无法直接得到隐层的权值,能否先通过输出层得到输出结果和期望输出的误差来间接调整隐层的权值呢?BP算法就是采用这样的思想设计出来的算法,它的基本思想是,学习过程由信号的正向传播误差的反向传播两个过程组成。

  • 正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。
  • 反向传播时,将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。

图8就是BP算法的信号流向图。

BP网络特性分析——BP三要素

我们分析一个ANN时,通常都是从它的三要素入手,即1)网络拓扑结构;2)传递函数;3)学习算法。如图9所示。

每一个要素的特性加起来就决定了这个ANN的功能特性。所以,我们也从这三要素入手对BP网络的研究。

3.1 BP网络的拓扑结构

前面已经说了,BP网络实际上就是多层感知器,因此它的拓扑结构和多层感知器的拓扑结构(图5)相同。由于单隐层(三层)感知器已经能够解决简单的非线性问题,因此应用最为普遍。三层感知器的拓扑结构如图10所示。

3.2 BP网络的传递函数

BP网络采用的传递函数是非线性变换函数——Sigmoid函数(又称S函数)。其特点是函数本身及其导数都是连续的,因而在处理上十分方便。为什么要选择这个函数,等下在介绍BP网络的学习算法的时候会进行进一步的介绍。S函数有单极性S型函数和双极性S型函数两种,单极性S型函数定义如下:

f(x)=11+ex

 

其函数曲线如图11所示。

双极性S型函数定义如下:

f(x)=1ex1+ex

 

其函数曲线如图12所示。

3.3 BP网络的学习算法

BP网络的学习算法就是BP算法,又叫 δ 算法(在ANN的学习过程中我们会发现不少具有多个名称的术语), 以三层感知器为例,当网络输出与期望输出不等时,存在输出误差 E ,定义如下

 

E=12(dO)2=12κ=1(dkok)2

 

将以上误差定义式展开至隐层,有

E=12κ=1[dκf(netκ)]2=12κ=1[dκf(j=0mωjκyj)]2

 

进一步展开至输入层,有

E=12κ=1{dκf[j=0mωjκf(netj)]}2=12κ=1{dκf[j=0mωjκf(j=0nυijχi)]}2

 

由上式可以看出,网络输入误差是各层权值ωjκυij的函数,因此调整权值可改变误差 E。 显然,调整权值的原则是使误差不断减小,因此应使权值与误差的梯度下降成正比,即

Δωjκ=ηEωjκj=0,1,2,,m;κ=1,2,,

 

 

Δυij=ηEυiji=0,1,2,,n;j=1,2,,m

 

对于一般多层感知器,设共有 h 个隐层,按前向顺序各隐层节点数分别记为 m1,m2,,mh,各隐层输出分别记为 y1,y2,,yh,各层权值矩阵分别记为 W1,W2,,Wh,Wh+1,则各层权值调整公式为

输出层

 

Δωh+1jκ=ηδh+1κyhj=η(dκoκ)oκ(1oκ)yκjj=0,1,2,,mh;κ=1,2,,

 

第 h 隐层

 

Δωhij=ηδhjyhi1=η(lκ=1δoκωh+1jκyκj(1ykjappa)yhi1i=0,1,2,,m(h1);j=1,2,,mh

 

按以上规律逐层类推,则第一隐层权值调整公式

 

Δω1pq=ηδ1qχp=η(m2r=1δ2rω2qr)y1q(1y1q)χpp=0,1,2,,n;j=1,2,,m1

 

容易看出,BP学习算法中,各层权值调整公式形式上都是一样的,均由3个因素决定,即:

  • 学习率 η
  • 本层输出的误差信号 δ
  • 本层输入信号 Y(或X

其中输入层误差信号与网络的期望输出与实际输出之差有关,直接反应了输出误差,而各隐层的误差信号与前面各层的误差信号有关,是从输出层开始逐层反传过来的

可以看出BP算法属于δ学习规则类,这类算法常被称为误差的梯度下降算法δ学习规则可以看成是Widrow-Hoff(LMS)学习规则的一般化(generalize)情况。LMS学习规则与神经元采用的变换函数无关,因而不需要对变换函数求导,δ学习规则则没有这个性质,要求变换函数可导。这就是为什么我们前面采用Sigmoid函数的原因

综上所述,BP三要素如图13所示。

BP网实例

由于BP网络具有出色的非线性映射能力、泛化能力和容错能力,因此BP网络成了至今为止应用最广泛的人工神经网络。图14是Matlab下用BP网络做线性拟合的结果,效果很好。

代码如下:

% BP网络函数逼近实例
% 1.首先定义正弦函数,采样率为20Hz,频率为1Hz
k = 1; % 设定正弦信号频率
p = [0:0.05:4];
t = cos(k*pi*p) + 3*sin(pi*p);
plot(p, t, '-'), xlabel('时间'); ylabel('输入信号');
% 2.生成BP网络。用newff函数生成前向型BP网络,设定隐层中神经元数目为10
% 分别选择隐层的传递函数为 tansig,输出层的传递函数为 purelin,
% 学习算法为trainlm。
net =
newff(minmax(p),[10,10,1],{'tansig','tansig','purelin'},'trainlm');
% 3.对生成的网络进行仿真并做图显示。
y1 = sim(net,p); plot(p, t, '-', p, y1, '--')
% 4.训练。对网络进行训练,设定训练误差目标为 1e-5,最大迭代次数为300,
% 学习速率为0.05。
net.trainParam.lr=0.05;
net.trainParam.epochs=1000;
net.trainParam.goal=1e-5;
[net,tr]=train(net,p,t);
%5.再次对生成的网络进行仿真并做图显示。
y2 = sim(net,p);
plot(p, t, '-', p, y2, '--')

 

 

原文地址:http://hahack.com/reading/ann2/

转载于:https://www.cnblogs.com/sdlypyzq/p/4775894.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笑男手札:SharePoint 2013 单一服务器场环境恢复数据库内容

SharePoint 2013 单一服务器场环境恢复数据库内容 笑男的公司服务很多客户&#xff0c;当然&#xff0c;这些客户都很挑剔&#xff0c;所以一般情况下生产&#xff08;Prod&#xff09;环境的服务是不能停的。 当然&#xff0c;如果你将包含相同网站集的数据库连接到同一个服务…

图解 深入浅出 JavaWeb:Servlet 再说几句

Writer &#xff1a;BYSocket&#xff08;泥沙砖瓦浆木匠&#xff09; 微 博&#xff1a;BYSocket 豆 瓣&#xff1a;BYSocket FaceBook&#xff1a;BYSocket Twitter &#xff1a;BYSocket 上一篇的《 Servlet必会必知 》受到大家一致好评 — (感谢 读…

!+\v1 用来“判断浏览器类型”还是用来“IE判断版本”的问题!

这种写法是利用各浏览器对转义字符"\v"的理解不同来判断浏览器类型。在IE中&#xff0c;"\v"没有转义&#xff0c;得到的结果为"v"。而在其他浏览器中"\v"表示一个垂直制表符&#xff0c;所以ie解析的"\v1" 为 "v1&quo…

这么多个月,我头一次体验用类的概念来写驱动

原来感觉一样是那么爽阿。。。快乐得不得了。。。转载于:https://www.cnblogs.com/suanguade/p/4038190.html

$ npm install opencv ? 你试试?! 在windows环境下,使用node.js调用opencv攻略

博主之前写过一篇文章《html5与EmguCV前后端实现——人脸识别篇》&#xff0c;叙述的是opencv和C#的故事。最近在公司服务器上更新了一套nodejs环境&#xff0c;早就听闻npm上有opencv模块&#xff0c;便欲部署之。然而opencv的部署似乎从来都不会那么顺利...... 找模块上https…

Win7安装vs2010失败

提示&#xff1a; --------------------------------------------------------------------------------------------------------------------------------------- 解决方法&#xff1a;开始运行中regedit打开注册表找到HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control …

调光设备术语:调光曲线(转)

源&#xff1a;调光设备术语&#xff1a;调光曲线 核心提示&#xff1a;调光曲线是调光设备重要的参数之一&#xff0c;它直接影响到了灯光输出的效果&#xff0c;是数字化调光设备性能的体现。上面这句话包含了三点内容&#xff0c;我们逐条解析。 调光曲线是调光设备重要的参…

TCP/IP三次握手与四次握手

原文地址 http://blog.csdn.net/whuslei/article/details/6667471 http://blog.csdn.net/wo2niliye/article/details/48447933 建立TCP需要三次握手才能建立&#xff0c;而断开连接则需要四次握手。整个过程如下图所示&#xff1a; 先来看看如何建立连接的。 首先Client端发送连…

vim支持nginx语法高亮

下载nginx源码&#xff0c;解压之后&#xff0c;将contribu/vim/*拷贝到~/.vim/目录&#xff0c;如果没有~/.vim/目录&#xff0c;则创建即可。 cp -r contrib/vim/* ~/.vim/或 mkdir -p ~/.vim/ cp -r contrib/vim/* ~/.vim/此时再打开conf/nginx.conf就可以看到已经语法高亮…

C语言操作mysql

php中 mysqli, pdo 可以用 mysqlnd 或 libmysqlclient 实现 前者 从 php 5.3.0起已内置到php中, 并且支持更多的特性&#xff0c;推荐用 mysqlnd mysqlnd &#xff0c; libmysqlclient 对比&#xff1a;http://php.net/manual/en/mysqlinfo.library.choosing.php mysqlnd 目前是…

每日温度

根据每日 气温 列表&#xff0c;请重新生成一个列表&#xff0c;对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高&#xff0c;请在该位置用 0 来代替。 例如&#xff0c;给定一个列表 temperatures [73, 74, 75, 71, 69, 72, 76, 73]&#xf…

什么是Modbus

什么是Modbus 1. Modbus如何工作 Modbus是通过设备之间的几根连线来传递数据&#xff0c;最简单的设置就是主站和从站之间用一跟串口线相连。数据通过一串0或者1来传递&#xff0c;也就是位。0为正电压&#xff0c;1为负电压。位数据传递速度非常快&#xff0c;常见的传输速度为…

Android实例-拍摄和分享照片、分享文本(XE8+小米2)

结果&#xff1a; 1.分享文本不好使&#xff0c;原因不明。有大神了解的&#xff0c;请M我&#xff0c;在此十分感谢。 2.如果想支持图片编辑&#xff0c;将Action事件的Editable改为True。 相关资料&#xff1a; 官网地址&#xff1a;http://docwiki.embarcadero.com/RADStudi…

go语言 expected ; found a

错误代码&#xff0c;这是一段测试go语言类型转换的代码 package type_testimport "testing"type MyInt int64func TestImplicit(t *testing.T) {var a int32 1var b int64 3b (int64)avar c MyInt 4// c bt.Log(a, b, c) }报错代码 b (int64)a改正 b int6…

win8 metro 调用摄像头拍摄照片并将照片保存在对应的位置

刚刚做过这类开发&#xff0c;所以就先献丑了&#xff0c;当然所贴上的源代码都是经过验证过的&#xff0c;已经执行成功了&#xff0c;希望能够给大家一些借鉴&#xff1a; 以下是metro UI代码&#xff1a; <Pagex:Class"Camera.MainPage"xmlns"http://sche…

poj 3678 Katu Puzzle(2-sat)

Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a boolean operator op (one of AND, OR, XOR) and an integer c (0 ≤ c ≤ 1). One Katu is solvable if one can find each vertex Vi a value Xi (0 ≤ Xi ≤ 1) suc…

go 语言 first argument to append must be slice

错误代码 func TestSliceGrowing(t *testing.T) {s : [4]int{1, 2, 3, 4}for i :0; i<10; i {s append(s, i)t.Log(len(s), cap(s))} }报错代码 s append(s, i)原因&#xff1a;append的第一个参数必须是切片 更正 func TestSliceGrowing(t *testing.T) {s : []int{1,…

豆瓣网静态页面

divcss网站登录注册豆瓣读书视频 音乐同城小组阅读 豆瓣FM东西更多豆瓣视频 影讯&购票电视剧排行榜 分类影评预告片 向后向前3/5正在热映全部正在热映>>即将上映 烈日灼心 4.7终结者&#xff1a;创世纪... 4.7百团大战 4.7刺客&#xff1a;聂隐娘 4.7近期热门更多影视…

C++并发编程实战(豆瓣评分5.4)

评分已说明一切&#xff0c;切勿踩坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 推荐的翻译 C并发编程实战 关注公众号回复【C并发编程实…

奔跑吧,兄弟

10月底的时候&#xff0c;不能忍受老婆的奚落&#xff0c;开始了我的跑步计划。 说说&#xff0c;跑步需要注意的事项&#xff0c;首先你得有双跑步鞋&#xff0c;我有一次是穿了薄底鞋跑的&#xff0c;结果&#xff0c;打满了水泡。跑步前控制饮水&#xff0c;最好在饮食后2个…