انطلق في التعلم التعزيزي: خطوتك الأولى الملموسة اليوم

بدء التعلم التعزيزي: الأساسيات في مقال واحد — كود حقيقي، مخططات وخطوات ملموسة، مقتطفات من دورة مكونة من 42 درسًا.

انطلق في التعلم التعزيزي: خطوتك الأولى الملموسة اليوم

أفضل طريقة لتعلم Débuter Reinforcement Learning هي بالممارسة. يساعدك هذا المقال على البدء بخطوات عملية مستمدة من دورة تتكون من 42 درسًا — ما يمكنك من الحصول على نتيجة أولى اليوم.

tl;dr
  • موارد الدورة وتثبيت البيئة
  • مقدمة في التعلم التعزيزي
  • المفاهيم الأساسية للتعلم التعزيزي
  • MDP الجزء 1 - الحالات والإجراءات والمكافآت
  • MDP الجزء 2 - السياسة ومعادلات بيلمان
~$ cat ./parcours.md # بدء تعلم التعزيز — 11 فصلاً
01
موارد الدورة وتثبيت البيئة
→ موارد الدورة والمقدمة→ تثبيت Python وAnaconda وTensorFlow+ 3 دروس أخرى
02
مقدمة في التعلم المعزز
→ ما هو التعلم المعزز؟→ مقارنة التعلم الخاضع للإشراف وغير الخاضع للإشراف والتعلم المعزز+ 2 دروس أخرى
03
المفاهيم الأساسية للتعلم المعزز
→ تفاعل الوكيل والبيئة→ الاستكشاف مقابل الاستغلال — المعضلة الكبرى+ 2 دروس أخرى
04
MDP الجزء 1 - الحالات والإجراءات والمكافآت
→ تعريف الـ MDP وخاصية ماركوف→ الحالات والإجراءات والمكافآت في MDP+ 2 دروس أخرى
05
MDP الجزء 2 - السياسة ومعادلات بيلمان
→ السياسة المثلى مقابل دون المثلى→ دوال القيمة V(s) و Q(s,a)+ 2 دروس أخرى
06
Q-Learning
→ أساسيات Q-Learning→ تحديث قيم Q والتقارب+ 1 دروس أخرى
07
طرق مونت كارلو
→ مقدمة في طرق مونت كارلو→ مونت كارلو مقابل تعلم TD+ 1 دروس أخرى
08
البرمجة الديناميكية وتعلم TD
→ مقدمة في البرمجة الديناميكية→ طرق TD(0) و TD(λ)+ 1 دروس أخرى
🏁
المشروع النهائي (+ 3 فصول في الطريق)
→ ستخرج بمشروع ملموس وقابل للعرض

الفصل 02 – بطاقة المصطلحات الكاملة

NOTEهدف هذه البطاقة — توفر جميع التعريفات الأساسية للتعلم التعزيزي في مكان واحد، من مفهوم الحالة إلى الخوارزميات. تعمل هذه البطاقة كمرجع طوال الدورة.

نموذج تعلم آلي يتعلم فيه الوكيل كيف يتصرف داخل بيئة من خلال تنفيذ إجراءات وتلقي مكافآت أو عقوبات في المقابل.

TIPالآلية :
  1. يلاحظ الوكيل حالة البيئة
  2. يختار إجراءً للتنفيذ
  3. يلاحظ النتيجة : حالة جديدة + مكافأة (إيجابية أو سلبية)
  4. بتكرار هذه الدورة، يتعلم الإجراءات التي تعظم المكافأة على المدى الطويل

الحالة — State st مكون أساسي

وصف كامل لـالوضع الحالي للبيئة في اللحظة t. هي المعلومات المتاحة للوكيل ليقرر الإجراء المناسب.

