
Tianshou (天授)是基於純Pytorch和體育館的加固學習(RL)庫。蒂安肖(Tianshou)的主要特徵是:
與其他強化學習庫不同,可能具有復雜的代碼庫,不友好的高級API或未針對速度進行優化,Tianshou提供了一個高性能,模塊化的框架和用戶友好的接口,以構建深入增強式學習劑。設定田肖(Tianshou)與眾不同的另一個方面是它的一般性:它支持在線和離線RL,多代理RL和基於模型的算法。
蒂安肖(Tianshou)旨在為研究人員和從業者提供簡潔的實施,而無需犧牲靈活性。
支持的算法包括:
其他值得注意的功能:
在中文中,天舒(Tianshou)的意思是受命的,被派往出生的禮物。天舒(Tianshou)是一個加強學習平台,RL的性質不是向人類學習。因此,“ tianshou”意味著沒有老師可以學習,而是通過與環境的不斷互動來學習自己。
“天授”,引申為與生具有的天賦。天授是強化學習平台,而強化學習算法並不是向人類學習的,所以取“天授”,而是自己通過跟環境不斷交互來進行學習。
天舒(Tianshou)目前主持在PYPI和Conda-Forge上。它需要python> = 3.11。
為了安裝最新版本的tianshou,最好的方法是克隆倉庫,並使用詩歌安裝(您需要先在系統上安裝它)
git clone [email protected]:thu-ml/tianshou.git
cd tianshou
poetry install您還可以通過添加--with dev或Extras來安裝開發需求,並通過添加--extras "mujoco envpool"來表達Mujoco和Envpool的額外需求。
如果您想安裝多個附加功能,請確保將它們包含在一個命令中。對poetry install --extras xxx將覆蓋先前的安裝,僅保留最後指定的附加功能。或者,您可以通過添加--all-extras來安裝所有以下附加功能。
可用的額外功能是:
atari (用於Atari環境)box2d (對於Box2D環境)classic_control (用於經典控制(離散)環境)mujoco (用於Mujoco環境)mujoco-py (用於傳統的Mujoco-Py環境1 )pybullet (用於pybullet環境)robotics (適用於體育館機器人環境)vizdoom (對於Vizdoom環境)envpool (Envpool集成)argparse (為了能夠運行高級API示例)否則,您可以使用以下命令安裝PYPI(目前遠遠落後於Master)的最新版本:
$ pip install tianshou如果您使用的是Anaconda或MinoConda,則可以從Conda-Forge安裝Tianshou:
$ conda install tianshou -c conda-forge或者,對於詩歌安裝,您還可以通過GitHub安裝最新的源版本:
$ pip install git+https://github.com/thu-ml/tianshou.git@master --upgrade最後,您可以通過Python控制台檢查安裝,如下所示:
import tianshou
print ( tianshou . __version__ )如果未報告錯誤,您已經成功安裝了Tianshou。
教程和API文檔在tianshou.readthedocs.io上託管。
在測試/和示例/文件夾中找到示例腳本。
| RL平台 | 文件 | 代碼覆蓋範圍 | 類型提示 | 最後更新 |
|---|---|---|---|---|
| 穩定的生物線3 | ✔️ | |||
| 雷/rllib | ➖ (1) | ✔️ | ||
| 旋轉 | ||||
| 多巴胺 | ||||
| Acme | ➖ (1) | ✔️ | ||
| 樣本工廠 | ➖ | |||
| 天舒 | ✔️ |
(1):它具有連續的集成,但覆蓋率不可用
天舒(Tianshou)經過嚴格測試。與其他RL平台相反,我們的測試包括所有實施算法的完整代理培訓程序。如果任何代理商未能在有限時期達到一致的性能水平,我們的測試將失敗一次。因此,我們的測試確保可重複性。查看GitHub操作頁面以獲取更多詳細信息。
Atari和Mujoco基準結果可以在示例/ atari/和示例/ mujoco/文件夾中找到。我們的Mujoco結果達到或超過了大多數現有基準的性能水平。
所有算法實現以下,高度一般的API:
__init__ :初始化策略;forward :根據給定的觀察計算行動;process_buffer :過程初始緩衝區,這對於某些離線學習算法很有用process_fn :來自重播緩衝區的預處理數據(因為我們已經重新重新制定了基於緩衝算法的所有算法);learn :從給定的一批數據中學習;post_process_fn :更新學習過程中的重播緩衝區(例如,優先重播緩衝區需要更新重量);update :培訓的主要接口,即, process_fn -> learn -> post_process_fn 。該API的實現足以使新算法適用於Tianshou,這使得通過新方法特別簡單地進行實驗。
天舒(Tianshou)提供了兩個API級別:
在下文中,讓我們考慮使用Cartpole體育館環境的示例應用程序。我們將使用兩個API應用深Q網絡(DQN)學習算法。
首先,我們需要一些進口。
from tianshou . highlevel . config import SamplingConfig
from tianshou . highlevel . env import (
EnvFactoryRegistered ,
VectorEnvType ,
)
from tianshou . highlevel . experiment import DQNExperimentBuilder , ExperimentConfig
from tianshou . highlevel . params . policy_params import DQNParams
from tianshou . highlevel . trainer import (
EpochTestCallbackDQNSetEps ,
EpochTrainCallbackDQNSetEps ,
EpochStopCallbackRewardThreshold
)在高級API中,RL實驗的基礎是一個ExperimentBuilder ,我們可以通過它來構建我們尋求運行的實驗。由於我們想使用DQN,因此我們使用專業DQNExperimentBuilder 。其他導入物為我們的實驗提供配置選項。
高級API在很大程度上提供了聲明性的語義,即代碼幾乎完全關注控制要做什麼的配置(而不是如何做)。
experiment = (
DQNExperimentBuilder (
EnvFactoryRegistered ( task = "CartPole-v1" , train_seed = 0 , test_seed = 0 , venv_type = VectorEnvType . DUMMY ),
ExperimentConfig (
persistence_enabled = False ,
watch = True ,
watch_render = 1 / 35 ,
watch_num_episodes = 100 ,
),
SamplingConfig (
num_epochs = 10 ,
step_per_epoch = 10000 ,
batch_size = 64 ,
num_train_envs = 10 ,
num_test_envs = 100 ,
buffer_size = 20000 ,
step_per_collect = 10 ,
update_per_step = 1 / 10 ,
),
)
. with_dqn_params (
DQNParams (
lr = 1e-3 ,
discount_factor = 0.9 ,
estimation_step = 3 ,
target_update_freq = 320 ,
),
)
. with_model_factory_default ( hidden_sizes = ( 64 , 64 ))
. with_epoch_train_callback ( EpochTrainCallbackDQNSetEps ( 0.3 ))
. with_epoch_test_callback ( EpochTestCallbackDQNSetEps ( 0.0 ))
. with_epoch_stop_callback ( EpochStopCallbackRewardThreshold ( 195 ))
. build ()
)
experiment . run ()實驗構建器提出了三個論點:
watch=True )的許多情節後觀察其行為( watch_num_episodes=100 )。我們已經禁用了持久性,因為我們不想保存培訓日誌,代理或其配置以供將來使用。num_epochs=10 )step_per_epoch=10000 )。每個時期都由一系列數據收集(推出)步驟和培訓步驟組成。參數step_per_collect控制每個集合步驟中收集的數據量,在每個集合步驟之後,我們執行一個訓練步驟,基於基於梯度的更新( batch_size=64 ),從已收集的數據的緩衝區中採取了基於梯度的更新。有關更多詳細信息,請參閱SamplingConfig的文檔。然後,我們繼續配置DQN算法本身和我們要使用的神經網絡模型的某些參數。 DQN特定的細節是使用回調來配置算法的Epsilon參數進行探索。我們希望在推出期間使用隨機探索(火車回調),但是在評估測試環境中代理商的性能(測試回調)時,我們沒有。
在示例/iNCETE/INCETE_DQN_HL.PY中找到腳本。這是一場跑步(隨著訓練時間縮短):

