OpenAI Gym 经典控制环境介绍——CartPole(倒立摆)
淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】
摘要:OpenAI Gym是一款用于研发和比较强化学习算法的工具包,本文主要介绍Gym仿真环境的功能和工具包的使用方法,并详细介绍其中的经典控制问题中的倒立摆(CartPole-v0/1)问题。最后针对倒立摆问题如何建立控制模型并采用爬山算法优化进行了介绍,并给出了相应的完整python代码示例和解释。要点如下:
- OpenAI Gym仿真环境介绍
- CartPole-v0/1原理与功能
- 爬山算法解决倒立摆问题
自从AlphaGo的横空出世之后,整个工业界都为之振奋,也确定了强化学习在人工智能领域的重要地位,越来越多的人加入到强化学习的研究和学习中。强化学习(Reinforcement learning, RL)是机器学习的一个子领域,在智能控制机器人及分析预测等领域有许多应用。强化学习通过与环境进行交互获得的奖赏指导行为,目标是使智能体获得最大的奖赏,最终开发出智能体(Agent)做出决策和控制。
OpenAI Gym是一个研究和比较强化学习相关算法的开源工具包,包含了许多经典的仿真环境和各种数据。目前强化学习的研究面临着使用的环境缺乏标准化的问题,这个问题使得很难复制已发表的研究结果以及比较不同论文的结果,个人认为Gym正好为这一问题提供了很好的解决方案。因此非常有必要学习一下Gym这一快捷工具包,经过一段时间对深度强化学习的研究和学习,我这里将前期所学做一个整理和总结。
Gym是一个研究和开发强化学习相关算法的仿真平台,无需智能体先验知识,并兼容常见的数值运算库如 TensorFlow、Theano等。OpenAI Gym由以下两部分组成:
- Gym开源库:测试问题的集合。当你测试强化学习的时候,测试问题就是环境,比如机器人玩游戏,环境的集合就是游戏的画面。这些环境有一个公共的接口,允许用户设计通用的算法。
- OpenAI Gym服务:提供一个站点和API(比如经典控制问题:CartPole-v0),允许用户对他们的测试结果进行比较。
简单来说OpenAI Gym提供了许多问题和环境(或游戏)的接口,而用户无需过多了解游戏的内部实现,通过简单地调用就可以用来测试和仿真。接下来以经典控制问题CartPole-v0为例,简单了解一下Gym的特点,以下代码来自OpenAI Gym官方文档
运行效果如下:
以上代码中可以看出,gym的核心接口是Env。作为统一的环境接口,Env包含下面几个核心方法:
- reset(self):重置环境的状态,返回观察。
- step(self, action):推进一个时间步长,返回observation, reward, done, info。
- render(self, mode="human", close=False):重绘环境的一帧。默认模式一般比较友好,如弹出一个窗口。
- close(self):关闭环境,并清除内存。
以上代码首先导入gym库,第2行创建CartPole-v0环境,并在第3行重置环境状态。在for循环中进行1000个时间步长(timestep)的控制,第5行刷新每个时间步长环境画面,第6行对当前环境状态采取一个随机动作(0或1),最后第7行循环结束后关闭仿真环境。
在上面代码中使用了env.step()函数来对每一步进行仿真,在Gym中,env.step()会返回 4 个参数:
- 观测 Observation (Object):当前step执行后,环境的观测(类型为对象)。例如,从相机获取的像素点,机器人各个关节的角度或棋盘游戏当前的状态等;
- 奖励 Reward (Float): 执行上一步动作(action)后,智能体( agent)获得的奖励(浮点类型),不同的环境中奖励值变化范围也不相同,但是强化学习的目标就是使得总奖励值最大;
- 完成 Done (Boolen): 表示是否需要将环境重置 env.reset。大多数情况下,当 Done 为True 时,就表明当前回合(episode)或者试验(tial)结束。例如当机器人摔倒或者掉出台面,就应当终止当前回合进行重置(reset);
- 信息 Info (Dict): 针对调试过程的诊断信息。在标准的智体仿真评估当中不会使用到这个info,具体用到的时候再说。
总结来说,这就是一个强化学习的基本流程,即"agent-environment loop",在每个时间点上,智能体(可以认为是你写的算法)选择一个动作(action),环境返回上一次action的观测(Observation)和奖励(Reward),用图表示为
在 Gym 仿真中,每一次回合开始,需要先执行 reset() 函数,返回初始观测信息,然后根据标志位 done 的状态,来决定是否进行下一次回合。所以更恰当的方法是遵守done的标志,同样我们可以参考OpenAI Gym官方文档中的代码如下
当done 为真时,控制失败,此阶段episode 结束。可以计算每 episode 的回报就是其坚持的t+1时间,坚持的越久回报越大,在上面算法中,agent 的行为选择是随机的,平均回报为20左右。
在前面的两个小例子中,每次执行的动作(action)都是从环境动作空间中随机进行选取的,但是这些动作 (action) 是什么?在 Gym 的仿真环境中,有运动空间 action_space 和观测空间observation_space 两个指标,程序中被定义为 Space类型,用于描述有效的运动和观测的格式和范围。下面是一个代码示例:
从程序运行结果可以看出:
- action_space 是一个离散Discrete类型,从discrete.py源码可知,范围是一个{0,1,...,n-1} 长度为 n 的非负整数集合,在CartPole-v0例子中,动作空间表示为{0,1}。
- observation_space 是一个Box类型,从box.py源码可知,表示一个 n 维的盒子,所以在上一节打印出来的observation是一个长度为 4 的数组。数组中的每个元素都具有上下界。
利用运动空间和观测空间的定义和范围,可以将代码写得更加通用。在许多仿真环境中,Box和Discrete是最常见的空间描述,在智体每次执行动作时,都属于这些空间范围内,代码示例为:
在CartPole-v0栗子中,运动只能选择左和右,分别用{0,1}表示。
Gym中从简单到复杂,包含了许多经典的仿真环境和各种数据,其中包括:
-
经典控制和文字游戏:经典的强化学习示例,方便入门;
-
算法:从例子中学习强化学习的相关算法,在Gym的仿真算法中,由易到难方便新手入坑;
-
雅达利游戏:利用强化学习来玩雅达利的游戏。Gym中集成了对强化学习有着重要影响的Arcade Learning Environment,并且方便用户安装;
-
2D和3D的机器人:这个是我一直很感兴趣的一部分,在Gym中控制机器人进行仿真。需要利用第三方的物理引擎如 MuJoCo。
Gym是一个包含各种各样强化学习仿真环境的大集合,并且封装成通用的接口暴露给用户,查看所有环境的代码如下
Gym支持将用户制作的环境写入到注册表中,需要执行 gym.make()和在启动时注册register,具体可参考这篇博客:gym介绍。同时我们可以通过写入新的注册表实现对环境中的某些参数设置进行修改,例如
用户可以记录和上传算法在环境中的表现或者上传自己模型的Gist,生成评估报告,还能录制模型玩游戏的小视频。在每个环境下都有一个排行榜,用来比较大家的模型表现。详细介绍可以参考这篇博文:OpenAI Gym评估平台、OpenAI教程,当然更加准确的表述还是应该参考OpenAI Gym官方文档。
在CartPole-v0的环境中,实际参考了论文:AG Barto, RS Sutton and CW Anderson, "Neuronlike Adaptive Elements That Can Solve Difficult Learning Control Problem", IEEE Transactions on Systems, Man, and Cybernetics, 1983.中的倒立摆控制问题。
Cart Pole即车杆游戏,游戏模型如下图所示。游戏里面有一个小车,上有竖着一根杆子,每次重置后的初始状态会有所不同。小车需要左右移