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, optional) – 如果從策略運算元中檢索到的分佈沒有熵的封閉式公式,將使用蒙特卡洛估計。
samples_mc_entropy將控制計算此估計所需的樣本數量。預設為1。entropy_coeff –
標量 | Mapping[NestedKey, scalar], optional): 計算總損失時,熵的乘數。* **標量**:應用於每個動作頭總熵的值。* **對映**
{head_name: coeff}為每個動作頭的熵提供單獨的係數。預設為0.01。有關詳細的使用示例和故障排除,請參閱 ppo_entropy_coefficients。
critic_coeff (標量, 可選) – 計算總損失時,評論員損失的乘數。預設為
1.0。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, optional) – 如果提供,將用於計算值預測的裁剪版本,相對於輸入 tensordict 的值估計,並使用它來計算值 loss。裁剪的目的是限制極端值預測的影響,有助於穩定訓練並防止大幅更新。但是,如果值估計是由當前版本的值估計器完成的,則此引數將不起作用。預設為None。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 = 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*”。重要的是,損失必須以這個名稱返回,因為它們將在反向傳播之前被訓練器讀取。