OpenAI Gym 簡介
|
589
產生的行為
b
a
d
c
r
p
a
c d
b
策略空間
圖
18-3
在策略空間裡面的四個點
(
左
)
與
agent
對應的行為
(
右
)
另一種做法是使用優化技術
,
例如計算獎勵對策略參數的梯度
,
然後沿著前往更高獎勵的
梯度調整這些參數
9
,
這種做法稱為
策略梯度
(policy gradient,PG),
本章稍後將更詳細
討論它
。
回到掃地機器人
,
你可以稍微增加
p,
並且評估這樣子會不會提升它在
30
分鐘
之內吸到的灰塵量
;
若是如此
,
就再稍微增加
p,
否則就減少
p。
我們將使用
TensorFlow
來實作一種流行的
PG
演算法
,
但是在此之前
,
我們要先建立一個環境
,
讓
agent
待在裡
面
,
所以
,
是時候介紹
OpenAI Gym
了
。
OpenAI Gym
簡介
強化學習有一項挑戰是
,
你必須先建立一個有效的環境才能訓練
agent。
如果你想要寫一
個只會玩
Atari
遊戲的
agent,
你就要有一個
Atari
遊戲模擬器
。
如果你想要寫一個會走路
的機器人
,
那個環境就是真實世界
,
你可以直接在真實世界中訓練你的機器人
,
但這樣
子也有其限制
:
如果機器人掉下懸崖
,
你不是只要按下
Undo
就可以重來一遍
,
你也不能
把時間加速
,
投入更多計算能力無法讓機器人走得更快
。
而且平行訓練
1,000
個機器人通
常需要大量成本
。
簡言之
,
在真實世界訓練是很難且很慢的做法
,
所以你通常至少需要
一個模擬的環境
,
來提升訓練速度
。
例如
,
你可以使用
PyBullet(https://pybullet.org/)
或
MuJoCo(http://www.mujoco.org/)
之類的程式庫來做
3D
物理模擬
。
9
這種做法稱為
梯度上升
(Gradient Ascent)。
它就像是反向的梯度下降
:
進行最大化
,
而不是最小化
。
590
|
第十八章:強化學習
OpenAI Gym(https://gym.openai.com/)
10
是提供各種模擬環境的工具組
(Atari
遊戲
、
棋類
遊戲
、2D
與
3D
物理模擬等
),
讓你可以訓練
agent、
比較它們
,
或開發新的
RL
演算法
。
在安裝工具組之前
,
如果你已經使用
virtualenv
來建立並隔離一個環境了
,
你要先啟動
它
:
$
cd $ML_PATH
#
你的
ML
工作目錄
(
例如
$HOME/ml)
$
source my_env/bin/activate
#
在
Linux
或
MacOS
$
.\my_env\Scripts\activate
#
在
Windows
接著安裝
OpenAI Gym(
如果你沒有使用虛擬環境
,
你要加上
--user
選項
,
或取得管理員
權限
):
$
python3 -m pip install -U gym
取決於你的系統
,
你可能也要安裝
Mesa OpenGL Utility(GLU)
程式庫
(
例如在
Ubuntu
18.04,
你必須執行
apt install libglu1-mesa
)
才能顯示第一個環境
。
接著打開
Python
shell
或
Jupyter
筆記本
,
並且用
make()
建立一個環境
:
>>> import gym
>>>
env = gym.make("CartPole-v1")
>>>
obs = env.reset()
>>>
obs
array([-0.01258566, -0.00156614, 0.04207708, -0.00180545])
我們在此建立一個
CartPole
環境
,
這是個
2D
模擬環境
,
在裡面
,
你可以讓一台車子向左
或向右加速
,
來平衡它上面的桿子
(
見圖
18-4)。
你可以執行
gym.envs.registry.all()
來取得所有可用的環境清單
。
建立環境之後
,
你必須用
reset()
方法將它初始化
。
它會
回傳第一個觀察
,
觀察的內容依環境而定
,
對
CartPole
環境而言
,
各個觀察都是一個
1D
NumPy
陣列
,
裡面有四個浮點數
:
這些浮點數代表車子的橫向位置
(
0.0
=
中間
)、
它的
加速度
(
正數代表右邊
),
桿子的角度
(
0.0
=
直立
),
以及它的角速度
(
正數代表順時
針
)。
接下來
,
我們呼叫環境的
render()
方法來顯示這個環境
(
見圖
18-4)。
在
Windows,
你要
先安裝一種
X Server,
例如
VcXsrv
或
Xming:
>>>
env.render()
True
10 OpenAI
是一家人工智慧研究公司
,
部分資金來自
Elon Musk。
它聲稱它的目標是促進並發展造福人類
(
而
不是消滅人類
)
的友善
AI。
OpenAI Gym 簡介
|
591
角度
角速度
速度
位置
0
圖
18-4 CartPole
環境
如果你使用
headless
伺服器
(
也就是沒有螢幕的
),
例如雲端上的虛擬
機器
,
顯示將會失敗
。
避免這種情況的唯一方法是使用偽
X
伺服器
,
例
如
Xvfb
或
Xdummy。
例如
,
你可以安裝
Xvfb(
在
Ubuntu
或
Debian
上
使用
apt install xvfb
)
並使用下面的命令來啟動
Python:
xvfb-run -s
"-screen 0 1400x900x24" python3
。
或是安裝
Xvfb
與
pyvirtualdisplay
程式庫
(https://homl.info/pyvd)(
裡面有
Xvfb),
然後在程式的開頭執行
pyvirtualdisplay.Display(visible=0, size=(1400, 900)).start()
。
如果你希望
render()
用
NumPy
陣列回傳顯示圖像
,
可設定
mode="rgb_array"
(
奇怪的
是
,
這個環境也會將環境顯示到螢幕上
):
>>>
img = env.render(mode="rgb_array")
>>>
img.shape #
高
、
寬
、
通道
(3 =
紅
、
綠
、
藍
)
(800, 1200, 3)
我們來詢問環境有哪些行動可做
:
>>>
env.action_space
Discrete(2)
Discrete(2)
代表可能的行動是整數
0
與
1,
代表往左
(0)
或右
(1)
加速
。
其他的環境可
能有額外的離散
(discrete)
的行動
,
或其他種類的行動
(
例如連續的
)。
因為桿子往右傾
斜
(
obs[2] > 0
),
我們將車子往右加速
:
>>>
action = 1 #
往右加速
>>>
obs, reward, done, info = env.step(action)
>>>
obs
array([-0.01261699, 0.19292789, 0.04204097, -0.28092127])
592
|
第十八章:強化學習
>>>
reward
1.0
>>>
done
False
>>>
info
{}
step()
方法執行了指定的行動
,
並回傳四個值
:
obs
這是新的觀察
。
現在車子往右移了
(
obs[1] > 0
),
桿子仍然右傾
(
obs[2] > 0
),
但
是它的角速度是負的
(
obs[3] < 0
),
所以在下一步之後
,
它可能會左傾
。
reward
在這個環境中
,
每一步都會讓你得到
1.0
的獎勵
,
無論你做了什麼事
,
所以你的目標
是讓這一期
(episode)
的執行時間盡可能地久
。
done
這個值會在這一期結束時變成
True
,
這種情況會在傾斜太多
,
或離開螢幕
,
或進行
200
步之後
(
此時代表你贏了
)
發生
。
結束之後
,
你必須先重設環境才能再次使用它
。
info
這個環境專屬的字典有一些額外的資訊
,
可能對除錯或訓練有幫助
。
例如
,
在一些遊
戲中
,
它可能會找出
agent
還有多少條命
。
當你結束使用環境時
,
你要呼叫它的
close()
方法來釋出資源
。
我們來寫一個簡單的策略
,
在桿子左傾時往左加速
,
當它右傾時往右加速
。
我們會執行這
個策略
,
看看經過
500
期之後
,
它得到多少平均獎勵
:
def
basic_policy(obs):
angle = obs[2]
return
0
if
angle < 0
else
1
totals = []
for
episode
in
range(500):
episode_rewards = 0
obs = env.reset()
for
step
in
range(200):
action = basic_policy(obs)
Get 精通機器學習 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.