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, 可選) – 如果從策略運算子中獲得的分佈沒有熵的閉合形式公式,將使用蒙特卡洛估計。
samples_mc_entropy將控制用於計算此估計值的樣本數量。預設為1。entropy_coef (標量, 可選) – 計算總損失時的熵乘數。預設為
0.01。critic_coef (標量, 可選) – 計算總損失時的評論家損失乘數。預設為
1.0。loss_critic_type (str, 可選) – 用於價值差異的損失函式。可以是“l1”、“l2”或“smooth_l1”之一。預設為
"smooth_l1"。normalize_advantage (bool, 可選) – 如果
True,在使用優勢值之前會對其進行歸一化。預設為False。normalize_advantage_exclude_dims (Tuple[int], 可選) – 從優勢值標準化中排除的維度。負數維度有效。這在多智慧體(或多目標)設定中很有用,其中智慧體(或目標)維度可以從約簡中排除。預設為
()。separate_losses (bool, 可選) – 如果
True,策略和評論家之間的共享引數將僅透過策略損失進行訓練。預設為False,即梯度會傳播到策略和評論家損失的共享引數。advantage_key (str, 可選) – [已棄用,請改用 set_keys(advantage_key=advantage_key)] 期望寫入優勢值的輸入 tensordict 鍵。預設為
"advantage"。value_target_key (str, 可選) – [已棄用,請改用 set_keys(value_target_key=value_target_key)] 期望寫入目標狀態值的輸入 tensordict 鍵。預設為
"value_target"。value_key (str, 可選) – [已棄用,請改用 set_keys(value_key) 代替] 期望寫入狀態值的輸入 tensordict 鍵。預設為
"state_value"。functional (bool, 可選) – 模組是否應該功能化。功能化允許像 meta-RL 這樣的特性,但使得無法使用分散式模型(DDP、FSDP 等),並帶來一些額外開銷。預設為
True。reduction (str, 可選) – 指定應用於輸出的約簡方式:
"none"|"mean"|"sum"。“none”:不應用約簡;“mean”:輸出總和除以輸出元素數量;“sum”:對輸出求和。預設為"mean"。clip_value (
float, 可選) – 如果提供,將根據輸入的 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[源]¶
它旨在讀取一個輸入的 TensorDict 並返回另一個帶有命名為“loss*”的損失鍵的 tensordict。
將損失拆分成其組成部分後,訓練器可以使用它們在訓練過程中記錄各種損失值。輸出 tensordict 中存在的其他標量也會被記錄。
- 引數::
tensordict – 一個包含計算損失所需值的輸入 tensordict。
- 返回::
一個新的沒有批處理維度的 tensordict,包含各種將被命名為“loss*”的損失標量。這些損失必須以此名稱返回,因為它們將在反向傳播之前被訓練器讀取,這一點至關重要。