機器人強化學習之使用 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
。大多數情況下,當Done
爲True
時,就表明當前回合(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]
利用運動空間和觀測空間的定義和範圍,可以將代碼寫得更加通用。在許多仿真環境中,Box
和 Discrete
是最常見的空間描述,在智體每次執行動作時,都屬於這些空間範圍內,代碼示例爲
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 … 第一篇強化學習入坑筆記寫完,大多是從官方文檔看過來的加上了一點點自己的理解,建議文檔這東西還是直接看官方的吧,原汁原味
關於作者
- 神奇的戰士
- 博客:http://thinkhard.tech/
- Github: https://github.com/wangshub
- 微信公衆號:舒林笑笑生