QMixerLoss¶
- class torchrl.objectives.multiagent.QMixerLoss(*args, **kwargs)[源代码]¶
QMixer 损失类。
根据一个混合网络将局部智能体 Q 值混合成一个全局 Q 值,然后使用 DQN 更新来更新全局值。此损失函数用于多智能体应用。因此,它要求 ‘local_value’、‘action_value’ 和 ‘action’ 键具有智能体维度(这在默认的 AcceptedKeys 中可见)。此维度将由混音器(mixer)混合,混音器将计算一个用于 DQN 目标的 ‘global_value’ 键。预制的类型为
torchrl.modules.models.multiagent.Mixer
的混音器期望多智能体维度是倒数第二个维度。- 参数:
local_value_network (QValueActor 或 nn.Module) – 局部 Q 值操作器。
mixer_network (TensorDictModule 或 nn.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 (str 或 TensorSpec, optional) – 动作空间。必须是
"one-hot"
、"mult_one_hot"
、"binary"
或"categorical"
之一,或是相应规范的实例 (torchrl.data.OneHot
、torchrl.data.MultiOneHot
、torchrl.data.Binary
或torchrl.data.Categorical
)。如果未提供,将尝试从值网络中检索。priority_key (NestedKey, optional) – [已弃用,请改用 .set_keys(priority_key=priority_key)] 优先级被假定存储在此 ReplayBuffer 中的 TensorDict 内的键。当采样器类型为
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)