التعلم المعزز2018متوسط10 دقيقة قراءة

Rainbow: دمج التحسينات في التعلُّم المعزَّز العميق

Rainbow: Combining Improvements in Deep Reinforcement Learning

Hessel, M. · Modayil, J. · van Hasselt, H. · Schaul, T. · Ostrovski, G. · Dabney, W. · Horgan, D. · Piot, B. · Azar, M. G. · Silver, D. — AAAI

المشكلة

بعد أن أثبتت شبكة DQN أن التعلُّم المعزَّز العميق قادر على إتقان ألعاب Atari انطلاقاً من البكسلات الخام، أنتج المجتمع البحثي موجة من التحسينات المستقلة — Double DQN وإعادة التشغيل ذات الأولوية والشبكات الثنائية والتعلُّم متعدد الخطوات . كل ورقة أظهرت تحسّناً على DQN الأصلي، لكن لم يكن أحد يعرف ما إذا كانت هذه الأفكار الست متكاملة أم متداخلة. واجه الممارسون لغزاً تركيبياً: أي مجموعة فرعية ينبغي استخدامها؟ وهل دمجها جميعاً سيساعد فعلاً، أم أن التفاعلات بين المكوّنات ستُلغي المكاسب الفردية؟

الإسهام

يدمج Rainbow الامتدادات الست لـ DQN في واحد ويُثبت تجريبياً أن الجمع بينها ليس مجرد إضافة حسابية بل تآزر حقيقي — الوكيل الموحَّد يحقق أداءً متقدماً على معيار Atari 2600 سواء من حيث كفاءة البيانات (تعلُّم أسرع) أو من حيث النتيجة النهائية. دراسة استبعاد مفصَّلة تحذف مكوّناً واحداً في كل مرة وتكشف أن إعادة التشغيل ذات الأولوية والتعلُّم متعدد الخطوات والتعلُّم المعزَّز التوزيعي هي الأكثر تأثيراً، مع أن كل مكوّن يكون مفيداً في بعض الألعاب على الأقل.

الأثر

أصبح Rainbow المرجع الأساسي للوكلاء القائمة على القيمة في معايير Atari. أثبت أن الدمج المتأني لتحسينات متعامدة يُنتج أكثر بكثير من مجموع أجزائه — درسٌ أثّر على وكلاء لاحقة مثل IMPALA وAgent57. كما أن منهجية الاستبعاد التي شاعت بفضله أصبحت الطريقة المعيارية لتقييم أنظمة التعلُّم المعزَّز المركَّبة.

تخيَّل أن DQN دراجة عادية. على مرّ السنوات، جاء ستة مهندسين وأضاف كلٌّ منهم تحسيناً مستقلاً: تروس أفضل، فرامل قرصية، هيكل أخف، عجلات انسيابية، نظام ملاحة، ومقياس قدرة. كل تحسين وحده جعل الدراجة أسرع — لكن لم يُجرِّب أحد تركيب الستة معاً على الهيكل نفسه.

Rainbow هو الدراجة بكامل ترقياتها. والمفاجأة أن الأداء الكلّي أكبر من مجموع المكاسب الفردية، لأن التحسينات تُغذّي بعضها بعضاً: فرامل أقوى تُتيح لك الدخول في المنعطفات بسرعة أكبر، وهذا بدوره يجعل العجلات الانسيابية أكثر فائدة.

المشكلة: صندوق أدوات مليء بالترقيات بلا مخطط لدمجها

بحلول عام 2017 كانت خوارزمية DQN قد وَلّدت ست تحسينات رئيسية، كلٌّ منها يعالج نقطة ضعف مختلفة:

  • Double DQN — يعالج مشكلة المبالغة المنهجية في تقدير قيم Q.
  • — تُركِّز على التجارب التي يتعلّم منها الوكيل أكثر، فتُعيد تشغيلها بتكرار أعلى.
  • — تفصل تقدير جودة الحالة عن تقدير تفوّق كل فعل.
  • التعلُّم متعدد الخطوات — ينقل إشارة المكافأة أسرع عبر تجميع عوائد n خطوة.
  • التعلُّم المعزَّز التوزيعي (C51) — يتعلّم التوزيع الاحتمالي الكامل للعائد بدلاً من الاكتفاء بمتوسطه.
  • الشبكات المُشوَّشة (Noisy Nets) — تستبدل العشوائي بتشويش مُتعلَّم يتكيّف مع الحالة.

