用平常语言介绍神经网络

上传人:卷*** 文档编号:125261310 上传时间:2022-07-26 格式:DOC 页数:45 大小:343.50KB
收藏 版权申诉 举报 下载
用平常语言介绍神经网络_第1页
第1页 / 共45页
用平常语言介绍神经网络_第2页
第2页 / 共45页
用平常语言介绍神经网络_第3页
第3页 / 共45页
资源描述:

《用平常语言介绍神经网络》由会员分享,可在线阅读,更多相关《用平常语言介绍神经网络(45页珍藏版)》请在装配图网上搜索。

1、用平常语言简介神经网络(Neural Networks in Plain English)由于我们没有较好理解大脑,我们常常试图用最新的技术作为一种模型来解释它。在我童年的时候,我们都坚信大脑是一部电话互换机。(否则它还能是什么呢?)我当时还看到英国出名神经学家谢林顿把大脑的工作挺有趣地比作一部电报机。更早些时候,弗罗伊德常常把大脑比作一部水力发电机,而莱布尼茨则把它比作了一台磨粉机。我还听人说,古希腊人把大脑功能想象为一付弹弓。显然,目前要来比方大脑的话,那只也许是一台数字电子计算机了。 John R.Searle 注11.神经网络简介(Introduction to Neural Netw

2、orks)曾有很长一种时期,人工神经网络对我来说是完全神秘的东西。固然,有关它们我在文献中已经读过了,我也能描述它们的构造和工作机理,但我始终没有能“啊哈!”一声,犹如你头脑中一种难于理解的概念有幸忽然得到理解时的感觉那样。我的头上好象始终有个榔头在敲着,或者像电影AnimalHouse(中文片名为“动物屋”)中那个在痛苦地尖叫“先生,谢谢您,再给我一种啊!”的可怜家伙那样。我无法把数学概念转换成实际的应用。有时我甚至想把我读过的所有神经网络的书的作者都抓起来,把她们缚到一棵树上,大声地向她们吼叫:“不要再给我数学了,快给我一点实际东西吧!”。但无需说,这是永远不也许发生的事情。我不得不自己来

3、弥补这个空隙.由此我做了在那种条件下唯一可以做的事情。我开始干起来了。这样几种星期后,在一种美丽的日子里,当时我在苏格兰海边度假,当我越过一层薄雾凝视着狭长的海湾时,我的头脑忽然受到一种冲击。一下子悟到了人工神经网络是如何工作的。我得到“啊哈!”的感觉了!但我此时身边只有一种帐篷和一种睡袋,尚有半盒子的脆玉米片,没有电脑可以让我迅速写出某些代码来证明我的直觉。Arghhhhh!这时我才想到我应当买一台手提电脑。不管如何,几天后我回到家了,我立即让我的手指在键盘上飞舞起来。几种小时后我的第一人工神经网络程序终于编成和运营了,并且工作得挺好!自然,代码写的有点乱,需要进行整顿,但它的确已能工作了,

4、并且,更重要的是,我还懂得它为什么能工作!我可以告诉你,那天我是一位非常得意的人。我但愿本书传递给你的就是这种“啊哈!”感觉。当我们学完遗传算法时,你也许已尝到了一点感觉,但你但愿这种感觉是美妙的话,那就要等把神经网络部分整个学完。2.生物学的神经网络-大脑 (A Biological Neural NetworkThe Brain).你的大脑是一块灰色的、像奶冻同样的东西。它并不像电脑中的CPU那样,运用单个的解决单元来进行工作。如果你有一具新鲜地保存到福尔马林中的尸体,用一把锯子小心地将它的头骨锯开,搬掉头盖骨后,你就能看到熟悉的脑组织皱纹。大脑的外层象一种大核桃那样,所有都是起皱的图0左

5、,这一层组织就称皮层(Cortex)。如果你再小心地用手指把整个大脑从头颅中端出来,再去拿一把外科医生用的手术刀,将大脑切成片,那么你将看到大脑有两层图0右:灰色的外层(这就是“灰质”一词的来源,但没有通过福尔马林固定的新鲜大脑实际是粉红色的。)和白色的内层。灰色层只有几毫米厚,其中紧密地压缩着几十亿个被称作neuron(神经细胞、神经元)的微小细胞。白色层在皮层灰质的下面,占据了皮层的大部分空间,是由神经细胞互相之间的无数连接构成。皮层象核桃同样起皱,这可以把一种很大的表面区域塞进到一种较小的空间里。这与光滑的皮层相比能容纳更多的神经细胞。人的大脑大概具有1OG(即100亿)个这样的微小解决

6、单元;一只蚂蚁的大脑大概也有250,OOO个。如下表l显示了人和几种动物的神经细胞的数目。图0大脑的外形和切片形状表l 人和几种动物的神经细胞的数目动 物神经细胞的数目(数量级)蜗 牛10,000 (=104)蜜 蜂100,000 (=105)蜂 雀10,000,000 (=107)老 鼠100,000,000 (=108)人 类10,000,000,000 (=1010)大 象100,000,000,000 (=1011)图1神经细胞的构造在人的生命的最初9个月内,这些细胞以每分钟25,000个的惊人速度被创立出来。神经细胞和人身上任何其她类型细胞十分不同,每个神经细胞都长着一根像电线同样的

