快捷方式

KLPENPPOLoss

class torchrl.objectives.KLPENPPOLoss(*args, **kwargs)[源]

KL 懲罰 PPO 損失。

KL 懲罰損失的公式如下:

loss = loss - beta * KL(old_policy, new_policy)

“beta”引數會動態調整,以匹配新舊策略之間的目標 KL 散度,從而在策略之間保持一定程度的距離,同時防止它們相距過遠。

引數::
  • actor_network (ProbabilisticTensorDictSequential) – 策略運算子。

  • critic_network (ValueOperator) – 值運算子。

關鍵字引數::
  • dtarg (標量, 可選) – 目標 KL 散度。預設為 0.01

  • samples_mc_kl (int, 可選) – 如果無法找到解析公式,用於計算 KL 散度的樣本數量。預設為 1

  • beta (標量, 可選) – 初始 KL 散度乘數。預設為 1.0

  • decrement (標量, 可選) – 如果 KL < dtarg,beta 應該減小多少。有效範圍:decrement <= 1.0 預設為 0.5

  • increment (標量, 可選) – 如果 KL > dtarg,beta 應該增加多少。有效範圍:increment >= 1.0 預設為 2.0

  • entropy_bonus (bool, 可選) – 如果 True,將向損失中新增熵獎勵,以鼓勵探索性策略。預設為 True

  • samples_mc_entropy (int, 可選) – 如果從策略運算子中獲得的分佈沒有熵的閉合形式公式,將使用蒙特卡洛估計。samples_mc_entropy 將控制用於計算此估計值的樣本數量。預設為 1

  • entropy_coef (標量, 可選) – 計算總損失時的熵乘數。預設為 0.01

  • critic_coef (標量, 可選) – 計算總損失時的評論家損失乘數。預設為 1.0

  • loss_critic_type (str, 可選) – 用於價值差異的損失函式。可以是“l1”、“l2”或“smooth_l1”之一。預設為 "smooth_l1"

  • normalize_advantage (bool, 可選) – 如果 True,在使用優勢值之前會對其進行歸一化。預設為 False

  • normalize_advantage_exclude_dims (Tuple[int], 可選) – 從優勢值標準化中排除的維度。負數維度有效。這在多智慧體(或多目標)設定中很有用,其中智慧體(或目標)維度可以從約簡中排除。預設為 ()

  • separate_losses (bool, 可選) – 如果 True,策略和評論家之間的共享引數將僅透過策略損失進行訓練。預設為 False,即梯度會傳播到策略和評論家損失的共享引數。

  • advantage_key (str, 可選) – [已棄用,請改用 set_keys(advantage_key=advantage_key)] 期望寫入優勢值的輸入 tensordict 鍵。預設為 "advantage"

  • value_target_key (str, 可選) – [已棄用,請改用 set_keys(value_target_key=value_target_key)] 期望寫入目標狀態值的輸入 tensordict 鍵。預設為 "value_target"

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

  • functional (bool, 可選) – 模組是否應該功能化。功能化允許像 meta-RL 這樣的特性,但使得無法使用分散式模型(DDP、FSDP 等),並帶來一些額外開銷。預設為 True

  • reduction (str, 可選) – 指定應用於輸出的約簡方式:"none" | "mean" | "sum"。“none”:不應用約簡;“mean”:輸出總和除以輸出元素數量;“sum”:對輸出求和。預設為 "mean"

  • clip_value (float, 可選) – 如果提供,將根據輸入的 tensordict 值估計計算價值預測的截斷版本,並用其計算價值損失。截斷的目的是限制極端價值預測的影響,幫助穩定訓練並防止大幅更新。但是,如果價值估計是由當前版本的價值估計器完成的,則此引數無效。預設為 None

注意

如果 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 = KLPENPPOLoss(model.get_policy_operator(), model.get_value_operator())
>>> # second option, with a single call to the common module
>>> loss_module = KLPENPPOLoss(ProbabilisticTensorDictSequential(model, actor_head), value_head)

無論 separate_losses 是否啟用,這都將奏效。

forward(tensordict: TensorDictBase = None) TensorDict[源]

它旨在讀取一個輸入的 TensorDict 並返回另一個帶有命名為“loss*”的損失鍵的 tensordict。

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

引數::

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

返回::

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

文件

查閱 PyTorch 全面的開發者文件

檢視文件

教程

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

檢視教程

資源

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

檢視資源