OpenAI教程


英文版: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由兩部分組成:

  1. gym開源庫:測試問題的集合。當你測試增強學習的時候,測試問題就是環境,比如機器人玩游戲,環境的集合就是游戲的畫面。這些環境有一個公共的接口,允許用戶設計通用的算法。
  2. 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入手更改。

改完之后產生的文件如下:

 

 


免責聲明!

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



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