• 文件 >
  • 開始使用環境、TED 和轉換
快捷方式

使用環境、TED 和 Transforms 入門

作者Vincent Moens

注意

要在 notebook 中執行本教程,請在開頭新增一個安裝單元格,其中包含:

!pip install tensordict
!pip install torchrl

歡迎來到入門教程!

下面是我們將在教程中涵蓋的主題列表。

如果您時間緊迫,可以直接跳到最後一個教程 您自己的第一個訓練迴圈,然後可以根據需要回溯其他“入門”教程,如果某些內容不清楚或您想了解特定主題的更多資訊!

強化學習中的環境

標準的 RL(強化學習)訓練迴圈包括一個模型,也稱為策略,該模型經過訓練,以便在特定環境中完成任務。通常,此環境是一個接受動作作為輸入併產生觀測值以及一些元資料作為輸出的模擬器。

在本教程中,我們將探討 TorchRL 的環境 API:我們將學習如何建立一個環境、與其進行互動以及理解它使用的資料格式。

建立環境

本質上,TorchRL 不直接提供環境,而是為封裝模擬器的其他庫提供包裝器。envs 模組可以被視為通用環境 API 的提供者,以及模擬後端(如 gymGymEnv)、BraxBraxEnv)或 DeepMind Control SuiteDMControlEnv)的中心集線器。

建立環境通常與底層後端 API 所允許的一樣簡單。以下是使用 gym 的示例

from torchrl.envs import GymEnv

env = GymEnv("Pendulum-v1")

執行環境

TorchRL 中的環境有兩個關鍵方法:reset()(啟動一個回合)和 step()(執行由 actor 選擇的操作)。在 TorchRL 中,環境方法讀寫 TensorDict 例項。本質上,TensorDict 是張量的通用基於鍵的資料載體。與普通張量相比,使用 TensorDict 的好處在於它使我們能夠互換處理簡單和複雜的資料結構。由於我們的函式簽名非常通用,因此消除了適應不同資料格式的挑戰。簡而言之,在本簡短教程之後,您將能夠操作簡單和高度複雜的環境,因為它們面向使用者的 API 是相同的且很簡單!

讓我們讓環境執行起來,看看 tensordict 例項的樣子

reset = env.reset()
print(reset)

現在讓我們在動作空間中採取一個隨機動作。首先,對動作進行取樣

reset_with_action = env.rand_action(reset)
print(reset_with_action)

這個 tensordict 具有與從 EnvBase() 獲得的 tensordict 相同的結構,並額外有一個 "action" 條目。您可以像訪問普通字典一樣輕鬆訪問該動作

print(reset_with_action["action"])

我們現在需要將此動作傳遞給環境。我們將把整個 tensordict 傳遞給 step 方法,因為在更高階的情況下,例如多智慧體 RL 或無狀態環境,可能需要讀取不止一個張量

stepped_data = env.step(reset_with_action)
print(stepped_data)

同樣,這個新的 tensordict 與前一個相同,只是它有一個 "next" 條目(它本身就是一個 tensordict!),其中包含我們動作的結果觀測值、獎勵和完成狀態。

我們將這種格式稱為 TED,代表 TorchRL Episode Data format(TorchRL 回合資料格式)。這是庫中表示資料的普遍方式,無論是像這裡一樣的動態表示,還是使用離線資料集進行靜態表示。

您需要執行環境中的回放的最後一點資訊是如何將 "next" 條目移到根目錄以執行下一步。TorchRL 提供了一個專門的 step_mdp() 函式,它可以做到這一點:它會過濾掉您不需要的資訊,並提供一個對應於馬爾可夫決策過程(MDP)中步驟後的觀測值的資料結構。

from torchrl.envs import step_mdp

data = step_mdp(stepped_data)
print(data)

環境回放

寫下這三個步驟(計算動作、執行步驟、在 MDP 中移動)可能會有些繁瑣和重複。幸運的是,TorchRL 提供了一個漂亮的 rollout() 函式,該函式允許您按需以閉環方式執行它們

rollout = env.rollout(max_steps=10)
print(rollout)

這些資料看起來與上面的 stepped_data 非常相似,只是其批次大小現在等於您透過 max_steps 引數提供的步數。tensordict 的魔力不止於此:如果您對該環境的單個轉換感興趣,您可以像索引張量一樣索引 tensordict

transition = rollout[3]
print(transition)

TensorDict 會自動檢查您提供的索引是鍵(在這種情況下,我們沿著鍵維度進行索引)還是像此處一樣的空間索引。

當不帶策略執行時(rollout 方法可能看起來相當無用:它只是執行隨機動作。如果提供了策略,則可以將其傳遞給該方法並用於收集資料。

儘管如此,一開始執行一個樸素的、無策略的回放以一目瞭然地檢視環境的預期行為可能仍然有用。

為了體會 TorchRL API 的多功能性,請考慮 rollout 方法的通用適用性。無論您是處理單個環境(如本例)、跨多個程序的多個副本、多智慧體環境,甚至是其無狀態版本,它都適用於 **所有** 用例!

轉換環境

大多數時候,您會想修改環境的輸出來更好地滿足您的需求。例如,您可能想監控自上次重置以來執行的步數,調整影像大小,或將連續的觀測值堆疊在一起。

在本節中,我們將檢查一個簡單的轉換,即 StepCounter 轉換。完整的轉換列表可以在 此處 找到。

該轉換透過 TransformedEnv 整合到環境中

from torchrl.envs import StepCounter, TransformedEnv

transformed_env = TransformedEnv(env, StepCounter(max_steps=10))
rollout = transformed_env.rollout(max_steps=100)
print(rollout)

如您所見,我們的環境現在多了一個條目 "step_count",它跟蹤自上次重置以來的步數。考慮到我們向轉換建構函式傳遞了可選引數 max_steps=10,我們還將軌跡截斷為 10 步(未像透過 rollout 呼叫請求的那樣完成完整的 100 步回放)。透過檢視 truncated 條目,我們可以看到軌跡被截斷了

print(rollout["next", "truncated"])

以上就是 TorchRL 環境 API 的簡短介紹!

後續步驟

要進一步探索 TorchRL 的環境功能,請檢視

  • step_and_maybe_reset() 方法,它將 step()step_mdp()reset() 打包在一起。

  • 某些環境,如 GymEnv,透過 from_pixels 引數支援渲染。請檢視類文件字串以瞭解更多資訊!

  • 批處理環境,特別是 ParallelEnv,它允許您在多個程序上執行一個相同(或不同!)環境的多個副本。

  • 使用 Pendulum 教程 設計您自己的環境,並瞭解規格和無狀態環境。

  • 請在 專用教程 中檢視更深入的環境教程;

  • 如果您對 MARL 感興趣,請檢視 多智慧體環境 API

  • TorchRL 提供了許多與 Gym API 互動的工具,例如透過 register_gym() 將 TorchRL 環境註冊到 Gym 登錄檔中的方式,用於讀取資訊字典的 API(透過 set_info_dict_reader()),或者透過 set_gym_backend() 控制 gym 後端的方式。

由 Sphinx-Gallery 生成的畫廊

文件

訪問全面的 PyTorch 開發者文件

檢視文件

教程

為初學者和高階開發者提供深入的教程

檢視教程

資源

查詢開發資源並讓您的問題得到解答

檢視資源