第六章 更多監(jiān)督訓(xùn)練

轉(zhuǎn)載于:http://www.javagame.top/column/1/DXBLOG202202160939286734769/detail.html

介紹Lunar Lander示例

監(jiān)督訓(xùn)練沒(méi)有訓(xùn)練集

使用遺傳算法

使用模擬退火算法

遺傳算法和模擬退火算法的訓(xùn)練集


到目前為止,本書(shū)僅僅探索了訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)使用的是監(jiān)督傳播訓(xùn)練方法,這章將看看一些非傳播訓(xùn)練技術(shù),本章的神經(jīng)網(wǎng)絡(luò)將在沒(méi)有訓(xùn)練集的情況下進(jìn)行訓(xùn)練,但依然在經(jīng)常被用來(lái)幫助訓(xùn)練神經(jīng)網(wǎng)絡(luò)的輸出反饋的監(jiān)督下。我們將不提前準(zhǔn)備數(shù)據(jù)。

這種訓(xùn)練有兩種常見(jiàn)的技術(shù),模擬退火和遺傳算法,Encog提供了內(nèi)置支持,本章的示例可以使用這兩種算法進(jìn)行訓(xùn)練,這兩種算法都將在本章后面討論。

本章的例子展示了經(jīng)典的“月球著陸器”游戲,這款游戲已經(jīng)多次實(shí)現(xiàn),幾乎和電腦一樣老。你可以在維基百科上閱讀更多關(guān)于Lunar Lander的游戲。月球著陸器游戲的大多數(shù)變種背后的想法非常相似,示例程序的工作原理如下:月球著陸器宇宙飛船將開(kāi)始?jí)嬄洹.?dāng)它下降時(shí),它加速。著陸器可以達(dá)到最大速度,稱(chēng)為“末速”。推進(jìn)器可以應(yīng)用于著陸器以減慢其降落速度。然而,燃料的數(shù)量是有限的。一旦燃料耗盡,著陸器就會(huì)掉下來(lái),什么也做不了。

本章將教一個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)引導(dǎo)著陸器。這是一個(gè)非常簡(jiǎn)單的純文本模擬。神經(jīng)網(wǎng)絡(luò)只有一個(gè)選項(xiàng)可供選擇。它可以決定啟動(dòng)推進(jìn)器,也可以關(guān)閉推進(jìn)器。沒(méi)有預(yù)先建立訓(xùn)練數(shù)據(jù),也不會(huì)對(duì)神經(jīng)網(wǎng)絡(luò)如何引導(dǎo)飛行器進(jìn)行假設(shè)。如果使用訓(xùn)練集,輸入將提前提供關(guān)于神經(jīng)網(wǎng)絡(luò)在某些情況下應(yīng)該做什么的信息。對(duì)于這個(gè)例子,神經(jīng)網(wǎng)絡(luò)將自己學(xué)習(xí)所有的東西。

盡管神經(jīng)網(wǎng)絡(luò)將自己學(xué)習(xí)所有的東西,但這仍然是有監(jiān)督的訓(xùn)練。神經(jīng)網(wǎng)絡(luò)并沒(méi)有被完全不管。它將獲得一種給神經(jīng)網(wǎng)絡(luò)評(píng)分的方法。對(duì)于評(píng)分神經(jīng)網(wǎng)絡(luò),我們必須給它一些目標(biāo),然后計(jì)算一個(gè)數(shù)值,它決定了神經(jīng)網(wǎng)絡(luò)達(dá)到目標(biāo)的程度。

這些目標(biāo)是任意的,只是反映了什么被挑選出來(lái)評(píng)分網(wǎng)絡(luò)。這里總結(jié)了目標(biāo):

[if !supportLists]??[endif]盡量輕地著陸

[if !supportLists]??[endif]降落所用時(shí)間盡可能長(zhǎng)

[if !supportLists]??[endif]節(jié)約燃料

