- 深度強(qiáng)化學(xué)習(xí)實(shí)踐(原書第2版)
- (俄)馬克西姆·拉潘
- 2063字
- 2021-08-18 17:39:24
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é)束。

圖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中的表示:

觀察空間是離散的,這意味著它就是從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
類:

通過將此包裝器應(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所示。

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

圖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所示。

圖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)練失敗的原因。

圖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ì)算折扣獎勵并返回需要保留下去的“精英”片段:

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

除了學(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é)再討論。

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

圖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í)例)。

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


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

圖4.14 不光滑版本的獎勵邊界
- 自動駕駛:人工智能理論與實(shí)踐
- TensorFlow學(xué)習(xí)指南:深度學(xué)習(xí)系統(tǒng)構(gòu)建詳解
- 深度學(xué)習(xí)與計(jì)算機(jī)視覺:項(xiàng)目式教材
- COMSOL Multiphysics工程實(shí)踐與理論仿真
- 從零構(gòu)建大模型
- 深度學(xué)習(xí)詳解:基于李宏毅老師“機(jī)器學(xué)習(xí)”課程
- 共生:科技與社會驅(qū)動的數(shù)字化未來
- 深度學(xué)習(xí)必學(xué)的十個問題:理論與實(shí)踐
- 人工智能初探2
- AI會取代我們嗎?(The Big Idea 21世紀(jì)讀本)
- 終極智能:感知機(jī)器與人工智能的未來
- AI進(jìn)化論:解碼人工智能商業(yè)場景與案例
- 聊天機(jī)器人:對話式體驗(yàn)產(chǎn)品設(shè)計(jì)
- AI助理:用ChatGPT輕松搞定工作
- Web3超入門