7、称为轴突(axon)的东西,它的长度有时伸展到几厘米译注,用来将信号传递给其她的神经细胞。神经细胞的构造如图1所示。它由一种细胞体(soma)、某些树突(dendrite)、和一根可以很长的轴突构成。神经细胞体是一颗星状球形物,里面有一种核(nucleus)。树突由细胞体向各个方向长出,自身可有分支,是用来接受信号的。轴突也有许多的分支。轴突通过度支的末梢(terminal)和其她神经细胞的树突相接触,形成所谓的突触(Synapse,图中未画出),一种神经细胞通过轴突和突触把产生的信号送到其她的神经细胞。每个神经细胞通过它的树突和大概10,000个其她的神经细胞相连。这就使得你的头脑中所有神经

8、细胞之间连接总计也许有l,000,000,000,000,000个。这比100兆个现代电话互换机的连线数目还多。因此毫不奇怪为什么我们有时会产生头疼毛病!有趣的事实曾经有人估算过,如果将一种人的大脑中所有神经细胞的轴突和树突依次连接起来,并拉成一根直线,可从地球连到月亮,再从月亮返回地球。如果把地球上所有人脑的轴突和树突连接起来,则可以伸展到离开们近来的星系!神经细胞运用电-化学过程互换信号。输入信号来自另某些神经细胞。这些神经细胞的轴突末梢(也就是终端)和本神经细胞的树突相遇形成突触(synapse),信号就从树突上的突触进入本细胞。信号在大脑中实际如何传播是一种相称复杂的过程,但就我们而言

9、,重要的是把它当作和现代的计算机同样,运用一系列的0和1来进行操作。就是说,大脑的神经细胞也只有两种状态:兴奋(fire)和不兴奋(即克制)。发射信号的强度不变,变化的仅仅是频率。神经细胞运用一种我们还不懂得的措施,把所有从树突上突触进来的信号进行相加,如果所有信号的总和超过某个阀值,就会激发神经细胞进入兴奋(fire)状态,这时就会有一种电信号通过轴突发送出去给其她神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。这样的解释有点过度简朴化,但已能满足我们的目的。神经细胞运用电-化学过程互换信号。输入信号来自另某些神经细胞。这些神经细胞的轴突末梢(也就是终端)和本神经细胞的树突相遇形

10、成突触(synapse),信号就从树突上的突触进入本细胞。信号在大脑中实际如何传播是一种相称复杂的过程,但就我们而言,重要的是把它当作和现代的计算机同样,运用一系列的0和1来进行操作。就是说,大脑的神经细胞也只有两种状态:兴奋(fire)和不兴奋(即克制)。发射信号的强度不变,变化的仅仅是频率。神经细胞运用一种我们还不懂得的措施,把所有从树突上突触进来的信号进行相加,如果所有信号的总和超过某个阀值,就会激发神经细胞进入兴奋(fire)状态,这时就会有一种电信号通过轴突发送出去给其她神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。这样的解释有点过度简朴化,但已能满足我们的目的。 正是

11、由于数量巨大的连接,使得大脑具有难以置信的能力。尽管每一种神经细胞仅仅工作于大概100Hz的频率,但因各个神经细胞都以独立解决单元的形式并行工作着,使人类的大脑具有下面这些非常明显的特点:能实现无监督的学习。 有关我们的大脑的难以置信的事实之一,就是它们可以自己进行学习,而不需要导师的监督教导。如果一种神经细胞在一段时间内受到高频率的刺激,则它和输入信号的神经细胞之间的连接强度就会按某种过程变化,使得该神经细胞下一次受到鼓励时更容易兴奋。这一机制是50近年此前由DonardHebb在她写的Organination of Behavior一书中论述的。她写道: “当神经细胞 A的一种轴突反复地或

12、持久地鼓励另一种神经细胞B后,则其中的一种或同步两个神经细胞就会发生一种生长过程或新陈代谢式的变化,使得励 B细胞之一的A细胞,它的效能会增长” 与此相反的就是,如果一种神经细胞在一段时间内不受到鼓励,那么它的连接的有效性就会慢慢地衰减。这一现象就称可塑性(plasticity)。对损伤有冗余性(tolerance)。大脑虽然有很大一部分受到了损伤,它仍然可以执行复杂的工作。一种出名的实验就是训练老鼠在一种迷宫中行走。然后,科学家们将其大脑一部分一部分地、越来越大地加以切除。她们发现,虽然老鼠的很大的一部大脑被切除后,它们仍然能在迷宫中找到行走途径。这一事实证明了,在大脑中,知识并不是保存在一

