ImageVerifierCode 换一换
格式:DOCX , 页数:45 ,大小:381.52KB ,
资源ID:6084771      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6084771.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(神经网络入门(Neural Networks in Plain English).docx)为本站会员(tkhy51908)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

神经网络入门(Neural Networks in Plain English).docx

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

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

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

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

5、层象一个大核桃那样,全部都是起皱的图 0 左,这一层组织就称皮层(Cortex)。如果你再小心地用手指把整个大脑从头颅中端出来,再去拿一把外科医生用的手术刀,将大脑切成片,那么你将看到大脑有两层图 0 右: 灰色的外层(这就是“灰质”一词的来源,但没有经过福尔马林固定的新鲜大脑实际是粉红色的。) 和白色的内层。灰色层只有几毫米厚,其中紧密地压缩着几十亿个被称作 neuron(神经细胞、神经元)的微小细胞。白色层在皮层灰质的下面,占据了皮层的大部分空间,是由神经细胞相互之间的无数连接线组成(但没有神经细胞本身,正如印刷电路板的背面,只有元件的连线,而没有元件本身那样,译注)。皮层象核桃一样起皱,

6、这可以把一个很大的表面区域塞进到一个较小的空间里。这与光滑的皮层相比能容纳更多的神经细胞。人的大脑大约含有 10G(即 100 亿)个这样的微小处理单元;一只蚂蚁的大脑大约也有 250,000 个。 以下表 1 显示了人和几种动物的神经细胞的数目。表 l 人和几种动物的神经细胞的数目动 物 种 类 神经细胞的数目(数量级)蜗 牛 10,000(=10 4)蜜 蜂 100,000 (=10 5)蜂 雀 10,000,000 (=10 7)老 鼠 100,000,000 (=10 8)人 类 10,000,000,000 (=10 10)大 象 100,000,000,000 (=10 11)图

7、0-1 大脑半球像核桃 图 0-2 大脑皮层由灰质和白质组成图 0 大脑的外形和切片形状图 1 神经细胞的结构在人的生命的最初 9 个月内,这些细胞以每分钟 25,000 个的惊人速度被创建出来。神经细胞和人身上任何其他类型细胞十分不同,每个神经细胞都长着一根像电线一样的称为轴突(axon)的东西,它的长度有时伸展到几厘米译注,用来将信号传递给其他的神经细胞。神经细胞的结构如图 1 所示。它由一个细胞体(soma )、一些树突(dendrite) 、和一根可以很长的轴突组成。神经细胞体是一颗星状球形物,里面有一个核(nucleus)。树突由细胞体向各个方向长出,本身可有分支,是用来接收信号的。

8、轴突也有许多的分支。轴突通过分支的末梢(terminal )和其他神经细胞的树突相接触,形成所谓的突触(Synapse), (图中未画出),一个神经细胞通过轴突和突触把产生的信号送到其他的神经细胞。每个神经细胞通过它的树突和大约 10,000 个其他的神经细胞相连。这就使得你的头脑中所有神经细胞之间连接总计可能有 l,000,000,000,000,000 个。这比 100 兆个现代电话交换机的连线数目还多。所以毫不奇怪为什么我们有时会产生头疼毛病!有趣的事实曾经有人估算过,如果将一个人的大脑中所有神经细胞的轴突和树突依次连接起来,并拉成一根直线,可从地球连到月亮,再从月亮返回地球。如果把地球

9、上所有人的脑中的神经细胞的轴突和树突连接起来,则可以伸展到离开们最近的星系!神经细胞利用电-化学过程交换信号。输入信号来自另一些神经细胞。这些神经细胞的轴突末梢(也就是终端)和本神经细胞的树突相遇形成突触(synapse),信号就从树突上的突触进入本细胞。信号在大脑中实际怎样传输是一个相当复杂的过程,但就我们而言,重要的是把它看成和现代的计算机一样,利用一系列的 0 和 1 来进行操作。就是说,大脑的神经细胞也只有两种状态:兴奋(fire)和不兴奋(即抑制)。发射信号的强度不变,变化的仅仅是频率。神经细胞利用一种我们还不知道的方法,把所有从树突突触上进来的信号进行相加,如果全部信号的总和超过某

