ClipPPOLoss¶
- class torchrl.objectives.ClipPPOLoss(*args, **kwargs)[原始碼]¶
裁剪的 PPO 損失。
- 裁剪的 Importance Weighted 損失計算如下:
loss = -min( weight * advantage, min(max(weight, 1-eps), 1+eps) * advantage)
- 引數:
actor_network (ProbabilisticTensorDictSequential) – 策略運算元。
critic_network (ValueOperator) – 值運算子。
注意
雖然此損失模組不強制任何特定的模型模式(訓練/評估),但強烈建議在 RL 訓練期間將模型保持在評估模式以確保確定性行為。通常在有效樣本數量 (ESS) 下降或顯著增加時會觀察到由於訓練/評估模式不匹配導致的學習失敗(請參閱下面的註釋)。
注意
PPO 損失暴露了幾個額外的指標,可用於監控訓練過程
裁剪分數是 PPO 損失中被裁剪權重的數量的比例(即,被裁剪權重的數量與總權重的數量之比)。
有效樣本數量 (ESS) 是批次中有效樣本數量的度量,計算為重要性權重平方和的倒數。值為 1 表示重要性權重都等於 1(即,樣本被同等加權)。低於 1 的任何值都表示樣本沒有被同等加權,ESS 是有效樣本數量的度量。如果值顯著下降或增加,通常表示模型配置存在問題(例如,訓練/評估模式不匹配,或策略更新幅度過大)。
- 關鍵字引數:
clip_epsilon (標量, 可選) – 裁剪的 PPO 損失方程中的權重裁剪閾值。預設值:0.2
entropy_bonus (bool, optional) – 如果為
True,將向損失新增熵獎勵,以鼓勵探索性策略。samples_mc_entropy (int, optional) – 如果從策略運算元中檢索到的分佈沒有熵的封閉式公式,將使用蒙特卡洛估計。
samples_mc_entropy將控制計算此估計所需的樣本數量。預設為1。entropy_coeff –
(標量 | 對映[巢狀鍵, 標量], 可選):計算總損失時的熵乘數。* **標量**:應用於每個動作頭熵總和的值。* **對映**
{head_name: coeff}為每個動作頭的熵提供單獨的係數。預設為0.01。有關詳細的使用示例和故障排除,請參閱 ppo_entropy_coefficients。
critic_coeff (標量, 可選) – 計算總損失時的 critic 損失乘數。預設為
1.0。將critic_coeff設定為None以從前向輸出中排除值損失。loss_critic_type (str, optional) – 值差異的 loss 函式。可以是 "l1"、"l2" 或 "smooth_l1" 之一。預設為
"smooth_l1"。normalize_advantage (bool, optional) – 如果為
True,則在使用之前將對優勢(advantage)進行歸一化。預設為False。normalize_advantage_exclude_dims (Tuple[int], optional) – 在優勢標準化中要排除的維度。負維度是有效的。這在多智慧體(或多目標)設定中很有用,因為智慧體(或目標)維度可以從縮減中排除。預設值:()。
separate_losses (bool, 可選) – 如果為
True,則策略和評估器之間的共享引數將僅針對策略損失進行訓練。預設為False,即梯度將傳播到策略和評估器損失的共享引數。advantage_key (str, optional) – [已棄用,請改用 set_keys(advantage_key=advantage_key) ] 預期在輸入 tensordict 中寫入優勢的 tensordict 鍵。預設為
"advantage"。value_target_key (str, optional) – [已棄用,請改用 set_keys(value_target_key=value_target_key) ] 預期在輸入 tensordict 中寫入目標狀態值的 tensordict 鍵。預設為
"value_target"。value_key (str, optional) – [已棄用,請改用 set_keys(value_key) ] 預期在輸入 tensordict 中寫入狀態值的 tensordict 鍵。預設為
"state_value"。functional (bool, optional) – 模組是否應被函式化。函式化允許 meta-RL 等功能,但使得無法使用分散式模型(DDP、FSDP 等),並且會帶來一點開銷。預設為
True。reduction (str, optional) – 指定應用於輸出的約簡:
"none"|"mean"|"sum"。"none":不應用約簡,"mean":輸出的總和將除以輸出中的元素數量,"sum":將對輸出進行求和。預設為"mean"。clip_value (布林值 或 浮點數, 可選) – 如果提供了
float,它將用於計算輸入 tensordict 值估計的預測值的裁剪版本,並用於計算值損失。裁剪的目的是限制極端值預測的影響,有助於穩定訓練並防止大的更新。但是,如果值估計是由當前版本的值估計器完成的,它將不會產生任何影響。如果提供True,則clip_epsilon引數將用作裁剪閾值。如果未提供或提供False,則不會進行裁剪。預設為False。device (torch.device, 可選) –
緩衝區的裝置。預設為
None。注意
策略/ critic 的引數和緩衝區不會被轉換為該裝置,以確保儲存與傳遞給其他元件(如資料收集器)的儲存匹配。
注意
如果 actor 和 value function 共享引數,可以透過僅將 value network 的 head 傳遞給 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[原始碼]¶
它旨在讀取一個輸入的 TensorDict 並返回另一個包含名為“loss*”的損失鍵的 tensordict。
將損失分解為其組成部分可以被訓練器用於在訓練過程中記錄各種損失值。輸出 tensordict 中存在的其他標量也將被記錄。
- 引數:
tensordict – 一個輸入的 tensordict,包含計算損失所需的值。
- 返回:
一個沒有批處理維度的新 tensordict,其中包含各種損失標量,這些標量將被命名為“loss*”。重要的是,損失必須以這個名稱返回,因為它們將在反向傳播之前被訓練器讀取。