13、种局部地方。此外所作的某些实验则表白,如果大脑的一小部分受到损伤,则神经细胞能把损伤的连接重新生长出来。解决信息的效率极高。神经细胞之间电-化学信号的传递,与一台数字计算机中CPU的数据传播相比,速度是非常慢的,但因神经细胞采用了并行的工作方式,使得大脑可以同步解决大量的数据。例如,大脑视觉皮层在解决通过我们的视网膜输入的一幅图象信号时,大概只要100ms的时间就能完毕。考虑到你的神经细胞的平均工作频率只有100Hz,100ms的时间就意味只能完毕10个计算环节!想一想通过我们眼睛的数据量有多大,你就可以看到这真是一种难以置信的伟大工程了。善于归纳推广。大脑和数字计算机不同,它极擅长的事情之一

14、就是模式辨认,并能根据已熟悉信息进行归纳推广(generlize)。例如,我们可以阅读她人所写的手稿上的文字,虽然我们此前历来没见过她所写的东西。它是故意识的。意识(consciousness)是神经学家和人工智能的研究者广泛而又热烈地在辩论的一种话题。有关这一论题已有大量的文献出版了,但对于意识实际究竟是什么,至今尚未获得实质性的统一见解。我们甚至不能批准只有人类才故意识,或者涉及动物王国中人类的近亲在内才故意识。一头猩猩故意识吗?你的猫故意识吗?上星期晚餐中被你吃掉的那条鱼故意识吗?因此,一种人工神经网络(Artificial neural network,简称ANN)就是要在现代数字计算

15、机既有规模的约束下,来模拟这种大量的并行性,并在实现这一工作时,使它能显示许多和生物学大脑相类似的特性。下面就让我们瞧瞧它们的表演吧!3 数字版的神经网络 (The Digital Version)上面我们看到了生物的大脑是由许多神经细胞构成,同样,模拟大脑的人工神经网络ANN是由许多叫做人工神经细胞(Artificialneuron,也称人工神经原,或人工神经元)的细小构造模块构成。人工神经细胞就像真实神经细胞的一种简化版,但采用了电子方式来模拟实现。一种人工神经网络中需要使用多少个数的人工神经细胞,差别可以非常大。有的神经网络只需要使用10个以内的人工神经细胞,而有的神经网络也许需要使用几

16、千个人工神经细胞。这完全取决于这些人工神经网络准备实际用来做什么。有趣的事实 有一种叫 Hugo deGaris的同行,曾在一种雄心勃勃的工程中创立并训练了一种涉及1000,000,000个人工神经细胞的网络。这个人工神经网络被她非常巧妙地建立起来了,它采用蜂房式自动机构造,目的就是为一机器客户定制一种叫做CAM BrainMachine(“CAM大脑机器”)的机器(CAM就是Cellular AutomataMachine的缩写)。此人曾自夸地宣称这一人工网络机器将会有一只猫的智能。许多神经网络研究人员觉得她是在“登星”了,但不幸的是,雇用她的公司在她的梦想尚未实现之前就破产了。此人目前犹她

17、州,是犹她州大脑工程(Utah BrainProject)的领导。时间将会告诉我们她的思想最后与否能变成实际故意义的东西。译注 我想你目前也许很想懂得,一种人工神经细胞究竟是一种什么样的东西?但是,它事实上什么东西也不像; 它只是一种抽象。还是让我们来察看一下图2吧,这是表达一种人工神经细胞的一种形式。译注Hugo de Garis目前为犹她州立大学专家,有关她和她的CAM机器,可在该校网站的一种网页上看到报道,其上有真实的照片,见degaris图2 一种人工神经细胞图中,左边几种灰底圆中所标字母w代表浮点数,称为权重(weight,或权值,权数)。进入人工神经细胞的每一种input(输入)都

18、与一种权重w相联系,正是这些权重将决定神经网络的整体活跃性。你目前临时可以设想所有这些权重都被设立到了-和之间的一种随机小数。由于权重可正可负,故能对与它关联的输入施加不同的影响,如果权重为正,就会有激发(excitory)作用,权重为负,则会有克制(inhibitory)作用。当输入信号进入神经细胞时,它们的值将与它们相应的权重相乘,作为图中大圆的输入。大圆的核是一种函数,叫鼓励函数(activationfunction),它把所有这些新的、通过权重调节后的输入所有加起来,形成单个的鼓励值(activationvalue)。鼓励值也是一浮点数,且同样可正可负。然后,再根据鼓励值来产生函数的输

19、出也即神经细胞的输出:如果鼓励值超过某个阀值(作为例子我们假设阀值为1.0),就会产生一种值为1的信号输出;如果鼓励值不不小于阀值1.0,则输出一种0。这是人工神经细胞鼓励函数的一种最简朴的类型。在这里,从鼓励值产生输出值是一种阶跃函数译注。看一看图3后你就能猜到为什么有这样的名称。图3 阶跃鼓励函数译注 由图可知阶跃函数是一元的,而鼓励函数既然能把多种输入相加应为多元,故需加以区别。如果到目前为止你对这些还没有获得诸多感觉,那也不必紧张。窍门就是: 不要企图去感觉它,临时就随波逐流地跟我一起向前走吧。在经历本章的若干处后,你最后就会开始弄清晰它们的意义。而目前,就放松一点继续读下去吧。3.1

