神经网络入门(连载之三)

Posted zzwu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络入门(连载之三)相关的知识,希望对你有一定的参考价值。

 

游戏编程中的人工智能技术

 (连载之三)


4. 聪明的扫雷机工程(Smart Minesweeper Project)

      我要向你介绍的第一个完整例子,是怎么使用神经网络来控制具有人工智能的扫雷机的行为。扫雷机工作在一个很简单的环境中,那里只有扫雷机以及随机散布的许多地雷。



图7 运行中的演示程序。

   尽管书上图形画成了黑白色,但当你运行程序时性能最好的扫雷机将显现为红色。地雷,你可能已经猜到,就是那些小方形。工程的目标是创建一个网络,它不需要从我们这里得到任何帮助,就能自己进行演化(evolve)去寻找地雷。为了实现这一功能,网络的权重将被编码到基因组中,并用一个遗传算法来演化它们。
 
        怎么样,很酷吧?

提示(重要)
      如果你跳过前面的一些章节来到这里,而你又不了解怎样使用遗传算法,则在进一步阅读下面的内容之前,你应回到前面去补读一下有关遗传算法的内容。


 
       首先让我解释人工神经网络(ANN)的体系结构。我们需要决定输入的数目、输出的数目、还有隐藏层的数目和每个隐藏层中隐藏单元的数目。


4.1 选择输出(Choosing the Outputs)

        那么,人工神经网络怎样控制扫雷机的行动呢?问得很好!我们把扫雷机想象成和坦克车一样,通过左右2个能转动的履带式轮轨(track)来行动的。见图8。

 图8  扫雷机的控制

 
   扫雷机向前行进的速度,以及向左、向右转弯的角度,都是通过改变2个履带轮的相对速度来实现的。因此,神经网络需要得到2个数据,1个是左侧履带轮的速度,另一个是右侧履带轮的速度。

   啊,但是...,我听见你在嘀咕了如果网络只能输出一个1或一个0,我们怎么能控制车轨移动的快慢呢? 你是对的;如果利用以前描述的阶跃函数来决定输出,我们就根本无法控制扫雷机实际移动。幸好,我有一套戏法,让我卷起袖子来,把激励函数的输出由阶跃式改变成为在0-1之间连续变化的形式,这样就可以供扫雷机神经细胞使用了。为此,有几种函数都能做到这样,我们使用的是一个被称为逻辑斯蒂S形函数(logistic sigmoid function)[译注1]。该函数所实现的功能,本质上说,就是把神经细胞原有的阶跃式输出曲线钝化为一光滑曲线,后者绕y轴0.5处点对称[译注2],如图9所示。
 
[译注1] logistic有’计算的’或’符号逻辑的’等意思在内,和’逻辑的(logic)’意义不同。
[译注2] 点对称图形绕对称点转180度后能与原图重合。若f(x)以原点为点对称,则有f(-x)=-f(x)


图9 S形曲线。


   当神经细胞的激励值趋于正、负无穷时,S形函数分别趋于1或0。负的激励值对应的函数值都<0.5; 正激励值对应的函数值都>0.5。S形函数用数学表达式写出来则为:               

    这个方程看上去可能会吓唬一些人,但其实很简单。e是数学常数,近似等于2.7183,a是神经细胞的激励值,它是函数的自变量,而p是一个用来控制曲线形状变化快慢或陡峭性的参数。p通常设定为1。当p赋以较大值时,曲线就显得平坦,反之,就会使曲线变为陡峭。见图10。很低的p值所生成的函数就和阶跃函数近似。P值的大小用来控制何时使神经网络由低变高开始翻转有很大作用,但是在本例子中我们将它保持为1。
 
注:“S型”的英文原名Sigmoid 或Sigmoidal 原来是根据希腊字“Sigma”得来的,但非常巧它也可以说成是曲线的一种形状。 


 
图10  不同的S形响应曲线。

