快捷方式

KLRewardTransform

class torchrl.envs.transforms.KLRewardTransform(actor: ProbabilisticTensorDictModule, coef=1.0, in_keys=None, out_keys=None, requires_grad=False)[源代码]

一种将 KL[pi_current||pi_0] 校正项添加到奖励的转换。

此转换用于约束策略使其保持与其原始配置接近,这在使用 RLHF 进行微调时限制了过度拟合。

参数:
  • actor (ProbabilisticTensorDictModule) – 一个概率性 actor。它必须具有以下特征:它必须有一组输入(in_keys)和输出键(out_keys)。它必须有一个 get_dist 方法,该方法输出动作的分布。

  • coef (float) – KL 项的系数。默认为 1.0

  • in_keys (strstr 列表/str 元组) – 应从中获取奖励的输入键。默认为 "reward"

  • out_keys (strstr 列表/str 元组) – 应将奖励写入其中的输出键。默认为 "reward"

  • requires_grad (bool, 可选) – 如果 True,则冻结的参数将包含原始参数的可微分克隆。默认为 False

注意

如果参数不可微分(默认),则在调用数据类型或设备转换操作(例如 cuda()to() 等)时,它们将不会跟随模块。当 requires_grad=True 时,转换操作将按预期工作。

示例

>>> from torchrl.envs.libs.gym import GymEnv
>>> from torchrl.envs import TransformedEnv
>>> from tensordict.nn import TensorDictModule as Mod, NormalParamExtractor
>>> from torchrl.modules import ProbabilisticActor
>>> from tensordict import TensorDict
>>> from torchrl.modules.distributions import TanhNormal
>>> from torch import nn
>>> base_env = GymEnv("Pendulum-v1")
>>> n_obs = base_env.observation_spec["observation"].shape[-1]
>>> n_act = base_env.action_spec.shape[-1]
>>> module = Mod(
...     nn.Sequential(nn.Linear(n_obs, n_act * 2), NormalParamExtractor()),
...     in_keys=["observation"],
...     out_keys=["loc", "scale"],
... )
>>> actor = ProbabilisticActor(
...     module,
...     in_keys=["loc", "scale"],
...     distribution_class=TanhNormal,
...     return_log_prob=True,
... )
>>> transform = KLRewardTransform(actor, out_keys="reward_kl")
>>> env = TransformedEnv(base_env, transform)
>>> with torch.no_grad():
...     # modify the actor parameters
...     _ = TensorDict(dict(actor.named_parameters()), []).apply_(lambda x: x.data.copy_(x.data + 1))
...     td = env.rollout(3, actor)
>>> # check that rewards have been modified
>>> assert (td.get(("next", "reward")) != td.get(("next", "reward_kl"))).all()

注意

由于 KL 公式并不总是可用,并且原始分布的参数可能尚未记录,因此我们使用 KL 散度的随机估计。

forward(tensordict: TensorDictBase) TensorDictBase

读取输入 tensordict,并对选定的键应用转换。

transform_output_spec(output_spec: CompositeSpec) CompositeSpec[源代码]

转换输出规范,以便生成的规范与转换映射匹配。

此方法通常应保持不变。更改应使用 transform_observation_spec()transform_reward_spec()transformfull_done_spec() 实现。:param output_spec: 转换前的规范 :type output_spec: TensorSpec

返回值:

转换后的预期规范

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源