نوع الحالة الوصف مثال
الحالة الأولية الموضع البدائي في بداية الحلقة الخلية (1,1) في متاهة
الحالة الوسيطة أي حالة أثناء الحلقة (غير نهائية) الخلايا التي تم اجتيازها في المتاهة
الحالة النهائية حالة نهاية الحلقة (فوز أو خسارة) مخرج المتاهة أو حفرة
NOTEمنفصل مقابل مستمر : قد تكون الحالة منفصلة (مثل: خلايا مرقمة في متاهة — يمكن عدها) أو مستمرة (مثل: موقع GPS بالأمتار، زاوية بالدرجات — قيم رقمية لا نهائية).

الإجراء at مكون أساسي

ما يقرر الوكيل فعله في حالة معينة. تشكل جميع الإجراءات الممكنة فضاء الإجراءات.

TIPإجراءات منفصلة
عدد محدود من الإجراءات القابلة للعد.
أمثلة : أعلى، أسفل، يسار، يمين (متاهة) ؛ 0 أو 1 (CartPole)
NOTEإجراءات مستمرة
قيم رقمية ضمن مجال.
أمثلة : قوة من 0 إلى 10 نيوتن ؛ زاوية عجلة القيادة من −30° إلى +30°

المكافأة rtReward إشارة التعلم

إشارة رقمية يتلقاها الوكيل بعد كل إجراء. هي الطريقة الوحيدة التي تخبر بها البيئة الوكيل إن كان إجراؤه جيدًا أم سيئًا.

NOTEالمكافأة الفورية (3.6)
المكافأة المستلمة مباشرة بعد إجراء في الخطوة t. تعطي تغذية راجعة فورية على جودة إجراء واحد.
الترميز : rt+1
NOTEالمكافأة طويلة الأمد (3.7)
مجموع المكافآت المتراكمة على كامل الحلقة (أو إلى ما لا نهاية). هذا ما يسعى الوكيل فعليًا لتعظيمه.
الترميز : Gt = rt+1 + rt+2 + rt+3 + …

الخصم — معامل الخصم γ (gamma) معامل رئيسي

قيمة بين 0 و1 تزن المكافآت المستقبلية. كلما كانت المكافأة أبعد زمنيًا، زاد "انخفاض قيمتها". هي العقوبة المطبقة على المكافآت المستقبلية.

NOTEγ قريب من 0
الوكيل "قصير النظر" : يفكر فقط في المكافأة الفورية. سلوك قصير الأمد.
TIPγ قريب من 1
الوكيل "مستقبلي" : يأخذ المكافآت المستقبلية بأهمية شبه متساوية. سلوك طويل الأمد.
NOTEالقيمة النموذجية : γ = 0.9 أو 0.99 في معظم التطبيقات العملية.

المنفعة — Utility / Return Gt الهدف النهائي

مجموع المكافآت المخصومة الكلي المحصل من الخطوة الزمنية t. هي القيمة التي يسعى الوكيل لتعظيمها. تُسمى أيضًا العائد أو التراكمي.

TIPبالعربية البسيطة : المنفعة = مجموع كل المكافآت المستقبلية، مع ترجيح يتناقص مع الوقت (بفضل الخصم γ). إجراء جيد الآن + إجراءات جيدة في المستقبل = منفعة عالية.
NOTEالمرادفات المستخدمة في الدورة : المكافأة طويلة الأمد، العائد، Return، التراكمي، Gt

السياسة — Policy π جوهر التعلم التعزيزي

استراتيجية القرار للوكيل : لكل حالة، تحدد الإجراء الواجب تنفيذه. هي "دماغ" الوكيل، ما يسعى لتعلمه.

بيئات بايثون الافتراضية

NOTEالهدف — فهم سبب استخدام البيئات الافتراضية، وكيفية تثبيت عدة إصدارات من بايثون بالتوازي، وكيفية إنشاء بيئة معزولة لكل مشروع — على ويندوز ولينكس (أوبونتو).

لماذا البيئات الافتراضية ؟

المشكلة بدون venv

الحل مع venv

البيئةبايثونالمكتباتالمشروع
myenv393.9TensorFlow 2.10, Gym 0.26دورة RL (القديمة)
myenv3103.10Streamlit 1.28, pandas 2.0لوحة القيادة
myenv3113.11TensorFlow 2.15, Gymnasiumدورة RL (الحالية)
rl-env3.12Gymnasium, NumPy, Matplotlibهذه الدورة

