gym in python

Gym 入门

Gym 是一个用于开发和比较强化学习算法的工具包。它不对您的代理结构做任何假设,并且与任何数值计算库兼容,例如 TensorFlow 或 Theano。

Gym 库是测试问题(环境)的集合,您可以使用它们来制定强化学习算法。这些环境具有共享接口,允许您编写通用算法。

安装

首先,您需要安装 Python 3.5+。只需使用 pip 安装gym:

pip install gym

Building from Source

如果你乐意,你也可以直接克隆gym git库,当你要修改Gym库本身或者添加新环境时,这个尤其有用。

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

您可以稍后运行 pip install -e .[all]以执行包含所有环境的完整安装。这需要安装更多涉及的依赖项,包括 cmake 和最新的 pip 版本。

环境

这是一个让某些东西运行的最低限度的例子。这将运行 CartPole-v0 环境的实例 1000 个时间步,在每一步渲染环境。您应该会看到一个窗口弹出,呈现经典的推车杆问题:

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
env.close()

通常,我们会在推车杆离开屏幕之前结束模拟。稍后再谈。现在,请忽略有关调用 step() 的警告,即使此环境已返回 done = True。
如果您想查看其他一些实际运行环境,请尝试将上面的 CartPole-v0 替换为 MountainCar-v0、MsPacman-v0(需要 Atari 依赖项)或 Hopper-v1(需要 MuJoCo 依赖项)之类的内容。环境都来自 Env 基类。

请注意,如果您缺少任何依赖项,您应该会收到一条有用的错误消息,告诉您缺少什么。 (如果某个依赖项在没有明确的修复说明的情况下给您带来麻烦,请告诉我们。)安装缺少的依赖项通常非常简单。您还需要一个适用于 Hopper-v1 的 MuJoCo 许可证。

观测(Observations)

If we ever want to do better than take random actions at each step, it’d probably be good to actually know what our actions are doing to the environment.

如果我们想要比采取随机行为做的更好,那么最好知道我们的行为对环境做了什么。

环境的 step 函数返回的正是我们需要的。事实上, step 返回四个值。这些是:

observation (object): 一个特定于环境的对象,代表您对环境的观察。例如,来自相机的像素数据、机器人的关节角度和关节速度,或棋盘游戏中的棋盘状态。
reward (float): 前一个动作获得的奖励量.规模因环境而异,但目标始终是增加您的总回报。
done (boolean): 决定是否是时候再次重置环境了. 大多数(但不是全部)任务被划分为明确定义的回合, 并且 done 为 True 表示该回合已终止,结束. (举例来说,可能这个杆子倾斜太严重,或者你失去了一条命)
info (dict): 对调试有用的诊断信息。它有时对学习很有用(例如,它可能包含环境最后状态变化背后的原始概率)。但是,您的代理的官方评估不允许将此用于学习。(一般是空的,可以忽略)

这只是经典的“代理-环境循环”的一个实现。每个时间步长,代理选择一个动作,环境返回一个观察和奖励。
image.png

该过程从调用 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
env.close()

空间

在上面的例子中,我们一直在从环境的动作空间中采样随机动作。但这些行为究竟是什么?

每个环境都有action_spaceobservation_space。这些属性属于 [Space] 类型,他们描述了有效的action和observations的格式:

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

离散空间允许固定范围的非负数,因此在这种情况下,有效action是 0 或 1。

Box 空间表示一个 n 维的盒子,因此有效的观测值将是一个包含 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 中采样或检查某些东西是否属于它:

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,其中一个动作向左侧施加力,其中一个动作向右侧施加力。 (你能找出哪个是哪个吗?)

幸运的是,您的学习算法越好,您自己尝试解释这些数字的次数就越少。

可用环境

Gym 附带了一套多样化的环境,从简单到困难,涉及许多不同类型的数据。查看完整的环境列表以获得鸟瞰图:

  • Classic control 和 toy text: 完成小规模任务,主要来自 RL 文献。他们在这里帮助您入门。
  • Algorithmic: 执行计算,例如添加多位数字和反转序列。有人可能会反对这些任务对计算机来说很容易。挑战在于纯粹从示例中学习这些算法。这些任务有一个很好的特性,即通过改变序列长度很容易改变难度。
  • Atari: 玩经典的雅达利游戏。我们集成了 Arcade Learning Environment (这对强化学习研究产生了重大影响) 用一种 容易安装 的方式
  • 2D 和 3D 机器人:在模拟中控制机器人。这些任务使用 MuJoCo 物理引擎,该引擎专为快速准确的机器人模拟而设计

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 对象列表。这些定义了特定任务的参数,包括要运行的试验次数和最大步骤数。例如,EnvSpec(Hopper-v1) 定义了一个环境,目标是让一个 2D 模拟机器人跳跃; EnvSpec(Go9x9-v0) 定义了一个 9x9 棋盘上的围棋游戏。

这些环境 ID 被视为不透明字符串。为了确保未来的有效比较,环境永远不会以影响性能的方式改变,只会被更新的版本取代。我们目前为每个环境添加一个 v0 后缀,以便未来的替代品可以自然地称为 v1、v2 等。

将您自己的环境添加到注册表中非常容易,从而使它们可用于gym.make():只需在加载时 register() 即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值