官术网_书友最值得收藏!

4.4 交叉熵方法在FrozenLake中的應(yīng)用

我們要用交叉熵方法解決的下一個環(huán)境是FrozenLake。它是所謂的網(wǎng)格世界類型的環(huán)境,智能體被限制在4×4的網(wǎng)格中時,可以朝4個方向移動:上、下、左、右。如圖4.6所示,智能體總是從左上角開始,它的目標(biāo)是到達(dá)網(wǎng)格的右下角。在某些固定的單元格中有洞,如果智能體掉入洞中,片段就結(jié)束了并且獎勵為0。如果智能體到達(dá)了目標(biāo)單元格,則獲得1.0的獎勵并且片段結(jié)束。

089-02

圖4.6 FrozenLake環(huán)境

為了增加復(fù)雜性,假設(shè)整個世界都是光滑的(畢竟這是一個結(jié)冰的湖面),所以智能體執(zhí)行的動作不總?cè)珙A(yù)期那樣發(fā)生——有33%的概率,它會滑到左邊或右邊。例如,如果希望智能體向左移動,則它有33%的概率確實(shí)向左移動,有33%的概率會停在目標(biāo)單元格的上面,有33%的概率則會停在目標(biāo)單元格的下面。本節(jié)末尾將會顯示,這使智能體很難進(jìn)步。

我們來看該環(huán)境在Gym中的表示:

089-03

觀察空間是離散的,這意味著它就是從0到15(包含0和15)的數(shù)字。很明顯,這個數(shù)字是智能體在網(wǎng)格中的當(dāng)前位置。動作空間同樣是離散的,它可以是從0到3的數(shù)字。神經(jīng)網(wǎng)絡(luò)來自CartPole示例,需要一個數(shù)字向量。為了獲得這樣的向量,可以對離散的輸入進(jìn)行傳統(tǒng)的獨(dú)熱(one-hot)編碼,這意味著網(wǎng)絡(luò)的輸入會是16個浮點(diǎn)數(shù),除了要編碼的位置是1外,其他位置都是0。使用Gym中的ObservationWrapper類可以減少代碼的修改量,因此可以實(shí)現(xiàn)一個DiscreteOneHotWrapper類:

090-01

通過將此包裝器應(yīng)用于環(huán)境,觀察空間和動作空間已經(jīng)都100%兼容CartPole了(源代碼見Chapter04/02_frozenlake_naive.py)。然而,運(yùn)行之后,我們發(fā)現(xiàn)它的分?jǐn)?shù)并沒有隨著時間的推移而提升,如圖4.7和圖4.8所示。

090-02

圖4.7 FrozenLake環(huán)境的獎勵(左)和損失(右)

091-01

圖4.8 訓(xùn)練過程的獎勵邊界

要理解發(fā)生了什么,我們需要深入研究兩個環(huán)境的獎勵結(jié)構(gòu)。在CartPole中,木棒掉落前的每一步環(huán)境都會返回一個1.0的獎勵。所以智能體平衡木棒越久,它能獲得的獎勵就越多。由于智能體行為的隨機(jī)性,不同的片段有不同的長度,這將產(chǎn)生一個片段獎勵的正態(tài)分布。通過選擇獎勵邊界,過濾掉不太成功的片段,學(xué)習(xí)如何復(fù)制成功的片段(用成功的片段數(shù)據(jù)來訓(xùn)練),如圖4.9所示。

091-02

圖4.9 CartPole環(huán)境的獎勵分布

在FrozenLake環(huán)境中,片段和它們的獎勵有些不同。只有在到達(dá)終點(diǎn)的時候才會獲得1.0的獎勵,并且這個獎勵并不能表示出片段有多好。它是快速并高效的嗎?還是說在湖上轉(zhuǎn)了4圈后才偶然進(jìn)入最終單元格的?我們并不知道這些,只有一個1.0的獎勵,僅此而已。片段的獎勵分布也是有問題的。只有兩種可能的片段(見圖4.10):獎勵是0的(失敗了)以及獎勵是1的(成功了),失敗的片段顯然會在訓(xùn)練的一開始占主導(dǎo)地位。所以,“精英”片段的百分位完全選錯了,只提供了一些錯誤的樣本來訓(xùn)練。這就是訓(xùn)練失敗的原因。

092-01

圖4.10 FrozenLake環(huán)境的獎勵分布

