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*”的損失標量。損失必須以此名稱返回,因為訓練器將在反向傳播之前讀取它們。