4.2 选择输入(Choosing the Inputs)

  
 上面我们已经把输出安排好了,现在我们来考虑输入,确定网络需要什么样的输入?为此,我们必须想象一下扫雷机的具体细节:需要什么样的信息才能使它朝地雷前进?你可能想到的第一个输入信息清单是:

  • 扫雷机的位置(x1,y1)
  • 与扫雷机最靠近的地雷的位置(x2,y2)
  • 代表扫雷机前进方向的向量(x3,y3)

   这样一共得到6个输入。但是,要网络使用这些输入,工作起来就非常困难,因为,网络在像我们希望的那样执行工作之前,必须寻找所有6个输入之间的数学关系,而这有相当工作量。可以把此作为一个练习倒是很理想的:去试试如何给出最少数量的输入而仍能为网络传达解决问题所需要的全部信息。 你的网络使用的输入愈少,网络所要求的神经细胞数目也愈少。而较少的神经细胞就意味更快速的训练和更少的计算,有利于网络更高速度的工作。

   只要作少量的额外考虑,就能够把输入的个数减少为4,这就是图11中所画出的两个向量的4个参数。
        把神经网络的所有输入进行规范化是一种好想法。这里的意思并不是说每个输入都要改变大小使它们都在0~1间,而是说每一个输入应该受到同等重视。例如,拿我们已经讨论过的扫雷机输入为例。瞄准向量或视线向量(look-at vector)总是一个规范化向量,即长度等于1,分量x和y都在0~1间。但从扫雷机到达其最近地雷的向量就可能很大,其中的一个分量甚至有可能和窗体的宽度或高度一样大。如果这个数据以它的原始状态输入到网络,网络对有较大值的输入将显得更灵敏,由此就会使网络性能变差。因此,在信息输入到神经网络中去之前,数据应预先定比(scaled)和标准化(standardized),使它们大小相似(similar)。在本特例中,由扫雷机引到与其最接近地雷的向量需要进行规范化(normalized)。这样可以使扫雷机的性能得到改良。
 


 
图11 选择输入。

  

 小技巧:
    有时,你把输入数据重新换算(rescale)一下,使它以0点为中心,就能从你的神经网络获得最好的性能。这一小窍门在你设计网络时永远值得一试。但我在扫雷机工程中没有采用这一方法,这是因为我想使用一种更直觉的方法。

 

4.3 隐藏的神经细胞要多少?(How many Hidden Neurons?)

   到此我们已把输入、输出神经细胞的数目和种类确定下来了,下一步是确定隐藏层的数目,并确定每个隐藏层中神经细胞必须有多少?但遗憾的是,还没有一种确切的规则可用来计算这些。它们的开发又需要凭个人的“感觉”了。某些书上和文章中确实给过一些提纲性的东西,告诉你如何去决定隐藏神经细胞个数,但业内专家们的一致看法是:你只能把任何建议当作不可全信的东西,主要还要靠自己的不断尝试和失败中获得经验。但你通常会发现,你所遇到的大多数问题都只要用一个隐藏层就能解决。所以,本领的高低就在于如何为这一隐藏层确定最合适的神经细胞数目了。显然,个数是愈少愈好,因为我前面已经提及,数目少的神经细胞能够造就快速的网络。通常,为了确定出一个最优总数,我总是在隐藏层中采用不同数目的神经细胞来进行试验。我在本章所编写的神经网络工程的第一版本中一共使用了10个隐藏神经细胞(当然,我的这个数字也不一定是最好的<一笑>)。你应围绕这个数字的附近来做游戏,并观察隐藏层神经细胞的数目对扫雷机的演化会产生什么样的影响。不管怎样,理论已经够了,让我们拿一个具体程序来看看吧!你可以在本书所附光盘的Chapter7/Smart Sweepers v1.0文件夹中找到本章下面几页即将描述的所有程序的源码。

 

以上是关于神经网络入门(连载之三)的主要内容,如果未能解决你的问题,请参考以下文章

神经网络入门(连载之一)

Python爬虫入门之三urllib库的基本使用

连载 | 深入理解gradle框架之三:artifacts的发布

docker实践入门之三

docker实践入门之三

基础详解手磕实现 CNN卷积神经网络!