英文版:https://gym.openai.com/docs
2016年 5 月 4日,OpenAI發布了人工智能研究工具集 OpenAI Gym。OpenAI Gym是一款用於研發和比較學習算法的工具包。它與很多數值計算庫兼容,比如tensorflow和theano。現在支持的語言主要是python。
openai gym 是一個增強學習(reinforcement learning,RL)算法的測試床(testbed)。增強學習和有監督學習的評測不一樣。有監督學習的評測工具是數據。只要提供一批有標注的數據18:34:13就能進行有監督學習的評測。增強學習的評測工具是環境。需要提供一個環境給 Agent 運行,才能評測 Agent 的策略的優劣。OpenAI Gym 是提供各種環境的開源工具包。
增強學習有幾個基本概念:
(1) agent:智能體,也就是機器人,你的代碼本身。
(2) environment:環境,也就是游戲本身,openai gym提供了多款游戲,也就是提供了多個環境。
(3) action:行動,比如玩超級瑪麗,向上向下等動作。
(4) state:狀態,每次智能體做出行動,環境會相應地做出反應,返回一個狀態和獎勵。
(5) reward:獎勵:根據游戲規則的得分。智能體不知道怎么才能得分,它通過不斷地嘗試來理解游戲規則,比如它在這個狀態做出向上的動作,得分,那么下一次它處於這個環境狀態,就傾向於做出向上的動作。

OpenAI Gym由兩部分組成:
- gym開源庫:測試問題的集合。當你測試增強學習的時候,測試問題就是環境,比如機器人玩游戲,環境的集合就是游戲的畫面。這些環境有一個公共的接口,允許用戶設計通用的算法。
- OpenAI Gym服務。提供一個站點(比如對於游戲cartpole-v0:https://gym.openai.com/envs/CartPole-v0)和api,允許用戶對他們的測試結果進行比較。
gym的代碼在這上面:https://github.com/openai/gym
gym的核心接口是Env,作為統一的環境接口。Env包含下面幾個核心方法:
1、reset(self):重置環境的狀態,返回觀察。
2、step(self,action):推進一個時間步長,返回observation,reward,done,info
3、render(self,mode=’human’,close=False):重繪環境的一幀。默認模式一般比較友好,如彈出一個窗口。
安裝
1.Linux(沒試過):
apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig
2.Windows(有兩種方法):
(1)使用pip:
pip install gym
(2)使用git:
git clone https://github.com/openai/gym cd gym pip install -e . # minimal install pip install -e .[all] # full install (this requires cmake and a recent pip version)
接下來以cartpole-v0(https://gym.openai.com/envs/CartPole-v0)舉例。

這個游戲的規則是讓桿不倒。Openai gym提供了行動的集合,環境的集合等等。Cartpole-v0來說,動作空間包括向左拉和向右拉兩個動作。其實你並不需要關心它的動作空間是什么,當你的學習算法越好,你就越不需要解釋這些動作。
運行環境
運行CartPole-v0環境1000個時間步(timestep)。
import gym env = gym.make('CartPole-v0') env.reset() for _ in range(1000): env.render() env.step(env.action_space.sample()) # take a random action
可以看到隨機控制算法發散,游戲很快結束。
觀察
如果我們想做得好一點,觀察周圍的環境是必須的。環境的step函數返回四個值:
- Observation(object):返回一個特定環境的對象,描述對環境的觀察。比如,來自相機的像素數據,機器人的關節角度和關節速度,或棋盤游戲中的棋盤狀態。
- Reward(float):返回之前動作收獲的總的獎勵值。不同的環境計算方式不一樣,但總體的目標是增加總獎勵。
- Done(boolean):返回是否應該重新設置(reset)環境。大多數游戲任務分為多個環節(episode),當done=true的時候,表示這個環節結束了。
- Info(dict):用於調試的診斷信息(一般沒用)。
這是一個典型的“智能體-環境循環”的實現。每個時間步長(timestep),智能體選擇一個行動,環境返回一個觀察和獎勵值。
過程一開始調用reset,返回一個初始的觀察。並根據done判斷是否再次reset。
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
以上代碼有20個episode,打印每次的環境觀察值,隨機采取行動,返回環境的觀察值、獎勵、done和調試信息。當done為true時,該episode結束,開始下一個episode。可以看到,觀察了環境,每次堅持的時間好像稍微長了一點。
運行結果如下:
[-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]
空間
以上,我們都是從環境的動作空間中隨機選擇動作。每個環境都有一個space對象,用來描述有效的動作和觀察:
import gym env = gym.make('CartPole-v0') print(env.action_space) #> Discrete(2) print(env.observation_space) #> Box(4,)
在上面這個例子中,action取非負整數0或1。Box表示一個n維的盒子,因此observation是一個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])
Box和discrete是最常見的space。你可以從space中取樣或者驗證是否屬於它。
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
環境
Gym的主要目的是提供一個大環境集合,具有一個公共接口,並且允許比較算法。你可以列出這些環境。
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)定義了9*9棋盤上的圍棋游戲。
這些環境ID被視為不透明字符串。為了確保與未來的有效比較,環境永遠不會以影響性能的方式更改,只能由較新的版本替代。 我們目前使用v0為每個環境添加后綴,以便將來的替換可以自然地稱為v1,v2等。
記錄和加載結果
Gym使得記錄算法在環境中的性能變得簡單,同時能記錄學習過程的視頻。只要使用monitor如下:
import gym env = gym.make('CartPole-v0') env.monitor.start('/tmp/cartpole-experiment-1') 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.monitor.close()
跑了一下發現有錯:
env.monitor is deprecated. Wrap your env with gym.wrappers.Monitor to record data.
改為如下:
from gym.wrappers import Monitor env = Monitor(directory='/tmp/cartpole-experiment-0201',video_callable=False, write_upon_reset=True)(env) env.close()
(mark一下找bug思路,gym\monitoring\tests里面有測試的案例,參考test_monitor.py寫代碼。)
產生的結果放到'/tmp/cartpole-experiment-1'這個文件夾中,你可以加載到評分板。

