• 文档 >
  • 开始使用环境、TED 和转换
快捷方式

环境、TED 和 Transforms 入门

作者Vincent Moens

注意

要在 notebook 中运行本教程,请在开头添加一个安装单元格,其中包含:

!pip install tensordict
!pip install torchrl

欢迎来到入门教程!

下面是我们即将涵盖的主题列表。

如果您时间紧迫,可以立即跳转到最后一个教程 您自己的第一个训练循环,您可以在其中回溯所有其他“入门”教程,以防有不清楚的地方或想了解特定主题!

RL 中的环境

标准的 RL(强化学习)训练循环包含一个模型,也称为策略,该模型被训练以在特定环境中完成一项任务。通常,这个环境是一个模拟器,它接受动作作为输入,并产生一个观测值以及一些元数据作为输出。

在本文件中,我们将探讨 TorchRL 的环境 API:我们将学习如何创建环境、与之交互,以及了解它使用的数据格式。

创建环境

本质上,TorchRL 不直接提供环境,而是提供其他库的包装器,这些库封装了模拟器。envs 模块可以被视为通用环境 API 的提供者,也是模拟后端(如 gymGymEnv)、BraxBraxEnv)或 DeepMind Control SuiteDMControlEnv)的中心枢纽。

创建环境通常与底层后端 API 一样简单。下面是一个使用 gym 的示例

from torchrl.envs import GymEnv

env = GymEnv("Pendulum-v1")

运行环境

TorchRL 中的环境有两个关键方法:reset(),用于启动一个回合,以及 step(),用于执行由 actor 选择的动作。在 TorchRL 中,环境方法读写 TensorDict 实例。本质上,TensorDict 是一个通用的基于键的数据载体,用于存储张量。使用 TensorDict 而不是普通张量的优点在于,它使我们能够可互换地处理简单和复杂的数据结构。由于我们的函数签名非常通用,它消除了适应不同数据格式的挑战。简而言之,在完成这个简短的教程后,您将能够操作简单和高度复杂的环境,因为它们面向用户的 API 是相同且简单的!

让我们让环境运行起来,看看 tensordict 实例是什么样的

reset = env.reset()
print(reset)

现在让我们对动作空间采取一个随机动作。首先,对动作进行采样

reset_with_action = env.rand_action(reset)
print(reset_with_action)

这个 tensordict 的结构与从 EnvBase() 获得的结构相同,只是多了一个 "action" 条目。您可以轻松地访问该动作,就像访问普通字典一样

print(reset_with_action["action"])

我们现在需要将此动作传递给环境。我们将把整个 tensordict 传递给 step 方法,因为在更高级的情况下(如多智能体 RL 或无状态环境)可能需要读取多个张量

stepped_data = env.step(reset_with_action)
print(stepped_data)

同样,这个新的 tensordict 与之前的那个相同,只是多了一个 "next" 条目(它本身也是一个 tensordict!)包含我们动作产生的观测值、奖励和完成状态。

我们将这种格式称为 TED,即 TorchRL Episode Data format。它是库中表示数据的通用方式,无论是像这里一样的动态表示,还是像离线数据集一样的静态表示。

您在环境中运行回放所需的最后一部分信息是如何将 "next" 条目带到根目录以执行下一步。TorchRL 提供了一个专用的 step_mdp() 函数,可以做到这一点:它会过滤掉您不需要的信息,并提供一个对应于您在马尔可夫决策过程(MDP)中进行一次步骤后的观测值的数据结构。

from torchrl.envs import step_mdp

data = step_mdp(stepped_data)
print(data)

环境回放

写下这三个步骤(计算动作、执行步骤、在 MDP 中移动)可能会有点乏味和重复。幸运的是,TorchRL 提供了一个很好的 rollout() 函数,让您可以随心所欲地以闭环方式运行它们

rollout = env.rollout(max_steps=10)
print(rollout)

这些数据看起来与上面的 stepped_data 非常相似,除了它的批次大小,现在等于您通过 max_steps 参数提供的步数。tensordict 的魔力不止于此:如果您对这个环境的单个过渡感兴趣,您可以像索引张量一样索引 tensordict

transition = rollout[3]
print(transition)

TensorDict 会自动检查您提供的索引是键(在这种情况下,我们沿着键维度进行索引)还是像这里一样的空间索引。

当像这样执行(没有策略)时,rollout 方法可能看起来相当无用:它只是运行随机动作。如果存在策略,可以将其传递给该方法并用于收集数据。

尽管如此,首先运行一个天真的、无策略的回放来一目了然地检查环境的预期行为可能仍然有用。

为了体会 TorchRL API 的多功能性,请考虑回放方法普遍适用。无论您是处理像本例中的单个环境、跨多个进程的多个副本、多智能体环境,甚至其无状态版本,它都能在所有用例中发挥作用!

转换环境

大多数时候,您需要修改环境的输出以更好地满足您的需求。例如,您可能希望监控自上次重置以来执行的步数、调整图像大小或将连续的观测值堆叠在一起。

在本节中,我们将检查一个简单的转换,即 StepCounter 转换。完整的转换列表可以在 这里 找到。

该转换通过 TransformedEnv 集成到环境中

from torchrl.envs import StepCounter, TransformedEnv

transformed_env = TransformedEnv(env, StepCounter(max_steps=10))
rollout = transformed_env.rollout(max_steps=100)
print(rollout)

正如您所见,我们的环境现在多了一个条目 "step_count",它跟踪自上次重置以来的步数。鉴于我们将可选参数 max_steps=10 传递给了转换构造函数,我们还将轨迹截断在 10 步之后(没有像我们通过 rollout 调用那样完成完整的 100 步回放)。我们可以通过查看 truncated 条目来查看轨迹已被截断

print(rollout["next", "truncated"])

这就是 TorchRL 环境 API 的简短介绍!

后续步骤

要进一步探索 TorchRL 环境的功能,请查看

  • step_and_maybe_reset() 方法,它将 step()step_mdp()reset() 打包在一起。

  • 某些环境,如 GymEnv,通过 from_pixels 参数支持渲染。请查看类文档字符串以了解更多信息!

  • 批量环境,特别是 ParallelEnv,它允许您在多个进程上运行同一(或不同!)环境的多个副本。

  • 使用 Pendulum 教程 设计您自己的环境,并了解规范和无状态环境。

  • 请参阅更深入的环境教程 在专门的教程中

  • 如果您对 MARL 感兴趣,请查看 多智能体环境 API

  • TorchRL 拥有许多与 Gym API 交互的工具,例如通过 register_gym() 将 TorchRL 环境注册到 Gym 注册表的方法,通过 set_info_dict_reader() 读取 info 字典的 API,或者通过 set_gym_backend() 控制 gym 后端的方法。

由 Sphinx-Gallery 生成的画廊

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

为初学者和高级开发者提供深入的教程

查看教程

资源

查找开发资源并让您的问题得到解答

查看资源