OpenAI Gym库是一个兼容主流计算平台[例如TensorFlow,PyTorch,Theano]的强化学习工具包,可以让用户方便的调用API来构建自己的强化学习应用。

Installation

pip3 install gym

pip安装很方便,推荐使用虚拟环境安装,利于管理

Hello World

下面的代码是Gym官网提供了一个简单的例子,算是Gym的Hello World。因为每个一个step都是随机生成,所以他们不是通过和env交互获得的最佳方案[通过图形结果也可以看出来]

import gym
# create an environment using gym, 'CartPole-v0' is one of the predeinfed environment.
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    # render the environment for UI, not necessary
    env.render()
    # take a random action which is sampled by action_space
    env.step(env.action_space.sample()) 
env.close()

强化的学习核心思想就是跟环境交互然后根据结果来进行判断下一步动作,所以更好的方式获得每一个动作和它的feedback。Gym提供的step方法可以返回我们需要的信息也就是observation,reward,done,info

Observation[object]:当前step执行后,环境的观测(类型为对象)。例如,从相机获取的像素点,机器人各个关节的角度或棋盘游戏当前的状态等。这么说可能有点晦涩,可以理解成某一时刻一些环境参数的数值,比如上面CartPole-v0例子中,observation可以是下面的参数:

Num Observation Min Max
0 Cart Position -2.4 2.4
1 Cart Velocity -Inf Inf
2 Pole Angle -41.8 41.8
3 Pole Velocity At Tip -Inf Inf

Reward[float]:执行上一步动作(action)后,agent获得的奖励(浮点类型),不同的环境中奖励值变化范围也不相同,但是强化学习的目标就是使得总奖励值最大。在上一个例子中,每次不是1或者0,所以应该是1就是正反馈,0就是负反馈。

Done[boolean]:表示是否需要将环境重置env.reset。大多数情况下,当Done为True时,就表明当前回合[episode]或者试验[tial]结束。例如当机器人摔倒或者掉出台面,就应当终止当前回合进行重置[reset];

Info[dict]:主要是用于debug的log信息,很好理解就不多解释了。

所以,在Gym仿真中,正确的逻辑是每一次回合开始,需要先执行reset()函数,返回初始观测信息,然后根据标志位done的状态,来决定是否进行下一次回合。那么修改hello world的代码为

import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
    # reset the environment for each eposiod
    observation = env.reset()
    # there are 100 step in 1 episode by default 
    for t in range(100):
        env.render()
        action = env.action_space.sample()
        # get observation, reward, done, info after applying an action
        observation, reward, done, info = env.step(action)
        # if done is true then the current episode is finished
        if done:
            print("Episode finished after {} timesteps".format(t+1))
            print(observation)
            break
env.close()

Spaces

在Gym的仿真环境中,有运动空间action_space和观测空间observation_space两个指标,程序中被定义为 Space类型,用于描述有效的运动和观测的格式和范围。比如,在上面的例子中,每次执行的动作[action]都是从环境动作空间中随机进行选取的[env.action_space.sample()],但是这些动作取决于动作空间的定义。比如上面的例子中,通过代码可以发现

  • CartPole-v0仿真环境中,action_space是一个离散Discrete类型,从discrete.py源码可知,范围是一个{0,1,...,n-1}长度为n的非负整数集合,所以在CartPole-v0例子中,动作空间表示为Discrete(2)也就是{0,1}
  • observation_space是一个Box类型,从box.py源码可知,表示一个n维的盒子,所以Box(4,)是一个长度4为的数组。数组中的每个元素都具有上下界。
import gym
env = gym.make('CartPole-v0')
print(env.action_space)
># Discrete(2)
print(env.observation_space)
># Box(4,)

Reference

  1. OpenAI Gym Doc, https://gym.openai.com/docs/