当前位置:首页|资讯|OpenAI

OpenAI Gym学习(一)基本用法

作者:LSC2049发布时间:2023-08-07

Gymnasium(原OpenAI Gym,现在由Farama foundation维护)是一个为所有单体强化学习环境提供API的项目,包括常见环境的实现:cartpole、pendulum(钟摆)、mountain-car、mujoco、atari等。

API包含四个关键函数:make、reset、step和render,这些基本用法将向您介绍。Gymnasium的核心是Env,这是一个高级python类,代表了强化学习理论中的马尔可夫决策过程(markov decision process,MDP)(这不是一个完美的重建,缺少MDP的几个组件)。在Gymnasium中,环境(MDP)与Wrappers一起实现为Env类,Wrappers提供了有用的实用程序,可以更改传递给用户的结果。

初始化环境

在Gymnasium中初始化环境非常容易,可以通过make功能完成:

这将返回一个Env供用户交互。要查看您可以创建的所有环境,请使用gymnium.envs.registry.keys()。make包含许多用于添加包装器的附加参数,为环境指定关键字等等。

与环境互动

下图所示的经典“代理-环境循环”(agent-environment loop)是Gymnasium实现的强化学习的简化表示。

此循环使用以下Gym代码实现

输出应该如下所示:

代码解读

首先,使用make创建一个环境,并添加一个额外的关键字“render_mode”,指定环境应该如何可视化。有关不同渲染模式的默认含义的详细信息,请参见render。在本例中,我们使用“LunarLander”环境,agent控制需要安全着陆的宇宙飞船。

初始化环境后,我们reset环境以获得对环境的第一次观察。要使用特定的随机种子或选项初始化环境(有关可能的值,请参阅environment的相关文档),请使用带有seed或option参数的reset函数。

接下来,agent在环境中执行一个行动,step,这可以想象为移动机器人或按下游戏控制器上的按钮,从而导致环境发生变化。结果,agent从更新的环境接收新的观察结果以及对采取该动作的奖励reward。例如,这种奖励可以是摧毁敌人的正面奖励,也可以是进入熔岩的负面奖励。一个这样的行动观察交替(action-observation exchange)被称为时间步长(timestep)。

然而,经过一段时间后,环境可能会结束,这被称为终止状态(terminal state)。例如,机器人可能已经崩溃,或者agent成功完成了任务,由于agent无法继续,环境将需要停止。在Gym里,如果环境已经终止,这是由step返回的。类似地,我们可能还希望环境在固定数量的时间步长后结束,在这种情况下,环境会发出截断信号(truncated signal)。如果terminated或truncated中的任何一个为true,那么接下来应该调用reset来重新启动环境。

行为和观察空间

每个环境都使用env.action_space和env.observation_space属性指定有效的行动和观察的格式。这有助于了解环境的预期输入和输出,因为所有有效的行动和观察都应该包含在相应的空间中。

在本例中,我们通过env.action_space.sample()对随机行动进行采样,而不是使用代理策略,将观察结果映射到用户想要执行的行动。有关创建和训练代理策略(agent policy)的示例,请参阅其中一个agent教程。

每个环境都应该具有action_space和observation_space属性,这两个属性都应该是从space继承的类的实例。Gym支持用户可能需要的大多数可能空间:

  • Box:描述一个n维连续空间。这是一个有界空间,在这里我们可以定义上限和下限,这些上限和下限描述了我们的观测可以取的有效值。

  • Discrete(离散):描述一个离散空间,其中{0,1,…,n-1}是我们的观察或行动可以采取的可能值。可以使用可选参数将值移位到{a,a+1,…,a+n-1}。

  • Dict(字典):表示采样空间的字典。

  • Tuple(元组):表示采样空间的元组。

  • MultiBinary:创建一个n-shape二进制空间。参数n可以是一个数字或数字列表。

  • MultiDiscrete:由一系列离散行动空间组成,每个元素中有不同数量的行动。

修改环境

Wrappers (包装器)是修改现有环境的一种方便方式,无需直接更改底层代码。使用包装器可以避免大量的样板代码,并使您的环境更加模块化。包装器也可以被链接以组合它们的效果。默认情况下,通过gymnasium.make生成的大多数环境都会使用TimeLimit、OrderEnforceing和PassiveEnvChecker进行包装。

为了包装环境,必须首先初始化基本环境。然后,您可以将此环境与(可能是可选的)参数一起传递给包装器的构造函数:

Gym已经为您提供了许多常用的Wrapper。一些示例:

  • TimeLimit:如果超过了最大时间步长(或者基本环境发出了截断信号),则发出截断信号。

  • ClipAction:剪裁动作,使其位于动作空间中(类型为Box)。

  • RescaleAction(重新缩放行动):将行动重新缩放到指定的间隔内

  • TimeAwareObservation:向观察添加有关时间步长索引的信息。在某些情况下,有助于确保转换是马尔可夫的。

有关Gym中实现的包装器的完整列表,请参阅Wrappers。

如果你有一个包装的环境,并且你想在所有包装层下面获得未包装的环境(这样你就可以手动调用一个函数或更改环境的一些底层方面),你可以使用.unvapped属性。如果环境已经是一个基本环境,那么.unpacked属性只会返回自身。

原文地址:

Gymnasium/docs/content/basic_usage.md at main · Farama-Foundation/Gymnasium (github.com)


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1