這個示例展示了交叉熵方法存在的限制:

  • 對于訓(xùn)練來說,片段必須是有限的、優(yōu)秀的、簡短的。
  • 片段的總獎勵應(yīng)該有足夠的差異來區(qū)分好的片段和差的片段。
  • 沒有中間值來表明智能體成功了還是失敗了。

本書后面會介紹其他能解決這些限制的方法。就目前而言,如果你好奇如何用交叉熵方法解決FrozenLake環(huán)境,請參閱對代碼的改變(完整示例代碼見Chapter04/03_frozenlake_tweaked.py):

  • 每批包含更多的片段:在CartPole中,每個迭代只用16個片段就足夠了,但是FrozenLake需要起碼100個片段,才能獲得一些成功的片段。
  • 對獎勵使用折扣系數(shù):為了讓總獎勵能考慮片段的長度,并增加片段的多樣性,可以使用折扣因子是0.9或0.95的折扣總獎勵。在這種情況下,較短的片段將比那些較長的片段得到更高的獎勵。這將增加獎勵分布的多樣性,有助于避開圖4.10所描述的情況。
  • 讓“精英”片段保持更長的時間:在CartPole訓(xùn)練中,我們從環(huán)境中采樣片段,訓(xùn)練最好的一些片段,然后將它們丟掉。在FrozenLake環(huán)境中,成功的片段十分珍貴,所以需要將它們保留并訓(xùn)練好幾次迭代。
  • 降低學(xué)習(xí)率:這給NN機(jī)會來平均更多的訓(xùn)練樣本。
  • 更長的訓(xùn)練時間:由于成功片段的稀有性以及動作結(jié)果的隨機(jī)性,NN會更難決定在某個特定場景下應(yīng)該執(zhí)行什么動作。要將片段的成功率提升至50%,起碼需要訓(xùn)練5000次迭代。

要將這些內(nèi)容都合并到代碼中,需要改變filter_batch函數(shù),用它來計(jì)算折扣獎勵并返回需要保留下去的“精英”片段:

092-02

然后,在訓(xùn)練循環(huán)中,需要存下之前的“精英”片段,并將它們傳給下一次訓(xùn)練迭代的處理函數(shù)。

093-01

除了學(xué)習(xí)率降低10倍以及BATCH_SIZE設(shè)置成100,剩下的代碼都一樣。耐心地等待一小會兒(新版本的代碼需要花1個半小時才能完成1萬次迭代),當(dāng)能解決55%的片段時,再訓(xùn)練模型就不會提升了,訓(xùn)練結(jié)果如圖4.11和圖4.12所示。雖然處理這個問題還是有其他辦法的(例如,為熵?fù)p失增加一個正則項(xiàng)),但是這些方法會在后面的章節(jié)再討論。

093-02

圖4.11 調(diào)整后訓(xùn)練的獎勵(左)和損失(右)

094-02

圖4.12 調(diào)整后的獎勵邊界

FrozenLake環(huán)境中值得注意的最后一點(diǎn)是它的光滑度所帶來的影響。每個動作都有33%的概率被替換成一個轉(zhuǎn)動了90°的動作(例如,“向上”的動作會有33%的概率是正常的,有33%的概率被替換成“向左”,還有33%的概率被替換成“向右”)。

不光滑的版本見Chapter04/04_frozenlake_nonslippery.py,唯一的不同之處就在環(huán)境創(chuàng)建處(需要看一下Gym的源碼,然后用調(diào)整后的參數(shù)來創(chuàng)建環(huán)境的實(shí)例)。

094-01

效果驚人(見圖4.13和圖4.14)!只需要120~140個批就能解決不光滑版本的環(huán)境,這比有噪聲的環(huán)境要快100倍:

094-03
095-01

圖4.13 不光滑版本的FrozenLake的獎勵(左)和損失(右)

095-02

圖4.14 不光滑版本的獎勵邊界

主站蜘蛛池模板: 元谋县| 西乌珠穆沁旗| 赫章县| 德惠市| 东港市| 宣城市| 克什克腾旗| 福州市| 义马市| 柳江县| 师宗县| 娱乐| 莎车县| 巴林右旗| 锦州市| 会理县| 罗山县| 永昌县| 措勤县| 保德县| 乐业县| 长泰县| 黄大仙区| 威海市| 贞丰县| 丰原市| 文登市| 贡觉县| 榆林市| 吴旗县| 高平市| 隆林| 潞城市| 新沂市| 西青区| 密山市| 榆林市| 新密市| 都昌县| 西宁市| 利川市|