快捷方式

ClipPPOLoss

class torchrl.objectives.ClipPPOLoss(*args, **kwargs)[source]

裁剪过的 PPO 损失。

裁剪过的重要性加权损失的计算方法如下:

loss = -min( weight * advantage, min(max(weight, 1-eps), 1+eps) * advantage)

参数:
  • actor_network (ProbabilisticTensorDictSequential) – 策略算子。

  • critic_network (ValueOperator) – 值算子。

注意

虽然此损失模块不强制任何特定的模型模式(训练/评估),但强烈建议在 RL 训练期间将模型保持在评估模式以确保确定性行为。通常在有效样本量 (ESS) 下降或显著增加时会观察到由于训练/评估模式不匹配导致的学习失败(请参见下面的注释)。

注意

PPO 损失公开了几个额外的指标,可用于监控训练过程

  • 裁剪分数是 PPO 损失中裁剪权重数量的比例(即,裁剪权重数量与总权重数量的比例)。

  • 有效样本量 (ESS) 是批次中有效样本数量的度量,计算方法是重要性权重平方和的倒数。值为 1 表示重要性权重全部等于 1(即,样本权重相等)。任何低于 1 的值表示样本权重不相等,ESS 是有效样本数量的度量。如果值显着下降或增加,通常表明模型配置存在问题(例如,训练/评估模式不匹配,或策略更新幅度过大)。

关键字参数:
  • clip_epsilon (scalar, optional) – 裁剪 PPO 损失方程中的权重裁剪阈值。默认为:0.2

  • entropy_bonus (bool, optional) – 如果为 True,将向损失添加熵奖励,以鼓励探索性策略。

  • samples_mc_entropy (int, optional) – 如果从策略算子中检索到的分布没有熵的封闭形式公式,将使用蒙特卡洛估计。 samples_mc_entropy 将控制计算此估计需要多少样本。默认为 1

  • entropy_coeff – (scalar | Mapping[str, scalar], optional): 计算总损失时的熵乘数。 * **Scalar**:应用于每个动作头熵总和的一个值。 * **Mapping** {head_name: coeff} 为每个动作头的熵提供单独的系数。默认为 0.01

  • critic_coeff (scalar, optional) – 计算总损失时的 critic 损失乘数。默认为 1.0。将 critic_coeff 设置为 None 可从 forward 输出中排除值损失。

  • loss_critic_type (str, optional) – 值差异的损失函数。可以是“l1”、“l2”或“smooth_l1”之一。默认为 "smooth_l1"

  • normalize_advantage (bool, optional) – 如果为 True,则在进行标准化之前将对优势进行标准化。默认为 False

  • normalize_advantage_exclude_dims (Tuple[int], optional) – 排除在优势标准化之外的维度。允许负维度。这在多智能体(或多目标)场景中很有用,其中智能体(或目标)维度可能被排除在约简之外。默认:()。

  • separate_losses (bool, optional) – 如果为 True,策略和 critic 之间的共享参数将仅在策略损失上进行训练。默认为 False,即梯度会为策略和 critic 损失传播到共享参数。

  • advantage_key (str, optional) – [已弃用,请改用 set_keys(advantage_key=advantage_key)] 期望写入优势的输入 tensordict 键。默认为 "advantage"

  • value_target_key (str, optional) – [已弃用,请改用 set_keys(value_target_key=value_target_key) instead] 期望写入目标状态值的输入 tensordict 键。默认为 "value_target"

  • value_key (str, optional) – [已弃用,请改用 set_keys(value_key) instead] 期望写入状态值的输入 tensordict 键。默认为 "state_value"

  • functional (bool, optional) – 模块是否应该被函数化。函数化允许诸如 meta-RL 等功能,但使得无法使用分布式模型(DDP、FSDP 等),并且会产生一点开销。默认为 True

  • reduction (str, optional) – 指定应用于输出的约简: "none" | "mean" | "sum""none":不应用约简, "mean":输出的总和将除以输出中的元素数量, "sum":输出将进行求和。默认: "mean"

  • clip_value (bool or float, optional) – 如果提供了 float,它将用于计算值预测的裁剪版本,与输入 tensordict 的值估计进行比较,并用于计算值损失。裁剪的目的是限制极端值预测的影响,有助于稳定训练并防止大的更新。但是,如果值估计是由值估计器的当前版本完成的,则它将没有影响。如果提供了 True,则 clip_epsilon 参数将用作裁剪阈值。如果未提供或为 False,则不执行裁剪。默认为 False

  • device (torch.device, optional) –

    缓冲区的设备。默认为 None

    注意

    策略/ critic 的参数和缓冲区不会被转换为该设备,以确保存储与传递给其他组件(如数据收集器)的存储匹配。

注意

如果 actor 和 value function 共享参数,可以通过仅将 value network 的 head 传递给 PPO 损失模块来避免多次调用公共模块

>>> common = SomeModule(in_keys=["observation"], out_keys=["hidden"])
>>> actor_head = SomeActor(in_keys=["hidden"])
>>> value_head = SomeValue(in_keys=["hidden"])
>>> # first option, with 2 calls on the common module
>>> model = ActorValueOperator(common, actor_head, value_head)
>>> loss_module = ClipPPOLoss(model.get_policy_operator(), model.get_value_operator())
>>> # second option, with a single call to the common module
>>> loss_module = ClipPPOLoss(ProbabilisticTensorDictSequential(model, actor_head), value_head)

无论是否激活 separate_losses,这都将起作用。

forward(tensordict: TensorDictBase = None) TensorDictBase[source]

它旨在读取一个输入的 TensorDict 并返回另一个包含名为“loss*”的损失键的 tensordict。

将损失分解为其组成部分可以被训练器用于在训练过程中记录各种损失值。输出 tensordict 中存在的其他标量也将被记录。

参数:

tensordict – 一个输入的 tensordict,包含计算损失所需的值。

返回:

一个没有批处理维度的新 tensordict,其中包含各种损失标量,这些标量将被命名为“loss*”。重要的是,损失必须以这个名称返回,因为它们将在反向传播之前被训练器读取。

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源