注意
转到末尾 下载完整的示例代码。
使用环境、TED 和 Transforms 入门¶
注意
要在 notebook 中运行本教程,请在开头添加一个安装单元格,其中包含:
!pip install tensordict !pip install torchrl
欢迎来到入门教程!
下面是我们将在教程中涵盖的主题列表。
如果您时间紧迫,可以直接跳到最后一个教程 您自己的第一个训练循环,然后可以根据需要回溯其他“入门”教程,如果某些内容不清楚或您想了解特定主题的更多信息!
强化学习中的环境¶
标准的 RL(强化学习)训练循环包括一个模型,也称为策略,该模型经过训练,以便在特定环境中完成任务。通常,此环境是一个接受动作作为输入并产生观测值以及一些元数据作为输出的模拟器。
在本教程中,我们将探讨 TorchRL 的环境 API:我们将学习如何创建一个环境、与其进行交互以及理解它使用的数据格式。
创建环境¶
本质上,TorchRL 不直接提供环境,而是为封装模拟器的其他库提供包装器。envs 模块可以被视为通用环境 API 的提供者,以及模拟后端(如 gym(GymEnv)、Brax(BraxEnv)或 DeepMind Control Suite(DMControlEnv)的中心集线器。
创建环境通常与底层后端 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() 获得的 tensordict 相同的结构,并额外有一个 "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(TorchRL 回合数据格式)。这是库中表示数据的普遍方式,无论是像这里一样的动态表示,还是使用离线数据集进行静态表示。
您需要运行环境中的回放的最后一点信息是如何将 "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 的多功能性,请考虑 rollout 方法的通用适用性。无论您是处理单个环境(如本例)、跨多个进程的多个副本、多智能体环境,甚至是其无状态版本,它都适用于 **所有** 用例!
转换环境¶
大多数时候,您会想修改环境的输出来更好地满足您的需求。例如,您可能想监控自上次重置以来执行的步数,调整图像大小,或将连续的观测值堆叠在一起。
在本节中,我们将检查一个简单的转换,即 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 注册表中的方式,用于读取信息字典的 API(通过set_info_dict_reader()),或者通过set_gym_backend()控制 gym 后端的方式。