注意
转到末尾下载完整的示例代码。
模型优化入门¶
作者: 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