
Tianshou (天授) adalah perpustakaan pembelajaran penguatan (RL) berdasarkan pytorch murni dan gimnasium. Silsilah fitur utama Tianshou adalah:
Tidak seperti perpustakaan pembelajaran penguatan lainnya, yang mungkin memiliki basis kode yang kompleks, API tingkat tinggi yang tidak ramah, atau tidak dioptimalkan untuk kecepatan, Tianshou menyediakan kerangka kerja yang berkinerja tinggi, modularisasi dan antarmuka yang ramah pengguna untuk membangun agen pembelajaran penguatan yang mendalam. Satu lagi aspek yang membedakan Tianshou adalah umumnya: ia mendukung RL online dan offline, RL multi-agen, dan algoritma berbasis model.
Tianshou bertujuan memungkinkan implementasi ringkas, baik untuk peneliti dan praktisi, tanpa mengorbankan fleksibilitas.
Algoritma yang didukung meliputi:
Fitur penting lainnya:
Dalam bahasa Cina, Tianshou berarti ditahbiskan secara ilahi, diturunkan dari karunia dilahirkan. Tianshou adalah platform pembelajaran penguatan, dan sifat RL tidak belajar dari manusia. Jadi mengambil "Tianshou" berarti bahwa tidak ada guru untuk belajar, melainkan untuk belajar sendiri melalui interaksi yang konstan dengan lingkungan.
“天授” 意指上天所授 , 引申为与生具有的天赋。天授是强化学习平台 , 而强化学习算法并不是向人类学习的 , 所以取 “天授” 意思是没有老师来教 , 而是自己通过跟环境不断交互来进行学习。
Tianshou saat ini diselenggarakan di PYPI dan Conda-Forge. Itu membutuhkan python> = 3.11.
Untuk menginstal versi terbaru Tianshou, cara terbaik adalah mengkloning repositori dan menginstalnya dengan puisi (yang perlu Anda instal pada sistem Anda terlebih dahulu)
git clone [email protected]:thu-ml/tianshou.git
cd tianshou
poetry install Anda juga dapat menginstal persyaratan dev dengan menambahkan --with dev atau ekstra untuk mujoco dan akselerasi oleh envpool dengan menambahkan --extras "mujoco envpool"
Jika Anda ingin menginstal beberapa tambahan, pastikan Anda memasukkannya dalam satu perintah. Panggilan berurutan ke poetry install --extras xxx akan menimpa instalasi sebelumnya, hanya menyisakan ekstra terakhir yang diinstal. Atau Anda dapat menginstal semua ekstra berikut dengan menambahkan --all-extras .
Ekstra yang tersedia adalah:
atari (untuk lingkungan Atari)box2d (untuk lingkungan Box2D)classic_control (untuk lingkungan kontrol klasik (diskrit))mujoco (untuk lingkungan Mujoco)mujoco-py (untuk Lingkungan Mujoco-Py Legacy 1 )pybullet (untuk lingkungan pybullet)robotics (untuk lingkungan gimnasium-Robotics)vizdoom (untuk lingkungan vizdoom)envpool (untuk integrasi Envpool)argparse (untuk dapat menjalankan contoh API tingkat tinggi)Jika tidak, Anda dapat menginstal rilis terbaru dari PYPI (saat ini jauh di belakang master) dengan perintah berikut:
$ pip install tianshouJika Anda menggunakan Anaconda atau Miniconda, Anda dapat memasang Tianshou dari Conda-Forge:
$ conda install tianshou -c conda-forgeAtau untuk instalasi puisi, Anda juga dapat menginstal versi sumber terbaru melalui GitHub:
$ pip install git+https://github.com/thu-ml/tianshou.git@master --upgradeAkhirnya, Anda dapat memeriksa instalasi melalui konsol Python Anda sebagai berikut:
import tianshou
print ( tianshou . __version__ )Jika tidak ada kesalahan yang dilaporkan, Anda telah berhasil memasang Tianshou.
Tutorial dan dokumentasi API diselenggarakan di Tianshou.readthedocs.io.
Temukan contoh skrip dalam uji/ dan contoh/ folder.
| Platform RL | Dokumentasi | Cakupan Kode | Jenis petunjuk | Pembaruan terakhir |
|---|---|---|---|---|
| Stabil-baselines3 | ✔️ | |||
| Ray/rllib | ➖ (1) | ✔️ | ||
| Spinningup | ||||
| Dopamin | ||||
| PUNCAK | ➖ (1) | ✔️ | ||
| Contoh pabrik | ➖ | |||
| Tianshou | ✔️ |
(1): memiliki integrasi berkelanjutan tetapi laju cakupan tidak tersedia
Tianshou diuji dengan ketat. Berbeda dengan platform RL lainnya, tes kami mencakup prosedur pelatihan agen lengkap untuk semua algoritma yang diimplementasikan . Tes kami akan gagal sekali jika ada agen yang gagal mencapai tingkat kinerja yang konsisten pada zaman terbatas. Tes kami dengan demikian memastikan reproduktifitas. Lihat halaman Tindakan GitHub untuk lebih detail.
Hasil benchmark Atari dan Mujoco dapat ditemukan dalam contoh/ atari/ dan contoh/ mujoco/ folder masing -masing. Hasil mujoco kami mencapai atau melampaui tingkat kinerja sebagian besar tolok ukur yang ada.
Semua algoritma menerapkan API berikut, sangat umum:
__init__ : inisialisasi kebijakan;forward : Hitung tindakan berdasarkan pengamatan yang diberikan;process_buffer : Proses buffer awal, yang berguna untuk beberapa algoritma pembelajaran offlineprocess_fn : Data preprocess dari buffer replay (karena kami telah merumuskan ulang semua algoritma untuk memutar ulang algoritma berbasis buffer);learn : Belajar dari kumpulan data yang diberikan;post_process_fn : Perbarui buffer replay dari proses pembelajaran (misalnya, buffer replay yang diprioritaskan perlu memperbarui berat);update : Antarmuka utama untuk pelatihan, yaitu, process_fn -> learn -> post_process_fn .Implementasi API ini cukup untuk algoritma baru yang dapat diterapkan di dalam Tianshou, membuat percobaan dengan pendekatan baru secara langsung.
Tianshou menyediakan dua level API:
Berikut ini, mari kita pertimbangkan contoh aplikasi menggunakan lingkungan gimnasium Cartpole . Kami akan menerapkan Algoritma Pembelajaran Jaringan Q Deep Q (DQN) menggunakan kedua API.
Untuk memulai, kami membutuhkan beberapa impor.
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
) Dalam API tingkat tinggi, dasar untuk eksperimen RL adalah ExperimentBuilder yang dengannya kami dapat membangun percobaan yang kemudian kami cari. Karena kami ingin menggunakan DQN, kami menggunakan spesialisasi DQNExperimentBuilder . Impor lainnya berfungsi untuk menyediakan opsi konfigurasi untuk percobaan kami.
API tingkat tinggi menyediakan semantik deklaratif yang sebagian besar, yaitu kode tersebut hampir secara eksklusif berkaitan dengan konfigurasi yang mengontrol apa yang harus dilakukan (daripada bagaimana melakukannya).
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 ()Pembuat percobaan mengambil tiga argumen:
watch=True ) untuk sejumlah episode ( watch_num_episodes=100 ). Kami telah menonaktifkan kegigihan, karena kami tidak ingin menyimpan log pelatihan, agen atau konfigurasinya untuk penggunaan di masa depan.num_epochs=10 )step_per_epoch=10000 ). Setiap zaman terdiri dari serangkaian langkah pengumpulan data (peluncuran) dan langkah -langkah pelatihan. Parameter step_per_collect mengontrol jumlah data yang dikumpulkan di setiap langkah pengumpulan dan setelah setiap langkah pengumpulan, kami melakukan langkah pelatihan, menerapkan pembaruan berbasis gradien berdasarkan sampel data ( batch_size=64 ) yang diambil dari buffer data yang telah dikumpulkan. Untuk perincian lebih lanjut, lihat dokumentasi SamplingConfig .Kami kemudian melanjutkan untuk mengkonfigurasi beberapa parameter algoritma DQN itu sendiri dan model jaringan saraf yang ingin kami gunakan. Detail khusus DQN adalah penggunaan panggilan balik untuk mengonfigurasi parameter Epsilon algoritma untuk eksplorasi. Kami ingin menggunakan eksplorasi acak selama peluncuran (callback kereta api), tetapi kami tidak ketika mengevaluasi kinerja agen di lingkungan pengujian (callback tes).
Temukan skrip dalam contoh/diskrit/diskrit_dqn_hl.py. Berikut menjalankan (dengan waktu pelatihan yang dipotong pendek):

