Gym是开发和对比强化学习算法的工具,对算法agent结构没有限制,兼容很多计算库,比如TensorFlow,Theano。
Gym包括很多可用来测试强化学习的测试环境,支持统一的接口。

Installation

要求python版本不低于3.5,通过pip安装

pip install gym

Building from Source

gym代码在github上开源,允许修改编辑

git clone https://github.com/openai/gym
cd gym
pip install -e .

安装后随时可以用pip install -e .[all]安装所有环境,但这需要安装一些依赖工具,比如CMake

Environments

下面给出一个最简单的例子,运行CartPole-v01000帧,逐帧显示。运行代码,会显示一个窗口,演示cart-pole问题。

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

把CartPole-v0替换成MountainCar-v0,MsPacman-v0或Hopper-v1可以查看其他的环境,所以的环境的基类是Env。

Observations

相比于每一步随机选择一个动作,最好可以可以获得每个动作实施后对环境的影响。
环境的step函数会返回四个量,描述了动作对结果:
* observation(object): 一个环境相关的对象描述对环境的观测,比如来自摄像头的像素数据,关节转动量和速度,棋盘游戏的棋盘布局
* reward(float): 动作带来的收益。不同环境下的收益值域不同,RL算法的目的一般是令总收益最大
* done(boolean): 结束标志,done=True时表示环境需要重置,一般暗示game over
* info(dict): 调试信息,但agent不允许学习这些信息。
上述实现了经典的”agent-environment loop”。每个时刻agent选择一个action作用到环境,环境返回observation和reward
agent-environment loop
循环从reset()开始,返回初始的observation,所以更加正确的代码应该是参考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

将显示一段视频,并输入如下内容

[-0.061586   -0.75893141  0.05793238  1.15547541]
[-0.07676463 -0.95475889  0.08104189  1.46574644]
[-0.0958598  -1.15077434  0.11035682  1.78260485]
[-0.11887529 -0.95705275  0.14600892  1.5261692 ]
[-0.13801635 -0.7639636   0.1765323   1.28239155]
[-0.15329562 -0.57147373  0.20218013  1.04977545]
Episode finished after 14 timesteps
[-0.02786724  0.00361763 -0.03938967 -0.01611184]
[-0.02779488 -0.19091794 -0.03971191  0.26388759]
[-0.03161324  0.00474768 -0.03443415 -0.04105167]

Spaces

上面的例子中,我们从环境的actions中随机采样,每个环境都有一个action_space和一个observation_space,他们都时Space类型,描述合理的动作和观测:

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

Discrete空间允许固定范围的非负数,其对应的action只能是0或1。Box空间描述n维区域,对应的observation就是4维向量,可以检查Box的范围

print(env.observation_space.high)
#> array([ 2.4       ,         inf,  0.20943951,         inf])
print(env.observation_space.low)
#> array([-2.4       ,        -inf, -0.20943951,        -inf])

Box和Discrete是最常用的Space,可以对space采样并检查合法性

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

对于CartPole-v0包括两个动作,一个向左,另一个向右

Available Environments

  • Classic control和toy text:大部分来自于RL领域的入门级任务
  • Algorithmic:数学任务,比如数字连加,序列反转等。这些任务的挑战是必须从例子中学习到规则,而不是通常已知规则。这一类任务的优点是容易设置困难程度,比如增加序列长度以增加难度。
  • Atari:经典Atari游戏
  • 2D和3D机器人:在模拟环境中操作机器人

The registry

gym的主要目的是提供版本控制并且接口统一的测试环境,方便对比。gym.envs.registry列举出安装的所有环境

from gym import envs
print(envs.registry.all())
#> [EnvSpec(DoubleDunk-v0), EnvSpec(InvertedDoublePendulum-v0), EnvSpec(BeamRider-v0), EnvSpec(Phoenix-ram-v0), EnvSpec(Asterix-v0), EnvSpec(TimePilot-v0), EnvSpec(Alien-v0), EnvSpec(Robotank-ram-v0), EnvSpec(CartPole-v0), EnvSpec(Berzerk-v0), EnvSpec(Berzerk-ram-v0), EnvSpec(Gopher-ram-v0), ...

这将显示EnvSpec列表,定义了每个环境的参数,包括实验的帧数和总的帧数。比如Env(Hopper-v1)定义目标是控制2D模拟机器跳跃的环境。Env(Go9x9-v0)定义9x9
的棋盘游戏
环境ID作为不变化的字符串标识一个环境,环境不会变化,只会被新的版本替换,初始的环境id是v0。
通过gym.make()新增自定义环境,并在加载时用register()注册

Background:Why Gym?(2016)

强化学习是机器学习的一个分支,关注于决策和控制,研究agent如何在复杂,不确定的环境中达成目标。目前它再次引起关注,因为
* 实际场景中很多问题都涉及RL:比如控制机器人跑跳,投资理财,电子游戏和棋类游戏等。通过sequential or structured 输出还可以应用到有监督学习。
* 借助DL的发展,RL正在被应用到很多复杂环境中。DeepMind的Atari results,Pieter Abbeel工作组的BRETT以及AlphaGo都利用了RL算法。
但RL研究目前也面临问题
* 缺少统一测试基准。大规模标记数据,比如ImageNet极大的促进了有监督学习。而RL领域目前缺少丰富,容易使用的环境。
* 缺少统一的接口标准:问题定义和描述的不统一,比如reward/action的描述,导致难以对比结果

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