10、个阀值,就会激发神经细胞进入兴奋(fire)状态,这时就会有一个电信号通过轴突发送出去给其他神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。这样的解释有点过分简单化,但已能满足我们的目的。正是由于数量巨大的连接,使得大脑具备难以置信的能力。尽管每一个神经细胞仅仅工作于大约 100Hz 的频率,但因各个神经细胞都以独立处理单元的形式并行工作着,使人类的大脑具有下面这些非常明显的特点:能实现无监督的学习。 有关我们的大脑的难以置信的事实之一,就是它们能够自己进行学习,而不需要导师的监督教导。如果一个神经细胞在一段时间内受到高频率的刺激,则它和输入信号的神经细胞之间的连接强度就会按某种过

11、程改变,使得该神经细胞下一次受到激励时更容易兴奋。这一机制是 50 多年以前由 Donard Hebb 在他写的Organination of Behavior 一书中阐述的。他写道: “当神经细胞 A 的一个轴突重复地或持久地激励另一个神经细胞 B 后,则其中的一个或同时两个神经细胞就会发生一种生长过程或新陈代谢式的变化,使得激励 B 细胞之一的 A 细胞的效能会增加”与此相反的是,如果一个神经细胞在一段时间内不受到激励,那么它的连接的有效性就会慢慢地衰减。这一现象就称可塑性(plasticity)。 对损伤有冗余性(tolerance)。 大脑即使有很大一部分受到了损伤,它仍然能够执行复杂

12、的工作。一个著名的试验就是训练老鼠在一个迷宫中行走。然后,科学家们将其大脑一部分一部分地、越来越大地加以切除。他们发现,即使老鼠的很大一部份大脑被切除,它们仍然能在迷宫中找到行走路径。这一事实证明了,在大脑中,知识并不是保存在一个局部地方。另外所作的一些试验则表明,如果大脑的一小部分受到损伤,则神经细胞能把损伤的连接重新生长出来。【译注:我想到在人类身上也能见到这种现象:由于心血管病或其他原因引起大面积脑组织坏死的脑梗死病人经过一段时间的康复训练后也能恢复健康,特别是,记忆力并不受损。】处理信息的效率极高。 神经细胞之间电 -化学信号的传递,与一台数字计算机中CPU 的数据传输相比,速度是非常

13、慢的,但因神经细胞采用了并行的工作方式,使得大脑能够同时处理大量的数据。例如,大脑视觉皮层在处理通过我们的视网膜输入的一幅图象信号时,大约只要 100ms 的时间就能完成。考虑到你的神经细胞的平均工作频率只有100Hz,100ms 的时间就意味只能完成 10 个计算步骤!想一想通过我们眼睛的数据量有多大,你就可以看到这真是一个难以置信的伟大工程了。 善于归纳推广。 大脑和数字计算机不同,它极擅长的事情之一就是模式识别,并能根据已熟悉信息进行归纳推广(generlize)。例如,我们能够阅读他人所写的手稿上的文字,即使我们以前从来没见过他所写的东西。 它是有意识的。 意识(consciousne

14、ss)是神经学家和人工智能的研究者广泛而又热烈地在辩论的一个话题。有关这一论题已有大量的文献出版了,但对于意识实际究竟是什么,至今尚未取得实质性的统一看法。我们甚至不能同意只有人类才有意识,或者包括动物王国中人类的近亲在内才有意识。一头猩猩有意识吗?你的猫有意识吗?上星期晚餐中被你吃掉的那条鱼有意识吗?因此,一个人工神经网络( Artificial neural network, 简称 ANN ) 就是要在当代数字计算机现有规模的约束下,来模拟这种大量的并行性, 并在实现这一工作时,使它能显示许多和人或动物大脑相类似的特性。下面就让我们瞧瞧它们的表演吧!【译注 1】引自 John R.Sear

