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)