機器人強化學習之使用 OpenAI Gym 教程與筆記

機器人強化學習之使用 OpenAI Gym 教程與筆記

除了試圖直接去建立一個可以模擬成人大腦的程序之外, 爲什麼不試圖建立一個可以模擬小孩大腦的程序呢?如果它接 受適當的教育,就會獲得成人的大腦。 — 阿蘭·圖靈

介紹

強化學習 (Reinforcement learning) 是機器學習的一個子領域用於制定決策和運動自由度控制。強化學習主要研究在複雜未知的環境中,智體(agent)實現某個目標。強化學習最引人入勝的兩個特點是

  • 強化學習非常通用,可以用來解決需要作出一些列決策的所有問題: 例如,訓練機器人跑步和彈跳,制定商品價格和庫存管理,玩 Atari 遊戲和棋盤遊戲等等。

  • 強化學習已經可以在許多複雜的環境中取得較好的實驗結果: 例如 Deep RL 的 Alpha Go等

Gym 是一個研究和開發強化學習相關算法的仿真平臺。

  • 無需智體先驗知識;
  • 兼容常見的數值運算庫如 TensorFlow、Theano 等

Gym 的一個最小例子 CartPole-v0

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

運行效果

至此,第一個 Hello world 就算正式地跑起來了!

觀測(Observations)

在第一個小栗子中,使用了 env.step() 函數來對每一步進行仿真,在 Gym 中,env.step() 會返回 4 個參數:

  • 觀測 Observation (Object):當前 step 執行後,環境的觀測(類型爲對象)。例如,從相機獲取的像素點,機器人各個關節的角度或棋盤遊戲當前的狀態等;

  • 獎勵 Reward (Float): 執行上一步動作(action)後,智體(agent)獲得的獎勵(浮點類型),不同的環境中獎勵值變化範圍也不相同,但是強化學習的目標就是使得總獎勵值最大;

  • 完成 Done (Boolen): 表示是否需要將環境重置 env.reset。大多數情況下,當 DoneTrue 時,就表明當前回合(episode)或者試驗(tial)結束。例如當機器人摔倒或者掉出檯面,就應當終止當前回合進行重置(reset);

  • 信息 Info (Dict): 針對調試過程的診斷信息。在標準的智體仿真評估當中不會使用到這個 info,具體用到的時候再說。

總結來說,這就是一個強化學習的基本流程,在每個時間點上,智體執行 action,環境返回上一次 action 的觀測和獎勵,用圖表示爲

智體與環境交互

在 Gym 仿真中,每一次回合開始,需要先執行 reset() 函數,返回初始觀測信息,然後根據標誌位 done 的狀態,來決定是否進行下一次回合。代碼表示爲

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

仿真截圖如下

每次 action 前,將上一次 observation 打印,可以得到打印日誌如下

[ 0.0349103   1.14771978 -0.03934506 -1.64631971]
[ 0.0578647   1.34327926 -0.07227145 -1.95099638]
[ 0.08473028  1.14899616 -0.11129138 -1.68156178]
[ 0.1077102   0.95532555 -0.14492261 -1.42550525]
[ 0.12681672  1.15191062 -0.17343272 -1.75974995]
[ 0.14985493  0.95912509 -0.20862772 -1.52564382]
Episode finished after 16 timesteps
[ 0.03628829 -0.03189712 -0.01997778  0.02529094]
[ 0.03565035 -0.22672696 -0.01947196  0.31160431]
[ 0.03111581 -0.42156616 -0.01323988  0.59808332]
[ 0.02268449 -0.61650037 -0.00127821  0.8865666 ]

空間(Spaces)

在前面的兩個小栗子中,每次執行的動作(action)都是從環境動作空間中隨機進行選取的,但是這些動作 (action) 是什麼?在 Gym 的仿真環境中,有運動空間 action_space 和觀測空間 observation_space 兩個指標,程序中被定義爲 Space 類型,用於描述有效的運動和觀測的格式和範圍。下面是一個代碼示例

import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)
print(env.observation_space)
#> Box(4,)
[33mWARN: gym.spaces.Box autodetected dtype as <class 'numpy.float32'>. Please provide explicit dtype.[0m
Discrete(2)
Box(4,)

從程序運行結果來看

  • action_space 是一個離散 Discrete 類型,從 discrete.py 源碼可知,範圍是一個 {0,1,...,n-1} 長度爲 n 的非負整數集合,在 CartPole-v0 例子中,動作空間表示爲 {0,1}

  • observation_space 是一個 Box 類型,從 box.py 源碼可知,表示一個 n 維的盒子,所以在上一節打印出來的 observation 是一個長度爲 4 的數組。數組中的每個元素都具有上下界。

print(env.observation_space.high)
print(env.observation_space.low)
[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]
[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]

利用運動空間和觀測空間的定義和範圍,可以將代碼寫得更加通用。在許多仿真環境中,BoxDiscrete 是最常見的空間描述,在智體每次執行動作時,都屬於這些空間範圍內,代碼示例爲

from gym import spaces
space = spaces.Discrete(8) # Set with 8 elements {0, 1, 2, ..., 7}
x = space.sample()
print(space.contains(x)) 
print(space.n == 8) 
True
True

CartPole-v0 栗子中,運動只能選擇左和右,分別用 {0,1} 表示

Gym 中可用的環境

Gym 中從簡單到複雜,包含了許多經典的仿真環境和各種數據,其中包括

  • 經典控制和文字遊戲:經典的強化學習示例,方便入門;

  • 算法:從例子中學習強化學習的相關算法,在 Gym 的仿真算法中,由易到難方便新手入坑;

  • 雅達利遊戲:利用強化學習來玩雅達利的遊戲。Gym 中集成了對強化學習有着重要影響的 Arcade Learning Environment,並且方便用戶安裝;

  • 2D 和 3D 的機器人:這個是我一直很感興趣的一部分,在 Gym 中控制機器人進行仿真。需要利用第三方的物理引擎如 MuJoCo

註冊表

Gym 是一個包含各種各樣強化學習仿真環境的大集合,並且封裝成通用的接口暴露給用戶,查看所有環境的代碼如下:

from gym import envs
print(envs.registry.all())
dict_values([EnvSpec(Copy-v0), EnvSpec(RepeatCopy-v0), EnvSpec(ReversedAddition-v0), EnvSpec(ReversedAddition3-v0), EnvSpec(DuplicatedInput-v0), EnvSpec(Reverse-v0), EnvSpec(CartPole-v0), EnvSpec(CartPole-v1), EnvSpec(MountainCar-v0), EnvSpec(MountainCarContinuous-v0), EnvSpec(Pendulum-v0), EnvSpec(Acrobot-v1), EnvSpec(LunarLander-v2), EnvSpec(LunarLanderContinuous-v2), EnvSpec(BipedalWalker-v2),...

Gym 支持將用戶製作的環境寫入到註冊表中,需要執行 gym.make() 和在啓動時註冊 register,例如

register(
    id='CartPole-v0',
    entry_point='gym.envs.classic_control:CartPoleEnv',
    max_episode_steps=200,
    reward_threshold=195.0,
)

參考鏈接

結語

emmmm … 第一篇強化學習入坑筆記寫完,大多是從官方文檔看過來的加上了一點點自己的理解,建議文檔這東西還是直接看官方的吧,原汁原味

關於作者

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章