monitor支持將一個環境的多個案例寫入一個單獨的目錄。
然后你可以把你的結果加載到OpenAI Gym:
import gym gym.upload('/tmp/cartpole-experiment-1', api_key=' sk_FYp0Gc1dQU69epifs7ZE6w')
輸出應該是這樣:
[2016-04-22 23:16:03,123] Uploading 20 episodes of training data [2016-04-22 23:16:04,194] Uploading videos of 2 training episodes (6306 bytes) [2016-04-22 23:16:04,437] Creating evaluation object on the server with learning curve and training video [2016-04-22 23:16:04,677] **************************************************** You successfully uploaded your agent evaluation to OpenAI Gym! You can find it at: https://gym.openai.com/evaluations/eval_tmX7tssiRVtYzZk0PlWhKA
估值
每次加載會產生一個估值對象。官方文件說,應該創建一個Gist(被牆了)顯示怎么復制你的結果。估值頁會有一個如下方框:

你還可以在加載的時候提供你的gist,通過一個writeup參數
import gym gym.upload('/tmp/cartpole-experiment-1', writeup='https://gist.github.com/gdb/b6365e79be6052e7531e7ba6ea8caf23', api_key=' sk_FYp0Gc1dQU69epifs7ZE6w')
這一步是將你的結果提交到在線網站上進行評估,你的結果會被自動評分,並且會產生一個漂亮的界面,如:
https://gym.openai.com/evaluations/eval_Ir5NHkdNRGqvmpBDcdNNNw
在大多數環境中,你的目標是用最少的步數達到性能的要求(有一個閾值)。而在一些特別復雜的環境中,閾值是什么還不清楚,因此,你的目標是最優化性能。
注意,現在writeup被舍棄了,所以不需要writeup。
另外,api_key是指
再mark一個錯誤:
raise error.Error("[%s] You didn't have any recorded training data in {}. Once you've used 'env.monitor.start(training_dir)' to start recording, you need to actually run some rollouts. Please join the community chat on https://gym.openai.com if you have any issues.".format(env_id, training_dir))
這是由於之前更改monitor,改成調用wrappers里面的文件時候出的錯。將結果放到'/tmp/cartpole-experiment-1'這個文件夾的時候出錯,也就是在monitor這一步出錯,通過查看文件夾里面的文件也可看到文件夾里面的文件大小都很小,內容也不對,如下:


因此從monitor入手更改。
改完之后產生的文件如下:

