انتقل إلى المحتوى الرئيسي

الوحدة 5 — الفرق الزمنى وتعلّم Q

خطر لريتشارد ساتون في السبعينيّات سؤال بسيط: لماذا انتظار نهاية الحلقة كما في مونت كارلو ما دام بلمان يقول إنّ قيمة الحاضر تعتمد فقط على المكافأة القادمة وقيمة الحالة القادمة؟ الإجابة هي الفرق الزمنى (Temporal Difference)، ومنه سيولد تعلّم Q — الخوارزميّة الأشهر في تاريخ التعلّم المعزّز.

تحديث الفرق الزمنى

فكرة TD: نُحدّث القيمة بعد خطوة واحدة، مستعملين قيمة الحالة القادمة الحاليّة (البوت‌سترابنغ) بدلًا من العائد الحقيقي:

V(st)V(st)+α[rt+1+γV(st+1)V(st)]V(s_t) \leftarrow V(s_t) + \alpha \left[ r_{t+1} + \gamma V(s_{t+1}) - V(s_t) \right]

يُسمّى الحدّ δt=rt+1+γV(st+1)V(st)\delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t) خطأ TD. هو الفرق بين ما رأينا فعلًا (مكافأة + قيمة الحالة الجديدة) وما توقّعناه (القيمة الحاليّة). كلّ تحديث يُقلّص هذا الفرق.

هذا يحقّق أفضل ما في العالمين:

  • بلا نموذج، كمونت كارلو: لا حاجة إلى معرفة PP.
  • ببوت‌سترابنغ، كالبرمجة الديناميكية: لا حاجة إلى انتظار نهاية الحلقة.
  • تباين أقلّ من مونت كارلو: التحديث لا يعتمد إلّا على خطوة واحدة، لا على كلّ الحلقة.

في المقابل، TD متحيّز لأنّ V(st+1)V(s_{t+1}) الذي نستعمله ليس القيمة الحقيقيّة بل تقديرنا الحالي. هذه المفاضلة تحيّز/تباين هي المحور المركزي للاختيار بين الطرائق.

SARSA: على السياسة

نُطبّق نفس الفكرة على QQ. لكن هنا يظهر خياران يبدوان متشابهين:

SARSA (اختصار state-action-reward-state-action) يستعمل الفعل at+1a_{t+1} الذي اختاره الوكيل فعلًا:

Q(st,at)Q(st,at)+α[rt+1+γQ(st+1,at+1)Q(st,at)]Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[ r_{t+1} + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t) \right]

SARSA على السياسة (on-policy): يُقيّم ويُحسّن السياسة نفسها التي يتّبعها. إذا كانت السياسة إبسيلون-جشعة، فإنّ SARSA يحسب QQ لهذه السياسة الاستكشافيّة، لا للسياسة المُثلى.

تعلّم Q: خارج السياسة

تعلّم Q يستعمل بدلًا من ذلك maxaQ(st+1,a)\max_{a'} Q(s_{t+1}, a'):

Q(st,at)Q(st,at)+α[rt+1+γmaxaQ(st+1,a)Q(st,at)]Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[ r_{t+1} + \gamma \max_{a'} Q(s_{t+1}, a') - Q(s_t, a_t) \right]

تعلّم Q خارج السياسة (off-policy): يُقيّم السياسة الجشعة (المُثلى بالتقدير الحالي) بينما ينفّذ سياسة استكشافيّة مختلفة. هذا فارق نظري وعملي في آن.

تعلّم Q هو خوارزمية تبويبيّة تتقارب إلى QQ^{*} بشرط زيارة كافية لكلّ زوج (حالة، فعل)، وهو ما يوفّره الاستكشاف الذي تدرسه الوحدة 6.

الفرق الملموس: منحدر عربة

مثال بسيط يكشف الفرق العملي: بيئة بها منحدر خطر جانب مسار قصير. سياسة إبسيلون-جشعة تسقط أحيانًا في المنحدر بسبب الفعل العشوائي.

  • SARSA يتعلّم أنّ المسار الأقرب من الحافّة يُكلّف كثيرًا لأنّه في تقييمه يحتسب سقطات الاستكشاف المستقبليّة.
  • تعلّم Q يتعلّم قيمة السياسة المُثلى الحقيقية التي تسير على الحافّة دون سقوط، لأنّه يُقيّم max\max لا الفعل المُنفَّذ.

