强化学习基础篇 OpenAI Gym 环境搭建demo
淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】
Gym是一个研究和开发强化学习相关算法的仿真平台,无需智能体先验知识,由以下两部分组成
- Gym开源库:测试问题的集合。当你测试强化学习的时候,测试问题就是环境,比如机器人玩游戏,环境的集合就是游戏的画面。这些环境有一个公共的接口,允许用户设计通用的算法。
- OpenAI Gym服务:提供一个站点和API(比如经典控制问题:CartPole-v0),允许用户对他们的测试结果进行比较。
我们需要在Python 3.5+的环境中简单得使用pip安装gym
如果需要从源码安装gym,那么可以:
可以运行pip install -e .[all]执行包含所有环境的完整安装。 这需要安装一些依赖包,包括cmake和最新的pip版本。
简单来说OpenAI Gym提供了许多问题和环境(或游戏)的接口,而用户无需过多了解游戏的内部实现,通过简单地调用就可以用来测试和仿真。接下来以经典控制问题CartPole-v0为例,简单了解一下Gym的特点
运行效果如下
?
以上代码中可以看出,gym的核心接口是Env。作为统一的环境接口,Env包含下面几个核心方法:
- reset(self):重置环境的状态,返回观察。
- step(self, action):推进一个时间步长,返回observation, reward, done, info。
- render(self, mode=‘human’, close=False):重绘环境的一帧。默认模式一般比较友好,如弹出一个窗口。
- close(self):关闭环境,并清除内存
以上代码首先导入gym库,然后创建CartPole-v0环境,并重置环境状态。在for循环中进行1000个时间步长控制,env.render()刷新每个时间步长环境画面,对当前环境状态采取一个随机动作(0或1),在环境返回done为True时,重置环境,最后循环结束后关闭仿真环境。
在上面代码中使用了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,具体用到的时候再说。
在 Gym 仿真中,每一次回合开始,需要先执行 reset() 函数,返回初始观测信息,然后根据标志位 done 的状态,来决定是否进行下一次回合。所以更恰当的方法是遵守done的标志。
代码运行结果的片段如下所示:
上面的结果可以看到这个迭代中,输出的观测为一个列表。这是CartPole环境特有的状态,其规则是。
其中:
- 表示小车在轨道上的位置(position of the cart on the track)
- 表示杆子与竖直方向的夹角(angle of the pole with the vertical)
- 表示小车速度(cart velocity)
- 表示角度变化率(rate of change of the angle)
每次执行的动作(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 的数组。数组中的每个元素都具有上下界。
在gym的Cart Pole环境(env)里面,左移或者右移小车的action之后,env会返回一个+1的reward。其中CartPole-v0中到达200个reward之后,游戏也会结束,而CartPole-v1中则为500。最大奖励(reward)阈值可通过前面介绍的注册表进行修改。
Gym是一个包含各种各样强化学习仿真环境的大集合,并且封装成通用的接口暴露给用户,查看所有环境的代码如下
Gym支持将用户制作的环境写入到注册表中,需要执行 gym.make()和在启动时注册register。如果要注册自己的环境,那么假设你在以下结构中定义了自己的环境:
i. myenv.pyinit.py中,输入以下代码:
ii. 要使用我们自己的环境:
iii. 在PYTHONPATH中安装目录或从父目录启动python。
用户可以记录和上传算法在环境中的表现或者上传自己模型的Gist,生成评估报告,还能录制模型玩游戏的小视频。在每个环境下都有一个排行榜,用来比较大家的模型表现。
上传于录制方法如下所示
使用Monitor Wrapper包装自己的环境,在自己定义的路径下将记录自己模型的性能。支持将一个环境下的不同模型性能写在同一个路径下。
在官网注册账号后,可以在个人页面上看到自己的API_Key,接下来可以将结果上传至OpenAI Gym:
然后得到如下结果:
打开链接会有当前模型在环境下的评估报告,并且还录制了小视频:
每次上传结果,OpenAI Gym都会对其进行评估。
创建一个Github Gist将结果上传,或者直接在upload时传入参数:
评估将自动计算得分,并生成一个漂亮的页面。
在大多数环境中,我们的目标是尽量减少达到阈值级别的性能所需的步骤数。不同的环境都有不同的阈值,在某些环境下,尚不清楚该阈值是什么,此时目标是使最终的表现最大化。在cartpole这个环境中,阈值就是立杆能够直立的帧数。
任何程序错误,以及技术疑问或需要解答的,请添加
强化学习基础篇(十)OpenAI Gym环境汇总
Gym中从简单到复杂,包含了许多经典的仿真环境,主要包含了经典控制、算法、2D机器人,3D机器人,文字游戏,Atari视频游戏等等。接下来我们会简单看看主要的常用的环境。在Gym注册表中有着大量的其他环境,就没办法介绍了。
经典的强化学习示例,方便入门,包括了:
-
Acrobot-v1
Acrobot机器人系统包括两个关节和两个连杆,其中两个连杆之间的关节可以被致动。 最初,连杆是向下悬挂的,目标是将下部连杆的末端摆动到给定的高度。
Acrobot-v1.gif -
CartPole-v1
CartPole-v1环境中,手推车上面有一个杆,手推车沿着无摩擦的轨道移动。 通过对推车施加+1或-1的力来控制系统。 钟摆最开始为直立状态,训练的目的是防止其跌落。 杆保持直立的每个时间步长都提供+1的奖励。 当杆与垂直线的夹角超过15度时,或者推车从中心移出2.4个单位以上时,训练结束。
cartpole.gif -
MountaiCar-v0
MountaiCar-v0环境中汽车位于一维轨道上,轨道位于两个“山”之间。 目标是让汽车驶向右侧的山峰; 由于汽车的引擎强度不足以直接到达右侧山峰,所以,成功的唯一方法是来回驱动以产生动力。
MountainCar-v0.gif -
MountainCarContinuous-v0
MountainCarContinuous-v0环境与MountaiCar-v0环类似,动力不足的汽车必须爬上一维小山才能到达目标。 与MountainCar-v0不同,动作(应用的引擎力)允许是连续值。目标位于汽车右侧的山顶上。 如果汽车到达或超出,则剧集终止。
MountainCarContinuous-v0.gif -
Pendulum-v0
倒立摆摆动问题是控制文献中的经典问题。 在此问题的版本中,摆锤开始于随机位置,目标是将其摆动以使其保持直立。
Pendulum-v0.gif
从例子中学习强化学习的相关算法,在Gym的仿真算法中,由易到难方便新手入坑,包括了:
-
Copy-v0
此任务就是让智能体学习对序列的拷贝操作。
Copy-v0.gif -
DuplicatedInput-v0
此任务让智能体学习从输入序列,输出对每个元素的三次复制
DuplicatedInput-v0.gif -
RepeatCopy-v0
此任务让智能体学习对输入序列,输出对序列的m次复制。
RepeatCopy-v0.gif -
Reverse-v0
目的是反转输入序列
Reverse-v0.gif -
ReversedAddition-v0
此任务让智能体学习在提供的网格数字序列之上增加数字序列。在这个任务中需要智能体学会(i)记住加法表; (ii)学习如何在输入网格上移动,以及(iii)发现进位的概念。
ReversedAddition-v0.gif -
ReversedAddition3-v0
ReversedAddition3-v0与ReversedAddition-v0基本任务相同,但是现在要添加三个数字。 由于奖励信号的更具有稀疏性,因此难度加大(因为必须先完成更多正确的操作,然后才能产生正确的输出结果)。
ReversedAddition3-v0.gif
-
BipedalWalker-v2
这个环境要训练机器人向前移动,走到最远的位置一共有奖励300+,如果摔倒奖励-100。
环境的状态包括了船体角速度,角速度,水平速度,垂直速度,关节位置和关节角速度,腿是否与地面的接触以及10个激光雷达测距仪的测量值。( hull angle speed, angular velocity, horizontal speed, vertical speed, position of joints and joints angular speed, legs contact with ground, and 10 lidar rangefinder measurements.)状态向量中没有坐标。
BipedalWalker-v2.gif -
BipedalWalkerHardcore-v2
与BipedalWalker-v2相比,增加了一些障碍物。
BipedalWalkerHardcore-v2.gif -
CarRacing-v0
CarRacing-v0是一个最简单的连续控制任务。智能体从环境的图片像素中学习。这个环境也可以进行离散动作控制,环境带有离散化的开关控制是否进行离散化的动作控制。状态是由96x96的像素组成。 奖励是每帧-0.1。到达每个预定义位置会有+1000/N的奖励,所以环境里面有N个小目标。
例如,智能体在732帧完成目标,则奖励为1000-0.1 * 732=926.8。 赛车碰到边界就结束。窗口底部会显示一些指标。 从左到右为:真实速度,四个ABS传感器,方向盘位置,陀螺仪。
CarRacing-v0.gif -
LunarLander-v2
这是一个控制智能体着陆到指定目标的任务。
Landing pad is always at coordinates (0,0). Coordinates are the first two numbers in state vector. Reward for moving from the top of the screen to landing pad and zero speed is about 100..140 points. If lander moves away from landing pad it loses reward back. Episode finishes if the lander crashes or comes to rest, receiving additional -100 or +100 points. Each leg ground contact is +10. Firing main engine is -0.3 points each frame. Solved is 200 points. Landing outside landing pad is possible. Fuel is infinite, so an agent can learn to fly and then land on its first attempt. Four discrete actions available: do nothing, fire left orientation engine, fire main engine, fire right orientation engine.
LunarLander-v2.gif -
LunarLanderContinuous-v2
LunarLander-v2的连续控制版本
Landing pad is always at coordinates (0,0). Coordinates are the first two numbers in state vector. Reward for moving from the top of the screen to landing pad and zero speed is about 100..140 points. If lander moves away from landing pad it loses reward back. Episode finishes if the lander crashes or comes to rest, receiving additional -100 or +100 points. Each leg ground contact is +10. Firing main engine is -0.3 points each frame. Solved is 200 points. Landing outside landing pad is possible. Fuel is infinite, so an agent can learn to fly and then land on its first attempt. Action is two real values vector from -1 to +1. First controls main engine, -1..0 off, 0..+1 throttle from 50% to 100% power. Engine can't work with less than 50% power. Second value -1.0..-0.5 fire left engine, +0.5..+1.0 fire right engine, -0.5..0.5 off.
LunarLanderContinuous-v2.gif
MuJoCo(Multi-Joint dynamics with Contact)是一个物理模拟器,可以用于机器人控制优化等研究。
-
Ant-v2
需要训练一个四足的智能体学会行走。
Ant-v2.gif -
HalfCheetah-v2
需要训练一个两足的智能体学会行走。
HalfCheetah-v2.gif -
Hopper-v2
需要训练一个单腿的智能体向前跳跃
Hopper-v2.gif -
Humanoid-v2
需要训练三维双足智能体尽可能快地向前走,并且不会摔倒。
Humanoid-v2.gif -
HumanoidStandup-v2
需要训练尽可能快地让使三维双足智能体学会站立。
HumanoidStandup-v2.gif -
InvertedDoublePendulum-v2
需要智能体学会保持连杆不要掉下来
InvertedDoublePendulum-v2.gif InvertedPendulum-v2
-
Reacher-v2
训练智能体不断去接近一个目标。
Reacher-v2.gif -
Swimmer-v2
此任务涉及在粘性流体中的三连杆游泳智能体,其目的是通过控制两个关节,使其尽可能快地向前游泳。
Swimmer-v2.gif -
Walker2d-v2
需要训练使二维双足智能体尽可能快地向前走。
Walker2d-v2.gif
利用强化学习来玩雅达利的游戏。Gym中集成了对强化学习有着重要影响的Arcade Learning Environment,并且方便用户安装;
游戏的目标都是为了在游戏中最大化游戏分数。但是他们的状态分为两类,一类是直接观测屏幕的像素输出,另一类是观测到RAM中的数据。所有的环境名称列在下表中: