torchrl.objectives 包¶
TorchRL 提供了一系列损失函数,用于你的训练脚本。目的是拥有易于重用/交换且签名简单的损失函数。
TorchRL 损失函数的主要特点是
它们是有状态的对象:它们包含可训练参数的副本,因此
loss_module.parameters()
提供了训练算法所需的一切。它们遵循
tensordict
约定:torch.nn.Module.forward()
方法将接收一个 tensordict 作为输入,其中包含返回损失值所需的所有信息。它们输出一个
tensordict.TensorDict
实例,损失值写在"loss_<smth>"
下,其中smth
是一个描述损失的字符串。tensordict 中的其他键可能是训练期间要记录的有用指标。
注意
我们返回独立损失的原因是为了让用户可以为不同的参数集使用不同的优化器。损失的求和可以简单地通过以下方式完成
>>> loss_val = sum(loss for key, loss in loss_vals.items() if key.startswith("loss_"))
注意
损失中的参数初始化可以通过查询 get_stateful_net()
来完成,这将返回网络的有状态版本,可以像任何其他模块一样初始化。如果修改是就地完成的,它将传递到任何其他使用相同参数集的模块(在损失内部和外部):例如,修改 actor_network
损失中的参数也将修改收集器中的 actor。如果参数是异地修改的,可以使用 from_stateful_net()
将损失中的参数重置为新值。
torch.vmap 和随机性¶
TorchRL 损失模块有很多对 vmap()
的调用,以分摊循环调用多个相似模型的成本,并改为向量化这些操作。vmap 需要明确告知在调用中需要生成随机数时该怎么做。为此,需要设置一个随机模式,并且必须是 “error”(默认,处理伪随机函数时出错)、“same”(在批次中复制结果)或 “different”(批次的每个元素都单独处理)之一。依赖默认设置通常会导致如下错误
>>> RuntimeError: vmap: called random operation while in randomness error mode.
由于对 vmap 的调用埋藏在损失模块的深处,TorchRL 提供了一个接口,可以通过 loss.vmap_randomness = str_value 从外部设置 vmap 模式,参见 vmap_randomness()
以获取更多信息。
LossModule.vmap_randomness
默认为 “error”,如果未检测到随机模块,则在其他情况下默认为 “different”。默认情况下,只有有限数量的模块被列为随机模块,但可以使用 add_random_module()
函数扩展该列表。
训练价值函数¶
TorchRL 提供了一系列 价值估计器,例如 TD(0)、TD(1)、TD(\(\lambda\)) 和 GAE。简而言之,价值估计器是数据(主要是奖励和完成状态)和状态价值(即,通过拟合以估计状态价值的函数返回的值)的函数。要了解更多关于价值估计器的信息,请查看 RL 导论,来自 Sutton 和 Barto,特别是关于价值迭代和 TD 学习的章节。它给出了基于数据和代理映射的状态或状态-动作对之后的折现回报的某种有偏差的估计。这些估计器用于两种情况
为了训练价值网络以学习“真实”状态价值(或状态-动作价值)映射,需要一个目标价值来拟合它。估计器越好(偏差越小,方差越小),价值网络就越好,这反过来可以显着加速策略训练。通常,价值网络损失看起来像
>>> value = value_network(states) >>> target_value = value_estimator(rewards, done, value_network(next_state)) >>> value_net_loss = (value - target_value).pow(2).mean()
计算用于策略优化的“优势”信号。优势是价值估计(来自估计器,即来自“真实”数据)和价值网络的输出(即该价值的代理)之间的差值。正优势可以被视为策略实际上比预期表现更好的信号,从而表明如果将该轨迹作为示例,则有改进的空间。相反,负优势表示策略的表现不如预期。
情况并不总是像上面的示例那样容易,计算价值估计器或优势的公式可能比这稍微复杂一些。为了帮助用户灵活地使用一个或另一个价值估计器,我们提供了一个简单的 API 来动态更改它。这是一个 DQN 的示例,但所有模块都将遵循类似的结构
>>> from torchrl.objectives import DQNLoss, ValueEstimators
>>> loss_module = DQNLoss(actor)
>>> kwargs = {"gamma": 0.9, "lmbda": 0.9}
>>> loss_module.make_value_estimator(ValueEstimators.TDLambda, **kwargs)
ValueEstimators
类枚举了可供选择的价值估计器。这使得用户可以轻松地依赖自动完成功能来做出选择。
|
RL 损失的父类。 |
DQN¶
|
DQN 损失类。 |
|
分布式的 DQN 损失类。 |
DDPG¶
|
DDPG 损失类。 |
SAC¶
|
TorchRL 实现的 SAC 损失。 |
|
离散 SAC 损失模块。 |
REDQ¶
|
REDQ 损失模块。 |
CrossQ¶
|
TorchRL 实现的 CrossQ 损失。 |
IQL¶
|
TorchRL 实现的 IQL 损失。 |
|
TorchRL 实现的离散 IQL 损失。 |
CQL¶
|
TorchRL 实现的连续 CQL 损失。 |
|
TorchRL 实现的离散 CQL 损失。 |
GAIL¶
|
TorchRL 实现的生成对抗模仿学习 (GAIL) 损失。 |
DT¶
|
TorchRL 实现的在线决策 Transformer 损失。 |
|
TorchRL 实现的在线决策 Transformer 损失。 |
TD3¶
|
TD3 损失模块。 |
TD3+BC¶
|
TD3+BC 损失模块。 |
PPO¶
|
PPO 损失的父类。 |
|
裁剪 PPO 损失。 |
|
KL 惩罚 PPO 损失。 |
A2C¶
|
TorchRL 实现的 A2C 损失。 |
Reinforce¶
|
Reinforce 损失模块。 |
Dreamer¶
|
Dreamer Actor 损失。 |
|
Dreamer Model 损失。 |
|
Dreamer Value 损失。 |
多智能体目标¶
这些目标特定于多智能体算法。
QMixer¶
|
QMixer 损失类。 |
回报¶
|
价值函数模块的抽象父类。 |
|
优势函数的时间差分 (TD(0)) 估计。 |
|
\(\infty\)-时间差分 (TD(1)) 优势函数估计。 |
|
TD(\(\lambda\)) 优势函数估计。 |
|
广义优势估计函数的类包装器。 |
|
轨迹的 TD(0) 折现回报估计。 |
|
轨迹的 TD(0) 优势估计。 |
|
TD(1) 回报估计。 |
|
向量化 TD(1) 回报估计。 |
|
TD(1) 优势估计。 |
|
向量化 TD(1) 优势估计。 |
|
TD(\(\lambda\)) 回报估计。 |
向量化 TD(\(\lambda\)) 回报估计。 |
|
TD(\(\lambda\)) 优势估计。 |
|
向量化 TD(\(\lambda\)) 优势估计。 |
|
轨迹的广义优势估计。 |
|
轨迹的向量化广义优势估计。 |
|
|
计算给定多个轨迹和剧集结束时的折现累积奖励总和。 |
工具¶
|
计算两个张量之间的距离损失。 |
|
上下文管理器,用于将网络保持在计算图之外。 |
|
上下文管理器,用于将参数列表保持在计算图之外。 |
|
计算下一个状态值(无梯度)以计算目标值。 |
|
用于 Double DQN/DDPG 中目标网络更新的软更新类。 |
|
用于 Double DQN/DDPG 中目标网络更新的硬更新类(与软更新相反)。 |
|
用于自定义构建的估计器的价值函数枚举器。 |
|
默认价值函数关键字参数生成器。 |