التعلم المعزز: الآلة تتعلم بالتجربة والمكافأة
ما هو التعلم المعزز؟
تخيّل روبوتاً في مصنع يحاول تعلم أفضل طريقة لترتيب القطع على طبلية الشحن. في البداية يضع القطع عشوائياً — بعضها يسقط وبعضها لا يتوازن. لكن مع كل محاولة يحصل على مكافأة (ترتيب ناجح) أو عقوبة (قطعة سقطت). بعد آلاف المحاولات، يتعلم استراتيجية مثالية لم يبرمجها أحد يدوياً.
هذا هو التعلم المعزز (Reinforcement Learning - RL): وكيل (agent) يتفاعل مع بيئة (environment) ويتعلم السلوك الأمثل من خلال التجربة والخطأ، مُوجَّهاً بإشارات المكافأة.
المفاهيم الأساسية
العناصر الخمسة للتعلم المعزز
| العنصر | التعريف | مثال صناعي |
|---|---|---|
| الوكيل (Agent) | المتعلم وصانع القرار | نظام التحكم الذكي |
| البيئة (Environment) | كل ما يتفاعل معه الوكيل | خط الإنتاج والمعدات |
| الحالة (State) | وصف الوضع الحالي | درجة الحرارة، الضغط، السرعة |
| الإجراء (Action) | القرار الذي يتخذه الوكيل | زيادة السرعة، تقليل الحرارة |
| المكافأة (Reward) | إشارة تقييم الإجراء | +10 لقطعة سليمة، -50 لعطل |
السياسة (Policy)
السياسة هي استراتيجية الوكيل — دالة تحدد الإجراء المناسب لكل حالة. الهدف هو إيجاد السياسة المثلى التي تعظّم مجموع المكافآت على المدى الطويل.
السياسة: π(s) → a
أي: في الحالة s، اتخذ الإجراء a
دالة القيمة (Value Function)
تقدّر المكافأة المتوقعة الإجمالية بدءاً من حالة معينة. تصوّرها كتقدير المهندس الخبير: "لو بدأنا من هذا الوضع، كم سنربح على المدى الطويل؟"
# مثال مبسط: بيئة التحكم بدرجة حرارة الفرن
class FurnaceEnvironment:
def __init__(self):
self.target_temp = 200 # الهدف: 200°C
self.current_temp = 150 # البداية: 150°C
self.max_steps = 50
def get_state(self):
"""الحالة: الفرق عن الهدف"""
return round(self.current_temp - self.target_temp, 1)
def step(self, action):
"""
الإجراءات: 0 = تقليل التسخين، 1 = ثبات، 2 = زيادة التسخين
"""
if action == 0:
self.current_temp -= 5
elif action == 2:
self.current_temp += 5
# إضافة ضوضاء واقعية
self.current_temp += np.random.normal(0, 1)
# حساب المكافأة
error = abs(self.current_temp - self.target_temp)
if error < 2:
reward = 10 # ممتاز — قريب جداً من الهدف
elif error < 10:
reward = 1 # مقبول
else:
reward = -5 # بعيد — عقوبة
done = error > 50 # إنهاء إذا خرج عن السيطرة
return self.get_state(), reward, done
Q-Learning: التعلم بدون نموذج
Q-Learning هي أشهر خوارزمية RL كلاسيكية. تبني جدولاً (Q-Table) يخزّن قيمة كل زوج (حالة، إجراء) — أي "ما قيمة اتخاذ هذا الإجراء في هذه الحالة؟"
معادلة بيلمان (Bellman Equation)
Q(s, a) ← Q(s, a) + α × [r + γ × max Q(s', a') - Q(s, a)]
| الرمز | المعنى |
|---|---|
| α (ألفا) | معدل التعلم — كم نثق بالمعلومة الجديدة |
| γ (غاما) | عامل الخصم — أهمية المكافآت المستقبلية |
| r | المكافأة الفورية |
| max Q(s', a') | أفضل قيمة متوقعة من الحالة التالية |
import numpy as np
class QLearningAgent:
def __init__(self, n_states, n_actions, alpha=0.1, gamma=0.95, epsilon=0.1):
self.q_table = np.zeros((n_states, n_actions))
self.alpha = alpha # معدل التعلم
self.gamma = gamma # عامل الخصم
self.epsilon = epsilon # احتمال الاستكشاف
def choose_action(self, state):
"""استراتيجية إبسيلون-جشعة: استكشاف أحياناً، استغلال غالباً"""
if np.random.random() < self.epsilon:
return np.random.randint(self.q_table.shape[1]) # استكشاف عشوائي
return np.argmax(self.q_table[state]) # استغلال أفضل إجراء
def learn(self, state, action, reward, next_state):
"""تحديث Q-Table حسب معادلة بيلمان"""
best_next = np.max(self.q_table[next_state])
td_target = reward + self.gamma * best_next
td_error = td_target - self.q_table[state, action]
self.q_table[state, action] += self.alpha * td_error
# مثال: 21 حالة (فرق الحرارة من -50 إلى +50 بخطوة 5) و 3 إجراءات
agent = QLearningAgent(n_states=21, n_actions=3)
print(f"حجم Q-Table: {agent.q_table.shape}")
print("التدريب يبدأ بقيم صفرية ويتحسّن مع التكرار")
الاستكشاف مقابل الاستغلال (Exploration vs. Exploitation)
هذه المعضلة الجوهرية في RL: هل نجرّب إجراءات جديدة (استكشاف) أم نتمسك بأفضل ما نعرفه (استغلال)؟
تصوّر مهندس عمليات: هل يجرب إعدادات آلة جديدة قد تحسّن الإنتاج (لكن قد تسبب عيوباً)، أم يبقى على الإعدادات المضمونة الحالية؟
استراتيجية إبسيلون-جشعة (epsilon-greedy): بنسبة ε نستكشف عشوائياً، وبنسبة (1-ε) نستغل أفضل إجراء معروف. ε يبدأ مرتفعاً (كثير من الاستكشاف) وينخفض تدريجياً.
شبكات Q العميقة (Deep Q-Networks - DQN)
عندما يكون عدد الحالات ضخماً (مثل صورة كاميرا أو مئات قراءات الحساسات)، لا يمكن بناء جدول Q. الحل: استبداله بشبكة عصبية تقرّب دالة Q.
import tensorflow as tf
from tensorflow.keras import layers, models
def build_dqn(state_size, n_actions):
"""شبكة Q عميقة"""
model = models.Sequential([
layers.Dense(64, activation='relu', input_shape=(state_size,)),
layers.Dense(64, activation='relu'),
layers.Dense(n_actions, activation='linear') # قيمة Q لكل إجراء
])
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss='mse')
return model
# بيئة مع 20 حساس و 5 إجراءات ممكنة
dqn = build_dqn(state_size=20, n_actions=5)
dqn.summary()
حيل DQN المهمة
| التقنية | الغرض |
|---|---|
| ذاكرة التجربة (Experience Replay) | تخزين التجارب وإعادة تشغيلها عشوائياً لكسر الترابط الزمني |
| الشبكة الهدف (Target Network) | نسخة مجمّدة من الشبكة تُحدَّث دورياً لاستقرار التدريب |
| مكافأة مقصوصة (Reward Clipping) | تحديد المكافآت بنطاق [-1, +1] لاستقرار التدريب |
خوارزمية تدرج السياسة (Policy Gradient)
بدلاً من تعلم دالة Q ثم استخراج السياسة منها، تدرج السياسة يتعلم السياسة مباشرة — احتمال كل إجراء في كل حالة.
ميزة رئيسية: يمكنها التعامل مع إجراءات مستمرة (مثل "اضبط سرعة المحرك على 1523.7 دورة/دقيقة") بدلاً من إجراءات منفصلة فقط.
# مثال مبسط لشبكة سياسة
policy_network = models.Sequential([
layers.Dense(64, activation='relu', input_shape=(10,)),
layers.Dense(32, activation='relu'),
layers.Dense(3, activation='softmax') # احتمالات 3 إجراءات
])
# في كل خطوة:
# 1. الشبكة تعطي احتمالات الإجراءات
# 2. نختار إجراء عشوائياً حسب الاحتمالات
# 3. نحسب المكافأة
# 4. نحدّث الشبكة: زيادة احتمال الإجراءات ذات المكافأة العالية
مقارنة الأساليب
| المعيار | Q-Learning / DQN | Policy Gradient |
|---|---|---|
| نوع الإجراءات | منفصلة فقط | منفصلة ومستمرة |
| الاستقرار | أكثر استقراراً | أقل استقراراً (تباين عالٍ) |
| كفاءة العيّنات | أعلى (يعيد استخدام البيانات) | أقل (يحتاج بيانات أكثر) |
| أفضل لـ | عدد إجراءات محدود | تحكم مستمر |
التطبيقات الصناعية
تحسين العمليات الإنتاجية
تخيّل فرن صهر معادن بعشرات المعاملات (حرارة، ضغط أكسجين، سرعة تغذية). RL يجرّب تركيبات مختلفة ويتعلم الإعدادات المثلى التي تقلل الهدر وتحسّن جودة المعدن.
# مثال: بيئة تحسين عملية إنتاجية
class ProcessOptimizer:
def __init__(self):
self.params = {
"temperature": 800, # °C
"pressure": 50, # بار
"feed_rate": 100 # كغ/ساعة
}
def evaluate(self):
"""تقييم جودة المنتج والكفاءة"""
# في الواقع: قياسات فعلية من خط الإنتاج
quality = self._quality_model()
energy = self._energy_model()
waste = self._waste_model()
# المكافأة: جودة عالية + كفاءة طاقة - هدر
reward = quality * 10 - energy * 2 - waste * 5
return reward
def _quality_model(self):
"""نموذج جودة مبسط"""
temp_score = 1.0 - abs(self.params["temperature"] - 820) / 100
return max(0, min(1, temp_score))
def _energy_model(self):
return self.params["temperature"] / 1000
def _waste_model(self):
return max(0, (self.params["feed_rate"] - 110) / 100)
تخطيط مسار الروبوتات
روبوت ذراع صناعي يحتاج نقل قطع من موقع لآخر مع تجنب العوائق. RL يتعلم مسارات كفؤة تقلل وقت الحركة واستهلاك الطاقة مع ضمان السلامة.
لماذا RL وليس برمجة تقليدية؟ لأن البيئة تتغير: مواقع القطع تختلف، عوائق جديدة تظهر، ومتطلبات السرعة تتغير. RL يتكيّف تلقائياً.
إدارة الطاقة
مصنع فيه مولدات ديزل، ألواح شمسية، وبطاريات تخزين. RL يقرر كل ساعة: أي مصدر يستخدم، ومتى يشحن البطاريات، ومتى يبيع الفائض للشبكة — لتقليل التكلفة مع ضمان عدم انقطاع التغذية.
| القرار | المدخلات | الهدف |
|---|---|---|
| تشغيل المولد أم لا | سعر الكهرباء، الطلب الحالي | تقليل التكلفة |
| شحن/تفريغ البطارية | مستوى الشحن، توقعات الطقس | تعظيم استخدام الشمس |
| بيع للشبكة | الفائض، سعر البيع | زيادة الإيرادات |
تحديات التعلم المعزز في الصناعة
- السلامة: لا يمكن للوكيل تجربة إجراءات خطرة على معدات حقيقية. الحل: التدريب على محاكاة (simulation) ثم النقل للواقع.
- بطء التعلم: RL يحتاج ملايين التجارب. في الصناعة كل تجربة تكلف وقتاً ومالاً.
- تصميم المكافأة: مكافأة سيئة التصميم تؤدي لسلوك غير متوقع. مثلاً: مكافأة "أقصى إنتاج" بدون عقوبة على الجودة قد تنتج قطعاً رديئة بسرعة.
- الاستقرارية: DQN وPolicy Gradient قد لا يتقاربان دائماً — يحتاجان ضبطاً دقيقاً.
نصائح عملية
- ابدأ بالمحاكاة — لا تطبق RL مباشرة على معدات حقيقية. ابنِ نموذج محاكاة أولاً.
- صمم المكافأة بعناية — اقضِ وقتاً كافياً في تعريف ما هو "جيد" وما هو "سيء" لنظامك.
- Q-Learning للبداية — أبسط وأكثر استقراراً. انتقل لـ DQN عندما تزداد تعقيد البيئة.
- Policy Gradient للتحكم المستمر — إذا كانت إجراءاتك أرقام مستمرة (حرارة، سرعة)، استخدم تدرج السياسة.
- راقب الأمان — ضع حدوداً صلبة (hard constraints) لا يمكن للوكيل تجاوزها أبداً، حتى أثناء التدريب.
- التدريج ضروري — ابدأ ببيئة مبسطة ثم أضف التعقيد تدريجياً.