15、le 的 “MINDS,BRAINAND SCIENCE”,P44。John R.Searle 是美国当代哲学-心理学家,写过大量有关大脑和意识本质方面的书。3 数字版的神经网络 (The Digital Version)上面我们看到了生物的大脑是由许多神经细胞组成,同样,模拟大脑的人工神经网络ANN 是由许多叫做人工神经细胞(Artificial neuron,也称人工神经原,或人工神经元)的细小结构模块组成。人工神经细胞就像真实神经细胞的一个简化版,但采用了电子方式来模拟实现。一个人工神经网络中需要使用多少个数的人工神经细胞,差别可以非常大。有的神经网络只需要使用 10 个以内的人工神经细

16、胞,而有的神经网络可能需要使用几千个人工神经细胞。这完全取决于这些人工神经网络准备实际用来做什么。有趣的事实 有一个叫 Hugo de Garis 的同行,曾在一个雄心勃勃的工程中创建并训练了一个包含 1000,000,000 个人工神经细胞的网络。这个人工神经网络被他非常巧妙地建立起来了,它采用蜂房式自动机结构,目的就是为一客户定制一个叫做 CAM BrainMachine(“CAM 大脑机器”) 的机器(CAM 就是 Cellular Automata Machine 的缩写)。此人曾自夸地宣称这一人工网络机器将会有一只猫的智能。许多神经网络研究人员认为他是在“登星” 了,但不幸的是,雇用

17、他的公司在他的梦想尚未实现之前就破产了。此人现在犹他州,是犹他州大脑工程(Utah Brain Project)的领导。时间将会告诉我们他的思想最终是否能变成实际有意义的东西。译注 1 译注 1 Hugo de Garis 现在为犹他州立大学教授,有关他和他的 CAM 机器,可在该校网站的一个网页上看到报道,其上有真实的照片, 见 http:/www.cs.usu.edu/degaris图 2 一个人工神经细胞 我想你现在可能很想知道,一个人工神经细胞究竟是一个什么样的东西?但是,它实际上什么东西也不像; 它只是一种抽象。还是让我们来察看一下图 2 吧,这是表示一个人工神经细胞的一种形式。图中

18、,左边几个灰底圆中所标字母 w 代表浮点数,称为权重(weight,或权值,权数)。进入人工神经细胞的每一个 input(输入)都与一个权重 w 相联系,正是这些权重将决定神经网络的整体活跃性。你现在暂时可以设想所有这些权重都被设置到了-和之间的一个随机小数。因为权重可正可负,故能对与它关联的输入施加不同的影响,如果权重为正,就会有激发(excitory)作用,权重为负,则会有抑制(inhibitory)作用。当输入信号进入神经细胞时,它们的值将与它们对应的权重相乘,作为图中大圆的输入。大圆的核是一个函数,叫激励函数(activation function),它把所有这些新的、经过权重调整后的

19、输入全部加起来,形成单个的激励值(activation value)。激励值也是一浮点数,且同样可正可负。然后,再根据激励值来产生函数的输出也即神经细胞的输出:如果激励值超过某个阀值(作为例子我们假设阀值为 1.0),就会产生一个值为 1 的信号输出;如果激励值小于阀值 1.0,则输出一个 0。这是人工神经细胞激励函数的一种最简单的类型。在这里,从激励值产生输出值是一个阶跃函数译注 2。看一看图 3 后你就能猜到为什么有这样的名称。图 3 阶跃激励函数译注 2 由图可知阶跃函数是一元的,而激励函数既然能把多个输入相加应为多元,故需加以区别。如果到目前为止你对这些还没有获得很多感觉,那也不必担心