كل ورقة بحثية أثبتت مكاسب واضحة على ألعاب Atari، لكن كل تحسين اختُبِر بمعزل عن البقية. والسؤال الذي لم يُجِب عنه أحد: هل تعمل هذه التحسينات معاً أم تتعارض؟ كيف نُرتِّب الأولويات حين يكون الهدف توزيعاً لا رقماً واحداً؟ وكيف يتفاعل التجميع متعدد الخطوات مع Double Q-learning؟ هنا يأتي دور Rainbow ليُجيب عن هذه الأسئلة مجتمعة.

افتح في المختبر
انقر على أي مكوّن لترى المشكلة التي يحلّها وكيف يندمج في Rainbow.
تستيقظ التجربة عند وصولك…

نقطة الانطلاق: DQN — لعب Atari من البكسلات

الفكرة الأساسية في DQN هي استخدام شبكة عصبية التفافية لتقدير Q(s,a)Q(s, a) مباشرة من إطارات البكسلات الخام. في كل خطوة يختار الوكيل الفعل الذي يحمل أعلى قيمة مُقدَّرة ()، أو يُجرِّب فعلاً عشوائياً (استكشاف باحتمال ε). ولكي ينجح هذا النهج، تُستخدم حيلتان أساسيتان: الأولى هي التي تحتفظ بالانتقالات السابقة في ثم تُعيد عرضها في دفعات عشوائية صغيرة، وبذلك تكسر الارتباطات الضارة بين العيّنات المتتالية. الثانية هي ، وهي نسخة مُجمَّدة من شبكة Q تُوفِّر أهدافاً مستقرة للتحديث وتُستبدل دورياً بنسخة جديدة من الشبكة الأصلية.

