当前位置:首页 > 资讯 > 正文

OpenAI Gym 入门

OpenAI Gym 入门

这一部分参考官网提供的文档[1],对 Gym 的运作方式进行简单的介绍。Gym 是一个用于开发和比较强化学习算法的工具包,其对「代理」(agent)的结构不作要求,还可以和任意数值计算库兼容(如 Tensorflow 和 Pytorch)。Gym 提供了一系列用于交互的「环境」,这些环境共享统一的接口,以方便算法的编写。

1.1 环境

首先我们可以通过如下代码调用并展示(可视化)一个环境:

该代码创建了一个著名的 CartPole 环境,用于控制小车使上面的杆保持竖直不倒,如下图所示。在每一次迭代中,我们从动作空间中采样了一个随机动作(本环境中只有「向左」「向右」两个动作)并执行。

执行代码后我们会发现,小车并不能如上图所示维持住平衡,而会直接滚出屏幕外。这是因为我们并没有根据环境的反馈而采取正确的动作。

1.2 观测

为了做出更加合适的动作,我们需要先了解环境的反馈。环境的 函数可以返回我们想要的值,其总共返回如下四个值:

通过上述函数,我们可以实现经典的「代理-环境循环」,在每个时间步,代理选择一个动作,环境返回一个观察(状态)和一个奖励:

基于环境的反馈,我们可以对代码进行如下修改,达到终止条件时即退出循环:

在 CartPole 环境中,根据官方 wiki[2],「观测状态」有四维:小车位置、小车速度、杆的角度和杆顶端的速度(初始状态每个值均在 ±0.05 区间内取随机值);「终止条件」有三条:杆的角度大于 ±12 度,小车的位置超过 ±2.4,以及迭代次数超过 200(v1 为 500);每个步骤的「奖励」均为 1(包括终止步)。

1.3 空间

在 Gym 中,状态和动作都是通过 类型来表示的,其可以定义连续或离散的子空间。最常用的两种 是 和 ,在 CartPole 环境中状态空间和动作空间就分别对应这两种 :

定义了一个从 0 开始取值的离散空间,而 则可以表示一个 维的连续空间,需要为每个维度设置上下界。我们可以通过如下方式新建空间:

除了上述两种空间外,Gym 还提供了一些其他的空间,包括多维离散空间、字典空间等,具体可以参考官方源码[3]。

Gym 内置了许多强化学习的经典环境,包括经典控制、雅达利游戏、算法、机器人控制等。我们可以通过下述代码查看所有可以直接调用的环境:

但在实际应用中,面对一个全新的场景,我们往往需要自定义一个环境来训练我们的算法。本节将介绍如何自定义一个环境。

2.1 文件结构

根据官方说明[4],创建一个新的环境需要建立如下结构的 PIP 包:

其中 应包含如下代码:

应包含如下代码:

应包含如下代码:

应包含如下代码:

当全部定义完成后,我们可以在一级目录下通过 来安装自定义环境( 表示本地可编辑的代码,可以快速更新改动),然后即可在程序中调用该环境:

2.2 案例

下面通过经典的「井字棋」(Tic-Tac-Toe)游戏来说明环境的自定义方法。井字棋的玩法如下(就是简化版五子棋):

在井字棋环境中,状态即当前棋盘的局面,动作则是每一回合玩家的走棋。这里假定玩家为先手,电脑为后手。奖励基于玩家的胜负情况制定。具体代码如下:

实际上,上述环境存在许多缺陷。首先是状态空间的表示,我们无法直接判断当前位置是否包含棋子,需要在 agent 中去记录,这显然是不合理的;其次是获胜条件与奖励函数的制定,我们希望环境不去区分玩家与电脑,而是针对每一步给出当前玩家应该受到的奖励。因此,可以考虑将奖励改为当前步下获胜以及防止下一步对方获胜的奖励,相应的胜负判断条件也需要进行修改。一个比较完善的代码(基于 Q 学习)可以参考这里[5]。

以上就是 OpenAI Gym 的相关介绍及自定义环境的简单示范。

参考资料

[1]

OpenAI Gym 官方文档: https://gym.openai.com/docs/

[2]

OpenAI Wiki CartPole v0: https://github.com/openai/gym/wiki/CartPole-v0

[3]

spaces: https://github.com/openai/gym/tree/master/gym/spaces

[4]

How to create new environments for Gym: https://github.com/openai/gym/blob/master/docs/creating-environments.md

[5]

最新文章