20、。窍门就是: 不要企图去感觉它,暂时就随波逐流地跟我一起向前走吧。在经历本章的若干处后,你最终就会开始弄清楚它们的意义。而现在,就放松一点继续读下去吧。3.1 现在需要一些数学了(Now for Some Math)今后讨论中,我将尽量把数学降低到绝对少量,但学习一些数学记号对下面还是很有用的。我将把数学一点一点地喂给你,在到达有关章节时向你介绍一些新概念。我希望采用这样的方式能使你的头脑能更舒适地吸收所有的概念,并使你在开发神经网络的每个阶段都能看到怎样把数学应用到工作中。现在首先让我们来看一看,怎样把我在此之前告诉你的所有知识用数学方式表达出来。一个人工神经细胞(从现在开始,我将把“人工神

21、经细胞”简称它为“神经细胞”) 可以有任意 n 个输入,n 代表总数。可以用下面的数学表达式来代表所有 n 个输入:x1, x2, x3, x4, x5, ., xn同样 n 个权重可表达为:w1, w2, w3, w4, w5 ., wn请记住,激励值就是所有输入与它们对应权重的之乘积之总和,因此,现在就可以写为:a = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 +.+ wnxn以这种方式写下的求和式,我在第 5 章“建立一个更好的遗传算法”中已提到,可以用希腊字母 来简化:译注:神经网络的各个输入,以及为各个神经细胞的权重设置,都可以看作一个 n 维的向量。你在许多

