快捷方式

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) – 值函式運算元。

關鍵字引數:
  • clip_epsilon (scalar, optional) – 裁剪 PPO 損失方程中的權重裁剪閾值。預設值:0.2

  • entropy_bonus (bool, optional) – 如果為 True,則會在損失中新增熵獎勵,以鼓勵探索性策略。

  • samples_mc_entropy (int, optional) – 如果從策略運算元檢索到的分佈沒有熵的封閉形式公式,則將使用蒙特卡羅估計。samples_mc_entropy 將控制用於計算此估計的樣本數量。預設值為 1

  • entropy_coef (scalar, optional) – 計算總損失時的熵乘數。預設值為 0.01

  • critic_coef (scalar, optional) – 計算總損失時的評論家(價值函式)損失乘數。預設值為 1.0。將 critic_coef 設定為 None 以將值損失從前向傳播輸出中排除。

  • 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,則策略和評論家(價值函式)之間共享的引數將僅透過策略損失進行訓練。預設值為 False,即梯度會傳播到策略和評論家損失的共享引數。

  • 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) 代替] 輸入 tensordict 中期望寫入目標狀態值的鍵。預設值為 "value_target"

  • value_key (str, optional) – [已棄用,請改用 set_keys(value_key) 代替] 輸入 tensordict 中期望寫入狀態值的鍵。預設值為 "state_value"

  • functional (bool, optional) – 模組是否應該函式化。函式化允許元強化學習等功能,但會使分散式模型(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

注意

如果 actor 和價值函式共享引數,可以透過僅將價值網路的頭部傳遞給 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 並返回另一個 tensordict,其中包含名為“loss*”的損失鍵。

將損失分解到其組成部分後,訓練器就可以在訓練過程中記錄各種損失值。輸出 tensordict 中存在的其他標量也會被記錄。

引數:

tensordict – 包含計算損失所需值的輸入 tensordict。

返回值:

一個沒有批處理維度的新 tensordict,其中包含各種名為“loss*”的損失標量。損失必須以此名稱返回,因為訓練器將在反向傳播之前讀取它們。

文件

訪問 PyTorch 的全面開發者文件

檢視文件

教程

獲取面向初學者和高階開發者的深入教程

檢視教程

資源

查詢開發資源並獲得問題解答

檢視資源