🪟 Windows   تثبيت عدة إصدارات من بايثون

NOTEقبل البدء — PowerShell بوضع المسؤول
بعض الأوامر تتطلب صلاحيات المسؤول. إذا ظهر خطأ في الأذونات عند تفعيل venv، نفذ أولاً في PowerShell :
output
# افتح PowerShell كمسؤول، ثم :
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# أجب بـ O (نعم) على التأكيد

قم بتنزيل وتثبيت كل إصدار من python.org/downloads. حدد «Add to PATH» للإصدار الأول فقط. للإصدارات التالية، ألغِ تحديد «Add to PATH» لتجنب التعارضات.

TIPنصيحة : عند تثبيت بايثون على ويندوز، يُثبت المشغل py تلقائيًا. يتيح لك استدعاء أي إصدار مثبت باستخدام py -3.10، py -3.11، إلخ.
output
python --version
# Python 3.x.x (الإصدار الافتراضي في PATH)

py -3.9 --version
# Python 3.9.x

py -3.10 --version
# Python 3.10.x

py -3.11 --version
# Python 3.11.x

py -3.12 --version
# Python 3.12.x

py -3.13 --version
# Python 3.13.x
output
# تحقق من الإصدار
py -3.9 --version

# أنشئ البيئة الافتراضية
py -3.9 -m venv myenv39

# فعّل البيئة (PowerShell)
.\myenv39\Scripts\activate

# يتغير الـ prompt : (myenv39) يشير إلى أن البيئة نشطة
(myenv39) python --version
# Python 3.9.x

(myenv39) pip install streamlit
(myenv39) pip show streamlit
# Name: streamlit
# Version: 1.x.x
# ...

# عطّل البيئة
(myenv39) deactivate
output
py -3.10 --version
py -3.10 -m venv myenv310

.\myenv310\Scripts\activate

(myenv310) python --version
# Python 3.10.x

(myenv310) pip install streamlit
(myenv310) pip show streamlit
(myenv310) deactivate
output
# Python 3.11
py -3.11 -m venv myenv311
.\myenv311\Scripts\activate
(myenv311) python --version
(myenv311) pip install streamlit
(myenv311) deactivate

# Python 3.12
py -3.12 -m venv myenv312
.\myenv312\Scripts\activate
(myenv312) python --version
(myenv312) pip install streamlit
(myenv312) deactivate

# Python 3.13
py -3.13 -m venv myenv313
.\myenv313\Scripts\activate
(myenv313) python --version
(myenv313) pip install streamlit
(myenv313) deactivate

🔗 SSH   الاتصال بجهاز Linux افتراضي من ويندوز

NOTEالسياق : إذا كنت تعمل على جهاز Linux افتراضي (VirtualBox، VMware...) أو خادم بعيد، يمكنك الاتصال به من ويندوز عبر SSH دون مغادرة طرفية ويندوز.

الخطوة 1 — تثبيت SSH على جهاز Linux الافتراضي

في طرفية جهاز Linux الافتراضي، كمستخدم جذر :

output
su                         # أو : sudo -s
apt install openssh-server -y
systemctl status ssh       # تحقق من الحالة
systemctl start ssh        # شغّل إذا لزم الأمر
systemctl enable ssh       # شغّل تلقائيًا عند الإقلاع

# ابحث عن عنوان IP للجهاز الافتراضي
ip -br addr
# lo               UNKNOWN        127.0.0.1/8
# eth0             UP             192.168.2.139/24   ← انسخ هذا الـ IP

أول سكريبت Gym – اختبار التثبيت

TIP😌 لا داعي للذعر — نحن نختبر فقط !
الهدف من هذا الدرس هو التحقق فقط من عمل بيئتك. ستقوم بنسخ ولصق السكريبتات وملاحظة النتائج. لا يلزم فهم كل شيء الآن — سيتم شرح كل سطر بالتفصيل في الفصول القادمة. تنفس، إنه مجرد اختبار بدء !
NOTEالهدف — تشغيل أول سكريبتات باستخدام Gymnasium والتأكد من عمل التثبيت. خياران : محليًا (Jupyter) أو مباشرة في Google Colab دون أي تثبيت.