第一個(gè)目標(biāo)是不要墜毀,要盡可能輕柔地撞擊月球表面。因此,撞擊時(shí)的任何速度都是一個(gè)很大的負(fù)分。神經(jīng)網(wǎng)絡(luò)的第二個(gè)目標(biāo)是降落所用時(shí)間盡可能長(zhǎng)。要做到這一點(diǎn),它需要盡可能長(zhǎng)時(shí)間地停留在空中,并為在空中停留更長(zhǎng)時(shí)間加分。最后,還有一點(diǎn)獎(jiǎng)勵(lì):一旦飛船著陸,仍然有燃料。分?jǐn)?shù)計(jì)算可以在等式6.1中看到。

score = (fuel · 10) + (velocity · 1000) + fuel ?????(6.1)?

在下一節(jié),我們將運(yùn)行月球著陸器的例子和觀(guān)察它學(xué)習(xí)著陸航天器。

6.1運(yùn)行Lunar Lander示例

運(yùn)行的月球著陸器的游戲你應(yīng)該執(zhí)行l(wèi)unarlander類(lèi)。該類(lèi)位于以下位置。


這個(gè)類(lèi)不需要參數(shù)。一旦程序開(kāi)始,神經(jīng)網(wǎng)絡(luò)立即開(kāi)始訓(xùn)練。在它完成之前,它會(huì)周期性地經(jīng)過(guò)50個(gè)紀(jì)元,或者訓(xùn)練迭代。當(dāng)它開(kāi)始時(shí),得分是負(fù)數(shù)。這些未經(jīng)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)的早期嘗試是以高速度撞擊月球并且沒(méi)有覆蓋太多距離。

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

第七次迭代后,分?jǐn)?shù)開(kāi)始增加。

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

分?jǐn)?shù)會(huì)在6196停留一段時(shí)間,但是之后會(huì)改變。

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)達(dá)到了7460分。本章所使用的訓(xùn)練技術(shù)對(duì)隨機(jī)數(shù)進(jìn)行了廣泛的應(yīng)用。因此,多次運(yùn)行這個(gè)示例可能會(huì)導(dǎo)致完全不同的分?jǐn)?shù)。

更多的迭代可能產(chǎn)生了更好的訓(xùn)練神經(jīng)網(wǎng)絡(luò);然而,程序?qū)⑺拗圃?0。這個(gè)數(shù)字通常會(huì)產(chǎn)生相當(dāng)熟練的神經(jīng)飛行員。一旦網(wǎng)絡(luò)得到訓(xùn)練,就與獲勝的飛行員進(jìn)行仿真。遙測(cè)每秒顯示。

神經(jīng)駕駛員把飛船保持在高空911秒。因此,我們不會(huì)顯示每一個(gè)遙測(cè)報(bào)告。然而,這種神經(jīng)飛行員所學(xué)的一些有趣的動(dòng)作被高亮顯示。神經(jīng)網(wǎng)絡(luò)學(xué)會(huì)最好是讓飛船自由下落一段時(shí)間。獲勝網(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)到達(dá)了40米/秒的終端速度。沒(méi)有什么科學(xué)依據(jù)- 40米/秒是終端速度,它只是作為一個(gè)任意數(shù)選擇。終端速度是很有趣的,因?yàn)樯窠?jīng)網(wǎng)絡(luò)知道一旦達(dá)到這個(gè)目標(biāo),飛行器就不會(huì)加速。他們使用終端速度來(lái)節(jié)省燃料,當(dāng)接近地面時(shí)“中斷它們的下落”。自由落體的終端速度持續(xù)一段時(shí)間。

最后,在地面6102米處,推進(jìn)器第一次點(diǎn)火。

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秒點(diǎn)一次火。保持速度在-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

當(dāng)飛行器接近月球表面時(shí),最大速度開(kāi)始下降。當(dāng)飛行器接近月球表面時(shí),飛行員正減慢速度。大約離地面4,274米時(shí),神經(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

通過(guò)偶爾使用更短的周期,神經(jīng)飛行員減慢它達(dá)到離地面906米的地方使用了更多時(shí)間。飛船已經(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ù)到飛船減慢速度為止。它甚至達(dá)到了在飛行的最后幾秒增加了高度。

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的速度著陸。這是由于程序中有一點(diǎn)小毛病。這個(gè)“小故障”之所以存在,是因?yàn)樗f(shuō)明了一個(gè)重要的問(wèn)題:當(dāng)神經(jīng)網(wǎng)絡(luò)被允許學(xué)習(xí)時(shí),它們完全是自己的,并且將利用他們所能找到的一切。

