介绍Lunar Lander示例
监督训练没有训练集
使用遗传算法
使用模拟退火算法
遗传算法和模拟退火算法的训练集
到目前为止,本书仅仅探索了训练一个神经网络使用的是监督传播训练方法,这章将看看一些非传播训练技术,本章的神经网络将在没有训练集的情况下进行训练,但依然在经常被用来帮助训练神经网络的输出反馈的监督下。我们将不提前准备数据。
这种训练有两种常见的技术,模拟退火和遗传算法,Encog提供了内置支持,本章的示例可以使用这两种算法进行训练,这两种算法都将在本章后面讨论。
本章的例子展示了经典的“月球着陆器”游戏,这款游戏已经多次实现,几乎和电脑一样老。你可以在维基百科上阅读更多关于Lunar Lander的游戏。月球着陆器游戏的大多数变种背后的想法非常相似,示例程序的工作原理如下:月球着陆器宇宙飞船将开始坠落。当它下降时,它加速。着陆器可以达到最大速度,称为“末速”。推进器可以应用于着陆器以减慢其降落速度。然而,燃料的数量是有限的。一旦燃料耗尽,着陆器就会掉下来,什么也做不了。
本章将教一个神经网络来引导着陆器。这是一个非常简单的纯文本模拟。神经网络只有一个选项可供选择。它可以决定启动推进器,也可以关闭推进器。没有预先建立训练数据,也不会对神经网络如何引导飞行器进行假设。如果使用训练集,输入将提前提供关于神经网络在某些情况下应该做什么的信息。对于这个例子,神经网络将自己学习所有的东西。
尽管神经网络将自己学习所有的东西,但这仍然是有监督的训练。神经网络并没有被完全不管。它将获得一种给神经网络评分的方法。对于评分神经网络,我们必须给它一些目标,然后计算一个数值,它决定了神经网络达到目标的程度。
这些目标是任意的,只是反映了什么被挑选出来评分网络。这里总结了目标:
[if !supportLists]• [endif]尽量轻地着陆
[if !supportLists]• [endif]降落所用时间尽可能长
[if !supportLists]• [endif]节约燃料
第一个目标是不要坠毁,要尽可能轻柔地撞击月球表面。因此,撞击时的任何速度都是一个很大的负分。神经网络的第二个目标是降落所用时间尽可能长。要做到这一点,它需要尽可能长时间地停留在空中,并为在空中停留更长时间加分。最后,还有一点奖励:一旦飞船着陆,仍然有燃料。分数计算可以在等式6.1中看到。
score = (fuel · 10) + (velocity · 1000) + fuel (6.1)
在下一节,我们将运行月球着陆器的例子和观察它学习着陆航天器。
6.1运行Lunar Lander示例
运行的月球着陆器的游戏你应该执行lunarlander类。该类位于以下位置。
这个类不需要参数。一旦程序开始,神经网络立即开始训练。在它完成之前,它会周期性地经过50个纪元,或者训练迭代。当它开始时,得分是负数。这些未经训练的神经网络的早期尝试是以高速度撞击月球并且没有覆盖太多距离。
Epoch #1 Score :-299.0
Epoch #2 Score :-299.0
Epoch #3 Score :-299.0
Epoch #4 Score :-299.0
Epoch #5 Score :-299.0
Epoch #6 Score :-299.0
Epoch #7 Score :-299.0
第七次迭代后,分数开始增加。
Epoch #8 Score :-96.0
Epoch #9 Score : 5 7 6 0.0
Epoch #10 Score : 5 7 6 0.0
Epoch #11 Score : 5 7 6 0.0
Epoch #12 Score : 5 7 6 0.0
Epoch #13 Score : 5 7 6 0.0
Epoch #14 Score : 5 7 6 0.0
Epoch #15 Score : 5 7 6 0.0
Epoch #16 Score : 5 7 6 0.0
Epoch #17 Score : 6 1 9 6.0
Epoch #18 Score : 6 1 9 6.0
Epoch #19 Score : 6 1 9 6.0
分数会在6196停留一段时间,但是之后会改变。
Epoch #45 Score : 6 2 7 5.0
Epoch #46 Score : 6 2 7 5.0
Epoch #47 Score : 7 3 4 7.0
Epoch #48 Score : 7 3 4 7.0
Epoch #49 Score : 7 4 6 0.0
Epoch #50 Score : 7 4 6 0.0
到了第五十迭代,已经达到了7460分。本章所使用的训练技术对随机数进行了广泛的应用。因此,多次运行这个示例可能会导致完全不同的分数。
更多的迭代可能产生了更好的训练神经网络;然而,程序将它限制在50。这个数字通常会产生相当熟练的神经飞行员。一旦网络得到训练,就与获胜的飞行员进行仿真。遥测每秒显示。
神经驾驶员把飞船保持在高空911秒。因此,我们不会显示每一个遥测报告。然而,这种神经飞行员所学的一些有趣的动作被高亮显示。神经网络学会最好是让飞船自由下落一段时间。获胜网络是如何着陆的:
Elapsed : 1 s , Fuel : 200 l , Velocity :-1.6200 m/s , 9998 m
Elapsed : 2 s , Fuel : 200 l , Velocity :-3.2400 m/s , 9995 m
Elapsed : 3 s , Fuel : 200 l , Velocity :-4.8600 m/s , 9990 m
Elapsed : 4 s , Fuel : 200 l , Velocity :-6.4800 m/s , 9983 m
Elapsed : 5 s , Fuel : 200 l , Velocity :-8.1000 m/s , 9975 m
Elapsed : 6 s , Fuel : 200 l , Velocity :-9.7200 m/s , 9965 m
Elapsed : 7 s , Fuel : 200 l , Velocity :-11.3400 m/s , 9954 m
Elapsed : 8 s , Fuel : 200 l , Velocity :-12.9600 m/s , 9941 m
Elapsed : 9 s , Fuel : 200 l , Velocity :-14.5800 m/s , 9927 m
Elapsed : 10 s , Fuel : 200 l , Velocity :-16.2000 m/s , 9910 m
Elapsed : 11 s , Fuel : 200 l , Velocity :-17.8200 m/s , 9893 m
Elapsed : 12 s , Fuel : 200 l , Velocity :-19.4400 m/s , 9873 m
Elapsed : 13 s , Fuel : 200 l , Velocity :-21.0600 m/s , 9852 m
Elapsed : 14 s , Fuel : 200 l , Velocity :-22.6800 m/s , 9829 m
Elapsed : 15 s , Fuel : 200 l , Velocity :-24.3000 m/s , 9805 m
Elapsed : 16 s , Fuel : 200 l , Velocity :-25.9200 m/s , 9779 m
Elapsed : 17 s , Fuel : 200 l , Velocity :-27.5400 m/s , 9752 m
Elapsed : 18 s , Fuel : 200 l , Velocity :-29.1600 m/s , 9722 m
Elapsed : 19 s , Fuel : 200 l , Velocity :-30.7800 m/s , 9692 m
Elapsed : 20 s , Fuel : 200 l , Velocity :-32.4000 m/s , 9659 m
Elapsed : 21 s , Fuel : 200 l , Velocity :-34.0200 m/s , 9625 m
Elapsed : 22 s , Fuel : 200 l , Velocity :-35.6400 m/s , 9590 m
Elapsed : 23 s , Fuel : 200 l , Velocity :-37.2600 m/s , 9552 m
Elapsed : 24 s , Fuel : 200 l , Velocity :-38.8800 m/s , 9514 m
Elapsed : 25 s , Fuel : 200 l , Velocity :-40.0000 m/s , 9473 m
Elapsed : 26 s , Fuel : 200 l , Velocity :-40.0000 m/s , 9431 m
Elapsed : 27 s , Fuel : 200 l , Velocity :-40.0000 m/s , 9390 m f
你可以看到,在27秒和离地面9390米处,已经到达了40米/秒的终端速度。没有什么科学依据- 40米/秒是终端速度,它只是作为一个任意数选择。终端速度是很有趣的,因为神经网络知道一旦达到这个目标,飞行器就不会加速。他们使用终端速度来节省燃料,当接近地面时“中断它们的下落”。自由落体的终端速度持续一段时间。
最后,在地面6102米处,推进器第一次点火。
Elapsed : 105 s , Fuel : 200 l , Velocity :-40.0000 m/s , 6143 m
Elapsed : 106 s , Fuel : 200 l , Velocity :-40.0000 m/s , 6102 m
THRUST
Elapsed : 107 s , Fuel : 199 l , Velocity :-31.6200 m/s , 6060 m
Elapsed : 108 s , Fuel : 199 l , Velocity :-33.2400 m/s , 6027 m
Elapsed : 109 s , Fuel : 199 l , Velocity :-34.8600 m/s , 5992 m
Elapsed : 110 s , Fuel : 199 l , Velocity :-36.4800 m/s , 5956 m
Elapsed : 111 s , Fuel : 199 l , Velocity :-38.1000 m/s , 5917 m
Elapsed : 112 s , Fuel : 199 l , Velocity :-39.7200 m/s , 5878 m
THRUST
Elapsed : 113 s , Fuel : 198 l , Velocity :-31.3400 m/s , 5836 m
Elapsed : 114 s , Fuel : 198 l , Velocity :-32.9600 m/s , 5803 m
Elapsed : 115 s , Fuel : 198 l , Velocity :-34.5800 m/s , 5769 m
Elapsed : 116 s , Fuel : 198 l , Velocity :-36.2000 m/s , 5733 m
Elapsed : 117 s , Fuel : 198 l , Velocity :-37.8200 m/s , 5695 m
速度被逐渐减慢,神经网络决定每6秒点一次火。保持速度在-35 m/s左右。
THRUST
Elapsed : 118 s , Fuel : 197 l , Velocity :-29.4400 m/s , 5655 m
Elapsed : 119 s , Fuel : 197 l , Velocity :-31.0600 m/s , 5624 m
Elapsed : 120 s , Fuel : 197 l , Velocity :-32.6800 m/s , 5592 m
Elapsed : 121 s , Fuel : 197 l , Velocity :-34.3000 m/s , 5557 m
Elapsed : 122 s , Fuel : 197 l , Velocity :-35.9200 m/s , 5521 m
THRUST
Elapsed : 123 s , Fuel : 196 l , Velocity :-27.5400 m/s , 5484 m
Elapsed : 124 s , Fuel : 196 l , Velocity :-29.1600 m/s , 5455 m
Elapsed : 125 s , Fuel : 196 l , Velocity :-30.7800 m/s , 5424 m
Elapsed : 126 s , Fuel : 196 l , Velocity :-32.4000 m/s , 5392 m
Elapsed : 127 s , Fuel : 196 l , Velocity :-34.0200 m/s , 5358 m
Elapsed : 128 s , Fuel : 196 l , Velocity :-35.6400 m/s , 5322 m
THRUST
当飞行器接近月球表面时,最大速度开始下降。当飞行器接近月球表面时,飞行员正减慢速度。大约离地面4,274米时,神经网络决定应该每5秒反推一次。速度减缓到-28 m/s。
THRUST
Elapsed : 163 s , Fuel : 189 l , Velocity :-22.3400 m/s , 4274 m
Elapsed : 164 s , Fuel : 189 l , Velocity :-23.9600 m/s , 4250 m
Elapsed : 165 s , Fuel : 189 l , Velocity :-25.5800 m/s , 4224 m
Elapsed : 166 s , Fuel : 189 l , Velocity :-27.2000 m/s , 4197 m
Elapsed : 167 s , Fuel : 189 l , Velocity :-28.8200 m/s , 4168 m
THRUST
Elapsed : 168 s , Fuel : 188 l , Velocity :-20.4400 m/s , 4138 m
Elapsed : 169 s , Fuel : 188 l , Velocity :-22.0600 m/s , 4116 m
Elapsed : 170 s , Fuel : 188 l , Velocity :-23.6800 m/s , 4092 m
Elapsed : 171 s , Fuel : 188 l , Velocity :-25.3000 m/s , 4067 m
Elapsed : 172 s , Fuel : 188 l , Velocity :-26.9200 m/s , 4040 m
Elapsed : 173 s , Fuel : 188 l , Velocity :-28.5400 m/s , 4011 m
THRUST
通过偶尔使用更短的周期,神经飞行员减慢它达到离地面906米的地方使用了更多时间。飞船已经减慢到每秒14米。
THRUST
Elapsed : 320 s , Fuel : 162 l , Velocity :-6.6800 m/s , 964 m
Elapsed : 321 s , Fuel : 162 l , Velocity :-8.3000 m/s , 955 m
Elapsed : 322 s , Fuel : 162 l , Velocity :-9.9200 m/s , 945 m
Elapsed : 323 s , Fuel : 162 l , Velocity :-11.5400 m/s , 934 m
Elapsed : 324 s , Fuel : 162 l , Velocity :-13.1600 m/s , 921 m
Elapsed : 325 s , Fuel : 162 l , Velocity :-14.7800 m/s , 906 m
THRUST
Elapsed : 326 s , Fuel : 161 l , Velocity :-6.4000 m/s , 890 m
Elapsed : 327 s , Fuel : 161 l , Velocity :-8.0200 m/s , 882 m
Elapsed : 328 s , Fuel : 161 l , Velocity :-9.6400 m/s , 872 m
Elapsed : 329 s , Fuel : 161 l , Velocity :-11.2600 m/s , 861 m
Elapsed : 330 s , Fuel : 161 l , Velocity :-12.8800 m/s , 848 m
Elapsed : 331 s , Fuel : 161 l , Velocity :-14.5000 m/s , 833 m
THRUST
这种短程循环一直持续到飞船减慢速度为止。它甚至达到了在飞行的最后几秒增加了高度。
Elapsed : 899 s , Fuel : 67 l , Velocity : 5.3400 m/s , 2 m
Elapsed : 900 s , Fuel : 67 l , Velocity : 3.7200 m/s , 5 m
Elapsed : 901 s , Fuel : 67 l , Velocity : 2.1000 m/s , 8 m
Elapsed : 902 s , Fuel : 67 l , Velocity : 0.4800 m/s , 8 m
Elapsed : 903 s , Fuel : 67 l , Velocity :-1.1400 m/s , 7 m
Elapsed : 904 s , Fuel : 67 l , Velocity :-2.7600 m/s , 4 m
THRUST
Elapsed : 905 s , Fuel : 66 l , Velocity : 5.6200 m/s , 0 m
Elapsed : 906 s , Fuel : 66 l , Velocity : 4.0000 m/s , 4 m
Elapsed : 907 s , Fuel : 66 l , Velocity : 2.3800 m/s , 6 m
Elapsed : 908 s , Fuel : 66 l , Velocity : 0.7600 m/s , 7 m
Elapsed : 909 s , Fuel : 66 l , Velocity :-0.8600 m/s , 6 m
Elapsed : 910 s , Fuel : 66 l , Velocity :-2.4800 m/s , 4 m
THRUST
Elapsed : 911 s , Fuel : 65 l , Velocity : 5.9000 m/s , 0 m
Finally, the craft lands, with a very soft velocity of positive 5.9. You wonder why the lander lands with a velocity of 5.9. This is due to a slight glitch in the program. This “glitch” is left in because it illustrates an important point: when neural networks are allowed to learn, they are totally on their own and will take advantage of everything they can find.
最后,飞船降落,以非常软的速度为正5.9。
你想知道为什么着陆器以5.9的速度着陆。这是由于程序中有一点小毛病。这个“小故障”之所以存在,是因为它说明了一个重要的问题:当神经网络被允许学习时,它们完全是自己的,并且将利用他们所能找到的一切。
最后的正速度是因为程序决定它是否要作为模拟周期的最后一部分进行推力。这个程序已经决定了飞船的高度在零以下,并且着陆了。而神经网络最后一个“乱入的”推力,虽然飞行器已登陆这个推力没用。然而,最后的推力确实增加了神经网络的得分。
回看方程式6.1。在着陆时每秒钟的负速度每秒,程序得分减少1000。这个程序发现相反的情况也是这样。对于每米每秒的正速度,它也得到1000点。通过学习程序中的这个小魔鬼,神经飞行员可以获得更高的分数。
神经飞行员学习了一些非常有趣的东西,尽管没有预先设计策略。网络学习到了它想做什么。具体来说,这个飞行员决定如下:
[if !supportLists]• [endif]自由落体一段时间,利用终端速度优势
[if !supportLists]• [endif]在某一点上,打破自由落体,减缓飞行器下降速度
[if !supportLists]• [endif]接近地面时慢慢减小速度
[if !supportLists]• [endif]着陆后给最后一个推力,最大限度地得分
本例中的神经飞行员使用遗传算法进行训练。遗传算法和模拟退火将在本章后面讨论。首先,我们将了解着陆器是如何模拟的,以及它的得分是如何计算出来的。
6.2检查月球着陆模拟器
我们现在将研究如何通过物理模拟创建月球着陆器的例子,以及神经网络实际上如何引导航天器。最后,我们将看到神经网络如何学习成为一个更好的飞行员。
6.2.1模拟着陆器
首先,我们需要一个模拟物理着陆月球的类。“物理学”这个词使用得很随意。这个例子的目的更多地是关于一个神经网络如何适应一个人工环境而不是任何一种真实的物理模拟。
所有的物理仿真代码都包含在landersimulator类。可以在以下位置找到此类。
这个类首先定义一些对模拟非常重要的常量。
重力常数定义了月球重力加速度。设置为1.62,以米每秒计算。推力常数规定了每秒抵消重力加速度的量。终端速度是航天器可以向上或向下移动的最快速度。
除了这些常量之外,模拟器程序还需要几个实例变量来维护状态。这些变量如下所示
燃料变量保存燃料剩余量。秒变量保存停留空中的秒数。海拔高度保存当前高度。速度变量保存当前速度。正数表明飞船在向上移动。负数表明飞船在向下移动。
模拟器在下面的构造函数中将值设置为合理的起始值:
飞船以200升燃料开始,高度设置在10000米以上。
Turn方法处理每个“转换”。在模拟器中一次转换是一秒。推力参数表明飞船在这次转换过程中是否希望启动推力。
首先,秒数加1,表示逝去1秒。用重力常数GRAVITY来降低速度以模拟下降。
当前速度增大了海拔高度。当然,如果速度是负的,高度就会降低。
如果在这个转换处施加了推力,则将燃油fuel减少一,并通过推力常数THRUST增加速度。
飞行器的下降或上升速度不能大于终端速度。下面的代码确保着陆器的上升速度不超过终端速度。
下面代码确保我们下降速度不大于终端速度。
下面代码确保高度不会降到零以下。这是很重要的,以防止飞行器模拟着陆太硬以至于闯到地下去。
除了模拟代码,landersimulator还提供了两个实用功能。第一个计算的分数,应该只在航天器着陆后调用。此处显示此方法。
记分方法实现等式6.1。正如你所看到的,它使用fuel燃料、seconds秒和velocity速度来计算分数。
此外,还提供了一种确定飞船是否仍在飞行的方法。如果高度大于零,它仍在飞行。
在下一节中,我们将看到神经网络是如何实际飞行并获得一个分数的。
6.2.2计算分数
PilotScor类实现飞行航天器的神经网络所需的代码。这个类还计算在登陆后的最终得分。这个类如清单6.1所示。
正如你可以看到下面代码,这PilotScore类实现CalculateScore接口。
Encog的模拟退火和遗传算法都使用了CalculateScore接口,来确定神经网络在解决被给的问题时效率如何。根据不同的问题,低分可以是坏的也可以是好的。
CalculateScore接口要求两个方法。方法一被称为calculateNetworkScore。此方法接受一个神经网络,返回一个表示网络分数的double。
第二个方法返回一个值来指示分数是否应该最小化。
对于这个例子,我们想最大化得分。作为结果,shouldMinimize方法返回false
6.2.3驾驶宇宙飞船
本节展示了神经网络是如何实际飞行的。神经网络将提供环境信息,如燃料剩余、高度和当前速度。然后神经网络输出一个值,表示神经网络是否希望启动推力。NeuralPilot类执行此飞行。可以在以下位置看到NeuralPilot类:
NeuralPilot构造函数设置飞行的航天器。该构造函数通过一个网络来飞行飞船,以及一个布尔值,指示是否应该跟踪到屏幕上的遥测。
月球着陆器必须将燃料水平、高度和当前速度反馈给神经网络。这些值必须规范化,如第2章所述。为了实现这种规范化,构造函数首先设置几个规范化字段。
除了规范化字段之外,我们还将保存操作参数。跟踪变量保存到实例级别,以便程序稍后知道它是否应该显示遥测。
神经飞行员将有三个输入神经元和一个输出神经元。这三个输入神经元将向神经网络传达以下三个字段。•Current fuel level•Current altitude•Current velocity
这三个输入字段将产生一个输出字段,指示神经飞行员是否愿意启动推进器。
规范这三个字段,它们定义为三个NormalizedField对象。首先,设置燃料。
我们知道燃料在0到200之间。我们将把这个标准化到0.9到10.9的范围。这与范围- 1至1是非常相似的,除非它不采取价值的方式到极端。这有时会帮助神经网络更好地学习。尤其是当全范围已知时。
接下来设置速度和高度。
速度和高度都知道范围,像燃料一样。其结果是,速度建立起来类似于燃料和高度。
因为我们没有训练数据,所以知道范围是非常重要的。这与第2章中提供的确定最小值和最大值的示例数据不同。
在这个例子中,飞行宇宙飞船的主要目的是获得一个分数。scorePilot方法计算这个分数。它将模拟一个飞船从轨道一点降落到着陆点的飞行。scorePilot方法计算这个分数:
该方法首先创建一个LanderSimulator对象来模拟被该程序采用的非常简单的物理。
我们现在进入的scorePilot方法主循环。只要飞船还在飞行,它就会继续循环。只要它的高度大于零,宇宙飞船仍在飞行。
首先创建一个数组来保存从模拟器直接获得的原始数据。
规范化方法的NormalizedField对象用于实际规范燃料文件,高度和速度。
这个单输出神经元将决定推进器是否应该被启动。
如果值大于零,则推进器将被启动。如果飞船正在跟踪,那么也会显示推进器被启动了。
在模拟器中处理下一个“转换”,必要时进行推力。如果飞船跟踪,也显示遥测。
宇宙飞船现在着陆了。根据前面讨论的标准返回分数。
现在我们来看看如何训练神经飞行员。
6.3训练神经飞行员
这个例子可以使用遗传算法或模拟退火训练神经飞行员。encog将遗传算法和模拟退火算法非常类似地对待。一方面,您可以简单地提供一个训练集和使用模拟退火,或者您可以使用一个遗传算法,就像在一个传播网络中一样。我们将在本章后面看到一个例子,我们将这两种技术应用于XOR问题。这将表明它们与传播训练有多么相似。
另一方面,遗传算法和模拟退火可以做一些传播训练不能做的事情。他们可以让你在没有训练集的情况下进行训练。由于本章前面开发了一个评分类,它仍然是有监督的培训。但是,它不需要训练数据输入。相反,神经网络需要输入它所做的工作有多好的标准。如果能提供这种评分函数,模拟退火算法或遗传算法可以训练神经网络。这两种方法将在接下来的章节中讨论,遗传算法开始。
6.3.1什么是遗传算法
遗传算法试图模拟达尔文的进化来创造一个更好的神经网络。神经网络被简化为一个double变量数组。这个数组变成了基因序列。遗传算法首先是建立一个随机神经网络种群。这个群体中的所有神经网络都具有相同的结构,这意味着它们具有相同数量的神经元和层。然而,它们都有不同的随机权重。
这些神经网络按“分数”排序,其得分由评分方法提供,如上一节所讨论的。在神经飞行员的例子中,这个分数表明飞船降落的多软。
顶部的神经网络被选中来“繁殖”。底层神经网络“死亡”。当两个网络繁殖时,通过拼接DNA来模拟大自然。在这种情况下,接头是来自每个网络的双数组拼接在一起,创建一个新的子代神经网络。子代神经网络占据了垂死的神经网络空出的位置。
有些后代会“突变”。也就是说,一些遗传物质是随机的,而不是来自双亲。这就引入了基因库中需要的多样性,并模拟了突变的自然过程。
种群被排序,这个过程又开始了。每次迭代提供一个循环。正如你所看到的,不需要训练集。所有需要的是一个对象来评分每个神经网络。当然,您可以提供一个得分对象使用的训练集,该对象使用训练集来对每个网络进行评分。
6.3.2使用遗传算法
使用遗传算法非常简单,使用NeuralGeneticAlgorithm类。NeuralGeneticAlgorithm类实现mltrain接口。因此,一旦建成,它用的方法与其他encog训练类一样。
下面的代码创建训练神经新对象NeuralGeneticAlgorithm。
提供基本网络以将神经网络的结构与遗传算法通信。遗传算法将忽略当前由神经网络设置的权重。
随机数发生器的设置使神经网络可以创建一个新的随机种群。与通常用的普通RangeRandomizer相比,NguyenWidrowRandomizer试图产生不极端、更可训练的起始权重。然而,两个随机数发生器都可用。
500的值指定了种群大小。较大的种群会训练得更好,但会占用更多的内存和处理时间。0.1个用于变异10%个后代。0.25值用于从居前25%的种群中选择交配群体。
现在的训练器建好了,训练神经网络,就像任何encog训练对象那样。这里我们只重复50次。这通常足以制造出熟练的神经飞行员。
该神经网络也可以使用EncogUtility类训练,如在前一章。只是简单的训练,EncogUtility通常是首选的方法。然而,如果你的程序在每次迭代之后需要做些事,上面显示的更手动的方法可能是最好的。
6.3.3什么是模拟退化算法
模拟退火也可以用来训练神经飞行员。模拟退火算法类似于遗传算法,它也需要一个评分对象。然而,它在内部起着截然不同的作用。模拟退火模拟冶金退火过程。
退火是一种非常热的熔融金属慢慢冷却的过程。这种缓慢的冷却过程使金属产生了强烈的、一致的分子结构。退火是一种使金属不易断裂或破碎的过程。
可以在神经网络上执行类似的过程。为了实现模拟退火,将神经网络转换为一个double数组。这与遗传算法所做的过程完全相同。
随机性是用来模拟散热和冷却效果的。当神经网络仍然是真正的“热”,神经网络的现有权值在速度上增加。当网络冷却时,这种随机性会减慢。只有对网络得分产生积极影响的改变才被保留下来。
6.3.4使用模拟退火算法
使用模拟退火训练神经飞行员,在运行这个示例时,在命令行上传递退火参数。这是非常简单的使用退火的例子,而不是遗传算法。它们都使用相同的得分函数,并且是可互换的。下面的代码行使用了模拟退火算法。
模拟退火NeuralSimulatedAnnealing对象是用来训练神经飞行员。神经网络通过与使用遗传算法训练的相同得分对象一起传递。
10和2的值分别为起始温度和停止温度。就华氏度或摄氏度而言,它们不是真正的温度。较高的数字会产生更多的随机性;较低的数字会产生较少的随机性。下面的代码显示了如何应用这个温度或因素。
数字100指定从高温到低温每一次迭代需要多少个循环。一般来说,周期越长,结果就越准确。然而,数字越高,训练的时间就越长。
对于如何设置这些值,没有简单的规则。一般来说,最好用不同的值进行实验,看看哪一种训练你的神经网络最好。
6.4使用训练集评分类
训练集也可用于遗传算法和模拟退火。使用这种方法,模拟退火和遗传算法与基于使用的传播训练有点不同。使用这种方法时没有计分功能。你只是用TrainingSetScore对象,以训练集,用它来评分神经网络。
一般来说,使用这种方式时弹性传播优于遗传算法或模拟退火。遗传算法或模拟退火算法在使用评分方法而不是训练集时非常出色。此外,模拟退火有时可以将反向传播从局部极小值中推出来。
在下面的代码找到的helloworld应用程序可以很容易地修改为使用遗传算法或模拟退火算法:
要改变上面的例子来使用遗传算法,必须添加几行。以下几行创建了一个基于训练集的遗传算法。首先,创建一个TrainingSetScore对象。
然后可以使用该对象与遗传算法或模拟退火算法一起使用。下面的代码显示它与一个遗传算法一起使用:
使用TrainingSetScore对象与模拟退火,只是通过模拟退火的构造函数传递,如以上所做。
6.5总结
这一章介绍了怎样使用遗传算法和模拟退火训练一个神经网络,这两个技术使用一个评分对象,而不是训练集,然而,如果有需要的话这两个算法也能使用训练集。
遗传算法尝试模拟达尔文进化论,神经网络基于fitness排序,最好的神经网络允许繁殖,较差的网络死亡,下一代需要来自fitest神经网络的遗传物质。
模拟退火是模拟冶金的退火过程,网络权重从高温到低温,随着温度的降低,选择最佳网络,这就产生了一种适合于获得更好分数的神经网络。
到目前为止,本书仅仅讨论怎样使用前馈神经网络,这个网络训练使用传播训练,模拟退火或者是遗传算法,前馈神经网络最常用的神经网络类型,仅仅因为它们是最常用的,就不意味着它们总是最好的解决方式,在下一章中,我们将看看一些其他的神经网络架构。