
Tianshou (天授) هي مكتبة تعلم التعزيز (RL) تعتمد على Pytorch النقي والصالة الرياضية. ميزات Tianshou الرئيسية في لمحة هي:
على عكس مكتبات التعلم التعزيز الأخرى ، التي قد تحتوي على قواعد رمزية معقدة ، وواجهة برمجة التطبيقات غير الودية عالية المستوى ، أو لم يتم تحسينها للسرعة ، فإن Tianshou يوفر إطارًا عالي الأداء ومعيار وواجهات سهلة الاستخدام لبناء عوامل التعلم العميقة. أحد الجوانب الأخرى التي تميز Tianshou بعموميتها: وهي تدعم عبر الإنترنت وغير متصل RL ، و RL متعدد الوكلاء ، والخوارزميات القائمة على النماذج.
تهدف Tianshou إلى تمكين تطبيقات موجزة ، سواء للباحثين والممارسين ، دون التضحية بالمرونة.
تشمل الخوارزميات المدعومة:
ميزات أخرى جديرة بالملاحظة:
باللغة الصينية ، تعني Tianshou مرسومًا إلهيًا ، حيث يتم اشتقاقها إلى هدية الولادة. Tianshou هي منصة تعلم التعزيز ، ولا تتعلم طبيعة RL من البشر. لذا فإن أخذ "Tianshou" يعني أنه لا يوجد معلم يتعلم منه ، بل للتعلم من خلال التفاعل المستمر مع البيئة.
"天授" 意指上天所授 , 引申为与生具有的天赋。天授是强化学习平台 , , 所以取 "天授" 意思是没有老师来教 , 而是自己通过跟环境不断交互来进行学习。
يتم استضافة Tianshou حاليًا على Pypi و Conda-Forge. يتطلب بيثون> = 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 (للبيئات Mujoco-Py Legacy 1 )pybullet (لبيئات 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 | الوثائق | تغطية الكود | اكتب تلميحات | التحديث الأخير |
|---|---|---|---|---|
| مستقر baselines3 | ✔ | |||
| راي/rllib | ➖ (1) | ✔ | ||
| الغزل | ||||
| الدوبامين | ||||
| ذروة | ➖ (1) | ✔ | ||
| عينة مصنع | ➖ | |||
| تيانشو | ✔ |
(1): يحتوي على تكامل مستمر ولكن معدل التغطية غير متوفر
يتم اختبار تيانشو بدقة. على عكس منصات RL الأخرى ، تتضمن اختباراتنا إجراء تدريب الوكيل الكامل لجميع الخوارزميات المنفذة . سوف تفشل اختباراتنا بمجرد فشل أي من الوكلاء في تحقيق مستوى ثابت من الأداء على الحقبة المحدودة. وهكذا تضمن اختباراتنا التكاثر. تحقق من صفحة إجراءات GitHub لمزيد من التفاصيل.
يمكن العثور على نتائج Atari و Mujoco القياسية في الأمثلة/ atari/ والأمثلة/ mujoco/ المجلدات على التوالي. تصل نتائج Mujoco الخاصة بنا أو تتجاوز مستوى أداء معظم المعايير الحالية.
جميع الخوارزميات تنفذ واجهة برمجة تطبيقات عامة للغاية:
__init__ : تهيئة السياسة ؛forward : حساب الإجراءات بناءً على الملاحظات المعطاة ؛process_buffer : معالجة المخزن المؤقت الأولي ، وهو مفيد لبعض خوارزميات التعلم في وضع عدم الاتصالprocess_fn : البيانات المسبقة من المخزن المؤقت لإعادة التشغيل (نظرًا لأننا قمنا بإعادة صياغة جميع الخوارزميات لإعادة تشغيل الخوارزميات المستندة إلى المخزن المؤقت) ؛learn : تعلم من مجموعة معينة من البيانات ؛post_process_fn : قم بتحديث المخزن المؤقت لإعادة التشغيل من عملية التعلم (على سبيل المثال ، يحتاج المخزن المؤقت لإعادة التشغيل الأولوية إلى تحديث الوزن) ؛update : الواجهة الرئيسية للتدريب ، IE ، process_fn -> learn -> post_process_fn .يكفي تطبيق API هذا لتكون خوارزمية جديدة لتطبيقها داخل Tianshou ، مما يجعل التجارب مع طرق جديدة واضحة بشكل خاص.
يوفر Tianshou مستويين 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
) في واجهة برمجة التطبيقات ذات المستوى العالي ، يكون أساس تجربة RL هو ExperimentBuilder يمكننا بناء التجربة التي نسعى إليها بعد ذلك. نظرًا لأننا نريد استخدام DQN ، فإننا نستخدم التخصص DQNExperimentBuilder . تعمل الواردات الأخرى على توفير خيارات التكوين لتجربتنا.
توفر واجهة برمجة التطبيقات عالية المستوى الدلالات إلى حد كبير ، أي أن الكود يهتم بشكل حصري تقريبًا بالتكوين الذي يتحكم في ما يجب القيام به (بدلاً من كيفية القيام بذلك).
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 الخاصة بالخوارزمية للاستكشاف. نريد استخدام استكشاف عشوائي أثناء التمرير (رد الاتصال على القطار) ، لكننا لا نفعل عند تقييم أداء الوكيل في بيئات الاختبار (رد الاتصال).
ابحث عن البرنامج النصي في أمثلة/منفصل/منفصل _dqn_hl.py. إليك عملية تشغيل (مع اختصار وقت التدريب):

ابحث عن العديد من التطبيقات الإضافية لواجهة برمجة التطبيقات عالية المستوى في examples/ المجلد ؛ ابحث عن البرامج النصية التي تنتهي بـ _hl.py . لاحظ أن معظم هذه الأمثلة تتطلب الحزمة الإضافية argparse (قم بتثبيتها بإضافة --extras argparse عند استدعاء الشعر).
دعونا الآن نفكر في مثال مماثل في واجهة برمجة التطبيقات الإجرائية. ابحث عن البرنامج النصي الكامل في أمثلة/منفصل/منفصل.
أولاً ، استيراد بعض الحزم ذات الصلة:
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 أفضل. إذا كنت ترغب في المساهمة ، يرجى مراجعة هذا الرابط.
إذا وجدت 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 لأوروبا ، الذي يلتزم بتوفير الدعم والتطوير على المدى الطويل.
كان Tianshou سابقًا منصة تعلم تعزيز تعتمد على TensorFlow. يمكنك التحقق من الفرع priv لمزيد من التفاصيل. شكرًا جزيلاً لأعمال Haosheng Zou الرائدة في Tianshou قبل الإصدار 0.1.1.
نود أن نشكر Tsail والمعهد على الذكاء الاصطناعي ، جامعة Tsinghua على توفير منصة أبحاث AI ممتازة.
mujoco-py هي حزمة قديمة ولا ينصح بها للمشاريع الجديدة. يتم تضمينه فقط للتوافق مع المشاريع القديمة. لاحظ أيضًا أنه قد تكون هناك مشكلات توافق مع MacOS الأحدث من Monterey. ↩