為什麼有OpenAI?
對抗AI壟斷�讓大家擁有超能力,降低單一單位因為A.I.而超越所有人類
為什麼有OpenAI Gym?
破解大量的環境(遊戲),證明你AI的實力
建立一個 Reinforcement Learning (加強式學習)訓練平台,建立公開的標竿,加速RL研發速度
�電腦視覺有ImageNet�RL 有機器人的健身房:OpenAI Gym
環境
機器人
OpenAI Gym
環境
界面
機器人
�gym.Env.action_space�gym.Env.observation_space�gym.Env.reward_range��gym.Env.step(action)�gym.Env.reset()�gym.Env.render()�gym.Env.close()
�gym.Env
�你的機器人代碼
gym 的核心物件:Env
方法(methods):
step() 環境模擬往前一步�reset() 環境歸零�render() 渲染環境�close() 關閉環境�seed() 設定隨機數生成器
屬性(attributes)
action_space 動作空間�observation_space 觀察空間�reward_range 獎勵範圍
gym.Env 為所有環境的底層物件,提供一個統一的環境界面
gym
安裝�pip install gym�pip install gym[all] # 安裝所有的環境���使用�#from the `gym` package you can get all kinds of environments
import gym�env = gym.make(<name of the environment>)�
gym 的核心物件:Space
gym分別有Box, Discrete, MultiDiscrete, MultiBinary, Tuple這幾個Space子類別
gym.Space 代表動作或觀察的『空間』,是動作/觀察的 type (型態)
空間怎麼定義?看環境怎麼寫的
一張100x100的RGB圖片可能是Box(100, 100, 3)也有可能是Box(30000,)(被壓扁的向量)
A,B兩個按鈕有可能是Tuple(Discrete(2), Discrete(2)) 也有可能是 MultiDiscrete([[0,1], [0,1]])��次外,有些遊戲其實有的動作小於他的模擬器
看包環境的人怎麼選
環境
界面
機器人
�gym.Env.action_space�gym.Env.observation_space�gym.Env.reward_range��gym.Env.step(action)�gym.Env.reset()�gym.Env.render()�gym.Env.close()
�gym.Env
�你的機器人代碼
Env介紹
這個屬性會是一個gym.Space物件,決定這環境可以接受什麼樣的動作輸入
這個屬性會是一個gym.Space物件,決定這環境回傳的觀察所符合的形式
這個屬性會是一個gym.Space物件
gym.Env.action_space
gym.Env.observation_space
gym.Env.reward_range
Env介紹
> import gym�> env = gym.make('CartPole-v0')�> env.action_space�Discrete(2)�> env.observation_space�Box(4,)�> env.reward_range�(-inf, inf)�
Env介紹
在一回合中,讓環境往前一步�輸入 一個 action, 應該屬於action_space�代表機器人這部選擇的動作�E.g. 假如 env.action_space == Discrete(2),action 應該是 0 或 1(整數)��輸出 一個 (observation, reward, done, info) tuple
gym.Env.step(self, action)
Env介紹
import gym�from gym import wrappers�env = gym.make('CartPole-v0')�env = wrappers.Monitor(env, '/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
gym.Env.step(self, action)
Env介紹
(在舊的回合結束後),重新初始化環境,會回傳一個observation物件
import gym�from gym import wrappers�env = gym.make('CartPole-v0')�env = wrappers.Monitor(env, '/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
gym.Env.reset(self)
import gym�from gym import wrappers�env = gym.make('CartPole-v0')�for i_episode in range(20):� observation = env.reset()� for t in range(100):� 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
使用環境
機器人不需要了解每個環境裡面在發生什麼事情
它只需要透過這簡單的API與環境互動
選擇環境
Universe
�Universe是另外一個OpenAI團隊開發的Python包裝,建立在 gym 之上,而又比 gym 複雜一些��Universe 把上千個真實Flash遊戲打包起來建立統一的互動界面:所有Universe的Env都是用原始滑鼠+鍵盤事件當action_space和完整的螢幕擷取當observation_space
這算是提高環境的難度,更考驗機器人的學習能力
To see inside Universe environments
http://localhost:15900/viewer/?password=openai.�If you're on Mac, connecting to a VNC server is as easy as running: open vnc://localhost:5900
So if you’re ssh’ing in, you have to port-forward 15900
Workers use ports incrementally, so the next work will use port 15901, etc.
DIY 一個環境
安裝馬力歐環境
> sudo apt-get install fceux�> pip install gym-pull
> ipython�In [1]: import gym�In [2]: import gym_pull�In [3]: gym_pull.pull('github.com/ppaquette/gym-super-mario')�In [4]: exit�
注意事項:xvfb,X-server
很多環境都是假設純在螢幕畫面,就所謂的X-server
但在server上跑,程式碼在所謂的headless狀態,沒有畫面
這時要用 xvfb 模擬一個X-server執行程式碼
> sudo apt-get install xvfb�> xvfb-run jupyter notebook --no-browser
錄影
使用 env 前面先呼叫 wrapper.Monitor並指定錄影目錄�接下來env的所有互動都會自動被紀錄下來
import gym�from gym import wrappers�env = gym.make('CartPole-v0')�env = wrappers.Monitor(env, '/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
完整範例
openaigym.video.0.7281.video000000.mp4 (加快)