الخيار أ – الاختبار محليًا (Jupyter)

إذا اتبعت الدرسين 01 و02 (تثبيت Anaconda + إعداد Jupyter)، فعّل بيئتك وشغّل Jupyter :

bash
conda activate rl-env
jupyter notebook

ثم انسخ السكريبتات أدناه إلى خلية ونفذ باستخدام Shift + Enter.

الخيار ب – الاختبار في Google Colab (لا شيء للتثبيت !)

TIPلم تثبت بايثون محليًا بعد ؟ لا مشكلة.
يعمل Google Colab مباشرة في المتصفح. لا يتطلب أي تثبيت — مثالي للاختبار الآن والتثبيت محليًا لاحقًا.

افتح دفترًا جديدًا على colab.research.google.com، ثم ثبت Gymnasium في الخلية الأولى :

bash
# Cellule 1 — Installation (Colab uniquement, déjà fait si vous êtes en local)
!pip install gymnasium[toy-text] matplotlib --quiet

ثم انسخ السكريبتات أدناه إلى الخلايا التالية. هذا كل شيء !

NOTEColab أو محلي — السكريبتات متطابقة. الفرق الوحيد هو خلية التثبيت أعلاه التي لا تحتاج لتشغيلها محليًا.

ما هو Gymnasium (سابقًا OpenAI Gym) ؟

Gymnasium هي المكتبة المرجعية لاختبار خوارزميات التعلم التعزيزي. توفر بيئات قياسية بواجهة موحدة.

البيئات الكلاسيكية

الواجهة العالمية

السكريبت 1 – استكشاف بيئة CartPole

TIP📋 انسخ والصق الكود فقط — لا تبحث عن فهم كل شيء الآن. سترى ما ينتجه CartPole من معلومات. سنفصل كل مصطلح (observation_space، action_space، إلخ) في الفصل 02.
output
import gymnasium as gym
import numpy as np

# Créer l'environnement
env = gym.make("CartPole-v1")
obs, info = env.reset(seed=42)

print("=== CartPole-v1 ===")
print(f"Espace d'états  : {env.observation_space}")
print(f"  Nombre de dimensions : {env.observation_space.shape[0]}")
print(f"  Valeurs min : {env.observation_space.low}")
print(f"  Valeurs max : {env.observation_space.high}")
print(f"\nEspace d'actions : {env.action_space}")
print(f"  Nombre d'actions : {env.action_space.n}")
print(f"  Actions : 0 (gauche), 1 (droite)")
print(f"\nObservation initiale : {obs}")
print(f"  [position cart, vitesse cart, angle bâton, vitesse bâton]")

env.close()

السكريبت 2 – وكيل عشوائي على CartPole

TIP🎲 وكيل يلعب عشوائيًا — هذه نقطة البداية. هذا السكريبت لا يفعل شيئًا ذكيًا : يختار إجراءات عشوائية. هذا هو baseline المرجعي. كل ما ستتعلمه في هذه الدورة سيمكن وكيلًا من أداء أفضل بكثير من ذلك. نفذ وراقب المكافآت — هذا كل شيء !
output
import gymnasium as gym
import numpy as np
import matplotlib.pyplot as plt

def run_random_agent(env_name, n_episodes=100):
    """Agent qui prend des actions aléatoires - notre baseline."""
    env = gym.make(env_name)
    total_rewards = []

    for episode in range(n_episodes):
        obs, info = env.reset()
        episode_reward = 0
        done = False

        while not done:
            # Action aléatoire (pas d'apprentissage)
            action = env.action_space.sample()
            obs, reward, terminated, truncated, info = env.step(action)
            episode_reward += reward
            done = terminated or truncated

        total_rewards.append(episode_reward)

    env.close()
    return total_rewards

