OrnsteinUhlenbeckProcessModule¶
- class torchrl.modules.OrnsteinUhlenbeckProcessModule(*args, **kwargs)[source]¶
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)