تعلم التعزيز (RL) هو واحد من ثلاثة أنماط رئيسية لتعلم الآلة، والآخران هما التعلم الموجه والتعلم غير الموجه. في RL، يتعلم العامل التفاعل مع بيئته لتحقيق أقصى قدر من المكافآت التراكمية. يتعلم الإجراء الأمثل تحت شروط بيئية مختلفة من خلال المحاولة والخطأ. تعلم التعزيز بتغذية راجعة من الإنسان (RLHF) يسمح للعامل بتعديل السلوك بناءً على مدخلات الإنسان في كل خطوة.
يحل RL مشاكل مثل السيارات ذاتية القيادة، والتداول التلقائي، ولاعبي الكمبيوتر في ألعاب الفيديو، وتدريب الروبوتات، وغيرها. عند استخدام الشبكات العصبية العميقة لتطبيق خوارزميات RL، يُطلق عليها تعلم التعزيز العميق.
في هذا البرنامج التعليمي، سأريك كيفية البدء باستخدام Gymnasium، وهو مكتبة Python مفتوحة المصدر لتطوير ومقارنة خوارزميات تعلم التعزيز. سأوضح كيفية إعداده، واستكشاف بيئات RL المختلفة، واستخدام Python لبناء عامل بسيط لتنفيذ خوارزمية RL.
ما هو Gymnasium؟
Gymnasium هو مكتبة بايثون مفتوحة المصدر مصممة لدعم تطوير خوارزميات التعلم المعزز. لتسهيل البحث والتطوير في التعلم المعزز، يوفر Gymnasium:
- مجموعة واسعة من البيئات، من الألعاب البسيطة إلى المشكلات التي تحاكي السيناريوهات الواقعية.
- واجهات برمجة تطبيقات سلسة وملفات تغليف للتفاعل مع البيئات.
- القدرة على إنشاء بيئات مخصصة والاستفادة من إطار عمل واجهة برمجة التطبيقات.
يمكن للمطورين بناء خوارزميات التعلم المعزز واستخدام استدعاءات واجهة برمجة التطبيقات للمهام مثل:
- تمرير الإجراء المختار من قبل العميل إلى البيئة.
- معرفة حالة البيئة والمكافأة بعد كل إجراء.
- تدريب النموذج.
- اختبار أداء النموذج.
صالة ألعاب OpenAI مقابل صالة Farama
لم تلتزم OpenAI بموارد كبيرة لتطوير صالة الألعاب لأنها لم تكن أولوية تجارية للشركة. تم إنشاء مؤسسة Farama لتوحيد وصيانة مكتبات التعلم المعزز على المدى الطويل. صالة الألعاب هي نسخة فرعية من صالة OpenAI. صالة الألعاب 0.26.2 هي بديل مباشر لصالة الألعاب 0.26.2. مع النسخة الفرعية، تهدف Farama إلى إضافة طرق وظيفية (بالإضافة إلى الطرق القائمة على الفئات) لجميع استدعاءات واجهة البرمجة، ودعم بيئات المتجهات، وتحسين الأغلفة. الهدف العام هو جعل الإطار أكثر نظافة وكفاءة.
إعداد صالة الألعاب
يتطلب Gymnasium إصدارات محددة (وليس أحدث الإصدارات) من برامج الاعتماد المختلفة مثل NumPy وPyTorch. لذلك، نوصي بإنشاء بيئة جديدة باستخدام Conda أو venv أو دفتر ملاحظات جديد لتثبيت واستخدام Gymnasium وتشغيل برامج RL.
يمكنك استخدام هذا دفتر بيانات DataLab لمتابعة التعليمات.
تثبيت Gymnasium
لتثبيت Gymnasium على خادم أو جهاز محلي، نفذ:
$ pip install gymnasium
لتثبيت باستخدام ملاحظة مثل Colab من Google أو DataLab من DataCamp، استخدم:
!pip install gymnasium
الأمر أعلاه يثبت Gymnasium والإصدارات الصحيحة من التبعيات.
استكشاف بيئات Gymnasium
اعتبارًا من نوفمبر 2024، يتضمن Gymnasium أكثر من 60 بيئة مدمجة. للاطلاع على البيئات المدمجة المتاحة، استخدم وظيفة gym.envs.registry.all()
، كما هو موضح في المثال أدناه:
import gymnasium as gym for i in gym.envs.registry.keys(): print(i)
يمكنك أيضًا زيارة صفحة الصالة الرياضية. العمود الأيسر يحتوي على روابط إلى جميع البيئات. تتضمن صفحة كل بيئة تفاصيل حولها، مثل الإجراءات، الحالات، الخ.
البيئات منظمة في فئات مثل التحكم الكلاسيكي، Box2D، وغيرها. أدناه، أقدم بعض البيئات الشائعة في كل مجموعة:
- التحكم الكلاسيكي: هذه هي البيئات القنونية المستخدمة في تطوير تعلم الآلة التعزيزي؛ فهي تشكل أساس أمثلة الكتب المختلفة. إنها توفر مزيجًا من التعقيد والبساطة المناسب لاختبار ومقارنة خوارزميات تعلم الآلة التعزيزي الجديدة. تشمل بيئات التحكم الكلاسيكية في الصالة الرياضية:
- Acrobot
- Cart Pole
- Mountain Car Discrete
- Mountain Car Continuous
- Pendulum
- Box2D: Box2D هو محرك فيزياء ثنائي الأبعاد للألعاب. تشمل البيئات المعتمدة على هذا المحرك ألعابًا بسيطة مثل:
- المركبة القمرية
- سباق السيارات
- ToyText: هذه بيئات صغيرة وبسيطة غالبًا ما تستخدم لتصحيح أخطاء خوارزميات التعلم المعزز. تعتمد العديد من هذه البيئات على نموذج العالم الشبكي الصغير وألعاب الورق البسيطة. تتضمن الأمثلة:
- البلاك جاك
- التاكسي
- البحيرة المتجمدة
- MuJoCo: الديناميات متعددة المفاصل مع الاتصال (MuJoCo) هو محرك فيزياء مفتوح المصدر يحاكي البيئات لتطبيقات مثل الروبوتات، وعلم الحركة، والتعلم الآلي، إلخ. تشمل بيئات MuJoCo في Gymnasium:
- النملة
- القافز
- الإنسان الآلي
- السباح
- والمزيد
بالإضافة إلى البيئات المدمجة، يمكن استخدام Gymnasium مع العديد من البيئات الخارجية باستخدام نفس واجهة برمجة التطبيقات.
سنستخدم أحد بيئات التحكم الكلاسيكية المعروفة في هذا الدليل. لاستيراد بيئة معينة، استخدم الأمر .make()
ومرر اسم البيئة كوسيط. على سبيل المثال، لإنشاء بيئة جديدة تعتمد على CartPole (الإصدار 1)، استخدم الأمر أدناه:
import gymnasium as gym env = gym.make("CartPole-v1")
فهم مفاهيم التعلم المعزز في Gymnasium
بإيجاز، التعلم المعزز يتكون من وكيل (مثل الروبوت) يتفاعل مع بيئته. تحدد سياسة معينة تصرفات الوكيل. اعتمادًا على تصرفات الوكيل، تمنح البيئة مكافأة (أو عقوبة) في كل خطوة زمنية. يستخدم الوكيل التعلم المعزز لمعرفة السياسة المثلى التي تعظم المكافآت الإجمالية التي يحصل عليها الوكيل.
مكونات بيئة التعلم المعزز
مكونات بيئة التعلم التعظيمي تتضمن ما يلي:
- البيئة: النظام الخارجي، العالم، أو السياق. يتفاعل الوكيل مع البيئة في سلسلة من الخطوات الزمنية. في كل خطوة زمنية، يقوم البيئة استنادًا إلى إجراء الوكيل بما يلي:
- تعطي مكافأة (أو عقوبة)
- تقرر الحالة التالية
- الحالة: تمثيل رياضي للتكوين الحالي للبيئة.
- على سبيل المثال، يمكن أن تتضمن حالة بيئة البندول موقع البندول وسرعته الزاوية في كل خطوة زمنية.
- الحالة النهائية: حالة لا تؤدي إلى حالات جديدة/أخرى.
- العميل: الخوارزمية التي تراقب البيئة وتتخذ إجراءات مختلفة بناءً على هذه المراقبة. الهدف من العميل هو تحقيق أعلى مكافآت ممكنة.
- على سبيل المثال، يقرر العميل مدى قوة وفي أي اتجاه يجب دفع البندول.
- الملاحظة: تمثيل رياضي لرؤية الوكيل للبيئة، المكتسبة، على سبيل المثال، باستخدام أجهزة الاستشعار.
- العمل: القرار الذي يتخذه الوكيل قبل المضي قدمًا إلى الخطوة التالية. يؤثر العمل على حالة البيئة التالية ويكسب الوكيل مكافأة.
- المكافأة: ردود فعل من البيئة إلى الوكيل. يمكن أن تكون إيجابية أو سلبية، اعتمادًا على العمل وحالة البيئة.
- العائد: العائد التراكمي المتوقع على مر الزمن في المستقبل. يمكن خصم المكافآت من الخطوات الزمنية المستقبلية باستخدام عامل خصم.
- السياسة: استراتيجية الوكيل بشأن الإجراءات التي يتعين اتخاذها في حالات مختلفة. يتم تمثيلها عادةً كمصفوفة احتمالية، P، التي تربط الحالات بالإجراءات.
- بالنظر إلى مجموعة محدودة من الحالات الممكنة و الإجراءات الممكنة، فإن العنصر Pmn في المصفوفة يشير إلى احتمالية اتخاذ الإجراء an في الحالة sm.
- الحلقة: سلسلة من الخطوات الزمنية من الحالة الابتدائية (العشوائية) حتى يصل الوكيل إلى حالة نهائية.
مساحة الملاحظة ومساحة العمل
الملاحظة هي المعلومات التي يجمعها الوكيل عن البيئة. يمكن لوكيل، على سبيل المثال، روبوت، جمع المعلومات البيئية باستخدام المستشعرات. من الناحية المثالية، يجب أن يكون الوكيل قادرًا على ملاحظة الحالة الكاملة، والتي تصف جميع جوانب البيئة. في الممارسة العملية، يستخدم الوكيل ملاحظاته كبديل عن الحالة. وبالتالي، تحدد الملاحظات أفعال الوكيل.
مساحة تشبه مجموعة رياضية تقريباًX وتحتوي على جميع الحالات الممكنة لـ X. مساحة X تحدد أيضاً هيكل (البنية النحوية والتنسيق) لجميع العناصر من النوع X. كل بيئة من بيئات الجمنازيوم تحتوي على مساحتين، مساحة العمل، action_space
، ومساحة الملاحظة، observation_space
. كل من مساحات العمل والملاحظة مشتقة من الفئة الرئيسية gymnasium.spaces.Space
الفائقة.
مساحة المراقبة
تعتبر مساحة المراقبة هي المساحة التي تشمل جميع المراقبات الممكنة. كما أنها تحدد الشكل الذي يتم تخزين المراقبات فيه. تُمثل مساحة المراقبة عادةً ككائن من نوع الـ Box. وهذا هو ndarray الذي يصف معلمات المراقبات. يحدد الـ Box حدود كل بعد. يمكنك عرض مساحة المراقبة لبيئة ما باستخدام طريقة observation_space
:
print("observation space: ", env.observation_space)
في حالة بيئة CartPole-v1
، يبدو الإخراج كما في المثال أدناه:
observation space: Box([-4.8 -inf -0.41887903 -inf], [4.8 inf 0.41887903 inf], (4,), float32)
في هذا المثال، CartPole-v1
يحتوي فضاء الملاحظة على 4 أبعاد. العناصر الأربعة لمصفوفة الملاحظة هي:
- موضع العربة – يتراوح بين -4.8 و +4.8
- سرعة العربة – تتراوح بين – إلى +
- زاوية القطب – تتراوح بين -0.4189 و +0.4189
- سرعة الزاوية للقطب – تتراوح بين – إلى +
لرؤية مثال على مصفوفة الملاحظات الفردية، استخدم الأمر .reset()
.
observation, info = env.reset() print("observation: ", observation)
في حالة بيئة CartPole-v1
، يبدو المخرج كما هو موضح في المثال أدناه:
[ 0.03481963 -0.0277232 0.01703267 -0.04870504]
تت correspond العناصر الأربعة في هذه المصفوفة إلى الكميات الأربعة الملاحظة (موضع العربة، سرعة العربة، زاوية العمود، سرعة دوران العمود)، كما تم شرحه سابقًا.
فضاء العمل
يشمل فضاء العمل جميع الإجراءات الممكنة التي يمكن أن يتخذها الوكيل. كما يعرف فضاء العمل التنسيق الذي يتم فيه تمثيل الإجراءات. يمكنك عرض فضاء العمل لبيئة ما باستخدام action_space
الطريقة:
print("action space: ", env.action_space)
في حالة بيئة CartPole-v1
، يبدو الإخراج كما في المثال أدناه:
action space: Discrete(2)
في حالة بيئة CartPole-v1
، مساحة العمل هي متقطعة. هناك إجمالي اثنين من الإجراءات التي يمكن للوكيل اتخاذها:
- 0: دفع العربة إلى اليسار
- 1: دفع العربة إلى اليمين
بناء وكيل RL الأول الخاص بك مع جيمناسيوم
في الأقسام السابقة، استكشفنا المفاهيم الأساسية لـ RL والصالة الرياضية. تُظهر هذه القسم كيفية استخدام الصالة الرياضية لبناء وكيل RL.
إنشاء وإعادة تعيين البيئة
الخطوة الأولى هي إنشاء مثيل للبيئة. لإنشاء بيئات جديدة، استخدم الطريقة .make()
.
env = gym.make('CartPole-v1')
تتغير تفاعلات الوكيل بالبيئة. تُعيد الطريقة .reset()
البيئة إلى حالة ابتدائية. بشكل افتراضي، تُهيئ البيئة إلى حالة عشوائية. يمكنك استخدام معلمة SEED
مع الطريقة .reset()
لتهيئة البيئة إلى نفس الحالة في كل مرة يتم فيها تشغيل البرنامج. يعرض الكود أدناه كيفية القيام بذلك:
SEED = 1111 env.reset(seed=SEED)
عينات الإجراءات تتضمن أيضًا عنصر العشوائية. للتحكم في هذه العشوائية والحصول على مسار تدريب قابل لإعادة الإنتاج بالكامل، يمكننا زرع مولدات الأرقام العشوائية في NumPy و PyTorch:
np.random.seed(SEED) torch.manual_seed(SEED)
العمليات العشوائية مقابل العمليات الذكية
في كل خطوة في عملية ماركوف، يمكن للعامل اختيار إجراء بشكل عشوائي واستكشاف البيئة حتى يصل إلى حالة النهاية. من خلال اختيار الإجراءات عشوائيًا:
- قد يستغرق الأمر وقتًا طويلاً للوصول إلى حالة النهاية.
- المكافآت التراكمية أقل بكثير مما كانت عليه.
تدريب العامل على تحسين اختيار الإجراءات بناءً على التجارب السابقة (من التفاعل مع البيئة) يكون أكثر كفاءة لتعظيم المكافآت على المدى الطويل.
يبدأ الوكيل غير المدرب بالإجراءات العشوائية استنادًا إلى سياسة تم تهيئتها عشوائيًا. تُمثل هذه السياسة عادةً باستخدام شبكة عصبية. خلال التدريب، يتعلم الوكيل السياسة الأمثل التي تزيد من المكافآت. في RL، يُشار إلى عملية التدريب أيضًا باسم تحسين السياسة.
هناك أساليب مختلفة لـ تحسين السياسة. تصف معادلات بيلمان كيفية حساب قيمة سياسات RL وتحديد السياسة الأمثل. في هذا البرنامج التعليمي، سنستخدم تقنية بسيطة تسمى ميل السياسة. توجد طرق أخرى مثل تحسين السياسة القريبة (PPO).
تنفيذ وكيل بسيط بميل السياسة
لبناء وكيل RL يستخدم تدرجات السياسة، نقوم بإنشاء شبكة عصبية لتنفيذ السياسة، وكتابة دوال لحساب العوائد والخسارة من المكافآت خطوة بخطوة واحتمالات العمل، وتحديث السياسة بشكل تكراري باستخدام تقنيات الانتشار العكسي القياسية.
إعداد شبكة السياسة
نستخدم شبكة عصبية لتنفيذ السياسة. نظرًا لأن CartPole-v1
هو بيئة بسيطة، نستخدم شبكة عصبية لها:
- أبعاد إدخال تساوي أبعاد مساحة ملاحظات البيئة.
- طبقة خفية واحدة تحتوي على 64 نيوترون.
- أبعاد المخرجات تساوي أبعاد مساحة أفعال البيئة.
لذا، وظيفة شبكة السياسة هي تحويل الحالات الملاحظة إلى أفعال. عند إعطاء ملاحظة إدخال، تتنبأ بالفعل الصحيح. الكود أدناه ينفذ شبكة السياسة:
class PolicyNetwork(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, dropout): super().__init__() self.layer1 = nn.Linear(input_dim, hidden_dim) self.layer2 = nn.Linear(hidden_dim, output_dim) self.dropout = nn.Dropout(dropout) def forward(self, x): x = self.layer1(x) x = self.dropout(x) x = F.relu(x) x = self.layer2(x) return x
جمع المكافآت والتمرير الأمامي
كما ذكر، في كل خطوة من عملية ماركوف، تمنح البيئة مكافأة بناءً على فعل وحالة الوكيل. الهدف في التعلم المعزز هو تعظيم العائد الكلي.
- العائد في كل خطوة زمنية هو المجموع التراكمي للمكافآت التي تم الحصول عليها من البداية حتى تلك الخطوة.
- يتم الحصول على العائد الإجمالي في كل حلقة من خلال تجميع جميع المكافآت خطوة بخطوة من تلك الحلقة. وبالتالي، فإن العائد الإجمالي هو العائد في آخر نقطة زمنية (عندما يصل الوكيل إلى حالة نهائية).
في الممارسة العملية، أثناء تجميع المكافآت، من الشائع أن:
- تعديل المكافآت المستقبلية باستخدام عامل خصم.
- تطبيع مصفوفة العوائد خطوة بخطوة لضمان تدريب سلس ومستقر.
يوضح الكود أدناه كيفية القيام بذلك:
def calculate_stepwise_returns(rewards, discount_factor): returns = [] R = 0 for r in reversed(rewards): R = r + R * discount_factor returns.insert(0, R) returns = torch.tensor(returns) normalized_returns = (returns - returns.mean()) / returns.std() return normalized_returns
التمرير الأمامي يتكون من تشغيل الوكيل بناءً على السياسة الحالية حتى يصل إلى حالة النهاية وجمع مكافآت التدرج واحتمالات الإجراء. تشرح الخطوات أدناه كيفية تنفيذ التمرير الأمامي:
- إعادة تهيئة البيئة إلى حالة ابتدائية.
- تهيئة الذاكرات المؤقتة لتخزين احتماليات الإجراء، والمكافآت، والعائد التراكمي
- استخدام الدالة
.step()
لتشغيل الوكيل بشكل تكراري في البيئة حتى تنتهي: - الحصول على ملاحظة حالة البيئة.
- احصل على الإجراء المتوقع من السياسة بناءً على الملاحظة.
- استخدم وظيفة
Softmax
لتقدير احتمالية اتخاذ الإجراء المتوقع. - قم بمحاكاة توزيع احتمالي تصنيفي استنادًا إلى هذه الاحتماليات المقدرة.
- عيّن هذا التوزيع للحصول على إجراء العميل.
- قدر اللوغاريتمي للاحتمالية للإجراء المختار من التوزيع المحاكى.
- أضف اللوغاريتم للاحتماليات للإجراءات والمكافآت من كل خطوة إلى البوافر الخاصة بها.
- قدر القيم المعمول بها والمخفضة للعوائد في كل خطوة استنادًا إلى المكافآت.
def forward_pass(env, policy, discount_factor): log_prob_actions = [] rewards = [] done = False episode_return = 0 policy.train() observation, info = env.reset() while not done: observation = torch.FloatTensor(observation).unsqueeze(0) action_pred = policy(observation) action_prob = F.softmax(action_pred, dim = -1) dist = distributions.Categorical(action_prob) action = dist.sample() log_prob_action = dist.log_prob(action) observation, reward, terminated, truncated, info = env.step(action.item()) done = terminated or truncated log_prob_actions.append(log_prob_action) rewards.append(reward) episode_return += reward log_prob_actions = torch.cat(log_prob_actions) stepwise_returns = calculate_stepwise_returns(rewards, discount_factor) return episode_return, stepwise_returns, log_prob_actions
تحديث السياسة بناءً على المكافآت
الخسارة تمثل الكمية التي نطبق عليها انحدار التدرج. الهدف في RL هو تعظيم العوائد. لذلك، نستخدم قيمة العائد المتوقع كبديل للخسارة. يتم حساب قيمة العائد المتوقع كضرب العوائد المتوقعة عن كل خطوة ولوغاريتم الإجراءات الخطوية. الكود أدناه يحسب الخسارة:
def calculate_loss(stepwise_returns, log_prob_actions): loss = -(stepwise_returns * log_prob_actions).sum() return loss
لتحديث السياسة، تقوم بتشغيل الانتشار العكسي بالنسبة لدالة الخسارة. تقوم الدالة update_policy()
باستدعاء الدالة calculate_loss()
. ثم تقوم بتشغيل الانتشار العكسي على هذه الخسارة لتحديث معلمات السياسة، أي أوزان نموذج شبكة السياسة.
def update_policy(stepwise_returns, log_prob_actions, optimizer): stepwise_returns = stepwise_returns.detach() loss = calculate_loss(stepwise_returns, log_prob_actions) optimizer.zero_grad() loss.backward() optimizer.step() return loss.item()
يتم تحديث السياسة بناءً على تدرج العوائد ويسمى طريقة تدرج السياسة.
تدريب السياسة
لدينا الآن جميع المكونات اللازمة لتدريب وتقييم السياسة. نقوم بتنفيذ حلقة التدريب كما هو موضح في الخطوات التالية:
قبل البدء، نعلن عن المعلمات الفائقة، وننشئ سياسة، ونقوم بإنشاء مُحسّن:
- أعلن عن المعلمات الفائقة كثوابت بايثون:
MAX_EPOCHS
هو الحد الأقصى لعدد التكرارات التي نحن مستعدون لتنفيذها لتدريب السياسة.DISCOUNT_FACTOR
يحدد الأهمية النسبية للمكافآت من الخطوات الزمنية المستقبلية. قيمة معامل الخصم 1 تعني أن جميع المكافآت لها نفس الأهمية، في حين أن القيمة 0 تعني أن المكافأة من الخطوة الزمنية الحالية فقط هي المهمة.N_TRIALS
هو عدد الحلقات التي نقوم فيها بمتوسط العوائد لتقييم أداء العميل. نقرر أن التدريب ناجح إذا كان متوسط العائد علىN_TRIALS
الحلقات أعلى من العتبة.REWARD_THRESHOLD
: إذا كانت السياسة قادرة على تحقيق عائد أكبر من العتبة، فإنها تعتبر ناجحة.DROPOUT
يحدد نسبة الأوزان التي يجب أن يتم تصفيرها عشوائيًا. تقوم وظيفة الإسقاط بتعيين نسبة من أوزان النموذج إلى صفر بشكل عشوائي. هذا يقلل من الاعتماد على خلايا عصبية معينة ويمنع الإفراط في التكييف، مما يجعل الشبكة أكثر قوة.معدل_التعلم
يحدد مدى التعديل الذي يمكن أن تتم عليه معلمات السياسة في كل خطوة. يكون تحديث المعلمات في كل تكرار هو حاصل ضرب الميل ومعدل التعلم.- حدد السياسة كنموذج من الفئة
PolicyNetwork
(منفذة سابقًا). - قم بإنشاء مُحسِّن باستخدام خوارزمية Adam ومعدل التعلم.
لتدريب السياسة، نقوم بتشغيل خطوات التدريب تكراريًا حتى يكون المتوسط العائد (على N_TRIALS
) أكبر من عتبة الجائزة:
- لكل حلقة، قم بتشغيل المرور الأمامي مرة واحدة. اجمع احتمالية السجل للإجراءات، والعوائد الخطوية، والعائد الإجمالي من تلك الحلقة. اتراكم العوائد الحلقية في مصفوفة.
- حساب الخسارة باستخدام سجل الاحتمالات والعوائد الخطوية. تشغيل الانتشار العكسي على الخسارة. استخدام المحسن لتحديث معلمات السياسة.
- تحقق مما إذا كانت العائدات المتوسطة على
N_TRIALS
تتجاوز عتبة الجائزة.
ينفذ الكود أدناه هذه الخطوات:
def main(): MAX_EPOCHS = 500 DISCOUNT_FACTOR = 0.99 N_TRIALS = 25 REWARD_THRESHOLD = 475 PRINT_INTERVAL = 10 INPUT_DIM = env.observation_space.shape[0] HIDDEN_DIM = 128 OUTPUT_DIM = env.action_space.n DROPOUT = 0.5 episode_returns = [] policy = PolicyNetwork(INPUT_DIM, HIDDEN_DIM, OUTPUT_DIM, DROPOUT) LEARNING_RATE = 0.01 optimizer = optim.Adam(policy.parameters(), lr = LEARNING_RATE) for episode in range(1, MAX_EPOCHS+1): episode_return, stepwise_returns, log_prob_actions = forward_pass(env, policy, DISCOUNT_FACTOR) _ = update_policy(stepwise_returns, log_prob_actions, optimizer) episode_returns.append(episode_return) mean_episode_return = np.mean(episode_returns[-N_TRIALS:]) if episode % PRINT_INTERVAL == 0: print(f'| Episode: {episode:3} | Mean Rewards: {mean_episode_return:5.1f} |') if mean_episode_return >= REWARD_THRESHOLD: print(f'Reached reward threshold in {episode} episodes') break
أخيرًا، استدعاء الدالة main()
لتدريب السياسة:
main()
استخدم هذا دليل عمل DataLab لتشغيل الخوارزمية أعلاه مباشرة وحل بيئة CartPole باستخدام RL.
تقنيات متقدمة في الصالة الرياضية
بعد أن قدمنا كيفية تنفيذ خوارزمية RL، نناقش الآن بعض التقنيات المتقدمة المستخدمة عادة في الممارسة.
استخدام الهندسيات المُبنية مُسبقًا
تنفيذ خوارزميات RL من البداية هو عملية طويلة وصعبة، خاصة بالنسبة للبيئات المعقدة وسياسات ذات أحدث التقنيات.
بديل أكثر عملية هو استخدام برامج مثل Stable Baselines3. يأتي مع تطبيقات مجربة وموثوقة لخوارزميات التعلم المعزز. يتضمن عملاء مدربين مسبقًا، ونصوص تدريب، وأدوات تقييم، ووحدات لرسم الرسوم البيانية وتسجيل الفيديوهات.
Ray RLib هي أداة شائعة أخرى للتعلم المعزز. تم تصميم RLib كحل قابل للتوسع، مما يسهل تنفيذ خوارزميات التعلم المعزز على أنظمة متعددة وحدات معالجة الرسومات. كما أنه يدعم التعلم المعزز متعدد العملاء، مما يفتح آفاقًا جديدة مثل:
- التعلم المستقل متعدد العملاء: كل عميل يعامل العملاء الآخرين كجزء من البيئة.
- التدريب التعاوني للعوامل المتعددة: مجموعة من العوامل تشترك في نفس السياسة والدوال القيمية وتتعلم من تجارب بعضها البعض بشكل متوازي.
- التدريب التنافسي: تتنافس العوامل (أو مجموعات من العوامل) ضد بعضها في بيئات تشبه الألعاب التنافسية.
مع RLib وStable Baselines3، يمكنك استيراد واستخدام البيئات من OpenAI Gymnasium.
البيئات المخصصة
البيئات المعبأة مع Gymnasium هي الخيار الصحيح لاختبار استراتيجيات التعلم المعزز الجديدة وتدريب السياسات. ومع ذلك، بالنسبة لمعظم التطبيقات العملية، تحتاج إلى إنشاء واستخدام بيئة تعكس بدقة المشكلة التي تريد حلها. يمكنك استخدام Gymnasium لإنشاء بيئة مخصصة. الميزة في استخدام بيئات Gymnasium المخصصة هي أن العديد من الأدوات الخارجية مثل RLib و Stable Baselines3 تم تكوينها بالفعل للعمل مع هيكل واجهة برمجة تطبيقات Gymnasium.
لإنشاء بيئة مخصصة في Gymnasium، تحتاج إلى تحديد:
- مساحة المراقبة.
- الشروط النهائية.
- مجموعة الإجراءات التي يمكن للوكيل الاختيار منها.
- كيفية تهيئة البيئة (عندما يتم استدعاء دالة
reset()
). - كيف تقرر البيئة الحالة التالية بناءً على إجراءات الوكيل (عندما يتم استدعاء دالة
step()
).
للتعرف على المزيد، اتبع دليل Gymnasium لإنشاء بيئات مخصصة.
أفضل الممارسات لاستخدام Gymnasium
جرّب بيئات مختلفة
الكود في هذا الدليل أظهر كيفية تنفيذ خوارزمية تدرج السياسة في بيئة CartPole. هذه بيئة بسيطة ذات مساحة عمل متقطعة. لفهم التعلم المعزز بشكل أفضل، ننصحك بتطبيق نفس خوارزمية تدرج السياسة (وخوارزميات أخرى، مثل PPO) في بيئات أخرى.
على سبيل المثال، بيئة Pendulum تحتوي على مجال عمل مستمر. تتكون من إدخال واحد يُمثل بمتغير مستمر – العزم (المقدار والاتجاه) المطبق على القلادة في أي حالة معينة. يمكن أن يأخذ هذا العزم أي قيمة بين -2 و +2.
تجربة مع خوارزميات مختلفة في بيئات متنوعة تساعدك على فهم أفضل لأنواع مختلفة من حلول RL وتحدياتها.
مراقبة تقدم التدريب
تتكون بيئات RL في كثير من الأحيان من الروبوتات، الأرجوحات، السيارات الجبلية، ألعاب الفيديو، إلخ. تصوّر أفعال الوكيل داخل البيئة يعطي فهمًا أفضل وأكثر بديهية لأداء السياسة.
في Gymnasium، تقوم الطريقة env.render()
بتصوير تفاعلات الوكيل مع البيئة. تعرض بشكل رسومي الحالة الحالية للبيئة – شاشات اللعبة، موقع الأرجوحة أو العربة، إلخ. التغذية البصرية لأفعال الوكيل واستجابات البيئة تساعد في مراقبة أداء الوكيل وتقدمه خلال عملية التدريب.
هناك أربعة أوضاع تصوير: “human”، “rgb_array”، “ansi”، و”rgb_array_list”. لتصوير أداء الوكيل، استخدم وضع التصوير “human”. يتم تحديد وضع التصوير عند تهيئة البيئة. على سبيل المثال:
env = gym.make(‘CartPole-v1’, render_mode=’human’)
لأداء التقديم، قم بإدراج .render()
الطريقة بعد كل إجراء يتم من قبل الوكيل (من خلال استدعاء .step()
الطريقة). يوضح الشيفرة الزائفة أدناه كيفية القيام بذلك:
while not done: … step, reward, terminated, truncated, info = env.step(action.item()) env.render() …
حل مشاكل الأخطاء الشائعة
يجعل Gymnasium التفاعل مع بيئات RL المعقدة سهلاً. ومع ذلك، هو برنامج محدث باستمرار بالعديد من التبعيات. لذا، من الضروري متابعة بعض أنواع الأخطاء الشائعة.
عدم تطابق الإصدارات
- عدم تطابق إصدار صالة الألعاب الرياضية: تمت إلتفاف حزمة برامج صالة الألعاب الرياضية Farama عن الإصدار 0.26.2 من صالة الألعاب الرياضية المفتوحة من OpenAI. هناك تغييرات مهمة بين الإصدارات القديمة لصالة الألعاب والإصدارات الجديدة من صالة الألعاب. العديد من التنفيذات المتاحة للجمهور تعتمد على الإصدارات القديمة لصالة الألعاب وقد لا تعمل مباشرة مع الإصدار الأخير. في مثل هذه الحالات، من الضروري إما الرجوع في التثبيت إلى إصدار أقدم أو تكييف الشيفرة للعمل مع الإصدار الأحدث.
- عدم تطابق إصدار البيئة: تحتوي العديد من بيئات الصالة الرياضية على إصدارات مختلفة. على سبيل المثال، هناك بيئتين لـ CartPole –
CartPole-v1
وCartPole-v0
. على الرغم من أن سلوك البيئة هو نفسه في كلا الإصدارين، إلا أن بعض المعلمات، مثل طول الحلقة، عتبة المكافأة، إلخ، قد تكون مختلفة. قد لا يؤدي سياسة مدربة على إصدار واحد بشكل جيد على إصدار آخر من نفس البيئة. يجب عليك تحديث معلمات التدريب وإعادة تدريب السياسة لكل إصدار من البيئة. - تضارب في إصدارات التبعيات: يعتمد Gymnasium على تبعيات مثل NumPy و PyTorch. اعتبارًا من ديسمبر 2024، آخر إصدارات هذه التبعيات هي
numpy 2.1.3
وtorch 2.5.1
. ومع ذلك، Gymnasium يعمل بشكل أفضل معtorch 1.13.0
وnumpy 1.23.3
. قد تواجه مشاكل إذا قمت بتثبيت Gymnasium في بيئة تحتوي بالفعل على هذه التبعيات. نوصي بتثبيت Gymnasium والعمل به في بيئة Conda جديدة.
مشاكل التقارب
- المعلمات الفائقة: مثل الخوارزميات الأخرى لتعلم الآلة، فإن سياسات RL حساسة للمعلمات الفائقة مثل معدل التعلم، عامل الخصم، إلخ. نوصي بتجربة وضبط المعلمات الفائقة يدويًا أو باستخدام تقنيات آلية مثل البحث الشبكي والبحث العشوائي.
- الاستكشاف مقابل الاستغلال: بالنسبة لبعض فئات السياسات (مثل PPO)، يعتمد الوكيل استراتيجية ثنائية: استكشاف البيئة لاكتشاف مسارات جديدة واعتماد نهج جشع لتعظيم المكافآت بناءً على المسارات المعروفة حتى الآن. إذا قام بالاستكشاف بشكل زائد، فإن السياسة لا تتقارب. على الجانب الآخر، فإنه لن يجرب المسار الأمثل إذا لم يقم بالاستكشاف بما فيه الكفاية. لذا، العثور على التوازن المناسب بين الاستكشاف والاستغلال أمر أساسي. كما أن من الشائع أيضًا إعطاء الأولوية للاستكشاف في الحلقات الأولى والاستغلال في الحلقات اللاحقة أثناء التدريب.
استقرار التدريب
- معدلات تعلم كبيرة: إذا كان معدل التعلم مرتفعًا جدًا، فإن معلمات السياسة تتعرض لتحديثات كبيرة في كل خطوة. قد يؤدي ذلك بالإمكان إلى عدم تحقيق مجموعة القيم المثلى. الحل الشائع هو تضاؤل معدل التعلم تدريجيًا، مما يضمن تحديثات أصغر وأكثر استقرارًا أثناء اقتراب التدريب من الانحسار.
- استكشاف مفرط: الكثير من العشوائية (الانحراف) في اختيار الإجراءات يمنع التقارب ويؤدي إلى تباين كبير في وظيفة الخسارة بين الخطوات التالية. للحصول على عملية تدريب مستقرة ومتقاربة، قم بتحقيق توازن بين الاستكشاف واستغلال البيانات.
- اختيار خاطئ للخوارزمية: الخوارزميات البسيطة مثل تدرج السياسة قد تؤدي إلى تدريب غير مستقر في بيئات معقدة ذات مساحات عمل وحالات كبيرة. في مثل هذه الحالات، نوصي باستخدام خوارزميات أكثر قوة مثل PPO وTrust Region Policy Optimization (TRPO). هذه الخوارزميات تتجنب التحديثات الكبيرة للسياسة في كل خطوة ويمكن أن تكون أكثر استقرارًا.
- العشوائية: تعتبر خوارزميات التعلم المعزز حساسة بشكل ملحوظ للحالات الأولية والعشوائية المتأصلة في اختيار الإجراءات. عندما يكون تشغيل التدريب غير مستقر، يمكن أحيانًا استقراره باستخدام بذور عشوائية مختلفة أو من خلال إعادة تهيئة السياسة.
الخاتمة
في هذا البرنامج التعليمي، استكشفنا المبادئ الأساسية لـ RL، ناقشنا جيمنازيوم كحزمة برمجيات تتمتع بواجهة برمجية نظيفة للتفاعل مع بيئات RL المختلفة، وأظهرنا كيفية كتابة برنامج Python لتنفيذ خوارزمية RL بسيطة وتطبيقها في بيئة جيمنازيوم.
بعد فهم الأساسيات في هذا البرنامج التعليمي، أوصي باستخدام بيئات جيمنازيوم لتطبيق مفاهيم RL لحل مشاكل عملية مثل تحسين مسار سيارات التاكسي و محاكاة تداول الأسهم.
Source:
https://www.datacamp.com/tutorial/reinforcement-learning-with-gymnasium