快捷方式

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 值。建议提供一个包装了 torchrl.modules.models.multiagent.Mixer 中混合器的 TensorDictModule。

关键字参数:
  • loss_function (str, 可选) – 用于值差异的损失函数。可以是 "l1"、"l2" 或 "smooth_l1" 之一。默认为 "l2"。

  • delay_value (bool, 可选) – 是否将值网络复制到一个新的目标值网络以创建双 DQN。默认为 False

  • action_space (strTensorSpec, 可选) – 动作空间。必须是 "one-hot"、"mult_one_hot"、"binary" 或 "categorical" 之一,或相应 spec 的实例(torchrl.data.OneHottorchrl.data.MultiOneHottorchrl.data.Binarytorchrl.data.Categorical)。如果未提供,将尝试从值网络中检索。

  • priority_key (NestedKey, 可选) – [已弃用,请使用 .set_keys(priority_key=priority_key) 代替] 假设优先级存储在添加到此 ReplayBuffer 的 TensorDict 中的键。这适用于 sampler 类型为 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)
default_keys

别名:_AcceptedKeys

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 开发者文档

查看文档

教程

为初学者和高级开发者提供深入的教程

查看教程

资源

查找开发资源并让您的问题得到解答

查看资源