轉(zhuǎn)載于:http://www.javagame.top/column/1/DXBLOG202202160939286734769/detail.html
介紹Lunar Lander示例
監(jiān)督訓(xùn)練沒有訓(xùn)練集
使用遺傳算法
使用模擬退火算法
遺傳算法和模擬退火算法的訓(xùn)練集
到目前為止,本書僅僅探索了訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)使用的是監(jiān)督傳播訓(xùn)練方法,這章將看看一些非傳播訓(xùn)練技術(shù),本章的神經(jīng)網(wǎng)絡(luò)將在沒有訓(xùn)練集的情況下進行訓(xùn)練,但依然在經(jīng)常被用來幫助訓(xùn)練神經(jīng)網(wǎng)絡(luò)的輸出反饋的監(jiān)督下。我們將不提前準備數(shù)據(jù)。
這種訓(xùn)練有兩種常見的技術(shù),模擬退火和遺傳算法,Encog提供了內(nèi)置支持,本章的示例可以使用這兩種算法進行訓(xùn)練,這兩種算法都將在本章后面討論。
本章的例子展示了經(jīng)典的“月球著陸器”游戲,這款游戲已經(jīng)多次實現(xiàn),幾乎和電腦一樣老。你可以在維基百科上閱讀更多關(guān)于Lunar Lander的游戲。月球著陸器游戲的大多數(shù)變種背后的想法非常相似,示例程序的工作原理如下:月球著陸器宇宙飛船將開始墜落。當它下降時,它加速。著陸器可以達到最大速度,稱為“末速”。推進器可以應(yīng)用于著陸器以減慢其降落速度。然而,燃料的數(shù)量是有限的。一旦燃料耗盡,著陸器就會掉下來,什么也做不了。
本章將教一個神經(jīng)網(wǎng)絡(luò)來引導(dǎo)著陸器。這是一個非常簡單的純文本模擬。神經(jīng)網(wǎng)絡(luò)只有一個選項可供選擇。它可以決定啟動推進器,也可以關(guān)閉推進器。沒有預(yù)先建立訓(xùn)練數(shù)據(jù),也不會對神經(jīng)網(wǎng)絡(luò)如何引導(dǎo)飛行器進行假設(shè)。如果使用訓(xùn)練集,輸入將提前提供關(guān)于神經(jīng)網(wǎng)絡(luò)在某些情況下應(yīng)該做什么的信息。對于這個例子,神經(jīng)網(wǎng)絡(luò)將自己學習所有的東西。
盡管神經(jīng)網(wǎng)絡(luò)將自己學習所有的東西,但這仍然是有監(jiān)督的訓(xùn)練。神經(jīng)網(wǎng)絡(luò)并沒有被完全不管。它將獲得一種給神經(jīng)網(wǎng)絡(luò)評分的方法。對于評分神經(jīng)網(wǎng)絡(luò),我們必須給它一些目標,然后計算一個數(shù)值,它決定了神經(jīng)網(wǎng)絡(luò)達到目標的程度。
這些目標是任意的,只是反映了什么被挑選出來評分網(wǎng)絡(luò)。這里總結(jié)了目標:
[if !supportLists]??[endif]盡量輕地著陸
[if !supportLists]??[endif]降落所用時間盡可能長
[if !supportLists]??[endif]節(jié)約燃料
第一個目標是不要墜毀,要盡可能輕柔地撞擊月球表面。因此,撞擊時的任何速度都是一個很大的負分。神經(jīng)網(wǎng)絡(luò)的第二個目標是降落所用時間盡可能長。要做到這一點,它需要盡可能長時間地停留在空中,并為在空中停留更長時間加分。最后,還有一點獎勵:一旦飛船著陸,仍然有燃料。分數(shù)計算可以在等式6.1中看到。
score = (fuel · 10) + (velocity · 1000) + fuel ?????(6.1)?
在下一節(jié),我們將運行月球著陸器的例子和觀察它學習著陸航天器。
6.1運行Lunar Lander示例
運行的月球著陸器的游戲你應(yīng)該執(zhí)行l(wèi)unarlander類。該類位于以下位置。