最后的正速度是因?yàn)槌绦驔Q定它是否要作為模擬周期的最后一部分進(jìn)行推力。這個(gè)程序已經(jīng)決定了飛船的高度在零以下,并且著陸了。而神經(jīng)網(wǎng)絡(luò)最后一個(gè)“亂入的”推力,雖然飛行器已登陸這個(gè)推力沒(méi)用。然而,最后的推力確實(shí)增加了神經(jīng)網(wǎng)絡(luò)的得分。

回看方程式6.1。在著陸時(shí)每秒鐘的負(fù)速度每秒,程序得分減少1000。這個(gè)程序發(fā)現(xiàn)相反的情況也是這樣。對(duì)于每米每秒的正速度,它也得到1000點(diǎn)。通過(guò)學(xué)習(xí)程序中的這個(gè)小魔鬼,神經(jīng)飛行員可以獲得更高的分?jǐn)?shù)。

神經(jīng)飛行員學(xué)習(xí)了一些非常有趣的東西,盡管沒(méi)有預(yù)先設(shè)計(jì)策略。網(wǎng)絡(luò)學(xué)習(xí)到了它想做什么。具體來(lái)說(shuō),這個(gè)飛行員決定如下:

[if !supportLists]??[endif]自由落體一段時(shí)間,利用終端速度優(yōu)勢(shì)

[if !supportLists]??[endif]在某一點(diǎn)上,打破自由落體,減緩飛行器下降速度

[if !supportLists]??[endif]接近地面時(shí)慢慢減小速度

[if !supportLists]??[endif]著陸后給最后一個(gè)推力,最大限度地得分


本例中的神經(jīng)飛行員使用遺傳算法進(jìn)行訓(xùn)練。遺傳算法和模擬退火將在本章后面討論。首先,我們將了解著陸器是如何模擬的,以及它的得分是如何計(jì)算出來(lái)的。

6.2檢查月球著陸模擬器

我們現(xiàn)在將研究如何通過(guò)物理模擬創(chuàng)建月球著陸器的例子,以及神經(jīng)網(wǎng)絡(luò)實(shí)際上如何引導(dǎo)航天器。最后,我們將看到神經(jīng)網(wǎng)絡(luò)如何學(xué)習(xí)成為一個(gè)更好的飛行員。

6.2.1模擬著陸器

首先,我們需要一個(gè)模擬物理著陸月球的類(lèi)?!拔锢韺W(xué)”這個(gè)詞使用得很隨意。這個(gè)例子的目的更多地是關(guān)于一個(gè)神經(jīng)網(wǎng)絡(luò)如何適應(yīng)一個(gè)人工環(huán)境而不是任何一種真實(shí)的物理模擬。

所有的物理仿真代碼都包含在landersimulator類(lèi)。可以在以下位置找到此類(lèi)。

這個(gè)類(lèi)首先定義一些對(duì)模擬非常重要的常量。

重力常數(shù)定義了月球重力加速度。設(shè)置為1.62,以米每秒計(jì)算。推力常數(shù)規(guī)定了每秒抵消重力加速度的量。終端速度是航天器可以向上或向下移動(dòng)的最快速度。

除了這些常量之外,模擬器程序還需要幾個(gè)實(shí)例變量來(lái)維護(hù)狀態(tài)。這些變量如下所示

燃料變量保存燃料剩余量。秒變量保存停留空中的秒數(shù)。海拔高度保存當(dāng)前高度。速度變量保存當(dāng)前速度。正數(shù)表明飛船在向上移動(dòng)。負(fù)數(shù)表明飛船在向下移動(dòng)。

模擬器在下面的構(gòu)造函數(shù)中將值設(shè)置為合理的起始值:

飛船以200升燃料開(kāi)始,高度設(shè)置在10000米以上。

