1 of 26

為什麼有OpenAI?

對抗AI壟斷讓大家擁有超能力,降低單一單位因為A.I.而超越所有人類

2 of 26

為什麼有OpenAI Gym?

破解大量的環境(遊戲),證明你AI的實力

建立一個 Reinforcement Learning (加強式學習)訓練平台,建立公開的標竿,加速RL研發速度

�電腦視覺有ImageNet�RL 有機器人的健身房:OpenAI Gym

3 of 26

環境

機器人

4 of 26

OpenAI Gym

  • 測試和比較機器人(agent)的平台,分兩部份
  • gym Python包裝�這個Python程式庫只要是定義一個統一的環境api讓任何一種代理人演算法可以透過統一的界面與環境溝通�裡面包含許多已包奘好的環境
  • https://gym.openai.com/�一個比較你開發的演算法效能網路平台

5 of 26

環境

界面

機器人

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

�你的機器人代碼

6 of 26

gym 的核心物件:Env

方法(methods):

step() 環境模擬往前一步�reset() 環境歸零�render() 渲染環境�close() 關閉環境�seed() 設定隨機數生成器

屬性(attributes)

action_space 動作空間�observation_space 觀察空間�reward_range 獎勵範圍

gym.Env 為所有環境的底層物件,提供一個統一的環境界面

7 of 26

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

8 of 26

gym 的核心物件:Space

gym分別有Box, Discrete, MultiDiscrete, MultiBinary, Tuple這幾個Space子類別

  • Discrete(2)
  • 左右上下AB Discrete(6) 或 MultiDiscrete���
  • Box(210, 160, 3) �

gym.Space 代表動作或觀察的『空間』,是動作/觀察的 type (型態)

9 of 26

空間怎麼定義?看環境怎麼寫的

一張100x100的RGB圖片可能是Box(100, 100, 3)也有可能是Box(30000,)(被壓扁的向量)

A,B兩個按鈕有可能是Tuple(Discrete(2), Discrete(2)) 也有可能是 MultiDiscrete([[0,1], [0,1]])��次外,有些遊戲其實有的動作小於他的模擬器

看包環境的人怎麼選

10 of 26

環境

界面

機器人

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

你的機器人代碼

11 of 26

Env介紹

這個屬性會是一個gym.Space物件,決定這環境可以接受什麼樣的動作輸入

這個屬性會是一個gym.Space物件,決定這環境回傳的觀察所符合的形式

這個屬性會是一個gym.Space物件

gym.Env.action_space

gym.Env.observation_space

gym.Env.reward_range

12 of 26

Env介紹

> import gym�> env = gym.make('CartPole-v0')> env.action_space�Discrete(2)�> env.observation_space�Box(4,)�> env.reward_range�(-inf, inf)

13 of 26

Env介紹

在一回合中,讓環境往前一步�輸入 一個 action, 應該屬於action_space�代表機器人這部選擇的動作�E.g. 假如 env.action_space == Discrete(2),action 應該是 0 1(整數)��輸出 一個 (observation, reward, done, info) tuple

  • observation:屬於observation_space�環境接受到機器人的動作而反應後,機器人所看到的新環境狀態E.g. 新的遊戲frame
  • reward:機器人所得到的reward,會在 env.reward_range 範圍內
  • done:這一場環境(遊戲)是否結束,TrueFalse
  • info:dict 額外資訊,因環境而且異,可以是{}

gym.Env.step(self, action)

14 of 26

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)

15 of 26

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)

16 of 26

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

17 of 26

使用環境

機器人不需要了解每個環境裡面在發生什麼事情

它只需要透過這簡單的API與環境互動

18 of 26

選擇環境

  1. Gym包裝內富有上百個簡單的小環境
    • 簡單是指環境複雜度低,不代表遊戲好破解�
  2. 自己包一個符合gym.Env的環境或使用別人第三方
  3. Universe 包裝

19 of 26

Universe

https://universe.openai.com/

�Universe是另外一個OpenAI團隊開發的Python包裝,建立在 gym 之上,而又比 gym 複雜一些��Universe 把上千個真實Flash遊戲打包起來建立統一的互動界面:所有Universe的Env都是用原始滑鼠+鍵盤事件當action_space和完整的螢幕擷取當observation_space

這算是提高環境的難度,更考驗機器人的學習能力

20 of 26

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.

21 of 26

DIY 一個環境

  1. 繼承gym.Env
  2. 實現 _step _reset() �(可有可無)實現 _render() _close() _seed()
  3. 定義 action_space, observation_spacereward_range

22 of 26

安裝馬力歐環境

> 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

23 of 26

注意事項:xvfb,X-server

很多環境都是假設純在螢幕畫面,就所謂的X-server

但在server上跑,程式碼在所謂的headless狀態,沒有畫面

這時要用 xvfb 模擬一個X-server執行程式碼

> sudo apt-get install xvfb�> xvfb-run jupyter notebook --no-browser

24 of 26

錄影

使用 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

25 of 26

完整範例

26 of 26

openaigym.video.0.7281.video000000.mp4 (加快)