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)