Turn方法處理每個(gè)“轉(zhuǎn)換”。在模擬器中一次轉(zhuǎn)換是一秒。推力參數(shù)表明飛船在這次轉(zhuǎn)換過(guò)程中是否希望啟動(dòng)推力。

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

當(dāng)前速度增大了海拔高度。當(dāng)然,如果速度是負(fù)的,高度就會(huì)降低。

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

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

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

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

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

記分方法實(shí)現(xiàn)等式6.1。正如你所看到的,它使用fuel燃料、seconds秒和velocity速度來(lái)計(jì)算分?jǐn)?shù)。

此外,還提供了一種確定飛船是否仍在飛行的方法。如果高度大于零,它仍在飛行。

在下一節(jié)中,我們將看到神經(jīng)網(wǎng)絡(luò)是如何實(shí)際飛行并獲得一個(gè)分?jǐn)?shù)的。


6.2.2計(jì)算分?jǐn)?shù)

PilotScor類(lèi)實(shí)現(xiàn)飛行航天器的神經(jīng)網(wǎng)絡(luò)所需的代碼。這個(gè)類(lèi)還計(jì)算在登陸后的最終得分。這個(gè)類(lèi)如清單6.1所示。

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

Encog的模擬退火和遺傳算法都使用了CalculateScore接口,來(lái)確定神經(jīng)網(wǎng)絡(luò)在解決被給的問(wèn)題時(shí)效率如何。根據(jù)不同的問(wèn)題,低分可以是壞的也可以是好的。

CalculateScore接口要求兩個(gè)方法。方法一被稱(chēng)為calculateNetworkScore。此方法接受一個(gè)神經(jīng)網(wǎng)絡(luò),返回一個(gè)表示網(wǎng)絡(luò)分?jǐn)?shù)的double。

第二個(gè)方法返回一個(gè)值來(lái)指示分?jǐn)?shù)是否應(yīng)該最小化。

對(duì)于這個(gè)例子,我們想最大化得分。作為結(jié)果,shouldMinimize方法返回false

?

6.2.3駕駛宇宙飛船

本節(jié)展示了神經(jīng)網(wǎng)絡(luò)是如何實(shí)際飛行的。神經(jīng)網(wǎng)絡(luò)將提供環(huán)境信息,如燃料剩余、高度和當(dāng)前速度。然后神經(jīng)網(wǎng)絡(luò)輸出一個(gè)值,表示神經(jīng)網(wǎng)絡(luò)是否希望啟動(dòng)推力。NeuralPilot類(lèi)執(zhí)行此飛行。可以在以下位置看到NeuralPilot類(lèi):

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

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

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

神經(jīng)飛行員將有三個(gè)輸入神經(jīng)元和一個(gè)輸出神經(jīng)元。這三個(gè)輸入神經(jīng)元將向神經(jīng)網(wǎng)絡(luò)傳達(dá)以下三個(gè)字段。?Current fuel level?Current altitude?Current velocity

這三個(gè)輸入字段將產(chǎn)生一個(gè)輸出字段,指示神經(jīng)飛行員是否愿意啟動(dòng)推進(jìn)器。

規(guī)范這三個(gè)字段,它們定義為三個(gè)NormalizedField對(duì)象。首先,設(shè)置燃料。

我們知道燃料在0到200之間。我們將把這個(gè)標(biāo)準(zhǔn)化到0.9到10.9的范圍。這與范圍- 1至1是非常相似的,除非它不采取價(jià)值的方式到極端。這有時(shí)會(huì)幫助神經(jīng)網(wǎng)絡(luò)更好地學(xué)習(xí)。尤其是當(dāng)全范圍已知時(shí)。

接下來(lái)設(shè)置速度和高度。

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

因?yàn)槲覀儧](méi)有訓(xùn)練數(shù)據(jù),所以知道范圍是非常重要的。這與第2章中提供的確定最小值和最大值的示例數(shù)據(jù)不同。

在這個(gè)例子中,飛行宇宙飛船的主要目的是獲得一個(gè)分?jǐn)?shù)。scorePilot方法計(jì)算這個(gè)分?jǐn)?shù)。它將模擬一個(gè)飛船從軌道一點(diǎn)降落到著陸點(diǎn)的飛行。scorePilot方法計(jì)算這個(gè)分?jǐn)?shù):