Q(s,a)Q(s,a)+α[r+γmaxaQtarget(s,a)Q(s,a)]Q(s,a) \leftarrow Q(s,a) + \alpha \Big[ r + \gamma \max_{a'} Q_{\text{target}}(s', a') - Q(s,a) \Big]
قاعدة تحديث DQN — الأساس الذي يُحسِّنه Rainbowفي كل خطوة يُزيح الوكيل تقديره لـ Q باتّجاه الهدف: المكافأة الفورية r مُضافاً إليها أفضل قيمة مستقبلية مخصومة كما تراها شبكة الهدف. الفرق بين هذا الهدف والتقدير الحالي هو ما نُسمّيه خطأ الفرق الزمني (TD error).

المكوِّنات الستة لـ Rainbow

1. Double DQN — علاج المبالغة في التقدير

المشكلة في DQN الأصلي أنه يستخدم الشبكة نفسها لاختيار أفضل فعل تالٍ ولتقييم قيمته في الوقت ذاته. وبما أن تقديرات الشبكة العصبية تحمل دائماً قدراً من التشويش، فإن عملية أخذ الحد الأقصى (max) تنحاز تلقائياً نحو التقديرات المُضخَّمة — كأنك تسأل أكثر أصدقائك تفاؤلاً عند كل قرار. Double DQN يحلّ هذا بفصل مهمتين: الشبكة المباشرة تختار الفعل، وشبكة الهدف تُقيِّم قيمته. هذا الفصل البسيط يُخفِّض بشكل ملحوظ دون أي عبء حسابي إضافي.

a=argmaxaQθ(s,a),y=r+γQθ(s,a)a^* = \arg\max_{a'} Q_{\theta}(s', a'), \quad y = r + \gamma\, Q_{\theta^{-}}(s', a^*)
Double DQN — الفصل بين الاختيار والتقييمالشبكة المباشرة θ تختار أفضل فعل a*، بينما شبكة الهدف θ⁻ هي التي تُقدِّر قيمته. بهذه الطريقة لا يتضخّم التقدير لمجرد أن إحدى القراءات المُشوَّشة جاءت مرتفعة.
افتح في المختبر
شاهد كيف يبالغ DQN الأصلي في تقدير قيم Q (البرتقالي) بينما يتتبع Double DQN (الأزرق) القيم الحقيقية بدقة أكبر.
تستيقظ التجربة عند وصولك…

2. إعادة التشغيل ذات الأولوية — التعلُّم من المفاجآت

في DQN الأصلي تُسحب التجارب من مخزن إعادة التشغيل بشكل عشوائي منتظم، وكأن كل تجربة بنفس الأهمية. لكن هذا غير صحيح: الانتقال الذي فوجئ به الوكيل (أي كان فيه كبيراً) يحمل إشارة تعلُّم أغنى بكثير من انتقال توقّعه الوكيل بدقة. الفكرة بسيطة: إعادة التشغيل ذات الأولوية تسحب التجارب باحتمال يتناسب مع حجم الخطأ، تماماً كطالب يُركِّز وقته على المسائل التي أخطأ فيها بدلاً من مراجعة ما أتقنه. ولأن هذا السحب غير المنتظم يُدخل انحيازاً في ، تُعوَّض عنه بأوزان تُطبَّق على دالة الخسارة.

3. الشبكة الثنائية — فصل «هل الوضع جيد أصلاً؟» عن «هل هذا الفعل أفضل من غيره؟»

في حالات كثيرة لا يُحدث اختيار الفعل فرقاً يُذكر — إذا كنت على حافة هاوية فالموقف سيئ مهما فعلت. الشبكة الثنائية تستغلّ هذه الملاحظة بتقسيم الطبقات الأخيرة من شبكة Q إلى فرعين: فرع القيمة V(s) الذي يُقدِّر جودة الحالة بشكل عام بصرف النظر عن الفعل، وفرع الميزة A(s, a) الذي يقيس مدى تفوّق كل فعل على المتوسط. ثم يُعاد دمج الفرعين: Q(s, a) = V(s) + A(s, a) − mean(A). الفائدة العملية أن الوكيل يتعلّم تقييم الحالات من كل تجربة يمرّ بها، حتى لو كان اختيار الفعل في تلك اللحظة لا يُغيِّر النتيجة كثيراً.

Q(s,a)=V(s)+(A(s,a)1AaA(s,a))Q(s, a) = V(s) + \Big( A(s, a) - \frac{1}{|\mathcal{A}|}\sum_{a'} A(s, a') \Big)
البنية الثنائية — القيمة مُضافاً إليها الميزة المُمركَزةطرح متوسط الميزة يضمن أن يكون الفصل ذا معنًى واضح: V(s) تعكس جودة الحالة فعلاً، وA(s, a) تعكس التفوّق النسبي لكل فعل فقط.
افتح في المختبر
بدّل بين DQN الأصلي والبنية الثنائية. لاحظ كيف تفصل الشبكة الثنائية تيار القيمة (المشترك) عن تيار الميزة (الخاص بكل فعل).
تستيقظ التجربة عند وصولك…

4. التعلُّم متعدد الخطوات — توسيع مدى الرؤية

في DQN الأصلي يعتمد التحديث على خطوة واحدة فقط: المكافأة الفورية ثم تقدير الشبكة لما سيأتي. التعلُّم متعدد الخطوات يُوسِّع هذا الأفق إلى n خطوة، فيجمع مكافآت حقيقية قبل أن يلجأ إلى التقدير. تخيّل أنك تقود سيارة: بدلاً من أن تتوقف بعد كل منعطف لتتفقّد الخريطة، تقود عدة منعطفات ثم تُعيد تقييم المسار. المكافآت المُجمَّعة تحمل إشارة حقيقية أكثر وتعتمد أقل على تقديرات ناقصة (أي انحياز أقل)، لكنها في المقابل أكثر عُرضة للعشوائية (أي أعلى). يستخدم Rainbow القيمة n=3 التي أثبتت تجريبياً أنها نقطة توازن جيدة.

Rt(n)=k=0n1γkRt+k+1+γnQ(St+n,a)R_t^{(n)} = \sum_{k=0}^{n-1} \gamma^k R_{t+k+1} + \gamma^n Q(S_{t+n}, a^*)
العائد من n خطوة — تجميع المكافآت الحقيقية ثم الاسترجاعنُراكم n مكافأة حقيقية مخصومة، ثم نُضيف تقدير Q عند الخطوة t+n. حين n=1 نعود إلى هدف الفرق الزمني المعتاد، وحين n=∞ نحصل على عائد مونت كارلو الكامل بلا تقدير.

5. التعلُّم المعزَّز التوزيعي (C51) — رؤية الصورة كاملة

في التقليدي يتعلّم الوكيل العائد المتوقع — رقم وحيد. لكن رقماً واحداً قد يُخفي فروقاً جوهرية: حالتان بنفس المتوسط قد تختلفان تماماً، فواحدة مستقرة حول القيمة الوسطى والأخرى تتأرجح بين ربح كبير وخسارة فادحة. التعلُّم المعزَّز التوزيعي يتجاوز هذا بتعلّم التوزيع الاحتمالي الكامل للعوائد، مُقسَّماً إلى 51 نقطة (لذلك يُسمى C51). هذا يمنح الشبكة إشارة تعلُّم أغنى بكثير، رغم أن القرار النهائي ما زال يعتمد على المتوسط. الأمر أشبه بالفرق بين أن تعرف أن متوسط تقييم مطعم 3.5 نجوم، وبين أن ترى توزيع التقييمات: النتيجة المتوسطة واحدة، لكن مطعم معظم تقييماته 3 و4 يختلف جذرياً عن مطعم تقييماته منقسمة بين 1 و5.

افتح في المختبر
قارن بين تعلُّم Q التقليدي (رقم واحد) والنهج التوزيعي (مُدرَّج تكراري كامل). لاحظ كيف يكشف التوزيع عن مخاطر يُخفيها المتوسط.
تستيقظ التجربة عند وصولك…

6. الشبكات المُشوَّشة — استكشاف أذكى

الاستكشاف بأسلوب ε-greedy أشبه برمي عملة معدنية لتقرّر هل تُجرِّب شيئاً عشوائياً أم لا — قرار أعمى لا يأخذ بالحسبان مدى ثقة الوكيل بنفسه. الشبكات المُشوَّشة (Noisy Nets) تستبدل هذا النهج بتشويش مُتعلَّم: كل وزن في الشبكة يحمل معامل تشويش يتدرّب مع الشبكة. في بداية التدريب يكون عدم اليقين عالياً فيبقى التشويش كبيراً والسلوك استكشافياً. ومع تقدّم التعلّم، تُقلِّص الشبكة التشويشَ في المناطق التي باتت تفهمها جيداً وتُبقيه حيث لا يزال عدم اليقين قائماً. النتيجة أن الاستكشاف يصبح مرتبطاً بالحالة — الوكيل يستكشف حيث يحتاج فعلاً، لا في كل مكان بالتساوي.

كيف يدمج Rainbow المكوِّنات الست

دمج هذه المكوّنات ليس مجرد تجميع — فبعضها يتفاعل مع بعض بطرق تحتاج قرارات تصميمية دقيقة:

  • الخسارة التوزيعية (تباعد KL على احتمالات الذرّات) تحلّ محل خطأ TD التربيعي المعتاد. وبما أننا لم نعد نستخدم خطأ TD عددياً، تُستخدم قيمة تباعد KL نفسها كمعيار أولوية في إعادة التشغيل ذات الأولوية.
  • العوائد متعددة الخطوات تُحسب وتُسقط على التوزيع الهدف بدلاً من قيمة عددية واحدة.
  • في Double DQN تختار الشبكة المباشرة الفعل الأمثل بحساب المتوسط من توزيعاتها، ثم تتولى شبكة الهدف تقييم توزيع ذلك الفعل.
  • البنية الثنائية تُخرج توزيعات لفرعي V(s) وA(s,a)، تُدمج قبل تطبيق softmax على الذرّات.
  • الشبكات المُشوَّشة تحلّ محل جميع الطبقات الخطية، فيختفي الاستكشاف بأسلوب ε-greedy كلياً.

المحصلة خوارزمية متماسكة يُعزِّز فيها كل مكوّن أداء البقية.

افتح في المختبر
بنية وكيل Rainbow الكاملة — مرّر مؤشرك فوق كل مكوّن لترى كيف يتفاعل مع البقية.
تستيقظ التجربة عند وصولك…

النتائج — أكثر من مجموع الأجزاء

جرى تقييم Rainbow على 57 لعبة من ألعاب Atari 2600، وبرزت نتيجتان أساسيتان:

كفاءة البيانات: وصل Rainbow إلى المستوى الذي يحقّقه DQN في نهاية تدريبه خلال 7 ملايين إطار فقط — أي نحو 7% من الـ 200 مليون إطار التي يحتاجها DQN. السبب أن كل مكوّن يُسرِّع التعلّم بطريقته: إعادة التشغيل ذات الأولوية تُركِّز على التجارب الأكثر فائدة، والتعلُّم متعدد الخطوات ينقل إشارة المكافأة أسرع، والأهداف التوزيعية تُوفِّر تدرّجات أغنى.

الأداء النهائي: عند 200 مليون إطار، تجاوز متوسط أداء Rainbow المُطبَّع بشرياً عبر كل الألعاب الـ 57 جميعَ خطوط الأساس الفردية بفارق واضح، وحقّق أداءً يفوق المستوى البشري في غالبية الألعاب.

افتح في المختبر
الأداء الوسيط المُطبَّع بشرياً عبر 57 لعبة Atari. Rainbow (بنفسجي) مقابل كل تحسين على حدة.
تستيقظ التجربة عند وصولك…

دراسة الاستبعاد: أي المكوِّنات أكثر أهمية؟

الفكرة بسيطة: نأخذ Rainbow الكامل، نحذف مكوّناً واحداً في كل مرة، ونقيس كم انخفض الأداء. هذا يُجيب عن سؤال عملي مهم: لو اضطررت للتخلّي عن تحسين واحد، أيّها سيُؤلمك أكثر؟

تبيّن أن المكوّنات الثلاثة الأكثر تأثيراً هي:

  • إعادة التشغيل ذات الأولوية — حذفها أحدث أكبر هبوط في الأداء الوسيط. التركيز على التجارب المُفاجِئة يُسرِّع التعلُّم بشكل ملحوظ.
  • التعلُّم متعدد الخطوات — ثاني أكبر هبوط. توسيع أفق الرؤية يمنح إشارة تعلُّم أقوى وأقل انحيازاً.
  • التعلُّم المعزَّز التوزيعي — ثالث أكبر هبوط. التوزيع الكامل يُوفِّر تدرّجات أغنى مقارنة بقيمة متوقعة وحيدة.

أما حذف الشبكات المُشوَّشة أو البنية الثنائية أو Double DQN فقد سبّب هبوطاً أصغر، وإن ظلّ كلٌّ منها مفيداً في مجموعة من الألعاب. الخلاصة العملية: كل المكوّنات الستة تُساهم، لكن إن كانت الموارد محدودة فالأولوية للثلاثة الأولى.

افتح في المختبر
كل عمود يُمثِّل أداء Rainbow بعد حذف أحد مكوّناته. كلما كان العمود أطول، كان الهبوط أكبر والمكوّن أهم.
تستيقظ التجربة عند وصولك…

الفكرة الأساسية في شيفرة برمجية

وكيل Rainbow — دمج مبسَّط للمكوِّنات الستpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import numpy as np

class RainbowAgent:
    """Rainbow مبسَّط: يدمج تحسينات DQN الست."""

    def __init__(self, n_atoms=51, v_min=-10, v_max=10, n_step=3):
        self.n_atoms = n_atoms                    # C51: 51 ذرّة
        self.support = np.linspace(v_min, v_max, n_atoms)
        self.n_step = n_step                      # أفق التعلُّم متعدد الخطوات
        self.replay = PrioritizedReplayBuffer()   # إعادة تشغيل ذات أولوية
        # شبكة: ثنائية + طبقات مُشوَّشة + رأس توزيعي
        self.online = build_dueling_noisy_dist_network(n_atoms)
        self.target = self.online.copy()

    def act(self, state):
        """الشبكات المُشوَّشة تتولى الاستكشاف — لا حاجة لـ ε-greedy."""
        dist = self.online.predict(state)         # الشكل: (عدد_الأفعال, n_atoms)
        q_values = (dist * self.support).sum(-1)  # القيمة المتوقعة لكل فعل
        return q_values.argmax()                  # جشع بالنسبة للشبكة المُشوَّشة

    def learn(self, batch):
        # Double DQN: المباشرة تختار، الهدف يُقيّم
        online_dist = self.online.predict(next_states)
        online_q = (online_dist * self.support).sum(-1)
        best_actions = online_q.argmax(axis=1)    # اختيار بالشبكة المباشرة

        target_dist = self.target.predict(next_states)
        target_dist_selected = target_dist[range(B), best_actions]  # تقييم

        # إسقاط الهدف التوزيعي متعدد الخطوات على دعامة الذرّات
        projected = project_distribution(
            n_step_returns, target_dist_selected, self.support, gamma
        )

        # خسارة تباعد KL → تُستخدم أيضاً كأولوية لإعادة التشغيل
        kl_loss = kl_divergence(self.online.predict(states), projected)
        self.replay.update_priorities(batch_indices, kl_loss)
        self.online.update(kl_loss)               # انتشار عكسي عبر الطبقات المُشوَّشة

لماذا كان Rainbow مهماً

أثر Rainbow يتجاوز ألعاب Atari. المبدأ الذي أرساه — ادمج تحسينات مستقلة بمنهجية ثم قِس أثر كل واحد منها — أثّر مباشرة على أعمال لاحقة مثل IMPALA (الذي اعتمد تدريباً موزَّعاً بأسلوب Rainbow) وAgent57 (الذي بنى على Rainbow ليتفوّق بشرياً في جميع ألعاب Atari الـ 57) وR2D2 (الذي أضاف آلية التكرار إلى الوصفة). والدرس الأوسع واضح: في الأنظمة المعقدة، التفاعل بين مكوّنات مختارة بعناية لا يقلّ أهمية عن المكوّنات نفسها.

المرجعHessel, Modayil, van Hasselt, Schaul, Ostrovski, Dabney, Horgan, Piot, Azar, Silver. Rainbow: Combining Improvements in Deep Reinforcement Learning. AAAI, 2018.

مصطلحات هذه الورقة