gym入門
gym是用於開發和比較強化學習算法的工具包。它不對代理的結構做任何假設,並且與任何數字計算庫(例如TensorFlow或Theano)兼容。
gym
庫是測試問題(環境)的集合,您可以用來制定強化學習算法。這些環境具有共享的接口,使您可以編寫常規算法。
安裝
首先,您需要安裝Python 3.5+。只需使用pip安裝gym:
如果你的電腦中存在系統版本Python2,那你可能要用pip3
來安裝
pip install gym
- 從源頭建造
如果願意,還可以直接克隆gym Git存儲庫。當您要修改gym本身或添加環境時,此功能特別有用。使用以下方法下載並安裝:
git clone https://github.com/openai/gym
cd gym
pip install -e。
您以后可以運行pip install -e.[all]
執行包含所有環境的完整安裝。這需要安裝更多涉及的依賴項,包括cmake
和最新的pip
版本。
環境環境
這是運行某件事的最低限度示例。這將在1000個時間步中運行CartPole-v0環境的實例,並在每個步驟中渲染該環境。您應該會看到一個彈出窗口,呈現經典的購物車問題:
import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
env.render()
env.step(env.action_space.sample())#采取隨機行動
env.close()
它看起來應該像這樣:

通常,我們會在允許球桿離開屏幕之前結束模擬。以后再說。現在,即使此環境已經返回done = True
,也請忽略有關調用step()
的警告。
如果您希望看到其他運行環境,請嘗試將上面的CartPole-v0
替換為MountainCar-v0
,MsPacman-v0
(需要Atari依賴項)或Hopper-v1
(需要MuJoCo依賴項)。所有環境均來自Env
基類。
請注意,如果您缺少任何依賴項,則應該收到一條有用的錯誤消息,告訴您所缺少的內容。 (讓我們知道依賴項是否給您帶來麻煩,而沒有明確的修復說明。)安裝缺少的依賴項通常非常簡單。您還需要Hopper-v1的MuJoCo許可證。
觀察結果
如果我們想做的比每步都采取隨機行動要好,那么最好是真正了解我們的行動對環境有何影響。
環境的step
函數恰好返回了我們所需要的。實際上,step
返回四個值。這些是:
observation
(object):特定於環境的對象,代表您對環境的觀察。例如,來自攝像機的像素數據,機器人的關節角度和關節速度或棋盤游戲中的棋盤狀態。reward
(float):上一操作獲得的獎勵金額。規模因環境而異,但目標始終是增加總獎勵。done
(布爾值):是否應該再次重置環境。大多數(但不是全部)任務被划分為定義明確的情節,如果為True,則表示情節已終止。 (例如,也許桿子太尖了,或者您失去了上一生。)info
(dict):診斷信息,可用於調試。它有時對學習很有用(例如,它可能包含環境上次狀態更改背后的原始概率)。但是,您的代理人的官方評估不允許將其用於學習。 這只是經典“代理程序-環境循環”的實現。每個時間步長,代理都會選擇一個動作,環境會返回觀察結果和獎勵。

該過程通過調用reset()
開始,此返回初始observation
。因此,編寫前面的代碼的更合適的方法是檢查done
flag:
import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
observation = env.reset()
for t in range(100):
env.render()
print(observation)
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
print("Episode finished after {} timesteps".format(t+1))
break
env.close()
這應該提供視頻和類似以下的輸出。您應該能夠看到重置發生的位置。