該方法首先創(chuàng)建一個(gè)LanderSimulator對(duì)象來(lái)模擬被該程序采用的非常簡(jiǎn)單的物理。

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

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

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

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

如果值大于零,則推進(jìn)器將被啟動(dòng)。如果飛船正在跟蹤,那么也會(huì)顯示推進(jìn)器被啟動(dòng)了。

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

宇宙飛船現(xiàn)在著陸了。根據(jù)前面討論的標(biāo)準(zhǔn)返回分?jǐn)?shù)。

現(xiàn)在我們來(lái)看看如何訓(xùn)練神經(jīng)飛行員。

6.3訓(xùn)練神經(jīng)飛行員

這個(gè)例子可以使用遺傳算法或模擬退火訓(xùn)練神經(jīng)飛行員。encog將遺傳算法和模擬退火算法非常類(lèi)似地對(duì)待。一方面,您可以簡(jiǎn)單地提供一個(gè)訓(xùn)練集和使用模擬退火,或者您可以使用一個(gè)遺傳算法,就像在一個(gè)傳播網(wǎng)絡(luò)中一樣。我們將在本章后面看到一個(gè)例子,我們將這兩種技術(shù)應(yīng)用于XOR問(wèn)題。這將表明它們與傳播訓(xùn)練有多么相似。

另一方面,遺傳算法和模擬退火可以做一些傳播訓(xùn)練不能做的事情。他們可以讓你在沒(méi)有訓(xùn)練集的情況下進(jìn)行訓(xùn)練。由于本章前面開(kāi)發(fā)了一個(gè)評(píng)分類(lèi),它仍然是有監(jiān)督的培訓(xùn)。但是,它不需要訓(xùn)練數(shù)據(jù)輸入。相反,神經(jīng)網(wǎng)絡(luò)需要輸入它所做的工作有多好的標(biāo)準(zhǔn)。如果能提供這種評(píng)分函數(shù),模擬退火算法或遺傳算法可以訓(xùn)練神經(jīng)網(wǎng)絡(luò)。這兩種方法將在接下來(lái)的章節(jié)中討論,遺傳算法開(kāi)始。


6.3.1什么是遺傳算法

遺傳算法試圖模擬達(dá)爾文的進(jìn)化來(lái)創(chuàng)造一個(gè)更好的神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)被簡(jiǎn)化為一個(gè)double變量數(shù)組。這個(gè)數(shù)組變成了基因序列。遺傳算法首先是建立一個(gè)隨機(jī)神經(jīng)網(wǎng)絡(luò)種群。這個(gè)群體中的所有神經(jīng)網(wǎng)絡(luò)都具有相同的結(jié)構(gòu),這意味著它們具有相同數(shù)量的神經(jīng)元和層。然而,它們都有不同的隨機(jī)權(quán)重。

這些神經(jīng)網(wǎng)絡(luò)按“分?jǐn)?shù)”排序,其得分由評(píng)分方法提供,如上一節(jié)所討論的。在神經(jīng)飛行員的例子中,這個(gè)分?jǐn)?shù)表明飛船降落的多軟。

頂部的神經(jīng)網(wǎng)絡(luò)被選中來(lái)“繁殖”。底層神經(jīng)網(wǎng)絡(luò)“死亡”。當(dāng)兩個(gè)網(wǎng)絡(luò)繁殖時(shí),通過(guò)拼接DNA來(lái)模擬大自然。在這種情況下,接頭是來(lái)自每個(gè)網(wǎng)絡(luò)的雙數(shù)組拼接在一起,創(chuàng)建一個(gè)新的子代神經(jīng)網(wǎng)絡(luò)。子代神經(jīng)網(wǎng)絡(luò)占據(jù)了垂死的神經(jīng)網(wǎng)絡(luò)空出的位置。

有些后代會(huì)“突變”。也就是說(shuō),一些遺傳物質(zhì)是隨機(jī)的,而不是來(lái)自雙親。這就引入了基因庫(kù)中需要的多樣性,并模擬了突變的自然過(guò)程。