這個類不需要參數(shù)。一旦程序開始,神經(jīng)網(wǎng)絡(luò)立即開始訓(xùn)練。在它完成之前,它會周期性地經(jīng)過50個紀元,或者訓(xùn)練迭代。當它開始時,得分是負數(shù)。這些未經(jīng)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)的早期嘗試是以高速度撞擊月球并且沒有覆蓋太多距離。
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
第七次迭代后,分數(shù)開始增加。
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
分數(shù)會在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
到了第五十迭代,已經(jīng)達到了7460分。本章所使用的訓(xùn)練技術(shù)對隨機數(shù)進行了廣泛的應(yīng)用。因此,多次運行這個示例可能會導(dǎo)致完全不同的分數(shù)。
更多的迭代可能產(chǎn)生了更好的訓(xùn)練神經(jīng)網(wǎng)絡(luò);然而,程序?qū)⑺拗圃?0。這個數(shù)字通常會產(chǎn)生相當熟練的神經(jīng)飛行員。一旦網(wǎng)絡(luò)得到訓(xùn)練,就與獲勝的飛行員進行仿真。遙測每秒顯示。
神經(jīng)駕駛員把飛船保持在高空911秒。因此,我們不會顯示每一個遙測報告。然而,這種神經(jīng)飛行員所學的一些有趣的動作被高亮顯示。神經(jīng)網(wǎng)絡(luò)學會最好是讓飛船自由下落一段時間。獲勝網(wǎng)絡(luò)是如何著陸的:
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米處,已經(jīng)到達了40米/秒的終端速度。沒有什么科學依據(jù)- 40米/秒是終端速度,它只是作為一個任意數(shù)選擇。終端速度是很有趣的,因為神經(jīng)網(wǎng)絡(luò)知道一旦達到這個目標,飛行器就不會加速。他們使用終端速度來節(jié)省燃料,當接近地面時“中斷它們的下落”。自由落體的終端速度持續(xù)一段時間。
最后,在地面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
速度被逐漸減慢,神經(jīng)網(wǎng)絡(luò)決定每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米時,神經(jīng)網(wǎng)絡(luò)決定應(yīng)該每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
通過偶爾使用更短的周期,神經(jīng)飛行員減慢它達到離地面906米的地方使用了更多時間。飛船已經(jīng)減慢到每秒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
這種短程循環(huán)一直持續(xù)到飛船減慢速度為止。它甚至達到了在飛行的最后幾秒增加了高度。
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的速度著陸。這是由于程序中有一點小毛病。這個“小故障”之所以存在,是因為它說明了一個重要的問題:當神經(jīng)網(wǎng)絡(luò)被允許學習時,它們完全是自己的,并且將利用他們所能找到的一切。
最后的正速度是因為程序決定它是否要作為模擬周期的最后一部分進行推力。這個程序已經(jīng)決定了飛船的高度在零以下,并且著陸了。而神經(jīng)網(wǎng)絡(luò)最后一個“亂入的”推力,雖然飛行器已登陸這個推力沒用。然而,最后的推力確實增加了神經(jīng)網(wǎng)絡(luò)的得分。
回看方程式6.1。在著陸時每秒鐘的負速度每秒,程序得分減少1000。這個程序發(fā)現(xiàn)相反的情況也是這樣。對于每米每秒的正速度,它也得到1000點。通過學習程序中的這個小魔鬼,神經(jīng)飛行員可以獲得更高的分數(shù)。
神經(jīng)飛行員學習了一些非常有趣的東西,盡管沒有預(yù)先設(shè)計策略。網(wǎng)絡(luò)學習到了它想做什么。具體來說,這個飛行員決定如下:
[if !supportLists]??[endif]自由落體一段時間,利用終端速度優(yōu)勢
[if !supportLists]??[endif]在某一點上,打破自由落體,減緩飛行器下降速度
[if !supportLists]??[endif]接近地面時慢慢減小速度
[if !supportLists]??[endif]著陸后給最后一個推力,最大限度地得分
本例中的神經(jīng)飛行員使用遺傳算法進行訓(xùn)練。遺傳算法和模擬退火將在本章后面討論。首先,我們將了解著陸器是如何模擬的,以及它的得分是如何計算出來的。
6.2檢查月球著陸模擬器
我們現(xiàn)在將研究如何通過物理模擬創(chuàng)建月球著陸器的例子,以及神經(jīng)網(wǎng)絡(luò)實際上如何引導(dǎo)航天器。最后,我們將看到神經(jīng)網(wǎng)絡(luò)如何學習成為一個更好的飛行員。
6.2.1模擬著陸器
首先,我們需要一個模擬物理著陸月球的類。“物理學”這個詞使用得很隨意。這個例子的目的更多地是關(guān)于一個神經(jīng)網(wǎng)絡(luò)如何適應(yīng)一個人工環(huán)境而不是任何一種真實的物理模擬。
所有的物理仿真代碼都包含在landersimulator類??梢栽谝韵挛恢谜业酱祟?。