22、技术文献中常常可以看到是以这样的方式来引用的。 下面我们来考察在程序中应该怎样实现?假设输入数组和权重数组均已初始化为 xn和 wn,则求和的代码如下:double activation = 0;for(int i=0; i 激活阀值,所以这个神经细胞将输出 1。在进一步读下去之前,请你一定要确切弄懂激励函数怎样计算。表 2 神经细胞激励值的计算输 入 权 重 输入与权重的乘积 运行后总和 1 0.5 0.5 0.5 0 -0.2 0 0.51 -0.3 -0.3 0.2 1 0.9 0.9 1.1 0 0.1 0 1.1 3.2 行,我知道什么是神经细胞了,但用它来干什么呢?大脑里的生物神经

23、细胞和其他的神经细胞是相互连接在一起的。为了创建一个人工神经网络,人工神经细胞也要以同样方式相互连接在一起。为此可以有许多不同的连接方式,其中最容易理解并且也是最广泛地使用的,就是如图 5 所示那样,把神经细胞一层一层地连结在一起。这一种类型的神经网络就叫前馈网络(feedforword network)。这一名称的由来,就是因为网络的每一层神经细胞的输出都向前馈送(feed)到了它们的下一层(在图中是画在它的上面的那一层),直到获得整个网络的输出为止。图 5 一个前馈网络由图可知,网络共有三层(译注:输入层不是神经细胞,神经细胞只有两层)。输入层中的每个输入都馈送到了隐藏层,作为该层每一个神

24、经细胞的输入;然后,从隐藏层的每个神经细胞的输出都连到了它下一层(即输出层)的每一个神经细胞。图中仅仅画了一个隐藏层,作为前馈网络,一般地可以有任意多个隐藏层。但在对付你将处理的大多数问题时一层通常是足够的。事实上,有一些问题甚至根本不需要任何隐藏单元,你只要把那些输入直接连结到输出神经细胞就行了。另外,我为图 5 选择的神经细胞的个数也是完全任意的。每一层实际都可以有任何数目的神经细胞,这完全取决于要解决的问题的复杂性。但神经细胞数目愈多,网络的工作速度也就愈低,由于这一缘故,以及为了其他的几种原因(我将在第 9 章作出解释),网络的规模总是要求保持尽可能的小。到此我能想象你或许已对所有这些

25、信息感到有些茫然了。我认为,在这种情况下,我能做的最好的事情,就是向你介绍一个神经网络在现实世界中的实际应用例子,它有望使你自己的大脑神经细胞得到兴奋!不错吧?好的,下面就来了.你可能已听到或读到过神经网络常常用来作模式识别。这是因为它们善于把一种输入状态(它所企图识别的模式)映射到一种输出状态(它曾被训练用来识别的模式)。下面我们来看它是怎么完成的。我们以字符识别作为例子。设想有一个由 8x8 个格子组成的一块面板。每一个格子里放了一个小灯,每个小灯都可独立地被打开(格子变亮)或关闭(格子变黑),这样面板就可以用来显示十个数字符号。图 6 显示了数字“4”。图 6 用于字符显示的矩阵格点要解

26、决这一问题,我们必需设计一个神经网络,它接收面板的状态作为输入,然后输出一个 1 或 0;输出 1 代表 ANN 确认已显示了数字“4”,而输出 0 表示没有显示“4”。因此,神经网络需要有 64 个输入(每一个输入代表面板的一个具体格点) 和由许多神经细胞组成的一个隐藏层,还有仅有一个神经细胞的输出层,隐藏层的所有输出都馈送到它。我真希望你能在你的头脑中画出这个图来,因为要我为你把所有这些小圆和连线统统画出来确实不是一桩愉快的事。一旦神经网络体系创建成功后,它必须接受训练来认出数字“4”。为此可用这样一种方法来完成:先把神经网的所有权重初始化为任意值。然后给它一系列的输入,在本例中,就是代表

27、面板不同配置的输入。对每一种输入配置,我们检查它的输出是什么,并调整相应的权重。如果我们送给网络的输入模式不是“4”, 则我们知道网络应该输出一个0。因此每个非“4”字符时的网络权重应进行调节,使得它的输出趋向于 0。当代表“4”的模式输送给网络时,则应把权重调整到使输出趋向于 1。如果你考虑一下这个网络,你就会知道要把输出增加到 10 是很容易的。然后通过训练,就可以使网络能识别 0 到 9 的所有数字。但为什么我们到此停止呢?我们还可以进一步增加输出,使网络能识别字母表中的全部字符。这本质上就是手写体识别的工作原理。对每个字符,网络都需要接受许多训练,使它认识此文字的各种不同的版本。到最后

28、,网络不单能认识已经训练的笔迹,还显示了它有显著的归纳和推广能力。也就是说,如果所写文字换了一种笔迹,它和训练集中所有字迹都略有不同,网络仍然有很大几率来认出它。正是这种归纳推广能力,使得神经网络已经成为能够用于无数应用的一种无价的工具,从人脸识别、医学诊断,直到跑马赛的预测,另外还有电脑游戏中的 bot(作为游戏角色的机器人)的导航,或者硬件的 robot(真正的机器人)的导航。这种类型的训练称作有监督的学习(supervised learnig),用来训练的数据称为训练集(training set)。调整权重可以采用许多不同的方法。对本类问题最常用的方法就是反向传播(backpropaga

29、tion,简称 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 sigmoid function)译注 1。该函数所实现的功能,本质上说,就是把神经细胞原有的阶跃式输出曲线钝化为一光滑曲线,后者绕 y 轴 0.5 处点对称译注 2,如图 9 所示。译注 1 logistic 有计算的或符号逻辑的 等意思在内,和逻辑的 (logic)意义不同。译注 2 点对称图形绕对称点转 180 度后能与原图重合。若 f(x)以原点为点对称,则有 f(

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

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

35、我们希望的那样执行工作之前,必须寻找所有 6 个输入之间的数学关系,而这有相当工作量。可以把此作为一个练习倒是很理想的:去试试如何给出最少数量的输入而仍能为网络传达解决问题所需要的全部信息。 你的网络使用的输入愈少,网络所要求的神经细胞数目也愈少。而较少的神经细胞就意味更快速的训练和更少的计算,有利于网络更高速度的工作。只要作少量的额外考虑,就能够把输入的个数减少为 4,这就是图 11 中所画出的两个向量的个参数。把神经网络的所有输入进行规范化是一种好想法。这里的意思并不是说每个输入都要改变大小使它们都在 01 间,而是说每一个输入应该受到同等重视。例如,拿我们已经讨论过的扫雷机输入为例。瞄准

36、向量或视线向量(look-at vector)总是一个规范化向量,即长度等于1,分量 x 和 y 都在 01 间。但从扫雷机到达其最近地雷的向量就可能很大,其中的一个分量甚至有可能和窗体的宽度或高度一样大。如果这个数据以它的原始状态输入到网络,网络对有较大值的输入将显得更灵敏,由此就会使网络性能变差。因此,在信息输入到神经网络中去之前,数据应预先定比(scaled)和标准化(standardized),使它们大小相似(similar)。在本特例中,由扫雷机引到与其最接近地雷的向量需要进行规范化(normalized)。这样可以使扫雷机的性能得到改良。图 11 选择输入。小技巧:有时,你把输入数

37、据重新换算(rescale)一下,使它以 0 点为中心,就能从你的神经网络获得最好的性能。这一小窍门在你设计网络时永远值得一试。但我在扫雷机工程中没有采用这一方法,这是因为我想使用一种更直觉的方法。4.3 隐藏的神经细胞要多少?(How many Hidden Neurons?)到此我们已把输入、输出神经细胞的数目和种类确定下来了,下一步是确定隐藏层的数目,并确定每个隐藏层中神经细胞必须有多少?但遗憾的是,还没有一种确切的规则可用来计算这些。它们的开发又需要凭个人的“感觉”了。某些书上和文章中确实给过一些提纲性的东西, 告诉你如何去决定隐藏神经细胞个数,但业内专家们的一致看法是:你只能把任何建

38、议当作不可全信的东西,主要还要靠自己的不断尝试和失败中获得经验。但你通常会发现,你所遇到的大多数问题都只要用一个隐藏层就能解决。所以,本领的高低就在于如何为这一隐藏层确定最合适的神经细胞数目了。显然,个数是愈少愈好,因为我前面已经提及,数目少的神经细胞能够造就快速的网络。通常,为了确定出一个最优总数,我总是在隐藏层中采用不同数目的神经细胞来进行试验。我在本章所编写的神经网络工程的第一版本中一共使用了 10 个隐藏神经细胞(当然,我的这个数字也不一定是最好的)。你应围绕这个数字的附近来做游戏,并观察隐藏层神经细胞的数目对扫雷机的演化会产生什么样的影响。不管怎样,理论已经够了,让我们拿一个具体程序

39、来看看吧!你可以在本书所附光盘的 Chapter7/Smart Sweepers v1.0 文件夹中找到本章下面几页即将描述的所有程序的源码。4.4 CNeuralNet.h(神经网络类的头文件 )在 CNeuralNet.h 文件中,我们定义了人工神经细胞的结构、定义了人工神经细胞的层的结构、以及人工神经网络本身的结构。首先我们来考察人工神经细胞的结构。4.4.1 SNeuron(神经细胞的结构)这是很简单的结构。人工神经细胞的结构中必须有一个正整数来纪录它有多少个输入,还需要有一个向量 std:vector 来表示它的权重。请记住,神经细胞的每一个输入都要有一个对应的权重。Struct S

40、Neuron/ 进入神经细胞的输入个数int m_NumInputs;/ 为每一输入提供的权重vector m_vecWeight;/构造函数SNeuron(int NumInputs);以下就是 SNeuron 结构体的构造函数形式 :SNeuron:SNeuron(int NumInputs): m_NumInputs(NumInputs+1)(/ 我们要为偏移值也附加一个权重,因此输入数目上要 +1for (int i=0; i= t上式是使细胞输出为的条件。因为网络的所有权重需要不断演化(进化),如果阀值的数据也能一起演化,那将是非常重要的。要实现这一点不难,你使用一个简单的诡计就可以

41、让阀值变成权重的形式。从上面的方程两边各减去 t,得:w1x1 + w2x2 + w3x3 +.+ wnxn t = 0这个方程可以再换用一种形式写出来,如下:w1x1 + w2x2 + w3x3 +.+ wnxn+ t *(1) = 0到此,我希望你已能看出,阀值 t 为什么可以想像成为始终乘以输入为 -的权重了。这个特殊的权重通常叫偏移(bias),这就是为什么每个神经细胞初始化时都要增加一个权重的理由。现在,当你演化一个网络时,你就不必再考虑阀值问题,因为它已被内建在权重向量中了。怎么样,想法不错吧?为了让你心中绝对敲定你所学到的新的人工神经细胞是什么样子,请再参看一下图 12。图 12

42、 带偏移的人工神经细胞。4.4.2 SNeuronLayer(神经细胞层的结构)神经细胞层 SNeuronLayer 的结构很简单;它定义了一个如图 13 中所示的由虚线包围的神经细胞 SNeuron 所组成的层 。 图 13 一个神经细胞层。以下就是层的定义的源代码,它应该不再需要任何进一步的解释:struct SNeuronLayer/ 本层使用的神经细胞数目int m_NumNeurons;/ 神经细胞的层vector m_vecNeurons;SNeuronLayer(int NumNeurons, int NumInputsPerNeuron);;4.4.3 CNeuralNet(神

43、经网络类 )这是创建神经网络对象的类。让我们来通读一下这一个类的定义:class CNeuralNetprivate:int m_NumInputs;int m_NumOutputs;int m_NumHiddenLayers;int m_NeuronsPerHiddenLyr;/ 为每一层(包括输出层)存放所有神经细胞的存储器vector m_vecLayers;所有 private 成员由其名称容易得到理解。需要由本类定义的就是输入的个数、输出的个数、隐藏层的数目、以及每个隐藏层中神经细胞的个数等几个参数。public:CNeuralNet();该构造函数利用 ini 文件来初始化所有的

44、Private 成员变量,然后再调用 CreateNet 来创建网络。/ 由 SNeurons 创建网络void CreateNet();我过一会儿马上就会告诉你这个函数的代码。/ 从神经网络得到(读出)权重vector GetWeights()const;由于网络的权重需要演化,所以必须创建一个方法来返回所有的权重。这些权重在网络中是以实数型向量形式表示的,我们将把这些实数表示的权重编码到一个基因组中。当我开始谈论本工程的遗传算法时,我将为您确切说明权重如何进行编码。/ 返回网络的权重的总数int GetNumberOfWeights()const;/ 用新的权重代替原有的权重void Pu

45、tWeights(vector 这一函数所做的工作与函数 GetWeights 所做的正好相反。当遗传算法执行完一代时,新一代的权重必须重新插入神经网络。为我们完成这一任务的是 PutWeight 方法。/ S 形响应曲线inline double Sigmoid(double activation, double response);当已知一个神经细胞的所有输入*重量的乘积之和时,这一方法将它送入到 S 形的激励函数。/ 根据一组输入,来计算输出vector Update(vector 对此 Update 函数函数我马上就会来进行注释的。; / 类定义结束4.4.3.1 CNeuralNet

46、:CreateNet(创建神经网络的方法)我在前面没有对 CNeuralNet 的 2 个方法加以注释,这是因为我要为你显示它们的更完整的代码。这 2 个方法的第一个是网络创建方法 CreateNet。它的工作就是把由细胞层SNeuronLayers 所收集的神经细胞 SNeurons 聚在一起来组成整个神经网络,代码为:void CNeuralNet:CreateNet()/ 创建网络的各个层if (m_NumHiddenLayers 0)/创建第一个隐藏层译注m_vecLayers.push_back(SNeuronLayer(m_NeuronsPerHiddenLyr,m_NumInpu

47、ts);for( int i=0; i CNeuralNet:Update(vector int cWeight = 0;/ 首先检查输入的个数是否正确if (inputs.size() != m_NumInputs)/ 如果不正确,就返回一个空向量return outputs;/ 对每一层,.for (int i=0; i0)inputs = outputs;outputs.clear();cWeight = 0;/ 对每个神经细胞,求输入*对应权重乘积之总和。并将总和抛给 S 形函数,以计算输出for (int j=0; j vecWeights;double dFitness;SGeno

48、me():dFitness(0) SGenome(vector w, double f):vecWeights(w),dFitness(f)/重载 i / 用来对扫雷机各个顶点进行变换,以便接着可以画它出来void WorldTransform(vector / 返回一个向量到最邻近的地雷5Vector2D GetClosestMine(vector / 检查扫雷机看它是否已经发现地雷int CheckForMine(vector void Reset();/ - 定义各种供访问用的函数SVector2D Position()const return m_vPosition; void Inc

49、rementFitness(double val) m_dFitness += val; double Fitness()const return m_dFitness; void PutWeights(vector int GetNumberOfWeights()const return m_ItsBrain.GetNumberOfWeights(); ;4.7.1 The CMinesweeper:Update Function(扫雷机更新函数)需要更详细地向你说明的 CMinesweeper 类的方法只有一个,这就是 Update 更新函数。该函数在每一帧中都要被调用,以更新扫雷机神经网络。让我们考察这函数的肚子里有些什么货色:bool CMinesweeper:Update(vector /计算从扫雷机到与其最接近的地雷

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报