20、 目前需要某些数学了(Now for Some Math) 此后讨论中,我将尽量把数学减少到绝对少量,但学习某些数学记号对下面还是很有用的。我将把数学一点一点地喂给你,在达到有关章节时向你简介某些新概念。我但愿采用这样的方式能使你的头脑能更舒服地吸取所有的概念,并使你在开发神经网络的每个阶段都能看到如何把数学应用到工作中。目前一方面让我们来看一看,如何把我在此之前告诉你的所有知识用数学方式体现出来。 一种人工神经细胞(从目前开始,我将把“人工神经细胞”简称它为“神经细胞”) 可以有任意n个输入,n代表总数。可以用下面的数学体现式来代表所有n个输入: x1, x2, x3, x4, x5, .,

21、 xn同样 n 个权重可体现为: w1, w2, w3, w4, w5 ., wn请记住,鼓励值就是所有输入与它们相应权重的之乘积之总和,因此,目前就可以写为: a = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 +.+ wnxn以这种方式写下的求和式,我在第5章“建立一种更好的遗传算法”中已提到,可以用希腊字母来简化:注:神经网络的各个输入,以及为各个神经细胞的权重设立,都可以看作一种n维的向量。你在许多技术文献中常常可以看到是以这样的方式来引用的。 下面我们来考察在程序中应当如何实现?假设输入数组和权重数组均已初始化为xn和wn,则求和的代码如下:double act