這個類首先定義一些對模擬非常重要的常量。

重力常數(shù)定義了月球重力加速度。設(shè)置為1.62,以米每秒計算。推力常數(shù)規(guī)定了每秒抵消重力加速度的量。終端速度是航天器可以向上或向下移動的最快速度。
除了這些常量之外,模擬器程序還需要幾個實例變量來維護狀態(tài)。這些變量如下所示

燃料變量保存燃料剩余量。秒變量保存停留空中的秒數(shù)。海拔高度保存當前高度。速度變量保存當前速度。正數(shù)表明飛船在向上移動。負數(shù)表明飛船在向下移動。
模擬器在下面的構(gòu)造函數(shù)中將值設(shè)置為合理的起始值:

飛船以200升燃料開始,高度設(shè)置在10000米以上。
Turn方法處理每個“轉(zhuǎn)換”。在模擬器中一次轉(zhuǎn)換是一秒。推力參數(shù)表明飛船在這次轉(zhuǎn)換過程中是否希望啟動推力。

首先,秒數(shù)加1,表示逝去1秒。用重力常數(shù)GRAVITY來降低速度以模擬下降。

當前速度增大了海拔高度。當然,如果速度是負的,高度就會降低。

如果在這個轉(zhuǎn)換處施加了推力,則將燃油fuel減少一,并通過推力常數(shù)THRUST增加速度。

飛行器的下降或上升速度不能大于終端速度。下面的代碼確保著陸器的上升速度不超過終端速度。

下面代碼確保我們下降速度不大于終端速度。

下面代碼確保高度不會降到零以下。這是很重要的,以防止飛行器模擬著陸太硬以至于闖到地下去。

除了模擬代碼,landersimulator還提供了兩個實用功能。第一個計算的分數(shù),應(yīng)該只在航天器著陸后調(diào)用。此處顯示此方法。

記分方法實現(xiàn)等式6.1。正如你所看到的,它使用fuel燃料、seconds秒和velocity速度來計算分數(shù)。
此外,還提供了一種確定飛船是否仍在飛行的方法。如果高度大于零,它仍在飛行。

在下一節(jié)中,我們將看到神經(jīng)網(wǎng)絡(luò)是如何實際飛行并獲得一個分數(shù)的。
6.2.2計算分數(shù)
PilotScor類實現(xiàn)飛行航天器的神經(jīng)網(wǎng)絡(luò)所需的代碼。這個類還計算在登陸后的最終得分。這個類如清單6.1所示。

正如你可以看到下面代碼,這PilotScore類實現(xiàn)CalculateScore接口。

Encog的模擬退火和遺傳算法都使用了CalculateScore接口,來確定神經(jīng)網(wǎng)絡(luò)在解決被給的問題時效率如何。根據(jù)不同的問題,低分可以是壞的也可以是好的。
CalculateScore接口要求兩個方法。方法一被稱為calculateNetworkScore。此方法接受一個神經(jīng)網(wǎng)絡(luò),返回一個表示網(wǎng)絡(luò)分數(shù)的double。

第二個方法返回一個值來指示分數(shù)是否應(yīng)該最小化。

對于這個例子,我們想最大化得分。作為結(jié)果,shouldMinimize方法返回false
?
6.2.3駕駛宇宙飛船
本節(jié)展示了神經(jīng)網(wǎng)絡(luò)是如何實際飛行的。神經(jīng)網(wǎng)絡(luò)將提供環(huán)境信息,如燃料剩余、高度和當前速度。然后神經(jīng)網(wǎng)絡(luò)輸出一個值,表示神經(jīng)網(wǎng)絡(luò)是否希望啟動推力。NeuralPilot類執(zhí)行此飛行。可以在以下位置看到NeuralPilot類:

NeuralPilot構(gòu)造函數(shù)設(shè)置飛行的航天器。該構(gòu)造函數(shù)通過一個網(wǎng)絡(luò)來飛行飛船,以及一個布爾值,指示是否應(yīng)該跟蹤到屏幕上的遙測。

