快捷方式

QMixerLoss

class torchrl.objectives.multiagent.QMixerLoss(*args, **kwargs)[原始碼]

QMixer 損失類別。

根據混合網路將本地代理 q 值混合到全局 q 值中,然後對全局值使用 DQN 更新。此損失適用於多代理應用。因此,它期望 'local_value'、'action_value' 和 'action' 鍵具有代理維度(這在預設的 AcceptedKeys 中可見)。此維度將由混合器混合,混合器將計算一個 'global_value' 鍵,用於 DQN 目標。 torchrl.modules.models.multiagent.Mixer 類型的預製混合器將期望多代理維度是倒數第二個。

參數:
  • local_value_network (QValueActornn.Module) – 本地 Q 值運算符。

  • mixer_network (TensorDictModulenn.Module) – 將代理的本地 Q 值和可選狀態映射到全局 Q 值的混合器網路。建議提供一個 TensorDictModule,它封裝來自 torchrl.modules.models.multiagent.Mixer 的混合器。

關鍵字參數:
  • loss_function (str, optional) – 值差異的損失函數。可以是 "l1"、"l2" 或 "smooth_l1" 之一。預設為 "l2"。

  • delay_value (bool, optional) – 是否將值網路複製到新的目標值網路中以建立雙重 DQN。預設為 False

  • action_space (strTensorSpec, optional) – 行動空間。必須是 "one-hot""mult_one_hot""binary""categorical" 之一,或是相應規格的實例 (torchrl.data.OneHottorchrl.data.MultiOneHottorchrl.data.Binarytorchrl.data.Categorical)。如果未提供,將嘗試從值網路中檢索它。

  • priority_key (NestedKey, optional) – [已棄用,請改用 .set_keys(priority_key=priority_key)] 優先權鍵值,用於假定儲存在添加到此 ReplayBuffer 的 TensorDicts 中。這用於當取樣器類型為 PrioritizedSampler 時。預設為 "td_error"

範例

>>> import torch
>>> from torch import nn
>>> from tensordict import TensorDict
>>> from tensordict.nn import TensorDictModule
>>> from torchrl.modules import QValueModule, SafeSequential
>>> from torchrl.modules.models.multiagent import QMixer
>>> from torchrl.objectives.multiagent import QMixerLoss
>>> n_agents = 4
>>> module = TensorDictModule(
...     nn.Linear(10,3), in_keys=[("agents", "observation")], out_keys=[("agents", "action_value")]
... )
>>> value_module = QValueModule(
...     action_value_key=("agents", "action_value"),
...     out_keys=[
...         ("agents", "action"),
...         ("agents", "action_value"),
...         ("agents", "chosen_action_value"),
...     ],
...     action_space="categorical",
... )
>>> qnet = SafeSequential(module, value_module)
>>> qmixer = TensorDictModule(
...    module=QMixer(
...        state_shape=(64, 64, 3),
...        mixing_embed_dim=32,
...        n_agents=n_agents,
...        device="cpu",
...    ),
...    in_keys=[("agents", "chosen_action_value"), "state"],
...    out_keys=["chosen_action_value"],
... )
>>> loss = QMixerLoss(qnet, qmixer, action_space="categorical")
>>> td = TensorDict(
...    {
...        "agents": TensorDict(
...            {"observation": torch.zeros(32, n_agents, 10)}, [32, n_agents]
...        ),
...        "state": torch.zeros(32, 64, 64, 3),
...        "next": TensorDict(
...           {
...                "agents": TensorDict(
...                     {"observation": torch.zeros(32, n_agents, 10)}, [32, n_agents]
...                ),
...                "state": torch.zeros(32, 64, 64, 3),
...                "reward": torch.zeros(32, 1),
...                "done": torch.zeros(32, 1, dtype=torch.bool),
...                "terminated": torch.zeros(32, 1, dtype=torch.bool),
...            },
...            [32],
...        ),
...    },
...    [32],
... )
>>> loss(qnet(td))
TensorDict(
    fields={
        loss: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
forward(tensordict: TensorDictBase = None) TensorDict[原始碼]

它被設計為讀取一個輸入的 TensorDict,並返回另一個具有名為 "loss*" 的損失鍵的 tensordict。

然後,訓練器可以使用將損失拆分為其組件,以便在整個訓練過程中記錄各種損失值。輸出 tensordict 中存在的其他純量也會被記錄。

參數:

tensordict – 一個輸入的 tensordict,其中包含計算損失所需的值。

傳回:

一個新的 tensordict,沒有批次維度,包含各種名為 "loss*" 的損失純量。至關重要的是,損失以這個名稱返回,因為它們將在反向傳播之前被訓練器讀取。

make_value_estimator(value_type: Optional[ValueEstimators] = None, **hyperparams)[原始碼]

值函數建構子。

如果需要非預設的值函數,則必須使用此方法建構。

參數:
  • value_type (ValueEstimators) – 一個 ValueEstimators 枚舉類型,指示要使用的值函數。 如果未提供,將使用儲存在 default_value_estimator 屬性中的預設值。 產生的值估算器類別將在 self.value_type 中註冊,允許未來的改進。

  • **hyperparams – 用於值函數的超參數。 如果未提供,將使用 default_value_kwargs() 指示的值。

範例

>>> from torchrl.objectives import DQNLoss
>>> # initialize the DQN loss
>>> actor = torch.nn.Linear(3, 4)
>>> dqn_loss = DQNLoss(actor, action_space="one-hot")
>>> # updating the parameters of the default value estimator
>>> dqn_loss.make_value_estimator(gamma=0.9)
>>> dqn_loss.make_value_estimator(
...     ValueEstimators.TD1,
...     gamma=0.9)
>>> # if we want to change the gamma value
>>> dqn_loss.make_value_estimator(dqn_loss.value_type, gamma=0.9)

文件

取得 PyTorch 的完整開發人員文件

檢視文件

教學

取得初學者和進階開發人員的深入教學課程

檢視教學

資源

尋找開發資源並獲得您問題的解答

檢視資源