22、ivation = 0;for(int i=0; in; +i)activation += x * w;图4以图形的方式表达了此方程。请别忘掉,如果鼓励值超过了阀值,神经细胞就输出1;如果激活不不小于阀值,则神经细胞的输出为0。这和一种生物神经细胞的兴奋和克制是等价的。我们假设一种神经细胞有5个输入,她们的权重w都初始化成正负1之间的随机值(-1 w 激活阀值,因此这个神经细胞将输出1。 在进一步读下去之前,请你一定要确切弄懂鼓励函数如何计算。表2神经细胞鼓励值的计算 输 入 权 重 输入*权重的乘积 运营后总和 1 0.5 0.5 0.5 0 -0.2 0 0.5 1 -0.3 -0.3 0

23、.2 1 0.9 0.9 1.1 0 0.1 0 1.1 3.2行,我懂得什么是神经细胞了,但用它来干什么呢?大脑里的生物神经细胞和其她的神经细胞是互相连接在一起的。为了创立一种人工神经网络,人工神经细胞也要以同样方式互相连接在一起。为此可以有许多不同的连接方式,其中最容易理解并且也是最广泛地使用的,就是如图5所示那样,把神经细胞一层一层地连结在一起。这一种类型的神经网络就叫前馈网络(feedforwordnetwork)。这一名称的由来,就是由于网络的每一层神经细胞的输出都向前馈送(feed)到了它们的下一层(在图中是画在它的上面的那一层),直到获得整个网络的输出为止。图5 一种前馈网络 由

24、图可知,网络共有三层(译注:输入层不是神经细胞,神经细胞只有两层)。输入层中的每个输入都馈送到了隐藏层,作为该层每一种神经细胞的输入;然后,从隐藏层的每个神经细胞的输出都连到了它下一层(即输出层)的每一种神经细胞。图中仅仅画了一种隐藏层,作为前馈网络,一般地可以有任意多种隐藏层。但在对付你将解决的大多数问题时一层一般是足够的。事实上,有某些问题甚至主线不需要任何隐藏单元,你只要把那些输入直接连结到输出神经细胞就行了。此外,我为图5选择的神经细胞的个数也是完全任意的。每一层实际都可以有任何数目的神经细胞,这完全取决于要解决的问题的复杂性。但神经细胞数目愈多,网络的工作速度也就愈低,由于这一缘故,

25、以及为了其她的几种因素(我将在第9章作出解释),网络的规模总是规定保持尽量的小。 到此我能想象你或许已对所有这些信息感到有些茫然了。我觉得,在这种状况下,我能做的最佳的事情,就是向你简介一种神经网络在现实世界中的实际应用例子,它有望使你自己的大脑神经细胞得到兴奋!不错吧?好的,下面就来了. 你也许已听到或读到过神经网络常常用来作模式辨认。这是由于它们善于把一种输入状态(它所企图辨认的模式)映射到一种输出状态(它曾被训练用来辨认的模式)。下面我们来看它是怎么完毕的。我们以字符辨认作为例子。设想有一种由8x8个格子构成的一块面板。每一种格子里放了一种小灯,每个小灯都可独立地被打开(格子变亮)或关闭

26、(格子变黑),这样面板就可以用来显示十个数字符号。图6显示了数字“4”。 图6用于字符显示的矩阵格点要解决这一问题,我们必需设计一种神经网络,它接受面板的状态作为输入,然后输出一种1或0;输出1代表ANN确认已显示了数字“4”,而输出0表达没有显示“4”。因此,神经网络需要有64个输入(每一种输入代表面板的一种具体格点)和由许多神经细胞构成的一种隐藏层,尚有仅有一种神经细胞的输出层,隐藏层的所有输出都馈送到它。我真但愿你能在你的头脑中画出这个图来,由于要我为你把所有这些小圆和连线统统画出来的确不是一桩快乐的事。一旦神经网络体系创立成功后,它必须接受训练来认出数字“4”。为此可用这样一种措施来完

27、毕:先把神经网的所有权重初始化为任意值。然后给它一系列的输入,在本例中,就是代表面板不同配备的输入。对每一种输入配备,我们检查它的输出是什么,并调节相应的权重。如果我们送给网络的输入模式不是“4”,则我们懂得网络应当输出一种0。因此每个非“4”字符时的网络权重应进行调节,使得它的输出趋向于0。现代表“4”的模式输送给网络时,则应把权重调节到使输出趋向于1。 如果你考虑一下这个网络,你就会懂得要把输出增长到10是很容易的。然后通过训练,就可以使网络能辨认0到9的所有数字。但为什么我们到此停止呢?我们还可以进一步增长输出,使网络能辨认字母表中的所有字符。这本质上就是手写体辨认的工作原理。对每个字符

28、,网络都需要接受许多训练,使它结识此文字的多种不同的版本。到最后,网络不单能结识已经训练的笔迹,还显示了它有明显的归纳和推广能力。也就是说,如果所写文字换了一种笔迹,它和训练集中所有笔迹都略有不同,网络仍然有很大几率来认出它。正是这种归纳推广能力,使得神经网络已经成为可以用于无数应用的一种无价的工具,从人脸辨认、医学诊断,直到跑马赛的预测,此外尚有电脑游戏中的bot(作为游戏角色的机器人)的导航,或者硬件的robot(真正的机器人)的导航。 这种类型的训练称作有监督的学习(supervisedlearnig),用来训练的数据称为训练集(trainingset)。调节权重可以采用许多不同的措施。

29、对本类问题最常用的措施就是反向传播(backpropagation,简称backprop或BP)措施。有关反向传播问题,我将会在本书的背面,当你已能训练神经网络来辨认鼠标走势时,再来进行讨论。在本章剩余部分我将集中注意力来考察此外的一种训练方式,即主线不需要任何导师来监督的训练,或称无监督学习(unsupervised learnig)。 这样我已向你简介了某些基本的知识,目前让我们来考察某些有趣的东西,并向你简介第一种代码工程。4. 聪颖的扫雷机工程(Smart Minesweeper Project) 我要向你简介的第一种完整例子,是怎么使用神经网络来控制具有人工智能的扫雷机的行为。扫雷机

30、工作在一种很简朴的环境中,那里只有扫雷机以及随机散布的许多地雷。图7运营中的演示程序。尽管书上图形画成了黑白色,但当你运营程序时性能最佳的扫雷机将显现为红色。地雷,你也许已经猜到,就是那些小方形。工程的目的是创立一种网络,它不需要从我们这里得到任何协助,就能自己进行演化(evolve)去寻找地雷。为了实现这一功能,网络的权重将被编码到基因组中,并用一种遗传算法来演化它们。 怎么样,很酷吧?提示(重要) 如果你跳过前面的某些章节来到这里,而你又不理解如何使用遗传算法,则在进一步阅读下面的内容之前,你应回到前面去补读一下有关遗传算法的内容。 一方面让我解释人工神经网络(ANN)的体系构造。我们需要

31、决定输入的数目、输出的数目、尚有隐藏层和每个隐藏层中隐藏单元的数目。4.1 选择输出(Choosing the Outputs) 那么,人工神经网络如何控制扫雷机的行动呢?较好!我们把扫雷机想象成和坦克车同样,通过左右2个能转动的履带式轮轨(track)来行动的。见图案9.8。图8扫雷机的控制扫雷机向前行进的速度,以及向左、向右转弯的角度,都是通过变化2个履带轮的相对速度来实现的。因此,神经网络需要2个输入,1个是左侧履带轮的速度,另一种是右侧履带轮的速度。啊,但是.,我听见你在嘀咕了。如果网络只能输出一种或一种,我们怎么能控制车轨移动的快慢呢?你是对的;如果运用此前描述的阶跃函数来决定输出,

32、我们就主线无法控制扫雷机实际移动。幸好,我有一套戏法,让我卷起袖子来,把鼓励函数的输出由阶跃式变化成为在之间持续变化的形式,这样就可以供扫雷机神经细胞使用了。为此,有几种函数都能做到这样,我们使用的是一种被称为逻辑斯蒂S形函数(logistic sigmoidfunction)译注1。该函数所实现的功能,本质上说,就是把神经细胞原有的阶跃式输出曲线钝化为一光滑曲线,后者绕y轴0.5处点对称译注2,如图9所示。 译注1 logistic有计算的或符号逻辑的等意思在内,和逻辑的(logic)意义不同。 译注2 点对称图形绕对称点转180度后能与原图重叠。若f(x)以原点为点对称,则有f(-x)=-

33、f(x)图9S形曲线。当神经细胞的鼓励值趋于正、负无穷时,S形函数分别趋于或。负的鼓励值相应的函数值都0.5。S形函数用数学体现式写出来则为: 这个方程看上去也许会吓唬某些人,但其实很简朴。e是数学常数,近似等于2.7183,a是神经细胞的鼓励值,它是函数的自变量,而p是一种用来控制曲线形状变化快慢或陡峭性的参数。p一般设定为1。当p赋以较大值时,曲线就显得平坦,反之,就会使曲线变为陡峭。见图1O。很低的p值所生成的函数就和阶跃函数近似。P值的大小用来控制何时使神经网络由低变高开始翻转有很大作用,但是在本例子中我们将它保持为。 注:“S型”的英文原名Sigmoid 或Sigmoidal 本来是

34、根据希腊字“Sigma”得来的,但非常巧它也可以说成是曲线的一种形状。 图7。10不同的S形响应曲线。4.2 选择输入(Choosing the Inputs)上面我们已经把输出安排好了,目前我们来考虑输入,拟定网络需要什么样的输入?为此,我们必须想象一下扫雷机的具体细节:需要什么样的信息才干使它朝地雷迈进?你也许想到的第一种输入信息清单是: 扫雷机的位置(x1,y1) 与扫雷机最接近的地雷的位置(x2,y2) 代表扫雷机迈进方向的向量(x3,y3) 这样一共得到6个输入。但是,要网络使用这些输入,工作起来就非常困难,由于,网络在像我们但愿的那样执行工作之前,必须寻找所有6个输入之间的数学关系

35、,而这有相称工作量。可以把此作为一种练习倒是很抱负的:去试试如何给出至少数量的输入而仍能为网络传达解决问题所需要的所有信息。你的网络使用的输入愈少,网络所规定的神经细胞数目也愈少。而较少的神经细胞就意味更迅速的训练和更少的计算,有助于网络更高速度的工作。只要作少量的额外考虑,就可以把输入的个数减少为4,这就是图11中所画出的两个向量的个参数。 把神经网络的所有输入进行规范化是一种好想法。这里的意思并不是说每个输入都要变化大小使它们都在01间,而是说每一种输入应当受到同等注重。例如,拿我们已经讨论过的扫雷机输入为例。瞄准向量或视线向量(look-atvector)总是一种规范化向量,即长度等于1

36、,分量x和y都在01间。但从扫雷机达到其近来地雷的向量就也许很大,其中的一种分量甚至有也许和窗体的宽度或高度同样大。如果这个数据以它的原始状态输入到网络,网络对有较大值的输入将显得更敏捷,由此就会使网络性能变差。因此,在信息输入到神经网络中去之前,数据应预先定比(scaled)和原则化(standardized),使它们大小相似(similar)。在本特例中,由扫雷机引到与其最接近地雷的向量需要进行规范化(normalized)。这样可以使扫雷机的性能得到改良。图11 选择输入。小技巧: 有时,你把输入数据重新换算(rescale)一下,使它以0点为中心,就能从你的神经网络获得最佳的性能。这一

37、小窍门在你设计网络时永远值得一试。但我在扫雷机工程中没有采用这一措施,这是由于我想使用一种更直觉的措施。 4.3 隐藏的神经细胞要多少?(How many Hidden Neurons?)到此我们已把输入、输出神经细胞的数目和种类拟定下来了,下一步是拟定隐藏层的数目,并拟定每个隐藏层中神经细胞必须有多少?但遗憾的是,还没有一种确切的规则可用来计算这些。它们的开发又需要凭个人的“感觉”了。某些书上和文章中的确给过某些提纲性的东西,告诉你如何去决定隐藏神经细胞个数,但业内专家们的一致见解是:你只能把任何建议当作不可全信的东西,重要还要靠自己的不断尝试和失败中获得经验。但你一般会发现,你所遇到的大多

38、数问题都只要用一种隐藏层就能解决。因此,本领的高下就在于如何为这一隐藏层拟定最合适的神经细胞数目了。显然,个数是愈少愈好,由于我前面已经提及,数目少的神经细胞可以造就迅速的网络。一般,为了拟定出一种最优总数,我总是在隐藏层中采用不同数目的神经细胞来进行实验。我在本章所编写的神经网络工程的.第一版本中一共使用了10个隐藏神经细胞(固然,我的这个数字也不一定是最佳的)。你应环绕这个数字的附近来做游戏,并观测隐藏层神经细胞的数目对扫雷机的演化会产生什么样的影响。不管如何,理论已经够了,让我们拿一种具体程序来看看吧!你可以在本书所附光盘的Chapter7/Smart Sweepers v1.0文献夹中

39、找到本章下面几页即将描述的所有程序的源码。4.4CNeuralNet.h(神经网络类的头文献)在CNeuralNet.h 文献中,我们定义了人工神经细胞的构造、定义了人工神经细胞的层的构造、以及人工神经网络自身的构造。一方面我们来考察人工神经细胞的构造。4.4.1SNeuron(神经细胞的构造) 这是很简朴的构造。人工神经细胞的构造中必须有一种正整数来纪录它有多少个输入,还需要有一种向量std:vector来表达它的权重。请记住,神经细胞的每一种输入都要有一种相应的权重。Struct SNeuron / 进入神经细胞的输入个数 int m_NumInputs; / 为每一输入提供的权重 vec

40、tor m_vecWeight; /构造函数 SNeuron(int NumInputs);如下就是SNeuron 构造体的构造函数形式:SNeuron:SNeuron(int NumInputs): m_NumInputs(NumInputs+1)( / 我们要为偏移值也附加一种权重,因此输入数目上要 +1 for (int i=0; i= t上式是使细胞输出为的条件。由于网络的所有权重需要不断演化(进化),如果阀值的数据也能一起演化,那将是非常重要的。要实现这一点不难,你使用一种简朴的诡计就可以让阀值变成权重的形式。从上面的方程两边各减去t,得: w1x1 + w2x2 + w3x3 +.

41、+ wnxn t = 0这个方程可以再换用一种形式写出来,如下: w1x1 + w2x2 + w3x3 +.+ wnxn + t *(1) = 0到此,我但愿你已能看出,阀值t为什么可以想像成为始终乘以输入为-的权重了。这个特殊的权重一般叫偏移(bias),这就是为什么每个神经细胞初始化时都要增长一种权重的理由。目前,当你演化一种网络时,你就不必再考虑阀值问题,由于它已被内建在权重向量中了。怎么样,想法不错吧?为了让你心中绝对敲定你所学到的新的人工神经细胞是什么样子,请再参看一下图12。图12 带偏移的人工神经细胞。4.4.2SNeuronLayer(神经细胞层的构造) 神经细胞层SNeuro

42、nLayer的构造很简朴;它定义了一种如图13中所示的由虚线包围的神经细胞SNeuron所构成的层。 图13 一种神经细胞层。如下就是层的定义的源代码,它应当不再需要任何进一步的解释:struct SNeuronLayer / 本层使用的神经细胞数目int m_NumNeurons; / 神经细胞的层vector m_vecNeurons; SNeuronLayer(int NumNeurons, int NumInputsPerNeuron);;4.4.3CNeuralNet(神经网络类)这是创立神经网络对象的类。让我们来通读一下这一种类的定义:class CNeuralNetprivate

43、: int m_NumInputs; int m_NumOutputs; int m_NumHiddenLayers; int m_NeuronsPerHiddenLyr; / 为每一层(涉及输出层)寄存所有神经细胞的存储器 vectorm_vecLayers;所有private成员由其名称容易得到理解。需要由本类定义的就是输入的个数、输出的个数、隐藏层的数目、以及每个隐藏层中神经细胞的个数等几种参数。public: CNeuralNet();该构造函数运用ini文献来初始化所有的Private成员变量,然后再调用CreateNet来创立网络。 / 由SNeurons创立网络 void Cre

44、ateNet();我过一会儿立即就会告诉你这个函数的代码。 / 从神经网络得到(读出)权重 vector GetWeights()const;由于网络的权重需要演化,因此必须创立一种措施来返回所有的权重。这些权重在网络中是以实数型向量形式表达的,我们将把这些实数表达的权重编码到一种基因组中。当我开始谈论本工程的遗传算法时,我将为您确切阐明权重如何进行编码。 / 返回网络的权重的总数 int GetNumberOfWeights()const; / 用新的权重替代原有的权重 void PutWeights(vector &weights); 这一函数所做的工作与函数GetWeights所做的正好

45、相反。当遗传算法执行完一代时,新一代的权重必须重新插入神经网络。为我们完毕这一任务的是PutWeight措施。 / S形响应曲线 inline double Sigmoid(double activation, double response); 当已知一种神经细胞的所有输入*重量的乘积之和时,这一措施将它送入到S形的鼓励函数。 / 根据一组输入,来计算输出 vector Update(vector &inputs);对此Update函数函数我立即就会来进行注释的。; / 类定义结束4.4.3.1CNeuralNet:CreateNet(创立神经网络的措施) 我在前面没有对CNeuralNet

46、的2个措施加以注释,这是由于我要为你显示它们的更完整的代码。这2个措施的第一种是网络创立措施CreateNet。它的工作就是把由细胞层SNeuronLayers所收集的神经细胞SNeurons聚在一起来构成整个神经网络,代码为:void CNeuralNet:CreateNet() / 创立网络的各个层 if (m_NumHiddenLayers 0) /创立第一种隐藏层译注 m_vecLayers.push_back(SNeuronLayer(m_NeuronsPerHiddenLyr, m_NumInputs); for( int i=O; im_NumHiddenLayers-l; +i

47、) m_vecLayers.push_back(SNeuronLayer(m_NeuronsPerHiddenLyr, m_NeuronsPerHiddenLyr); 译注如果容许有多种隐藏层,则由接着for循环即能创立其他的隐藏层。 / 创立输出层 m_vecLayers.push_back(SNeuronLayer(m_NumOutput,m_NeuronsPerHiddenLyr); else /无隐藏层时,只需创立输出层 / 创立输出层 m_vecLayers.push_back(SNeuronLayer(m_NumOutputs, m_NumInputs); 4.4.3.2CNeur

48、alNet:Update(神经网络的更新措施)Update函数(更新函数)称得上是神经网络的“重要劳动力”了。这里,输入网络的数据input是以双精度向量std:vector的数据格式传递进来的。Update函数通过对每个层的循环来解决输入*权重的相乘与求和,再以所得的和数作为鼓励值,通过S形函数来计算出每个神经细胞的输出,正如我们前面最后几页中所讨论的那样。Update函数返回的也是一种双精度向量std:vector,它相应的就是人工神经网络的所有输出。 请你自己花两分钟或差不多的时间来熟悉一下如下的Update函数的代码,这能使你对的理解我们继续要讲的其她内容:vector CNeural

49、Net:Update(vector &inputs) / 保存从每一层产生的输出 vector outputs; int cWeight = 0; / 一方面检查输入的个数与否对的 if (inputs.size() != m_NumInputs) / 如果不对的,就返回一种空向量 return outputs; / 对每一层,. for (int i=0; iO) inputs = outputs; outputs.clear(); cWeight = 0; / 对每个神经细胞,求输入*相应权重乘积之总和。并将总和抛给S形函数,以计算输出 for (int j=0; jm_vecLayers

50、.m_NumNeurons; +j) double netinput = 0; int NumInputs = m_vecLayers.m_vecNeuronsj.m_NumInputs; / 对每一种权重 for (int k=O; kNumInputs-l; +k) / 计算权重*输入的乘积的总和。 netinput += m_vecLayers.m_vecNeuronsj.m_vecWeightk * inputscWeight+; / 加入偏移值 netinput += m_vecLayers.m_vecNeuronsj.m_vecWeightNumInputs-1 * CParams

51、:dBias;别忘掉每个神经细胞的权重向量的最后一种权重实际是偏移值,这我们已经阐明过了,我们总是将它设立成为 1的。我已经在ini文献中涉及了偏移值,你可以环绕它来做文章,考察它对你创立的网络的功能有什么影响。但是,这个值一般是不应当变化的。 / 每一层的输出,当我们产生了它们后,我们就要将它们保存起来。但用累加在一起的 / 鼓励总值一方面要通过S形函数的过滤,才干得到输出outputs.push_back(Sigmoid(netinput,CParams:dActivationResponse); cWeight = 0: return outputs; 4.5 神经网络的编码(Encod

52、ing the Network) 在本书的开始几章中,你已经看到过如何用多种各样的措施为遗传算法编码。但当时我并没有向你简介过一种用实数编码的具体例子,由于我懂得我要留在这里向你简介。我曾经讲到,为了设计一种前馈型神经网络,编码是很容易的。我们从左到右读每一层神经细胞的权重,读完第一种隐藏层,再向上读它的下一层,把所读到的数据依次保存到一种向量中,这样就实现了网络的编码。因此,如果我们有图14所示的网络,则它的权重编码向量将为: 0.3, -O.8, -O.2, 0.6, O.1, -0.l, 0.4, 0.5在这一网络中,为了简朴,我没有把偏移值的权重涉及进去。但在实际实现编码时,你必须涉及

53、偏移值这个权重,否则你肯定无法获得你所需要的成果。图14 为权重编码。在此之前讲的事情你都懂了吗?好极了,那下面就让我们转来考虑,如何用遗传算法来操纵已编码的基因吧。4.6遗传算法(The Genetic Algorithm) 到此,所有的权重已经象二进制编码的基因组那样,形成了一种串,我们就可以象本书早先讨论过的那样来应用遗传算法了。遗传算法(GA)是在扫雷机已被容许按照顾客指定的帧数(为了某种缘故, 我下面更喜欢将帧数称作滴答数,英文是ticks)运转后执行的。你可以在ini文献中找到这个滴答数(iNumTicks)的设立。下面是基因组构造体的代码。这些对于你应当是十分面熟的东西了。Str

54、uct SGenomevector vecWeights;double dFitness;SGenome():dFitness(0) SGenome(vector w, double f):vecWeights(w),dFitness(f)/重载的排序措施 friend booloperator(const SGenome& lhs, const SGenome& rhs) return (lhs.dFitness rhs.dFitness); ;从上面的代码你可看出,这一SGenome构造和我们在本书所有其她地方见到的SGenome构造几乎完全一致,唯一的差别就是这里的染色体是一种双精度向量

55、std:vector。因此,可以和一般同样来应用杂交操作和选择操作。但突变操作则稍微有些不同,这里的权重值是用一种最大值为dMaxPerturbation的随机数来搔扰的。这一参数dMaxPerturbation在ini文献中已作了声明。此外,作为浮点数遗传算法,突变率也被设定得更高些。在本工程中,它被设成为0.1。下面就是扫雷机工程遗传算法类中所见到的突变函数的形式:void CGenAlg:Mutate(vector &chromo)/ 遍历权重向量,按突变率将每一种权重进行突变for (int i=0; ichromo.size(); +i) / 我们要骚扰这个权重吗? if (RandFloat() m_dMutationRate) / 为权重增长

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!