月球著陸器必須將燃料水平、高度和當前速度反饋給神經(jīng)網(wǎng)絡(luò)。這些值必須規(guī)范化,如第2章所述。為了實現(xiàn)這種規(guī)范化,構(gòu)造函數(shù)首先設(shè)置幾個規(guī)范化字段。

除了規(guī)范化字段之外,我們還將保存操作參數(shù)。跟蹤變量保存到實例級別,以便程序稍后知道它是否應(yīng)該顯示遙測。

神經(jīng)飛行員將有三個輸入神經(jīng)元和一個輸出神經(jīng)元。這三個輸入神經(jīng)元將向神經(jīng)網(wǎng)絡(luò)傳達以下三個字段。?Current fuel level?Current altitude?Current velocity
這三個輸入字段將產(chǎn)生一個輸出字段,指示神經(jīng)飛行員是否愿意啟動推進器。
規(guī)范這三個字段,它們定義為三個NormalizedField對象。首先,設(shè)置燃料。

我們知道燃料在0到200之間。我們將把這個標準化到0.9到10.9的范圍。這與范圍- 1至1是非常相似的,除非它不采取價值的方式到極端。這有時會幫助神經(jīng)網(wǎng)絡(luò)更好地學習。尤其是當全范圍已知時。
接下來設(shè)置速度和高度。

速度和高度都知道范圍,像燃料一樣。其結(jié)果是,速度建立起來類似于燃料和高度。

因為我們沒有訓(xùn)練數(shù)據(jù),所以知道范圍是非常重要的。這與第2章中提供的確定最小值和最大值的示例數(shù)據(jù)不同。
在這個例子中,飛行宇宙飛船的主要目的是獲得一個分數(shù)。scorePilot方法計算這個分數(shù)。它將模擬一個飛船從軌道一點降落到著陸點的飛行。scorePilot方法計算這個分數(shù):

該方法首先創(chuàng)建一個LanderSimulator對象來模擬被該程序采用的非常簡單的物理。

我們現(xiàn)在進入的scorePilot方法主循環(huán)。只要飛船還在飛行,它就會繼續(xù)循環(huán)。只要它的高度大于零,宇宙飛船仍在飛行。

首先創(chuàng)建一個數(shù)組來保存從模擬器直接獲得的原始數(shù)據(jù)。

規(guī)范化方法的NormalizedField對象用于實際規(guī)范燃料文件,高度和速度。

這個單輸出神經(jīng)元將決定推進器是否應(yīng)該被啟動。

如果值大于零,則推進器將被啟動。如果飛船正在跟蹤,那么也會顯示推進器被啟動了。

在模擬器中處理下一個“轉(zhuǎn)換”,必要時進行推力。如果飛船跟蹤,也顯示遙測。

宇宙飛船現(xiàn)在著陸了。根據(jù)前面討論的標準返回分數(shù)。

