强化学习-Gym

2019-11-14  本文已影响0人  魏鹏飞

Gym是用于开发和比较强化学习算法的工具包。它支持教学人员,从步行到玩Pong或Pinball等游戏。

1. Gym入门

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

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

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

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

1.2 Environments

这是运行某件事的最低限度示例。这将在1000个时间步中运行CartPole-v0环境的实例,并在每个步骤中渲染该环境。您应该会看到一个弹出窗口,呈现经典的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
env.close()

它看起来应该像这样:


cartpole-no-reset

通常,我们会在允许球杆离开屏幕之前结束模拟。以后再说。现在,即使此环境已经返回done = True,也请忽略有关调用step()的警告。

如果您希望看到其他运行环境,请尝试将上面的CartPole-v0替换为MountainCar-v0MsPacman-v0(需要 Atari dependency依赖项)或Hopper-v1(需要MuJoCo依赖项)。所有环境均来自Env基类。

请注意,如果您缺少任何依赖项,则应该收到一条有用的错误消息,告诉您所缺少的内容。 (如果没有明确的修复说明,请让我们知道依赖是否给您带来麻烦。)安装缺少的依赖通常很简单。您还需要Hopper-v1的MuJoCo许可证。

1.3 Observations

如果我们想做的比在每个步骤中都采取随机行动要好,那么最好了解一下我们的行动对环境的影响。

环境的step函数完全返回我们需要的东西。实际上,step返回四个值。这些是:

这只是经典“agent-environment loop(代理-环境循环)”的实现。
每个时间步,代理选择一个action(动作),环境返回一个observation(观察)和reward(奖励)

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

这应该提供视频和类似以下的输出。您应该能够看到重置发生的位置。

cartpole-yes-reset
[-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]
1.4 Spaces

在上面的例子中,我们从环境的动作空间中取样随机的动作。但这些行动到底是什么呢?每个环境都有一个action_space和一个observation_space。这些属性的类型为Space,它们描述了有效操作和观察的格式:

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

离散空间允许固定范围的非负数,因此在这种情况下有效操作为0或1。Box空间表示n维框,因此有效观测值将是4个数字的数组。我们还可以检查框的边界:

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

这种自省有助于编写适用于许多不同环境的通用代码。BoxDiscrete是最常见的空间。您可以从某个空间中取样或检查某物是否属于该空间:

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

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

2. 可用环境

Gym拥有各种环境,从容易到困难,涉及许多不同种类的数据。查看完整的环境列表。

2.1 注册表

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板上定义Go游戏。

这些环境ID被视为不透明字符串。为了确保将来进行有效的比较,绝不会以影响性能的方式更改环境,而只能用较新的版本来替换。目前,我们为每个环境添加v0后缀,以便将来可以自然地将其替换为v1v2等。

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

3. 背景:为什么要Gym? (2016年)

强化学习(RL)是机器学习的子领域,涉及决策运动控制。它研究代理如何在复杂,不确定的环境中学习如何实现目标。令人兴奋的原因有两个:

但是,RL研究也因两个因素而减慢了速度:

Gym是试图解决这两个问题的尝试。

上一篇 下一篇

猜你喜欢

热点阅读