Temukan banyak aplikasi lebih lanjut dari API tingkat tinggi dalam examples/ folder; Cari skrip yang diakhiri dengan _hl.py . Perhatikan bahwa sebagian besar contoh ini memerlukan paket tambahan argparse (instal dengan menambahkan --extras argparse saat memohon puisi).
Sekarang mari kita pertimbangkan contoh analog dalam API prosedural. Temukan skrip lengkap dalam contoh/diskrit/diskrit_dqn.py.
Pertama, impor beberapa paket yang relevan:
import gymnasium as gym
import torch
from torch . utils . tensorboard import SummaryWriter
import tianshou as tsTentukan beberapa hiper-parameter:
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 , 10Inisialisasi logger:
logger = ts . utils . TensorboardLogger ( SummaryWriter ( 'log/dqn' ))
# For other loggers, see https://tianshou.readthedocs.io/en/master/01_tutorials/05_logger.htmlMembuat lingkungan:
# 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 )])Buat jaringan serta pengoptimalnya:
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 )Siapkan kebijakan dan kolektor:
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 methodAyo Latih:
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" ) Simpan/muat kebijakan terlatih (persis sama dengan memuat torch.nn.module ):
torch . save ( policy . state_dict (), 'dqn.pth' )
policy . load_state_dict ( torch . load ( 'dqn.pth' ))Tonton agen dengan 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 )Periksa data yang disimpan di Tensorboard:
$ tensorboard --logdir log/dqnHarap baca dokumentasi untuk penggunaan lanjutan.
Tianshou masih dalam pengembangan. Algoritma dan fitur lebih lanjut terus ditambahkan, dan kami selalu menyambut kontribusi untuk membantu membuat Tianshou lebih baik. Jika Anda ingin berkontribusi, silakan periksa tautan ini.
Jika Anda menganggap Tianshou berguna, silakan kutip di publikasi Anda.
@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 didukung oleh Appliedai Institute for Europe, yang berkomitmen untuk memberikan dukungan dan pengembangan jangka panjang.
Tianshou sebelumnya adalah platform pembelajaran penguatan berdasarkan TensorFlow. Anda dapat memeriksa Cabang priv untuk lebih detail. Terima kasih banyak kepada karya perintis Haosheng Zou untuk Tianshou sebelum versi 0.1.1.
Kami ingin mengucapkan terima kasih kepada Tsail dan Institute for Artificial Intelligence, Tsinghua University karena menyediakan platform penelitian AI yang sangat baik.
mujoco-py adalah paket warisan dan tidak direkomendasikan untuk proyek baru. Ini hanya disertakan untuk kompatibilitas dengan proyek yang lebih lama. Perhatikan juga bahwa mungkin ada masalah kompatibilitas dengan macOS yang lebih baru dari Monterey. ↩