
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可能存在兼容性问题。 ↩