[-0.061586 -0.75893141 0.05793238 1.15547541]
[-0.07676463 -0.95475889 0.08104189 1.46574644]
[-0.0958598 -1.15077434 0.11035682 1.78260485]
[-0.11887529 -0.95705275 0.14600892 1.5261692 ]
[-0.13801635 -0.7639636 0.1765323 1.28239155]
[-0.15329562 -0.57147373 0.20218013 1.04977545]
Episode finished after 14 timesteps
[-0.02786724 0.00361763 -0.03938967 -0.01611184]
[-0.02779488 -0.19091794 -0.03971191 0.26388759]
[-0.03161324 0.00474768 -0.03443415 -0.04105167]
空間
在上面的示例中,我們從環境的操作空間中采樣了隨機操作。但是這些動作實際上是什么?每個環境都有一個action_space和一個observation_space。這些屬性的類型為Space,它們描述了有效操作和觀察的格式:
import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)
print(env.observation_space)
#> Box(4,)
Discrete
空間允許固定范圍的非負數,因此在這種情況下,有效操作為0或1。Box
空間表示n維盒子,因此有效觀察值將是4個數字組成的數組。我們還可以檢查Box
的邊界:
print(env.observation_space.high)
#> array([ 2.4 , inf, 0.20943951, inf])
print(env.observation_space.low)
#> array([-2.4 , -inf, -0.20943951, -inf])
這種assert
對於編寫適用於許多不同環境的通用代碼很有幫助。 Box和Discrete是最常見的空間。您可以從某個空間采樣或檢查某個空間是否屬於該空間:
from gym import spaces
space = spaces.Discrete(8) # Set with 8 elements {0, 1, 2, ..., 7}
x = space.sample()
assert space.contains(x)
assert space.n == 8
對於CartPole-v0
,其中一個動作向左施加力,而其中一個動作向右施加力。 (您能找出哪個嗎?)
幸運的是,您的學習算法越好,您自己嘗試解釋這些數字的次數就越少。
可用環境
gym擁有各種環境,從容易到困難,涉及許多不同種類的數據。查看環境的完整列表以鳥瞰。
經典控制
和玩具文字
:完成小規模任務,大部分來自RL文獻。他們是來幫助您入門的。 算法:執行計算,例如添加多位數和反轉順序。有人可能會反對說這些任務對於計算機來說很容易。挑戰在於僅從示例中學習這些算法。這些任務具有很好的特性,即可以通過改變序列長度來輕松地改變難度。Atari
:玩經典的Atari游戲。我們以易於安裝的形式集成了Arcade學習環境(這對強化學習研究產生了重大影響)。2D和3D機器人
:在仿真中控制機器人。這些任務使用了MuJoCo物理引擎,該引擎設計用於快速而准確的機器人仿真。其中包括加州大學伯克利分校研究人員最新基准的一些環境(偶然會在今年夏天加入我們)。MuJoCo
是專有軟件,但提供免費試用許可證。
注冊表Registry
gym
的主要目的是提供大量環境,這些環境暴露出一個通用的界面,並進行版本控制以進行比較。要列出安裝中可用的環境,只需詢問gym.envs.registry
:
from gym import envs
print(envs.registry.all())
#> [EnvSpec(DoubleDunk-v0), EnvSpec(InvertedDoublePendulum-v0), EnvSpec(BeamRider-v0), EnvSpec(Phoenix-ram-v0), EnvSpec(Asterix-v0), EnvSpec(TimePilot-v0), EnvSpec(Alien-v0), EnvSpec(Robotank-ram-v0), EnvSpec(CartPole-v0), EnvSpec(Berzerk-v0), EnvSpec(Berzerk-ram-v0), EnvSpec(Gopher-ram-v0), ...
這將為您提供EnvSpec
對象的列表。這些定義了特定任務的參數,包括要運行的試驗次數和最大步驟數。例如,EnvSpec(Hopper-v1)
定義了一個環境,目標是讓2D模擬機器人跳躍; EnvSpec(Go9x9-v0)
在9x9板上定義Go游戲。
這些環境ID被視為不透明字符串。為了確保將來進行有效的比較,絕不會以影響性能的方式更改環境,而只能用較新的版本來替換。目前,我們為每個環境都添加了v0后綴,以便將來可以自然地將其替換為v1,v2等。
將您自己的環境添加到注冊表非常容易,從而使它們可用於gym.make()
:只需在加載時register()
即可。
背景:為什么要選擇gym
?
強化學習(RL)是機器學習的子領域,涉及決策和運動控制。它研究代理商如何在復雜,不確定的環境中學習如何實現目標。令人興奮的原因有兩個:
- RL是一個大的范式(框架),涵蓋了涉及一系列決策的所有問題:例如,控制機器人的電動機以使其能夠運行和跳躍,制定價格,庫存管理等商業決策,或者玩視頻游戲和棋盤游戲。 RL甚至可以應用於具有順序或結構化輸出的監督學習問題。
RL算法已開始在許多困難的環境中取得良好的效果。 RL歷史悠久,但在深度學習方面取得新進展之前,它需要大量針對特定問題的工程。 DeepMind的Atari結果,Pieter Abbeel小組的BRETT和AlphaGo都使用了深度RL算法,該算法並未對其環境做太多假設,因此可以在其他環境中應用。
但是,RL研究也因兩個因素而減慢了速度:需要更好的基准。在監督學習中,像ImageNet這樣的大型標簽數據集推動了進步。在RL中,最接近的等效項是各種各樣的環境。但是,現有的RL環境的開源集合種類繁多,並且通常甚至很難設置和使用。
出版物中使用的環境缺乏標准化。問題定義上的細微差異(例如獎勵功能或一組動作)會大大改變任務的難度。這個問題使得很難復制已發表的研究成果並比較不同論文的結果。
gym
是試圖解決這兩個問題的嘗試。