現(xiàn)在我們來看看如何訓(xùn)練神經(jīng)飛行員。
6.3訓(xùn)練神經(jīng)飛行員
這個例子可以使用遺傳算法或模擬退火訓(xùn)練神經(jīng)飛行員。encog將遺傳算法和模擬退火算法非常類似地對待。一方面,您可以簡單地提供一個訓(xùn)練集和使用模擬退火,或者您可以使用一個遺傳算法,就像在一個傳播網(wǎng)絡(luò)中一樣。我們將在本章后面看到一個例子,我們將這兩種技術(shù)應(yīng)用于XOR問題。這將表明它們與傳播訓(xùn)練有多么相似。
另一方面,遺傳算法和模擬退火可以做一些傳播訓(xùn)練不能做的事情。他們可以讓你在沒有訓(xùn)練集的情況下進行訓(xùn)練。由于本章前面開發(fā)了一個評分類,它仍然是有監(jiān)督的培訓(xùn)。但是,它不需要訓(xùn)練數(shù)據(jù)輸入。相反,神經(jīng)網(wǎng)絡(luò)需要輸入它所做的工作有多好的標準。如果能提供這種評分函數(shù),模擬退火算法或遺傳算法可以訓(xùn)練神經(jīng)網(wǎng)絡(luò)。這兩種方法將在接下來的章節(jié)中討論,遺傳算法開始。
6.3.1什么是遺傳算法
遺傳算法試圖模擬達爾文的進化來創(chuàng)造一個更好的神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)被簡化為一個double變量數(shù)組。這個數(shù)組變成了基因序列。遺傳算法首先是建立一個隨機神經(jīng)網(wǎng)絡(luò)種群。這個群體中的所有神經(jīng)網(wǎng)絡(luò)都具有相同的結(jié)構(gòu),這意味著它們具有相同數(shù)量的神經(jīng)元和層。然而,它們都有不同的隨機權(quán)重。
這些神經(jīng)網(wǎng)絡(luò)按“分數(shù)”排序,其得分由評分方法提供,如上一節(jié)所討論的。在神經(jīng)飛行員的例子中,這個分數(shù)表明飛船降落的多軟。
頂部的神經(jīng)網(wǎng)絡(luò)被選中來“繁殖”。底層神經(jīng)網(wǎng)絡(luò)“死亡”。當兩個網(wǎng)絡(luò)繁殖時,通過拼接DNA來模擬大自然。在這種情況下,接頭是來自每個網(wǎng)絡(luò)的雙數(shù)組拼接在一起,創(chuàng)建一個新的子代神經(jīng)網(wǎng)絡(luò)。子代神經(jīng)網(wǎng)絡(luò)占據(jù)了垂死的神經(jīng)網(wǎng)絡(luò)空出的位置。
有些后代會“突變”。也就是說,一些遺傳物質(zhì)是隨機的,而不是來自雙親。這就引入了基因庫中需要的多樣性,并模擬了突變的自然過程。
種群被排序,這個過程又開始了。每次迭代提供一個循環(huán)。正如你所看到的,不需要訓(xùn)練集。所有需要的是一個對象來評分每個神經(jīng)網(wǎng)絡(luò)。當然,您可以提供一個得分對象使用的訓(xùn)練集,該對象使用訓(xùn)練集來對每個網(wǎng)絡(luò)進行評分。
6.3.2使用遺傳算法
使用遺傳算法非常簡單,使用NeuralGeneticAlgorithm類。NeuralGeneticAlgorithm類實現(xiàn)mltrain接口。因此,一旦建成,它用的方法與其他encog訓(xùn)練類一樣。
下面的代碼創(chuàng)建訓(xùn)練神經(jīng)新對象NeuralGeneticAlgorithm。

提供基本網(wǎng)絡(luò)以將神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)與遺傳算法通信。遺傳算法將忽略當前由神經(jīng)網(wǎng)絡(luò)設(shè)置的權(quán)重。
隨機數(shù)發(fā)生器的設(shè)置使神經(jīng)網(wǎng)絡(luò)可以創(chuàng)建一個新的隨機種群。與通常用的普通RangeRandomizer相比,NguyenWidrowRandomizer試圖產(chǎn)生不極端、更可訓(xùn)練的起始權(quán)重。然而,兩個隨機數(shù)發(fā)生器都可用。
500的值指定了種群大小。較大的種群會訓(xùn)練得更好,但會占用更多的內(nèi)存和處理時間。0.1個用于變異10%個后代。0.25值用于從居前25%的種群中選擇交配群體。

現(xiàn)在的訓(xùn)練器建好了,訓(xùn)練神經(jīng)網(wǎng)絡(luò),就像任何encog訓(xùn)練對象那樣。這里我們只重復(fù)50次。這通常足以制造出熟練的神經(jīng)飛行員。

該神經(jīng)網(wǎng)絡(luò)也可以使用EncogUtility類訓(xùn)練,如在前一章。只是簡單的訓(xùn)練,EncogUtility通常是首選的方法。然而,如果你的程序在每次迭代之后需要做些事,上面顯示的更手動的方法可能是最好的。
6.3.3什么是模擬退化算法
模擬退火也可以用來訓(xùn)練神經(jīng)飛行員。模擬退火算法類似于遺傳算法,它也需要一個評分對象。然而,它在內(nèi)部起著截然不同的作用。模擬退火模擬冶金退火過程。
退火是一種非常熱的熔融金屬慢慢冷卻的過程。這種緩慢的冷卻過程使金屬產(chǎn)生了強烈的、一致的分子結(jié)構(gòu)。退火是一種使金屬不易斷裂或破碎的過程。
可以在神經(jīng)網(wǎng)絡(luò)上執(zhí)行類似的過程。為了實現(xiàn)模擬退火,將神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)換為一個double數(shù)組。這與遺傳算法所做的過程完全相同。
隨機性是用來模擬散熱和冷卻效果的。當神經(jīng)網(wǎng)絡(luò)仍然是真正的“熱”,神經(jīng)網(wǎng)絡(luò)的現(xiàn)有權(quán)值在速度上增加。當網(wǎng)絡(luò)冷卻時,這種隨機性會減慢。只有對網(wǎng)絡(luò)得分產(chǎn)生積極影響的改變才被保留下來。
6.3.4使用模擬退火算法
使用模擬退火訓(xùn)練神經(jīng)飛行員,在運行這個示例時,在命令行上傳遞退火參數(shù)。這是非常簡單的使用退火的例子,而不是遺傳算法。它們都使用相同的得分函數(shù),并且是可互換的。下面的代碼行使用了模擬退火算法。