在examples/文件夾中找到許多高級API的進一步應用;尋找以_hl.py結尾的腳本。請注意,這些示例中的大多數都需要額外的軟件包argparse (調用詩歌時添加--extras argparse進行安裝)。
現在讓我們考慮程序API中的一個類似示例。在示例/離散/iNCETE_DQN.PY中找到完整的腳本。
首先,導入一些相關軟件包:
import gymnasium as gym
import torch
from torch . utils . tensorboard import SummaryWriter
import tianshou as ts定義一些超參數:
task = 'CartPole-v1'
lr , epoch , batch_size = 1e-3 , 10 , 64
train_num , test_num = 10 , 100
gamma , n_step , target_freq = 0.9 , 3 , 320
buffer_size = 20000
eps_train , eps_test = 0.1 , 0.05
step_per_epoch , step_per_collect = 10000 , 10初始化記錄器:
logger = ts . utils . TensorboardLogger ( SummaryWriter ( 'log/dqn' ))
# For other loggers, see https://tianshou.readthedocs.io/en/master/01_tutorials/05_logger.html製作環境:
# You can also try SubprocVectorEnv, which will use parallelization
train_envs = ts . env . DummyVectorEnv ([ lambda : gym . make ( task ) for _ in range ( train_num )])
test_envs = ts . env . DummyVectorEnv ([ lambda : gym . make ( task ) for _ in range ( test_num )])創建網絡及其優化器:
from tianshou . utils . net . common import Net
# Note: You can easily define other networks.
# See https://tianshou.readthedocs.io/en/master/01_tutorials/00_dqn.html#build-the-network
env = gym . make ( task , render_mode = "human" )
state_shape = env . observation_space . shape or env . observation_space . n
action_shape = env . action_space . shape or env . action_space . n
net = Net ( state_shape = state_shape , action_shape = action_shape , hidden_sizes = [ 128 , 128 , 128 ])
optim = torch . optim . Adam ( net . parameters (), lr = lr )制定政策和收藏家:
policy = ts . policy . DQNPolicy (
model = net ,
optim = optim ,
discount_factor = gamma ,
action_space = env . action_space ,
estimation_step = n_step ,
target_update_freq = target_freq
)
train_collector = ts . data . Collector ( policy , train_envs , ts . data . VectorReplayBuffer ( buffer_size , train_num ), exploration_noise = True )
test_collector = ts . data . Collector ( policy , test_envs , exploration_noise = True ) # because DQN uses epsilon-greedy method讓我們訓練它:
result = ts . trainer . OffpolicyTrainer (
policy = policy ,
train_collector = train_collector ,
test_collector = test_collector ,
max_epoch = epoch ,
step_per_epoch = step_per_epoch ,
step_per_collect = step_per_collect ,
episode_per_test = test_num ,
batch_size = batch_size ,
update_per_step = 1 / step_per_collect ,
train_fn = lambda epoch , env_step : policy . set_eps ( eps_train ),
test_fn = lambda epoch , env_step : policy . set_eps ( eps_test ),
stop_fn = lambda mean_rewards : mean_rewards >= env . spec . reward_threshold ,
logger = logger ,
). run ()
print ( f"Finished training in { result . timing . total_time } seconds" )保存/加載訓練有素的策略(與加載torch.nn.module完全相同):
torch . save ( policy . state_dict (), 'dqn.pth' )
policy . load_state_dict ( torch . load ( 'dqn.pth' ))觀看35 fps的代理商:
policy . eval ()
policy . set_eps ( eps_test )
collector = ts . data . Collector ( policy , env , exploration_noise = True )
collector . collect ( n_episode = 1 , render = 1 / 35 )檢查在張板中保存的數據:
$ tensorboard --logdir log/dqn請閱讀文檔以進行高級使用。
天蘇仍在開發中。不斷添加進一步的算法和功能,我們始終歡迎捐款,以幫助提高天蘇更好。如果您想做出貢獻,請查看此鏈接。
如果您覺得天舒(Tianshou)有用,請在您的出版物中引用它。
@article{tianshou,
author = {Jiayi Weng and Huayu Chen and Dong Yan and Kaichao You and Alexis Duburcq and Minghao Zhang and Yi Su and Hang Su and Jun Zhu},
title = {Tianshou: A Highly Modularized Deep Reinforcement Learning Library},
journal = {Journal of Machine Learning Research},
year = {2022},
volume = {23},
number = {267},
pages = {1--6},
url = {http://jmlr.org/papers/v23/21-1127.html}
}蒂安肖得到了歐洲歐洲研究所的支持,後者致力於提供長期的支持和發展。
Tianshou以前是基於TensorFlow的加固學習平台。您可以查看分支priv以獲取更多詳細信息。非常感謝Haosheng Zou在0.1.1之前在Tianshou的開創性工作。
我們要感謝Tsail和Tsinghua大學人工智能研究所提供瞭如此出色的AI研究平台。
mujoco-py是一個舊的包裹,不建議用於新項目。它僅用於與較舊項目的兼容性。另請注意,與蒙特雷更新的MacOS可能存在兼容性問題。 ↩