注意
轉到末尾下載完整的示例程式碼。
環境(Environments)、TED 和變換(transforms)入門¶
作者: Vincent Moens
注意
要在 notebook 中執行此教程,請在開頭新增一個安裝單元格,其中包含
!pip install tensordict !pip install torchrl
歡迎來到入門教程!
下面列出了我們將要涵蓋的主題。
如果你很趕時間,可以直接跳到最後一個教程:你的第一個訓練迴圈。如果遇到不清楚的地方或想了解特定主題,可以從那裡回溯其他“入門”教程!
強化學習中的環境(Environments)¶
標準的強化學習 (RL) 訓練迴圈涉及一個模型(也稱為策略),該模型經過訓練以在特定環境中完成一項任務。通常,這個環境是一個模擬器,它接受動作作為輸入,併產生觀察結果以及一些元資料作為輸出。
在本文件中,我們將探索 TorchRL 的環境 API:我們將學習如何建立一個環境、如何與它互動,以及它使用的資料格式。
建立環境¶
本質上,TorchRL 不直接提供環境,而是提供封裝了模擬器的其他庫的包裝器。envs 模組可以被視為通用環境 API 的提供者,也是模擬後端(如 gym (GymEnv)、Brax (BraxEnv) 或 DeepMind Control Suite (DMControlEnv))的中心樞紐。
建立環境通常與底層後端 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() 獲得的相同,只是多了一個 "action" 條目。你可以像訪問普通字典一樣輕鬆訪問該動作
print(reset_with_action["action"])
現在我們需要將這個動作傳遞給環境。我們將把整個 tensordict 傳遞給 step 方法,因為在更高階的場景(如多智慧體強化學習或無狀態環境)中可能需要讀取多個張量
stepped_data = env.step(reset_with_action)
print(stepped_data)
同樣,這個新的 tensordict 與前一個相同,只是它有一個 "next" 條目(它本身也是一個 tensordict!),其中包含我們的動作產生的觀察結果、獎勵和完成狀態。
我們將這種格式稱為 TED,即 TorchRL 回合資料格式(TorchRL Episode Data format)。它是庫中表示資料的普遍方式,無論是動態表示(如這裡)還是靜態表示(如離線資料集)。
在環境中執行 rollout 所需的最後一點資訊是如何將 "next" 條目提升到根部以執行下一步。TorchRL 提供了一個專門的函式 step_mdp() 來完成這項工作:它過濾掉你不需要的資訊,並提供一個數據結構,該結構對應於在馬爾可夫決策過程 (MDP) 中執行一步之後的觀察結果。
from torchrl.envs import step_mdp
data = step_mdp(stepped_data)
print(data)
環境 rollout¶
寫下這三個步驟(計算動作、執行一步、在 MDP 中前進)可能會有些繁瑣和重複。幸運的是,TorchRL 提供了一個方便的函式 rollout(),允許你隨意在一個閉環中執行它們
rollout = env.rollout(max_steps=10)
print(rollout)
這些資料看起來很像上面的 stepped_data,不同之處在於其 batch-size,它現在等於我們透過 max_steps 引數提供的步數。tensordict 的神奇之處不止於此:如果你對環境中某個單一轉換感興趣,你可以像索引張量一樣索引 tensordict
transition = rollout[3]
print(transition)
TensorDict 會自動檢查你提供的索引是鍵(在這種情況下,我們沿鍵維度索引)還是像這裡的空間索引。
像這樣執行(沒有策略),rollout 方法可能看起來相當無用:它只是執行隨機動作。如果有一個策略可用,可以將其傳遞給該方法並用於收集資料。
儘管如此,先執行一個簡單的、無策略的 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 步的完整 rollout)。我們可以透過檢視 truncated 條目來看到軌跡被截斷了
print(rollout["next", "truncated"])
這是 TorchRL 環境 API 簡短介紹的全部內容!
下一步¶
要進一步探索 TorchRL 的環境功能,請檢視
將
step()、step_mdp()和reset()方法打包在一起的step_and_maybe_reset()方法。一些環境(如
GymEnv)透過from_pixels引數支援渲染。檢視類文件字串瞭解更多!批處理環境,特別是
ParallelEnv,它允許你在多個程序上運行同一個(或不同的!)環境的多個副本。透過 Pendulum 教程設計自己的環境,並學習關於 specs 和無狀態環境。
檢視關於環境的更深入教程,請參考專門教程;
如果你對多智慧體強化學習 (MARL) 感興趣,請檢視多智慧體環境 API;
TorchRL 有許多工具可以與 Gym API 互動,例如透過
register_gym()將 TorchRL 環境註冊到 Gym 登錄檔中,透過set_info_dict_reader()讀取資訊字典的 API,或藉助set_gym_backend()控制 gym 後端的方式。