快捷方式

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)
forward(tensordict: TensorDictBase) TensorDictBase[source]

定義每次呼叫時執行的計算。

應由所有子類重寫。

注意

雖然前向傳播的實現需要在該函式內定義,但之後應該呼叫 Module 例項而不是直接呼叫此函式,因為前者負責執行已註冊的鉤子,而後者則默默地忽略它們。

step(frames: int = 1) None[source]

更新 eps 噪聲因子。

引數:

frames (int) – 當前批次的幀數(對應於要進行的更新次數)。

文件

訪問 PyTorch 的全面開發者文件

檢視文件

教程

獲取針對初學者和高階開發者的深入教程

檢視教程

資源

查詢開發資源並獲得問題解答

檢視資源