引言
强化学习环境库Gym于2021年8月中旬迎来了首个社区志愿者维护的发布版Gym 0.19。该版本全面兼容Python 3.9,增加了多个新特性。
强化学习环境库的事实标准Gym迎来首个社区发布版
Gym库在强化学习领域可以说是众人皆知。它是OpenAI于2016年推出的Python环境库,内置了冰面滑行FrozenLake、车杆平衡CartPole、小车上山MountainCar、双足机器人BipedalWalker等经典强化学习任务环境,是目前最常见的强化学习环境库。绝大多数人在学习强化学习时第一个接触到的环境库就是Gym库。Gym库也是在各类强化学习教程和学术论文中出现频率最高的环境库。它以压倒性的占有率成为强化学习环境库中无可匹敌的事实标准。
OpenAI Gym徽标(图片来源:http://gym.openai.com/)
近年来,由于OpenAI投入的资源有限,Gym一直处于被动维护状态。特别是Python 3.9在2020年10月发布后,Gym迟迟未能兼容Python 3.9。由于不能兼容Python 3.9,更进一步导致不能兼容其他库的最新版本,为研发过程中采用其他库的新特性带来了困难。由于Gym已经在学术界和工业界广泛应用,希望Gym能够兼容Python 3.9的呼声一直很高。在GitHub仓库中的讨论区中常常有留言希望Gym尽早兼容Python 3.9,并对其中的bug进行修订。
2021年7月,OpenAI将Gym交给由马里兰大学(University of Maryland College Park)博士生Justin Terry(GitHub:jkterry1)领衔的社区志愿者们来维护。在志愿者的合作下,2021年8月14日发布了首个社区维护的发布版Gym 0.19。发布文件已经在2021年8月17日上传到PyPI。
Justin Terry(图片来源:https://github.com/jkterry1)
众望所归,Gym 0.19兼容Python 3.9
让Gym兼容Python 3.9涉及到对其依赖的pyglet、pillow等库的兼容性维护,这也导致了Gym迟迟不能兼容Python 3.9。在Justin Terry等多名社区志愿者的通力合作下,本次发布版终于兼容了Python 3.9。这其中也不乏来自中国内地志愿者的贡献。其中,来自中国内地的GitHub用户ZhiqingXiao提交的PR#2135维护了依赖的pillow的版本。
Zhiqing Xiao(图片来源:http://github.com/zhiqingxiao)
在发布版Gym 0.19中,我们已经可以在Python 3.9中采用一行简单的pip命令来安装Gym。
在Python 3.9中安装Gym的命令(在Python 3.9下,此命令仅适用于Gym 0.19,不适合更早的Gym版本)
pip install –upgrade gym
安装完后,就可以在Python中正常使用Gym了。
下面的代码给出了使用Gym的冰面滑行环境FrozenLake-v1的示例。环境FrozenLake-v1是在Gym 0.19首次出现的环境,它的前身是2016年Gym收录的冰面滑行的环境FrozenLake-v0。2021年3月,GitHub用户ZhiqingXiao发现环境FrozenLake-v0的阈值设置存在错误,提交了PR#2205修复了该问题。
使用Gym的示例代码(此代码示例仅适用于Gym 0.19,更早版本会出现运行错误):
import numpy as np
import gym
env = gym.make("FrozenLake-v1")
print(env.observation_space) # 观测空间
print(env.action_space) # 动作空间
print(env.spec.reward_threshold) # 成功求解的阈值
obs, reward, done = env.reset(), 0., False
episode_reward = 0.
while not done:
action = np.random.randint(4)
obs, reward, done, _ = env.step(action)
episode_reward += reward
print(episode_reward) # 回合奖励
Gym 0.19的其他新特性
Gym 0.19还包括了其他新特性。
GitHub用户m-orsini提交的PR#2148使得类gym.spaces.MultiDiscrete类可以自定义数据类型。
为gym.spaces.MultiDiscrete类自定义数据类型的示例代码(该代码仅能用于Gym 0.19,更早版本会有运行错误)
gym.spaces.MultiDiscrete(nvec, dtype=np.bool) # dtype是新增的关键字参数,可传入数据类型。
由GitHub用户vwxyzjn提交的PR#2296使得VectorEnv类也可以使用RecordEpisodeStatistics类。
VectorEnv类和RecordEpisodeStatistics类联合使用的代码示例(该示例来源于vwxyzjn提交的PR#2296。仅适用于Gym 0.19,更早版本会出现运行错误):
import gym
from gym.vector import SyncVectorEnv
def make_env(gym_id, seed):
def thunk():
env = gym.make(gym_id)
env.seed(seed)
env.action_space.seed(seed)
env.observation_space.seed(seed)
return env
return thunk
envs = SyncVectorEnv([make_env("CartPole-v1", 1 + i) for i in range(2)])
envs = gym.wrappers.RecordEpisodeStatistics(envs)
envs.reset()
for i in range(100):
_, _, _, infos = envs.step(envs.action_space.sample())
for info in infos:
if "episode" in info.keys():
print(f"i, episode_reward={info['episode']['r']}")
break
由GitHub用户amtamsi提交的PR#2289使得Gym在导入环境时(特别是导入外部环境时)检查导入的环境。由于检查是在库内部进行的,这个更新对用户是透明的,不需要用户修改代码。在我们导入Gym的第三方扩展库(如棋盘游戏库boardgame2等)时,相关功能会自动使用。
尘封数十年的经典环境惊现闭式解,仅需2行代码求解车杆平衡问题
Gym中收录的环境很多是数十年来反复研究的经典问题,特别是像车杆平衡CartPole、小车上山MountainCar、双足机器人BipedalWalker这样的环境更是反复出现在学术论文和教程中。从去年开始,这些环境的闭式解陆续被首次公开,引发研究人员关注。
车杆平衡CartPole是Gym中最著名的环境之一,该问题由强化学习大师级人物Andrew Barto等人在1983年的论文《Neuronlike adaptive elements that can solve difficult learning control problem》里提出,至今仍是GitHub上最受欢迎的环境之一,同时也是强化学习教程最喜欢收录的环境之一。研究人员于近40年来首次发现了能够求解车杆平衡CartPole的闭式解,并在Gym的Wiki里的Leaderboard页面公开。
车杆平衡CartPole问题(图片来源:https://gym.openai.com/envs/C...)
Gym库收录了两个不同版本的车杆平衡CartPole环境:CartPole-v0和CartPole-v1。公开的闭式解用2行代码就可以求解两个环境,其闭式解的简洁程度着实令人感到意外。
车杆平衡CartPole的闭式解代码
position, velocity, angle, angle_velocity = observation
action = int(3. * angle + angle_velocity > 0.)
除了车杆平衡CartPole以外,还有数个经典环境如小车上山MountainCar、双足机器人BipedalWalker都在Gym的Wiki上公布了闭式解。闭式解大都形式简洁,有兴趣的读者可移步Gym的Wiki上的Leaderboard页面查阅。
作者简介
肖智清,清华大学工学博士。著有《神经网络与PyTorch实战》《强化学习:原理与Python实战》。scipy、sklearn等开源项目源码贡献者。近7年发表SCI/EI论文十余篇,多个顶级期刊和会议审稿人。在国内外多项程序设计和数据科学竞赛上获得冠军。