模擬退火NeuralSimulatedAnnealing對象是用來訓(xùn)練神經(jīng)飛行員。神經(jīng)網(wǎng)絡(luò)通過與使用遺傳算法訓(xùn)練的相同得分對象一起傳遞。
10和2的值分別為起始溫度和停止溫度。就華氏度或攝氏度而言,它們不是真正的溫度。較高的數(shù)字會產(chǎn)生更多的隨機性;較低的數(shù)字會產(chǎn)生較少的隨機性。下面的代碼顯示了如何應(yīng)用這個溫度或因素。

數(shù)字100指定從高溫到低溫每一次迭代需要多少個循環(huán)。一般來說,周期越長,結(jié)果就越準確。然而,數(shù)字越高,訓(xùn)練的時間就越長。
對于如何設(shè)置這些值,沒有簡單的規(guī)則。一般來說,最好用不同的值進行實驗,看看哪一種訓(xùn)練你的神經(jīng)網(wǎng)絡(luò)最好。
6.4使用訓(xùn)練集評分類
訓(xùn)練集也可用于遺傳算法和模擬退火。使用這種方法,模擬退火和遺傳算法與基于使用的傳播訓(xùn)練有點不同。使用這種方法時沒有計分功能。你只是用TrainingSetScore對象,以訓(xùn)練集,用它來評分神經(jīng)網(wǎng)絡(luò)。
一般來說,使用這種方式時彈性傳播優(yōu)于遺傳算法或模擬退火。遺傳算法或模擬退火算法在使用評分方法而不是訓(xùn)練集時非常出色。此外,模擬退火有時可以將反向傳播從局部極小值中推出來。
在下面的代碼找到的helloworld應(yīng)用程序可以很容易地修改為使用遺傳算法或模擬退火算法:

要改變上面的例子來使用遺傳算法,必須添加幾行。以下幾行創(chuàng)建了一個基于訓(xùn)練集的遺傳算法。首先,創(chuàng)建一個TrainingSetScore對象。

然后可以使用該對象與遺傳算法或模擬退火算法一起使用。下面的代碼顯示它與一個遺傳算法一起使用:

使用TrainingSetScore對象與模擬退火,只是通過模擬退火的構(gòu)造函數(shù)傳遞,如以上所做。
6.5總結(jié)
這一章介紹了怎樣使用遺傳算法和模擬退火訓(xùn)練一個神經(jīng)網(wǎng)絡(luò),這兩個技術(shù)使用一個評分對象,而不是訓(xùn)練集,然而,如果有需要的話這兩個算法也能使用訓(xùn)練集。
遺傳算法嘗試模擬達爾文進化論,神經(jīng)網(wǎng)絡(luò)基于fitness排序,最好的神經(jīng)網(wǎng)絡(luò)允許繁殖,較差的網(wǎng)絡(luò)死亡,下一代需要來自fitest神經(jīng)網(wǎng)絡(luò)的遺傳物質(zhì)。
模擬退火是模擬冶金的退火過程,網(wǎng)絡(luò)權(quán)重從高溫到低溫,隨著溫度的降低,選擇最佳網(wǎng)絡(luò),這就產(chǎn)生了一種適合于獲得更好分數(shù)的神經(jīng)網(wǎng)絡(luò)。
到目前為止,本書僅僅討論怎樣使用前饋神經(jīng)網(wǎng)絡(luò),這個網(wǎng)絡(luò)訓(xùn)練使用傳播訓(xùn)練,模擬退火或者是遺傳算法,前饋神經(jīng)網(wǎng)絡(luò)最常用的神經(jīng)網(wǎng)絡(luò)類型,僅僅因為它們是最常用的,就不意味著它們總是最好的解決方式,在下一章中,我們將看看一些其他的神經(jīng)網(wǎng)絡(luò)架構(gòu)。