種群被排序,這個(gè)過(guò)程又開(kāi)始了。每次迭代提供一個(gè)循環(huán)。正如你所看到的,不需要訓(xùn)練集。所有需要的是一個(gè)對(duì)象來(lái)評(píng)分每個(gè)神經(jīng)網(wǎng)絡(luò)。當(dāng)然,您可以提供一個(gè)得分對(duì)象使用的訓(xùn)練集,該對(duì)象使用訓(xùn)練集來(lái)對(duì)每個(gè)網(wǎng)絡(luò)進(jìn)行評(píng)分。


6.3.2使用遺傳算法

使用遺傳算法非常簡(jiǎn)單,使用NeuralGeneticAlgorithm類(lèi)。NeuralGeneticAlgorithm類(lèi)實(shí)現(xiàn)mltrain接口。因此,一旦建成,它用的方法與其他encog訓(xùn)練類(lèi)一樣。

下面的代碼創(chuàng)建訓(xùn)練神經(jīng)新對(duì)象NeuralGeneticAlgorithm。

提供基本網(wǎng)絡(luò)以將神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)與遺傳算法通信。遺傳算法將忽略當(dāng)前由神經(jīng)網(wǎng)絡(luò)設(shè)置的權(quán)重。

隨機(jī)數(shù)發(fā)生器的設(shè)置使神經(jīng)網(wǎng)絡(luò)可以創(chuàng)建一個(gè)新的隨機(jī)種群。與通常用的普通RangeRandomizer相比,NguyenWidrowRandomizer試圖產(chǎn)生不極端、更可訓(xùn)練的起始權(quán)重。然而,兩個(gè)隨機(jī)數(shù)發(fā)生器都可用。

500的值指定了種群大小。較大的種群會(huì)訓(xùn)練得更好,但會(huì)占用更多的內(nèi)存和處理時(shí)間。0.1個(gè)用于變異10%個(gè)后代。0.25值用于從居前25%的種群中選擇交配群體。

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

該神經(jīng)網(wǎng)絡(luò)也可以使用EncogUtility類(lèi)訓(xùn)練,如在前一章。只是簡(jiǎn)單的訓(xùn)練,EncogUtility通常是首選的方法。然而,如果你的程序在每次迭代之后需要做些事,上面顯示的更手動(dòng)的方法可能是最好的。


6.3.3什么是模擬退化算法

模擬退火也可以用來(lái)訓(xùn)練神經(jīng)飛行員。模擬退火算法類(lèi)似于遺傳算法,它也需要一個(gè)評(píng)分對(duì)象。然而,它在內(nèi)部起著截然不同的作用。模擬退火模擬冶金退火過(guò)程。

退火是一種非常熱的熔融金屬慢慢冷卻的過(guò)程。這種緩慢的冷卻過(guò)程使金屬產(chǎn)生了強(qiáng)烈的、一致的分子結(jié)構(gòu)。退火是一種使金屬不易斷裂或破碎的過(guò)程。

可以在神經(jīng)網(wǎng)絡(luò)上執(zhí)行類(lèi)似的過(guò)程。為了實(shí)現(xiàn)模擬退火,將神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)換為一個(gè)double數(shù)組。這與遺傳算法所做的過(guò)程完全相同。

隨機(jī)性是用來(lái)模擬散熱和冷卻效果的。當(dāng)神經(jīng)網(wǎng)絡(luò)仍然是真正的“熱”,神經(jīng)網(wǎng)絡(luò)的現(xiàn)有權(quán)值在速度上增加。當(dāng)網(wǎng)絡(luò)冷卻時(shí),這種隨機(jī)性會(huì)減慢。只有對(duì)網(wǎng)絡(luò)得分產(chǎn)生積極影響的改變才被保留下來(lái)。


6.3.4使用模擬退火算法

使用模擬退火訓(xùn)練神經(jīng)飛行員,在運(yùn)行這個(gè)示例時(shí),在命令行上傳遞退火參數(shù)。這是非常簡(jiǎn)單的使用退火的例子,而不是遺傳算法。它們都使用相同的得分函數(shù),并且是可互換的。下面的代碼行使用了模擬退火算法。

