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 (scalar, optional) – 目標 KL 散度。預設為
0.01
。samples_mc_kl (int, optional) – 如果找不到解析公式,則用於計算 KL 散度的樣本數。預設為
1
。beta (scalar, optional) – 初始 KL 散度乘數。預設為
1.0
。decrement (scalar, optional) – 如果 KL < dtarg,beta 應該減少多少。有效範圍:decrement <= 1.0 預設值:
0.5
。increment (scalar, optional) – 如果 KL > dtarg,beta 應該增加多少。有效範圍:increment >= 1.0 預設值:
2.0
。entropy_bonus (bool, optional) – 如果為
True
,則會將熵獎勵添加到損失中,以支持探索性策略。預設為True
。samples_mc_entropy (int, optional) – 如果從策略運算子檢索到的分佈沒有 entropy 的封閉形式公式,則會使用蒙地卡羅估計法。
samples_mc_entropy
將控制用於計算此估計的樣本數量。預設值為1
。entropy_coef (scalar, optional) – 計算總損失時的 entropy 乘數。預設值為
0.01
。critic_coef (scalar, optional) – 計算總損失時的 critic 損失乘數。預設值為
1.0
。loss_critic_type (str, optional) – 價值差異的損失函數。可以是 “l1”、“l2” 或 “smooth_l1” 之一。預設值為
"smooth_l1"
。normalize_advantage (bool, optional) – 如果
True
,advantage 將在被使用之前進行正規化。預設值為False
。separate_losses (bool, optional) – 如果
True
,策略和 critic 之間的共享參數將僅在策略損失上進行訓練。預設值為False
,也就是說,梯度會傳播到策略和 critic 損失的共享參數。advantage_key (str, optional) – [已棄用,請改用 set_keys(advantage_key=advantage_key)] 輸入 tensordict 中期望寫入 advantage 的鍵。預設值為
"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) – 是否應該將模組功能化。功能化允許像 meta-RL 這樣的特性,但使其無法使用分散式模型 (DDP、FSDP, …),並且會帶來一些成本。預設值為
True
。reduction (str, optional) – 指定要應用於輸出的縮減方式:
"none"
|"mean"
|"sum"
。"none"
:不應用縮減,"mean"
:輸出的總和將除以輸出中的元素數量,"sum"
:輸出將被求和。預設值:"mean"
。clip_value (float, optional) – 如果提供,它將用於計算 value 預測的裁剪版本,其與輸入 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 [source]¶
它旨在讀取輸入 TensorDict 並返回另一個具有名為 “loss*” 的損失鍵的 tensordict。
將損失拆分為其組成部分然後可以被訓練器用於記錄整個訓練過程中的各種損失值。輸出 tensordict 中存在的其他純量也將被記錄。
- 參數:
tensordict – 一個輸入 tensordict,包含計算損失所需的值。
- 傳回:
一個沒有批次維度的新 tensordict,包含各種損失純量,它們將被命名為 “loss*”。損失必須以這個名稱傳回,因為它們將在反向傳播之前被訓練器讀取。