# Exécuter l'agent aléatoire
rewards = run_random_agent("CartPole-v1", n_episodes=100)

print(f"Récompense moyenne : {np.mean(rewards):.2f}")
print(f"Récompense maximale : {np.max(rewards):.0f}")
print(f"Récompense minimale : {np.min(rewards):.0f}")

# Visualiser
plt.figure(figsize=(10, 4))
plt.plot(rewards, alpha=0.6, label="Récompense par épisode")
plt.axhline(np.mean(rewards), color='red', linestyle='--', label=f"Moyenne: {np.mean(rewards):.1f}")
plt.xlabel("Épisode")
plt.ylabel("Récompense totale")
plt.title("Agent aléatoire - CartPole-v1")
plt.legend()
plt.tight_layout()
plt.savefig("agent_aleatoire_cartpole.png")
plt.show()

السكريبت 3 – استكشاف FrozenLake (بيئة منفصلة)

TIP🗺️ سيكون FrozenLake ساحة اللعب الرئيسية في هذه الدورة. لا تقلق بشأن الحلقة أو الإجراءات اليدوية الآن — الهدف فقط رؤية أن البيئة تُشغل وتستجيب. سيشرح الفصل 03 كل شيء بالتفصيل.
output
import gymnasium as gym

# FrozenLake : grille 4x4 avec états discrets
env = gym.make("FrozenLake-v1", is_slippery=False)
obs, info = env.reset()

print("=== FrozenLake-v1 ===")
print(f"Espace d'états  : {env.observation_space.n} états (grille 4x4)")
print(f"Espace d'actions : {env.action_space.n} actions")
print(f"  0=gauche, 1=bas, 2=droite, 3=haut")
print(f"\nÉtat initial : {obs}")
print("\nVisualisez la grille :")
env.render()

# Boucle manuelle
actions_manuelles = [2, 2, 1, 1, 1, 2, 1, 2, 2]  # chemin vers la sortie
total_reward = 0

print("\n--- Simulation manuelle ---")
obs, _ = env.reset()
for i, action in enumerate(actions_manuelles):
    obs, reward, terminated, truncated, _ = env.step(action)
    total_reward += reward
    direction = ["←", "↓", "→", "↑"][action]
    print(f"Étape {i+1}: {direction}  État={obs}  Récompense={reward}")
    if terminated or truncated:
        break

print(f"\nRécompense totale : {total_reward}")
env.close()
TIPلماذا FrozenLake ؟ هذه البيئة مثالية للمبتدئين لأن لديها فضاء حالات منفصل (16 خلية). يمكنك تصور جدول Q بالكامل. CartPole لديه حالات مستمرة، ما يتطلب تقنيات أكثر تقدمًا.
va-plus-loin

يغطي هذا المقال المقتطفات الأكثر فائدة — الدورة الكاملة Débuter Reinforcement Learning (12 فصلاً، 42 درسًا، تمارين محلولة ومشروع نهائي) تأخذك إلى النهاية.

./acceder-au-cours-complet cours gratuit : Maîtriser Claude Code

الأسئلة الشائعة

كم من الوقت يستغرق تعلم Débuter Reinforcement Learning ؟
مع تقدم منظم (12 فصلاً، 42 درسًا قصيرًا وعمليًا)، يمكن الوصول إلى مستوى تشغيلي في بضعة أسابيع بمعدل 30 إلى 60 دقيقة يوميًا. المهم هو تطبيق كل مفهوم فورًا.
هل هناك متطلبات سابقة ؟
لا توجد متطلبات سابقة : تبدأ الدورة من الصفر، ويُقدم كل مفهوم قبل استخدامه.
من أين أبدأ عمليًا ؟
نفذ الأوامر الواردة في هذا المقال، ثم تابع الدورة الكاملة Débuter Reinforcement Learning : تتسلسل فيها الـ42 درسًا بالترتيب، مع تمارين ومشروع نهائي.

📬 هل تريد تلقي هذا النوع من الأدلة أسبوعيًا ؟ اشترك مجانًا — كود حقيقي، بدون كلام زائد.