快捷方式

OrnsteinUhlenbeckProcessWrapper

class torchrl.modules.OrnsteinUhlenbeckProcessWrapper(*args, **kwargs)[source]

Ornstein-Uhlenbeck 探索策略包裝器。

在「使用深度強化學習進行連續控制」中提出,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))\]

為了追蹤樣本到樣本的步驟和雜訊,"ou_prev_noise{id}""ou_steps{id}" 鍵將寫入輸入/輸出 tensordict 中。預期 tensordict 將在重設時歸零,表示正在收集新的軌跡。否則,如果相同的 tensordict 用於連續軌跡,則步驟計數將在 rollouts 中持續增加。請注意,收集器類別負責在重設時將 tensordict 歸零。

注意

一旦環境被包裝在 OrnsteinUhlenbeckProcessWrapper 中,在訓練迴圈中加入對 step() 的呼叫以更新探索因子至關重要。由於很難捕捉到這個疏忽,如果省略了這一點,將不會發出警告或例外!

參數:

policy (TensorDictModule) – 策略

關鍵字參數:
  • eps_init (純量) – 初始 epsilon 值,決定要加入的雜訊量。預設值:1.0

  • eps_end (純量) – 最終 epsilon 值,決定要加入的雜訊量。預設值:0.1

  • annealing_num_steps (int) – epsilon 達到 eps_end 值所需的步數。預設值:1000

  • theta (純量) – 雜訊方程式中的 theta 因子。預設值:0.15

  • mu (純量) – OU 平均值(雜訊方程式中的 mu)。預設值:0.0

  • sigma (純量) – sigma 方程式中的 sigma 值。預設值:0.2

  • dt (純量) – 雜訊方程式中的 dt。預設值:0.01

  • x0 (Tensor, ndarray, 可選) – 程序的初始值。預設值:0.0

  • sigma_min (number, 可選) – sigma 方程式中的 sigma_min。預設值:None

  • n_steps_annealing (int) – sigma 退火的步數。預設值:1000

  • action_key (NestedKey, 可選) – 要修改的動作的鍵。預設值:“action”

  • is_init_key (NestedKey, 可選) – 在何處尋找用於重設雜訊步驟的 is_init 旗標的鍵。預設值:“is_init”

  • spec (TensorSpec, optional) – 若有提供,探索後的採樣動作將會投影到有效的動作空間。若無提供,探索包裝器將嘗試從策略中恢復它。

  • safe (bool) – 若 True,則超出動作規格範圍的動作,將會依照 TensorSpec.project 的啟發式方法投影到空間中。預設值:True

範例

>>> import torch
>>> from tensordict import TensorDict
>>> from torchrl.data import Bounded
>>> from torchrl.modules import OrnsteinUhlenbeckProcessWrapper, 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)
>>> explorative_policy = OrnsteinUhlenbeckProcessWrapper(policy)
>>> td = TensorDict({"observation": torch.zeros(10, 4)}, batch_size=[10])
>>> print(explorative_policy(td))
TensorDict(
    fields={
        _ou_prev_noise: Tensor(torch.Size([10, 4]), dtype=torch.float32),
        _ou_steps: Tensor(torch.Size([10, 1]), dtype=torch.int64),
        action: Tensor(torch.Size([10, 4]), dtype=torch.float32),
        observation: Tensor(torch.Size([10, 4]), dtype=torch.float32)},
    batch_size=torch.Size([10]),
    device=None,
    is_shared=False)
forward(tensordict: TensorDictBase) TensorDictBase[原始碼]

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

應該由所有子類別覆寫。

注意

雖然 forward pass 的配方需要在這個函式中定義,但之後應該呼叫 Module 實例,而不是這個函式,因為前者會處理已註冊的 hook,而後者會靜默地忽略它們。

step(frames: int = 1) None[原始碼]

更新 eps 雜訊因子。

參數:

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

文件

存取 PyTorch 的完整開發者文件

查看文件

教學

取得針對初學者和進階開發者的深入教學

查看教學

資源

尋找開發資源並獲得您問題的解答

查看資源