LossModule¶
- class torchrl.objectives.LossModule(*args, **kwargs)[source]¶
RL 損失的父類別。
LossModule 繼承自 nn.Module。它被設計來讀取一個輸入 TensorDict 並返回另一個具有名為
"loss_*"
的損失鍵的 tensordict。將損失分成其組成部分然後可以被訓練器用來記錄整個訓練過程中的各種損失值。輸出 tensordict 中的其他純量也會被記錄。
- 變數:
default_value_estimator – 類別的預設值型別。需要值估計的損失配備了預設值指標。如果未指定其他估計器,則此類別屬性表示將使用哪個值估計器。可以使用
make_value_estimator()
方法變更值估計器。
預設情況下,forward 方法始終使用 gh
torchrl.envs.ExplorationType.MEAN
裝飾為了利用透過
set_keys()
配置 tensordict 鍵的能力,子類別必須定義一個 _AcceptedKeys dataclass。這個 dataclass 應包含所有打算配置的鍵。此外,子類別必須實作 :meth:._forward_value_estimator_keys() 方法。這個函數對於將任何更改的 tensordict 鍵轉發到基礎 value_estimator 至關重要。範例
>>> class MyLoss(LossModule): >>> @dataclass >>> class _AcceptedKeys: >>> action = "action" >>> >>> def _forward_value_estimator_keys(self, **kwargs) -> None: >>> pass >>> >>> loss = MyLoss() >>> loss.set_keys(action="action2")
注意
當一個使用探索模組封裝或擴充的策略被傳遞給損失時,我們想要透過
set_exploration_type(<exploration>)
來停用探索,其中<exploration>
要嘛是ExplorationType.MEAN
、ExplorationType.MODE
或ExplorationType.DETERMINISTIC
。預設值是DETERMINISTIC
並且透過deterministic_sampling_mode
損失屬性設定。如果需要另一個探索模式(或者如果DETERMINISTIC
不可用),可以變更這個屬性的值,這將會變更模式。- convert_to_functional(module: TensorDictModule, module_name: str, expand_dim: Optional[int] = None, create_target_params: bool = False, compare_against: Optional[List[Parameter]] = None, **kwargs) None [source]¶
將模組轉換為 functional,以便在損失函數中使用。
- 參數:
module (TensorDictModule 或 compatible) – 一個有狀態的 tensordict 模組。來自此模組的參數將被隔離在 <module_name>_params 屬性中,並且該模組的無狀態版本將在 module_name 屬性下註冊。
module_name (str) – 模組將被找到的名稱。模組的參數將在
loss_module.<module_name>_params
下找到,而模組將在loss_module.<module_name>
下找到。expand_dim (int, optional) –
- 如果提供,模組的參數
將沿著第一個維度擴展
N
次,其中N = expand_dim
。每當要使用具有多個配置的目標網路時,都應使用此選項。注意
如果提供了
compare_against
值列表,則產生的參數將僅僅是原始參數的 detached 擴展。如果未提供compare_against
,則參數的值將在參數內容的最小值和最大值之間均勻地重新採樣。- create_target_params (bool, optional): 如果
True
,則 detached 參數的副本將可用於在名稱
loss_module.<module_name>_target_params
下提供給目標網路。 如果False
(預設),則此屬性仍然可用,但它將是參數的 detached 實例,而不是副本。 換句話說,對參數值的任何修改都將直接反映在目標參數中。
compare_against (iterable of parameters, optional) – 如果提供,則此參數列表將用作模組參數的比較集。 如果參數被擴展 (
expand_dim > 0
),則模組的結果參數將是原始參數的簡單擴展。 否則,產生的參數將是原始參數的 detached 版本。 如果None
,則結果參數將按預期帶有梯度。
- forward(tensordict: TensorDictBase) TensorDictBase [source]¶
它旨在讀取輸入 TensorDict 並返回另一個具有名為 “loss*” 的損失鍵的 tensordict。
將損失分成其組成部分然後可以被訓練器用來記錄整個訓練過程中的各種損失值。輸出 tensordict 中的其他純量也會被記錄。
- 參數:
tensordict – 一個輸入 tensordict,包含計算損失所需的值。
- Returns:
一個新的 tensordict,沒有批次維度,包含各種損失純量,這些純量將被命名為 “loss*”。 重要的是以這個名稱返回損失,因為它們會在反向傳播之前被訓練器讀取。
- from_stateful_net(network_name: str, stateful_net: Module)[source]¶
根據網路的有狀態版本來填充模型的參數。
有關如何收集網路的有狀態版本的詳細訊息,請參閱
get_stateful_net()
。- 參數:
network_name (str) – 要重置的網路名稱。
stateful_net (nn.Module) – 應該從中收集參數的有狀態網路。
- property functional¶
模組是否為 functional。
除非經過特別設計不成為 functional,否則所有損失都是 functional 的。
- get_stateful_net(network_name: str, copy: Optional[bool] = None)[source]¶
返回網路的有狀態版本。
這可用於初始化參數。
此類網路通常無法直接調用,並且需要 vmap 調用才能執行。
- 參數:
network_name (str) – 要收集的網路名稱。
copy (bool, optional) –
如果
True
,則會建立網路的深層複製 (deepcopy)。預設為True
。注意
如果模組無法正常運作,則不會進行複製。
- 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)
- named_parameters(prefix: str = '', recurse: bool = True) Iterator[Tuple[str, Parameter]] [原始碼]¶
傳回模組參數的疊代器,同時產生參數名稱和參數本身。
- 參數:
prefix (str) – 要附加到所有參數名稱的前綴。
recurse (bool) – 如果為 True,則產生此模組和所有子模組的參數。否則,僅產生屬於此模組直接成員的參數。
remove_duplicate (bool, optional) – 是否移除結果中重複的參數。預設為 True。
- 產生:
(str, Parameter) – 包含名稱和參數的元組
範例
>>> # xdoctest: +SKIP("undefined vars") >>> for name, param in self.named_parameters(): >>> if name in ['bias']: >>> print(param.size())
- parameters(recurse: bool = True) Iterator[Parameter] [原始碼]¶
傳回模組參數的疊代器。
這通常會傳遞給最佳化器。
- 參數:
recurse (bool) – 如果為 True,則產生此模組和所有子模組的參數。否則,僅產生屬於此模組直接成員的參數。
- 產生:
Parameter – 模組參數
範例
>>> # xdoctest: +SKIP("undefined vars") >>> for param in model.parameters(): >>> print(type(param), param.size()) <class 'torch.Tensor'> (20L,) <class 'torch.Tensor'> (20L, 1L, 5L, 5L)
- set_keys(**kwargs) None [原始碼]¶
設定 tensordict 鍵名。
範例
>>> from torchrl.objectives import DQNLoss >>> # initialize the DQN loss >>> actor = torch.nn.Linear(3, 4) >>> dqn_loss = DQNLoss(actor, action_space="one-hot") >>> dqn_loss.set_keys(priority_key="td_error", action_value_key="action_value")
- property value_estimator: ValueEstimatorBase¶
價值函數將來自即將到來的狀態/狀態-動作對的獎勵和價值估計混合到價值網路的目標價值估計中。
- property vmap_randomness¶
Vmap 隨機模式。
vmap 隨機模式控制當處理具有隨機結果的函數(例如
randn()
和rand()
)時,vmap()
應該做什麼。如果為 “error”,任何隨機函數都會引發異常,指示 vmap 不知道如何處理隨機呼叫。如果 “different”,沿著 vmap 被呼叫的批次中的每個元素將會表現不同。如果 “same”,vmaps 將會複製相同的結果到所有元素。
如果沒有偵測到隨機模組,則
vmap_randomness
預設為 “error”,否則預設為 “different”。預設情況下,只有有限數量的模組被列為隨機模組,但可以使用add_random_module()
函式擴充此列表。此屬性支援設定其值。