
Tianshou (天授) - это библиотека подкрепления (RL), основанная на чистом питорхе и гимназии. Основные особенности Тяньхоу с первого взгляда:
В отличие от других библиотек обучения подкрепления, которые могут иметь сложные кодовые базы, недружелюбные API высокого уровня или не оптимизированы для скорости, Tianshou обеспечивает высокопроизводительные, модульные структуры и удобные интерфейсы для создания обучающих средств для глубокого армирования. Еще один аспект, который отличает Tianshou,-это его общность: он поддерживает онлайн и автономные RL, многоагентные RL и алгоритмы на основе моделей.
Tianshou стремится обеспечить краткие реализации, как для исследователей, так и для практиков, не жертвуя гибкостью.
Поддерживаемые алгоритмы включают:
Другие примечательные черты:
На китайском языке Тяньхоу означает божественно рукоположенное, будучи приведенным к дару рождения. Tianshou - это подкрепляющая платформа обучения, а природа RL не учится у людей. Таким образом, принятие «tianshou» означает, что у учителя нет учителя, но скорее учиться на самостоятельном взаимодействии с окружающей средой.
«天授» 意指上天所授 引申为与生具有的天赋。天授是强化学习平台 , 而强化学习算法并不是向人类学习的 , 所以取 «天授» 意思是没有老师来教 , 而是自己通过跟环境不断交互来进行学习。
Тяньхоу в настоящее время принимает на PYPI и Conda-Forge. Требуется Python> = 3.11.
Для установки самой последней версии Tianshou наилучшим образом является клонировать репозиторий и установить его с помощью поэзии (которую вам нужно сначала установить на свою систему)
git clone [email protected]:thu-ml/tianshou.git
cd tianshou
poetry install Вы также можете установить требования DEV, добавив --with dev или дополнительными средствами для, скажем, Mujoco и ускорения с помощью Envpool, добавив --extras "mujoco envpool"
Если вы хотите установить несколько дополнительных дополнений, убедитесь, что вы включите их в одну команду. Последовательные вызовы по poetry install --extras xxx будут перезаписать предыдущие установки, оставляя только последние указанные дополнительные дополнения. Или вы можете установить все следующие дополнения, добавив --all-extras .
Доступные дополнения:
atari (для среды атари)box2d (для среда Box2d)classic_control (для классического управления (дискретной) среды)mujoco (для среды Mujoco)mujoco-py (для Legacy Mujoco-Py среды 1 )pybullet (для пидбаллетов)robotics (для среда гимназий-роботовики)vizdoom (для среда Vizdoom)envpool (для интеграции Envpool)argparse (чтобы иметь возможность запустить примеры API высокого уровня)В противном случае вы можете установить последний выпуск от PYPI (в настоящее время далеко позади мастера) со следующей командой:
$ pip install tianshouЕсли вы используете Anaconda или Miniconda, вы можете установить Tianshou из Conda-Forge:
$ 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 | ✔ | |||
| Ray/Rllib | ➖ (1) | ✔ | ||
| Вращение | ||||
| Дофамин | ||||
| Acme | ➖ (1) | ✔ | ||
| Образец фабрики | ➖ | |||
| Тяньхоу | ✔ |
(1): Он имеет непрерывную интеграцию, но скорость покрытия недоступна
Тяньхоу тестируется. В отличие от других платформ RL, наши тесты включают в себя полную процедуру обучения агентов для всех реализованных алгоритмов . Наши тесты потерпят неудачу, если какое -либо из агентов не сможет достичь постоянного уровня производительности в ограниченные эпохи. Таким образом, наши тесты обеспечивают воспроизводимость. Проверьте страницу действий GitHub для получения более подробной информации.
Результаты атари и эталоны Mujoco можно найти в примерах/ Atari/ и примерах/ Mujoco/ Polders соответственно. Наши результаты Mujoco достигают или превышают уровень производительности большинства существующих критериев.
Все алгоритмы реализуют следующий, очень общий API:
__init__ : инициализировать политику;forward : вычислить действия на основе заданных наблюдений;process_buffer : начальный буфер процесса, который полезен для некоторых автономных алгоритмов обученияprocess_fn : данные предварительного обработки из буфера воспроизведения (поскольку мы переформулировали все алгоритмы в алгоритмы на основе воспроизведения);learn : учиться на данной партии данных;post_process_fn : обновить буфер воспроизведения из процесса обучения (например, приоритетный буфер для воспроизведения необходимо обновить вес);update : основной интерфейс для обучения, то есть process_fn -> learn -> post_process_fn .Реализация этого API достаточно для того, чтобы новый алгоритм был применим в Tianshou, что экспериментация с новыми подходами особенно просты.
Tianshou обеспечивает два уровня API:
Далее, давайте рассмотрим пример применения с использованием среды гимназии Cartpole . Мы применим алгоритм обучения Deep Q (DQN) с использованием обоих API.
Чтобы начать, нам нужен какой -то импорт.
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 алгоритма для исследования. Мы хотим использовать случайные разведки во время развертывания (обратный вызов поезда), но мы не делаем при оценке производительности агента в тестовых средах (тестовый обратный вызов).
Найдите скрипт в примерах/discrete/discrete_dqn_hl.py. Вот пробег (с сокращением времени обучения):

Найдите много дальнейших применений API высокого уровня в examples/ папке; Ищите сценарии, заканчивающиеся _hl.py . Обратите внимание, что большинство из этих примеров требуют дополнительного пакета argparse (установите его, добавив --extras argparse при вызове поэзии).
Теперь рассмотрим аналогичный пример в процедурном API. Найдите полный скрипт в примерах/Discrete/Discrete_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 кадром в секунду:
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:
$ 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 поддерживается Институтом Европы Appliedai, который стремится обеспечить долгосрочную поддержку и развитие.
Тяньхоу ранее был платформой для подкрепления, основанной на Tensorflow. Вы можете проверить Branch priv для получения более подробной информации. Большое спасибо новаторской работе Haosheng Zou для Tianshou до версии 0.1.1.
Мы хотели бы поблагодарить Tsail and Institute of Artifical Intelligence Университета Цинхуа за предоставление такой отличной исследовательской платформы AI.
mujoco-py -это устаревший пакет и не рекомендуется для новых проектов. Он включен только для совместимости со старыми проектами. Также обратите внимание, что могут возникнуть проблемы с совместимостью с MacOS новым, чем Monterey. ↩