النتيجة عمليّة: مع إبسيلون-جشعة يقود SARSA إلى سلوك أكثر أمانًا (يبتعد عن الحافّة)، وتعلّم Q إلى سلوك أكثر خطرًا (يسير على الحافّة، ويسقط أحيانًا أثناء التدريب). هذا معروف بمعضلة «العربة والحافّة» وهي المثال الأشهر لتوضيح الفرق.

تعلّم Q تبويبي على FrozenLake

نُطبّقه الآن على FrozenLake-v1 بـis_slippery=True. جدول Q بحجم 16×416 \times 4، سياسة إبسيلون-جشعة، ومعدّل تعلّم متناقص.

import numpy as np
import gymnasium as gym

env = gym.make("FrozenLake-v1", is_slippery=True)
S, A = env.observation_space.n, env.action_space.n

Q = np.zeros((S, A))
alpha = 0.1 # معدّل التعلّم
gamma = 0.99 # تخفيض
epsilon = 1.0
epsilon_min = 0.05
episodes = 20_000
recompenses = []

for ep in range(episodes):
etat, _ = env.reset()
total_recompense = 0
done = False
while not done:
if np.random.random() < epsilon:
action = env.action_space.sample()
else:
action = int(np.argmax(Q[etat]))
etat_prime, r, terminated, truncated, _ = env.step(action)
done = terminated or truncated
# التحديث الجوهري
cible = r + (0.0 if terminated else gamma * np.max(Q[etat_prime]))
Q[etat, action] += alpha * (cible - Q[etat, action])
etat = etat_prime
total_recompense += r
recompenses.append(total_recompense)
epsilon = max(epsilon_min, epsilon * 0.9995)

politique = np.argmax(Q, axis=1)

نقاط دقيقة:

  • عند terminated=True نُلغي البوت‌سترابنغ (gamma * V(s') = 0): وهذا سبب الفرع الشرطي. نسيانه هو خطأ التنفيذ الأوّل.
  • truncated يختلف: الحلقة قُطعت اصطناعيًّا، فالبوت‌سترابنغ لا يُلغى. التمييز بين الاثنين ضروري.
  • تناقص إبسيلون تدريجي: نستكشف بكثرة في البداية ثمّ نستقرّ على السياسة المكتشفة.

بعد 2000020\,000 حلقة يفوز الوكيل بنسبة 74%\approx 74\% من الحلقات، وهو ما يقارب الأمثل النظري على FrozenLake الزلق حيث الانزلاق يفرض حدًّا لا يُتجاوز.

معدّل التعلّم والتخفيض: أثرهما

  • معدّل التعلّم α\alpha: كبير جدًّا يسبّب تذبذبًا؛ صغير جدًّا يسبّب بطئًا. القيم 0,10{,}1 إلى 0,50{,}5 للتبويب، ومتناقصة على الحلقات لضمان التقارب النظري.
  • معامل التخفيض γ\gamma: قريب من 11 يجعل الوكيل بعيد النظر لكنّه يُبطئ التقارب ويزيد الحساسيّة للتقديرات. 0,990{,}99 افتراضي جيّد؛ 0,90{,}9 لمسائل قصيرة الحلقة.
قاعدة عمليّة

إذا كانت المكافأة النهائيّة RR ومعدّل التعلّم α\alpha، فقيمة الحالة–الفعل قرب الهدف تكبر بمعدّل تقريبي αR\alpha \cdot R كلّ زيارة. جدولوا هذا مقابل عدد الزيارات المُتوقّعة قبل الاستقرار، وستحصلون على تخمين معقول لعدد الحلقات اللازم.

الخلاصة

  • الفرق الزمنى يُحدّث القيمة بعد خطوة واحدة، بلا نموذج ولا انتظار لنهاية الحلقة، بمفاضلة تحيّز-تباين مختلفة عن مونت كارلو.
  • SARSA يستعمل الفعل المُنفَّذ فعلًا (على السياسة)؛ تعلّم Q يستعمل max\max (خارج السياسة).
  • تعلّم Q يتقارب إلى QQ^{*} في التبويب مع استكشاف كافٍ، ويعطي سياسة مُثلى مستقلّة عن سياسة الاستكشاف.
  • الخطأ الأشيع في التنفيذ: نسيان إلغاء البوت‌سترابنغ عند terminated، أو الخلط بينه وبين truncated.

الوحدة التالية: الاستكشاف — كيف نضمن زيارة كافية لكلّ زوج (حالة، فعل) دون أن ندفع ثمنًا باهظًا لعشوائيّة عمياء؟