快捷方式

OrnsteinUhlenbeckProcessModule

class torchrl.modules.OrnsteinUhlenbeckProcessModule(*args, **kwargs)[源代码]

Ornstein-Uhlenbeck 探索策略模块。

在 “CONTINUOUS CONTROL WITH DEEP REINFORCEMENT LEARNING” 中提出,https://arxiv.org/pdf/1509.02971.pdf

OU 探索适用于连续控制策略,并引入了自相关探索噪声。这使得一种“结构化”的探索成为可能。

噪声方程

\[noise_t = noise_{t-1} + \theta * (mu - noise_{t-1}) * dt + \sigma_t * \sqrt{dt} * W\]

Sigma 方程

\[\sigma_t = max(\sigma^{min, (-(\sigma_{t-1} - \sigma^{min}) / (n^{\text{steps annealing}}) * n^{\text{steps}} + \sigma))\]

为了从样本到样本跟踪步数和噪声,输入/输出 tensordict 中将写入 "ou_prev_noise{id}""ou_steps{id}" 键。预计 tensordict 在重置时会被清零,表示正在收集新的轨迹。如果不是,并且连续轨迹使用了相同的 tensordict,则步数计数将跨越 rollouts 持续增加。请注意,收集器类会负责在重置时清零 tensordict。

注意

至关重要的是,在训练循环中调用 step() 来更新探索因子。由于很难捕获这种遗漏,如果省略此操作,将不会引发警告或异常!

参数:
  • spec (TensorSpec) – 用于采样动作的 spec。采样动作将在探索后投影到有效的动作空间。

  • eps_init (scalar) – 初始 epsilon 值,决定要添加的噪声量。默认值:1.0

  • eps_end (scalar) – 最终 epsilon 值,决定要添加的噪声量。默认值:0.1

  • annealing_num_steps (int) – epsilon 达到 eps_end 值所需的步数。默认值:1000

  • theta (scalar) – 噪声方程中的 theta 因子。默认值:0.15

  • mu (scalar) – OU 平均值(噪声方程中的 mu)。默认值:0.0

  • sigma (scalar) – sigma 方程中的 sigma 值。默认值:0.2

  • dt (scalar) – 噪声方程中的 dt。默认值:0.01

  • x0 (Tensor, ndarray, optional) – 过程的初始值。默认值:0.0

  • sigma_min (number, optional) – sigma 方程中的 sigma_min。默认值:None

  • n_steps_annealing (int) – sigma 衰减的步数。默认值:1000

关键字参数:
  • action_key (NestedKey, optional) – 要修改的动作的键。默认值:“action”

  • is_init_key (NestedKey, optional) – 用于重置噪声步数的 is_init 标志所在的键。默认值:“is_init”

  • safe (boolean, optional) – 如果为 False,则 TensorSpec 可以为 None。如果设置为 False 但仍传递了 spec,则仍会进行投影。默认值为 True。

  • device (torch.device, optional) – 必须存储缓冲区的设备。

示例

>>> import torch
>>> from tensordict import TensorDict
>>> from tensordict.nn import TensorDictSequential
>>> from torchrl.data import Bounded
>>> from torchrl.modules import OrnsteinUhlenbeckProcessModule, Actor
>>> torch.manual_seed(0)
>>> spec = Bounded(-1, 1, torch.Size([4]))
>>> module = torch.nn.Linear(4, 4, bias=False)
>>> policy = Actor(module=module, spec=spec)
>>> ou = OrnsteinUhlenbeckProcessModule(spec=spec)
>>> explorative_policy = TensorDictSequential(policy, ou)
>>> td = TensorDict({"observation": torch.zeros(10, 4)}, batch_size=[10])
>>> print(explorative_policy(td))
TensorDict(
    fields={
        _ou_prev_noise: Tensor(shape=torch.Size([10, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        _ou_steps: Tensor(shape=torch.Size([10]), device=cpu, dtype=torch.int64, is_shared=False),
        action: Tensor(shape=torch.Size([10, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        observation: Tensor(shape=torch.Size([10, 4]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([10]),
    device=None,
    is_shared=False)
forward(tensordict: TensorDictBase) TensorDictBase[源代码]

定义每次调用时执行的计算。

所有子类都应重写此方法。

注意

尽管前向传播的实现需要在此函数中定义,但您应该在之后调用 Module 实例而不是此函数,因为前者会处理注册的钩子,而后者则会静默忽略它们。

step(frames: int = 1) None[源代码]

更新 eps 噪声因子。

参数:

frames (int) – 当前批次的帧数(对应要进行的更新次数)。

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源