強化學習仿真環境搭建入門Getting Started with OpenAI gym


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()

它看起來應該像這樣:

cartpole
cartpole

通常,我們會在允許球桿離開屏幕之前結束模擬。以后再說。現在,即使此環境已經返回done = True,也請忽略有關調用step()的警告。

如果您希望看到其他運行環境,請嘗試將上面的CartPole-v0替換為MountainCar-v0MsPacman-v0(需要Atari依賴項)或Hopper-v1(需要MuJoCo依賴項)。所有環境均來自Env基類。

請注意,如果您缺少任何依賴項,則應該收到一條有用的錯誤消息,告訴您所缺少的內容。 (讓我們知道依賴項是否給您帶來麻煩,而沒有明確的修復說明。)安裝缺少的依賴項通常非常簡單。您還需要Hopper-v1的MuJoCo許可證。

觀察結果

如果我們想做的比每步都采取隨機行動要好,那么最好是真正了解我們的行動對環境有何影響。

環境的step函數恰好返回了我們所需要的。實際上,step返回四個值。這些是:

  • observation(object):特定於環境的對象,代表您對環境的觀察。例如,來自攝像機的像素數據,機器人的關節角度和關節速度或棋盤游戲中的棋盤狀態。
  • reward(float):上一操作獲得的獎勵金額。規模因環境而異,但目標始終是增加總獎勵。
  • done(布爾值):是否應該再次重置環境。大多數(但不是全部)任務被划分為定義明確的情節,如果為True,則表示情節已終止。 (例如,也許桿子太尖了,或者您失去了上一生。)
  • info(dict):診斷信息,可用於調試。它有時對學習很有用(例如,它可能包含環境上次狀態更改背后的原始概率)。但是,您的代理人的官方評估不允許將其用於學習。 這只是經典“代理程序-環境循環”的實現。每個時間步長,代理都會選擇一個動作,環境會返回觀察結果和獎勵。

agent and env
agent and env

該過程通過調用reset()開始,此返回初始observation。因此,編寫前面的代碼的更合適的方法是檢查doneflag:

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()

這應該提供視頻和類似以下的輸出。您應該能夠看到重置發生的位置。

cartpole
cartpole

[-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是試圖解決這兩個問題的嘗試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM