ClipPPOLoss¶
- class torchrl.objectives.ClipPPOLoss(*args, **kwargs)[來源]¶
Clipped 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
。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) – 是否應將模組功能化。功能化允許諸如 meta-RL 之類的功能,但會使您無法使用分散式模型 (DDP、FSDP, …),並且會產生一些成本。預設值為
True
。reduction (str, optional) – 指定要應用於輸出的縮減方式:
"none"
|"mean"
|"sum"
。"none"
:不套用任何縮減,"mean"
:輸出的總和將除以輸出中的元素數量,"sum"
:輸出將被加總。預設值:"mean"
。clip_value (bool or float, optional) – 如果提供一個
float
,它將被用於計算一個裁剪過的值預測,裁剪程度根據輸入 tensordict 值估算,並用它來計算 value loss。裁剪的目的是限制極端值預測的影響,幫助穩定訓練並防止大的更新。但是,如果 value estimate 是由當前版本的 value estimator 執行的,它將沒有任何影響。如果提供True
,則clip_epsilon
參數將用作裁剪閾值。如果未提供或為False
,則不會執行任何裁剪。預設值為False
。
注意
如果 actor 和 value function 共享參數,可以通過僅將 value network 的 head 傳遞給 PPO loss 模組來避免多次呼叫公共模組。
>>> 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*" 的 loss key 的 tensordict。
將 loss 分割成組件然後可以用於讓 trainer 在整個訓練過程中記錄各種 loss 值。輸出 tensordict 中存在的其他純量也將被記錄。
- 參數:
tensordict – 一個輸入 tensordict,其中包含計算 loss 所需的值。
- 返回值:
一個新的 tensordict,沒有 batch 維度,包含各種名為 "loss*" 的 loss 純量。 損失必須以這個名稱返回,因為它們會在反向傳播之前被 trainer 讀取。