OpenAI Gym學習(一)基本用法

Gymnasium(原OpenAI Gym,現(xiàn)在由Farama foundation維護)是一個為所有單體強化學習環(huán)境提供API的項目,包括常見環(huán)境的實現(xiàn):cartpole、pendulum(鐘擺)、mountain-car、mujoco、atari等。
API包含四個關(guān)鍵函數(shù):make、reset、step和render,這些基本用法將向您介紹。Gymnasium的核心是Env,這是一個高級python類,代表了強化學習理論中的馬爾可夫決策過程(markov decision process,MDP)(這不是一個完美的重建,缺少MDP的幾個組件)。在Gymnasium中,環(huán)境(MDP)與Wrappers一起實現(xiàn)為Env類,Wrappers提供了有用的實用程序,可以更改傳遞給用戶的結(jié)果。
初始化環(huán)境
在Gymnasium中初始化環(huán)境非常容易,可以通過make功能完成:
這將返回一個Env供用戶交互。要查看您可以創(chuàng)建的所有環(huán)境,請使用gymnium.envs.registry.keys()。make包含許多用于添加包裝器的附加參數(shù),為環(huán)境指定關(guān)鍵字等等。
與環(huán)境互動
下圖所示的經(jīng)典“代理-環(huán)境循環(huán)”(agent-environment loop)是Gymnasium實現(xiàn)的強化學習的簡化表示。

此循環(huán)使用以下Gym代碼實現(xiàn)
輸出應該如下所示:

代碼解讀
首先,使用make創(chuàng)建一個環(huán)境,并添加一個額外的關(guān)鍵字“render_mode”,指定環(huán)境應該如何可視化。有關(guān)不同渲染模式的默認含義的詳細信息,請參見render。在本例中,我們使用“LunarLander”環(huán)境,agent控制需要安全著陸的宇宙飛船。
初始化環(huán)境后,我們reset環(huán)境以獲得對環(huán)境的第一次觀察。要使用特定的隨機種子或選項初始化環(huán)境(有關(guān)可能的值,請參閱environment的相關(guān)文檔),請使用帶有seed或option參數(shù)的reset函數(shù)。
接下來,agent在環(huán)境中執(zhí)行一個行動,step,這可以想象為移動機器人或按下游戲控制器上的按鈕,從而導致環(huán)境發(fā)生變化。結(jié)果,agent從更新的環(huán)境接收新的觀察結(jié)果以及對采取該動作的獎勵reward。例如,這種獎勵可以是摧毀敵人的正面獎勵,也可以是進入熔巖的負面獎勵。一個這樣的行動觀察交替(action-observation exchange)被稱為時間步長(timestep)。
然而,經(jīng)過一段時間后,環(huán)境可能會結(jié)束,這被稱為終止狀態(tài)(terminal state)。例如,機器人可能已經(jīng)崩潰,或者agent成功完成了任務,由于agent無法繼續(xù),環(huán)境將需要停止。在Gym里,如果環(huán)境已經(jīng)終止,這是由step返回的。類似地,我們可能還希望環(huán)境在固定數(shù)量的時間步長后結(jié)束,在這種情況下,環(huán)境會發(fā)出截斷信號(truncated signal)。如果terminated或truncated中的任何一個為true,那么接下來應該調(diào)用reset來重新啟動環(huán)境。
行為和觀察空間
每個環(huán)境都使用env.action_space和env.observation_space屬性指定有效的行動和觀察的格式。這有助于了解環(huán)境的預期輸入和輸出,因為所有有效的行動和觀察都應該包含在相應的空間中。
在本例中,我們通過env.action_space.sample()對隨機行動進行采樣,而不是使用代理策略,將觀察結(jié)果映射到用戶想要執(zhí)行的行動。有關(guān)創(chuàng)建和訓練代理策略(agent policy)的示例,請參閱其中一個agent教程。
每個環(huán)境都應該具有action_space和observation_space屬性,這兩個屬性都應該是從space繼承的類的實例。Gym支持用戶可能需要的大多數(shù)可能空間:
Box:描述一個n維連續(xù)空間。這是一個有界空間,在這里我們可以定義上限和下限,這些上限和下限描述了我們的觀測可以取的有效值。
Discrete(離散):描述一個離散空間,其中{0,1,…,n-1}是我們的觀察或行動可以采取的可能值??梢允褂每蛇x參數(shù)將值移位到{a,a+1,…,a+n-1}。
Dict(字典):表示采樣空間的字典。
Tuple(元組):表示采樣空間的元組。
MultiBinary:創(chuàng)建一個n-shape二進制空間。參數(shù)n可以是一個數(shù)字或數(shù)字列表。
MultiDiscrete:由一系列離散行動空間組成,每個元素中有不同數(shù)量的行動。
修改環(huán)境
Wrappers (包裝器)是修改現(xiàn)有環(huán)境的一種方便方式,無需直接更改底層代碼。使用包裝器可以避免大量的樣板代碼,并使您的環(huán)境更加模塊化。包裝器也可以被鏈接以組合它們的效果。默認情況下,通過gymnasium.make生成的大多數(shù)環(huán)境都會使用TimeLimit、OrderEnforceing和PassiveEnvChecker進行包裝。
為了包裝環(huán)境,必須首先初始化基本環(huán)境。然后,您可以將此環(huán)境與(可能是可選的)參數(shù)一起傳遞給包裝器的構(gòu)造函數(shù):
Gym已經(jīng)為您提供了許多常用的包裝材料。一些示例:
TimeLimit:如果超過了最大時間步長(或者基本環(huán)境發(fā)出了截斷信號),則發(fā)出截斷信號。
ClipAction:剪裁動作,使其位于動作空間中(類型為Box)。
重新縮放操作:將操作重新縮放到指定的間隔內(nèi)
TimeAwareObservation:向觀察添加有關(guān)時間步長索引的信息。在某些情況下,有助于確保轉(zhuǎn)換是馬爾可夫的。
有關(guān)Gym中實現(xiàn)的包裝器的完整列表,請參閱Wrappers。
如果你有一個包裝的環(huán)境,并且你想在所有包裝層下面獲得未包裝的環(huán)境(這樣你就可以手動調(diào)用一個函數(shù)或更改環(huán)境的一些底層方面),你可以使用.unvapped屬性。如果環(huán)境已經(jīng)是一個基本環(huán)境,那么.unpacked屬性只會返回自身。
原文地址:
Gymnasium/docs/content/basic_usage.md at main · Farama-Foundation/Gymnasium (github.com)