目录

模型优化入门

作者Vincent Moens

注意

要在笔记本中运行本教程,请添加安装单元 开头包含:

!pip install tensordict
!pip install torchrl

在 TorchRL 中,我们尝试像在 PyTorch 中一样对待优化。 使用专用的损失模块,其设计的唯一目的是 优化模型。这种方法有效地将 该策略的 TRAINING 允许我们设计训练循环,这些循环是 类似于传统的监督学习示例中的内容。

因此,典型的训练循环如下所示:

>>> for i in range(n_collections):
...     data = get_next_batch(env, policy)
...     for j in range(n_optim):
...         loss = loss_fn(data)
...         loss.backward()
...         optim.step()

在这个简短的教程中,您将获得损失模块的简要概述。由于通常 API 的基本用法简单明了,本教程将保持简短。

RL 目标函数

在 RL 中,创新通常涉及对新方法的探索 用于优化策略(即新算法),而不是专注于 在新架构上,如在其他领域中所见。在 TorchRL 中, 这些算法封装在 loss 模块中。亏损 模块编排算法的各个组件,并且 生成一组可以反向传播的损失值 through 来训练相应的组件。

在本教程中,我们将采用一个流行的 off-policy 算法为例,DDPG。

要构建一个 loss 模块,唯一需要的是一组网络 定义为 :class:'~tensordict.nn.TensorDictModule 的。大多数时候,一个 将是策略。其他辅助网络,例如 可能还需要 Q-Value 网络或某种批评家。我看看 这在实践中是什么样子的:DDPG 需要一个确定性 map 从观察空间映射到操作空间以及一个值 预测 state-action 对值的网络。DDPG 损失将 尝试查找输出操作的策略参数,这些操作将 值。

为了造成损失,我们需要参与者网络和价值网络。 如果它们是按照 DDPG 的期望构建的,那就全部了 我们需要得到一个可训练的损失模块:

from torchrl.envs import GymEnv

env = GymEnv("Pendulum-v1")

from torchrl.modules import Actor, MLP, ValueOperator
from torchrl.objectives import DDPGLoss

n_obs = env.observation_spec["observation"].shape[-1]
n_act = env.action_spec.shape[-1]
actor = Actor(MLP(in_features=n_obs, out_features=n_act, num_cells=[32, 32]))
value_net = ValueOperator(
    MLP(in_features=n_obs + n_act, out_features=1, num_cells=[32, 32]),
    in_keys=["observation", "action"],
)

ddpg_loss = DDPGLoss(actor_network=actor, value_network=value_net)

就是这样!我们的 loss 模块现在可以使用来自 环境(我们省略了 Exploration、Storage 和其他功能,需要重点关注 损失功能):

rollout = env.rollout(max_steps=100, policy=actor)
loss_vals = ddpg_loss(rollout)
print(loss_vals)
TensorDict(
    fields={
        loss_actor: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        loss_value: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        pred_value: Tensor(shape=torch.Size([100]), device=cpu, dtype=torch.float32, is_shared=False),
        pred_value_max: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        target_value: Tensor(shape=torch.Size([100]), device=cpu, dtype=torch.float32, is_shared=False),
        target_value_max: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        td_error: Tensor(shape=torch.Size([100]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)

LossModule 的输出

如您所见,我们从损失中获得的值不是一个单一的标量 而是一本包含多个 loss 的字典。

原因很简单:因为一次可能训练多个网络, 并且由于一些用户可能希望将每个模块的优化分开 在不同的步骤中,TorchRL 的目标将返回包含 各种损失分量。

这种格式还允许我们将元数据与 loss 值一起传递。在 general,我们确保只有 loss 值是可微分的,这样 您可以简单地对字典的值求和以获得总计 损失。如果您想确保自己完全掌控正在发生的事情, 您只能对键以前缀开头的条目求和:"loss_"

total_loss = 0
for key, val in loss_vals.items():
    if key.startswith("loss_"):
        total_loss += val

训练 LossModule

鉴于所有这些,训练模块与训练模块并没有太大区别 在任何其他训练循环中完成。因为它封装了模块 获取可训练参数列表的最简单方法是查询 方法

我们需要一个优化器(或一个优化器 每个模块(如果这是您的选择))。

from torch.optim import Adam

optim = Adam(ddpg_loss.parameters())
total_loss.backward()

以下项目通常是 在训练循环中找到:

其他注意事项:目标参数

另一个需要考虑的重要方面是目标参数的存在 在 DDPG 等非策略算法中。目标参数通常表示 参数随时间变化的延迟或平滑版本,它们会播放 在政策培训期间的价值估计中起着至关重要的作用。利用目标 策略训练的参数通常被证明要多得多 与使用 Value Network 的当前配置相比效率更高 参数。通常,管理目标参数由 loss 处理 模块,减轻用户的直接关注。但是,它仍然是用户的 负责根据需要根据特定的 要求。TorchRL 提供了几个更新器,分别是 、 无需深入即可轻松实例化 了解 loss 模块的底层机制。

from torchrl.objectives import SoftUpdate

updater = SoftUpdate(ddpg_loss, eps=0.99)

在训练循环中,您需要在每个 optimization 步骤或每个 collection 步骤:

updater.step()

这就是您需要了解的有关损失模块以开始使用的全部内容!

要进一步探索该主题,请查看:

脚本总运行时间:(0 分 25.352 秒)

估计内存使用量:321 MB

由 Sphinx-Gallery 生成的图库

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

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

查看资源