模擬退火NeuralSimulatedAnnealing對(duì)象是用來(lái)訓(xùn)練神經(jīng)飛行員。神經(jīng)網(wǎng)絡(luò)通過(guò)與使用遺傳算法訓(xùn)練的相同得分對(duì)象一起傳遞。

10和2的值分別為起始溫度和停止溫度。就華氏度或攝氏度而言,它們不是真正的溫度。較高的數(shù)字會(huì)產(chǎn)生更多的隨機(jī)性;較低的數(shù)字會(huì)產(chǎn)生較少的隨機(jī)性。下面的代碼顯示了如何應(yīng)用這個(gè)溫度或因素。

數(shù)字100指定從高溫到低溫每一次迭代需要多少個(gè)循環(huán)。一般來(lái)說(shuō),周期越長(zhǎng),結(jié)果就越準(zhǔn)確。然而,數(shù)字越高,訓(xùn)練的時(shí)間就越長(zhǎng)。

對(duì)于如何設(shè)置這些值,沒(méi)有簡(jiǎn)單的規(guī)則。一般來(lái)說(shuō),最好用不同的值進(jìn)行實(shí)驗(yàn),看看哪一種訓(xùn)練你的神經(jīng)網(wǎng)絡(luò)最好。

6.4使用訓(xùn)練集評(píng)分類(lèi)

訓(xùn)練集也可用于遺傳算法和模擬退火。使用這種方法,模擬退火和遺傳算法與基于使用的傳播訓(xùn)練有點(diǎn)不同。使用這種方法時(shí)沒(méi)有計(jì)分功能。你只是用TrainingSetScore對(duì)象,以訓(xùn)練集,用它來(lái)評(píng)分神經(jīng)網(wǎng)絡(luò)。

一般來(lái)說(shuō),使用這種方式時(shí)彈性傳播優(yōu)于遺傳算法或模擬退火。遺傳算法或模擬退火算法在使用評(píng)分方法而不是訓(xùn)練集時(shí)非常出色。此外,模擬退火有時(shí)可以將反向傳播從局部極小值中推出來(lái)。

在下面的代碼找到的helloworld應(yīng)用程序可以很容易地修改為使用遺傳算法或模擬退火算法:

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

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

使用TrainingSetScore對(duì)象與模擬退火,只是通過(guò)模擬退火的構(gòu)造函數(shù)傳遞,如以上所做。

6.5總結(jié)

這一章介紹了怎樣使用遺傳算法和模擬退火訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò),這兩個(gè)技術(shù)使用一個(gè)評(píng)分對(duì)象,而不是訓(xùn)練集,然而,如果有需要的話(huà)這兩個(gè)算法也能使用訓(xùn)練集。

遺傳算法嘗試模擬達(dá)爾文進(jìn)化論,神經(jīng)網(wǎng)絡(luò)基于fitness排序,最好的神經(jīng)網(wǎng)絡(luò)允許繁殖,較差的網(wǎng)絡(luò)死亡,下一代需要來(lái)自fitest神經(jīng)網(wǎng)絡(luò)的遺傳物質(zhì)。

模擬退火是模擬冶金的退火過(guò)程,網(wǎng)絡(luò)權(quán)重從高溫到低溫,隨著溫度的降低,選擇最佳網(wǎng)絡(luò),這就產(chǎn)生了一種適合于獲得更好分?jǐn)?shù)的神經(jīng)網(wǎng)絡(luò)。

到目前為止,本書(shū)僅僅討論怎樣使用前饋神經(jīng)網(wǎng)絡(luò),這個(gè)網(wǎng)絡(luò)訓(xùn)練使用傳播訓(xùn)練,模擬退火或者是遺傳算法,前饋神經(jīng)網(wǎng)絡(luò)最常用的神經(jīng)網(wǎng)絡(luò)類(lèi)型,僅僅因?yàn)樗鼈兪亲畛S玫?,就不意味著它們總是最好的解決方式,在下一章中,我們將看看一些其他的神經(jīng)網(wǎng)絡(luò)架構(gòu)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容