التحسين2012مبتدئ9 دقيقة قراءة
RMSProp: قسمة التدرّج على المتوسط المتحرك لمقداره الحديث
RMSProp: Divide the Gradient by a Running Average of Its Recent Magnitude
Tieleman, T. · Hinton, G. — COURSERA: Neural Networks for Machine Learning
المشكلة
بحلول عام 2012، كان تدريب الشبكات العميقة باستخدام SGD التقليدي عملية مُرهقة. السبب الرئيسي أنّ حجم التدرّجات يتفاوت تفاوتاً كبيراً بين المعاملات المختلفة — بعض الأوزان تصلها تدرّجات ضخمة وبعضها لا تصلها إلا تدرّجات ضئيلة — وهذا التفاوت يتغيّر باستمرار أثناء . المشكلة أنّ معدّل تعلّم واحد لا يناسب الجميع: إن كان كبيراً تذبذبت الأبعاد الحادة، وإن كان صغيراً زحفت الأبعاد المستوية ببطء شديد. خوارزمية AdaGrad حاولت حلّ هذا بتجميع مربعات التدرّجات السابقة لكل معامل على حدة، لكنّ المشكلة أنّ هذا المُجمِّع لا يتوقف عن النمو أبداً، فينكمش معدّل التعلّم تدريجياً حتى يقترب من الصفر ويتجمّد التدريب. أما rprop فكان يعتمد على إشارة التدرّج فقط دون مقداره، وهذا يعمل جيداً مع الدُفعة الكاملة لكنّه يفشل مع الدُفعات الصغيرة لأنّه يتجاهل عملية حساب المتوسط.
الإسهام
الفكرة الأساسية في RMSProp هي الاحتفاظ بمتوسط متحرك أُسِّي لمربعات التدرّجات الأخيرة لكل معامل على حدة، ثم قسمة التدرّج الحالي على الجذر التربيعي لهذا المتوسط قبل تحديث الوزن. النتيجة أنّ كل معامل يحصل على معدّل تعلّم تكيُّفي يعكس الانحناء الفعلي لسطح الخسارة في تلك اللحظة: الاتجاهات الحادة تُهدَّأ والمستوية تُعزَّز. الفرق الجوهري عن AdaGrad أنّ المتوسط المتحرك ينسى الماضي البعيد بشكل طبيعي، فيبقى معدّل التعلّم قادراً على التعافي والتكيّف مع طبيعة السطح الحالية بدل أن يبقى حبيس تاريخ قديم. في جوهرها، الفكرة هي جعل rprop صالحاً للعمل مع الدُفعات الصغيرة.
الأثر
رغم أنّ RMSProp لم يظهر في ورقة بحثية مُحكَّمة — بل فقط في شرائح محاضرة جيفري هينتون على Coursera — إلا أنّه أصبح من أكثر المُحسِّنات انتشاراً في التعلّم العميق. استُخدم كمُحسِّن افتراضي في تدريب أوائل أنظمة التعلّم المعزّز العميق مثل DQN، وفي كثير من الشبكات العميقة المبكرة. فكرته المحورية — منح كل معامل معدّل تعلّم تكيُّفي عبر متوسط متحرك لمربعات التدرّجات — دخلت مباشرةً في بنية Adam عام 2014، المُحسِّن الأكثر استخداماً اليوم، الذي يضمّ تقدير العزم الثاني من RMSProp إلى جانب تقدير العزم الأول من .
تدريب بـ واحد يشبه أن تقود سيارة في مدينة فيها طرق بسرعات مختلفة — لكن سيارتك عالقة في ترسٍ واحد. على الطريق السريع تزحف، وأمام المدارس تنطلق بسرعة خطيرة.
AdaGrad يحاول حلّ المشكلة بأن يتذكّر كل مطبّ مرّ به منذ بداية الرحلة. بعد قيادة طويلة تتآكل المكابح لدرجة أنّ السيارة بالكاد تتحرّك.
RMSProp يعمل بذاكرة قصيرة: يراقب حالة الطريق الأخيرة عبر متوسط متحرك ويضبط السرعة الآن بناءً على ما يراه مؤخراً — لا على ما رآه قبل ساعة. السيارة تتكيّف مع الطريق الحالي، لا مع كامل تاريخ الرحلة.
المشكلة: معدّل تعلّم واحد لا يناسب الجميع
في العادي، جميع تُحدَّث بنفس حجم الخطوة. لكنّ سطح ليس متجانساً: بعض المعاملات تقع في وديان ضيقة وحادة حيث كبير جداً، وبعضها يجلس على هضاب مسطّحة حيث التدرّج ضعيف.
إن رفعت معدّل التعلّم تذبذبت الأبعاد الحادة بعنف، وإن خفّضته زحفت الأبعاد المسطّحة ببطء شديد. لا يمكنك الفوز برقم واحد يناسب الجميع.
من هنا جاءت فكرة أساليب معدّل التعلّم التكيُّفي: أعطِ كل معامل حجم خطوة خاصاً به، مُعايَراً حسب شكل السطح الذي يتعامل معه فعلاً.
من rprop إلى AdaGrad: الخطوات التكيُّفية وثمنها
rprop (الانتشار المرن) كان من أوائل الأساليب التكيُّفية، وصُمِّم للعمل مع الدُفعة الكاملة. فكرته بسيطة: تجاهل حجم التدرّج واستخدم إشارته فقط — موجب أو سالب. كل معامل يأخذ خطوة بحجم ثابت في الاتجاه الذي يشير إليه التدرّج فقط. الميزة هنا أنّه يهرب من الهضاب بسرعة، لأنّ حتى التدرّج الضئيل يُنتج خطوة كاملة.
لكنّ rprop يفشل مع . لنأخذ مثالاً: تخيّل يصله تدرّج +0.1 في تسع دُفعات صغيرة ثم −0.9 في الدفعة العاشرة. سيحسب المتوسط ويُبقي الوزن تقريباً في مكانه (لأنّ المتوسط قريب من الصفر). أما rprop فلأنّه ينظر للإشارة فقط، سيخطو للأعلى تسع مرات وللأسفل مرة — أي 8 خطوات صافية في الاتجاه الخاطئ.
AdaGrad جاء بنهج مختلف: اقسم كل تدرّج على الجذر التربيعي لمجموع مربعات كل التدرّجات السابقة لذلك المعامل. بهذا تحصل المعاملات ذات التدرّجات الكبيرة تاريخياً على تحديثات أصغر، وذات التدرّجات الصغيرة على تحديثات أكبر. وهذا ممتاز للتعامل مع المتناثرة.
لكنّ في AdaGrad عيباً قاتلاً: المقام لا يتوقف عن النمو أبداً. مع استمرار التدريب، ينكمش معدّل التعلّم الفعلي لكل معامل نحو الصفر — ولا يتعافى أبداً. في الشبكات العميقة التي تحتاج تدريباً طويلاً على أسطح خسارة غير محدّبة، يتجمّد AdaGrad في نهاية المطاف.
إصلاح RMSProp: انسَ الماضي البعيد
فكرة هينتون كانت أنيقة وبسيطة: بدلاً من تجميع كل مربعات التدرّجات السابقة كما يفعل AdaGrad، استخدم متوسطاً متحركاً أُسِّياً لها. بما أنّ التدرّجات الحديثة أهمّ من القديمة، يصبح المقام انعكاساً للانحناء الحالي لسطح الخسارة، لا لتاريخ التدريب كاملاً.
الآلية تعمل في خطوتين لكل معامل:
الخطوة الأولى — تتبّع حجم التدرّج مؤخراً. احتفظ بتقدير جارٍ لمدى كِبَر التدرّجات في الفترة الأخيرة. في كل خطوة تدريبية، امزج التقدير القديم مع مربع التدرّج الجديد باستخدام معامل اضمحلال (عادةً 0.9). تخيّل الأمر كدلو مثقوب: ماء جديد يدخل من الأعلى والقديم يتسرّب من الأسفل.
الخطوة الثانية — تطبيع التحديث. اقسم التدرّج الحالي على الجذر التربيعي لذلك التقدير الجاري. إن كان المعامل يرى تدرّجات كبيرة مؤخراً، تحديثه يُصغَّر. وإن كانت تدرّجاته صغيرة، تحديثه يُكبَّر. المحصّلة: كل معامل يتحرّك بإيقاع يتناسب مع شكل السطح المحلي حوله.
معدّل الاضمحلال ρ: كم من التاريخ نتذكّر
يحدّد طول ذاكرة المتوسط المتحرك. عندما نختار (القيمة التي أوصى بها هينتون)، تمتد النافذة الفعلية إلى نحو 10 خطوات — أي أنّ التدرّجات الأقدم من 10 تكرارات تقريباً لا تؤثّر. أما مع فتتمدّد النافذة إلى نحو 100 خطوة، مما يعطي تقديراً أنعم لكنّه أبطأ في التكيّف.
يمكنك تخيّل كمقبض للنسيان:
- ρ عالٍ (قريب من 1) ← نسيان بطيء ← تقديرات مستقرة ← تكيّف أبطأ مع التغيّرات المفاجئة.
- ρ منخفض (قريب من 0) ← نسيان سريع ← تقديرات مشوّشة ← تكيّف سريع لكنّه متقلّب.
الاختيار الأفضل يعتمد على طبيعة المسألة. في غالبية مهام ، يُعدّ مع نقطة انطلاق ممتازة.
مقارنة المُحسِّنات: SGD وAdaGrad وRMSProp
الفرق الجوهري بين هذه الثلاثة هو كيف يتعامل كل منها مع الماضي:
الانحدار التدريجي العشوائي يستخدم معدّل تعلّم واحد لجميع المعاملات. لا يملك ذاكرة عن حجم التدرّجات السابقة — كل خطوة بنفس الحجم مضروبةً في التدرّج الحالي فقط.
AdaGrad يتذكّر كل شيء. يُراكم مربعات التدرّجات من أول خطوة حتى الآن. في البداية هذا مفيد — المعاملات التي نادراً ما تُحدَّث تحصل على دفعة أكبر. لكن مع الوقت لا يتوقف المُراكِم عن النمو، فينخفض معدّل التعلّم الفعلي باتجاه واحد نحو الصفر.
RMSProp يتذكّر القريب فقط. يستبدل مجموع AdaGrad المتراكم بمتوسط متحرك أُسِّي. التدرّجات القديمة تتلاشى تلقائياً، فيستطيع المُحسِّن تسريع خطاه مجدّداً بعد عبوره منطقة ذات تدرّجات حادة. هذا يجعله أنسب بكثير لمسائل غير المحدّبة والتدريب الطويل.
الخوارزمية في شيفرة برمجية
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import numpy as np
def rmsprop(params, grads, cache, lr=0.001, rho=0.9, eps=1e-8):
"""خطوة واحدة من RMSProp لجميع المعاملات."""
for p, g in zip(params, grads):
# الخطوة 1: تحديث المتوسط الجاري لمربعات التدرّجات
cache[p] = rho * cache[p] + (1 - rho) * g ** 2
# الخطوة 2: التسوية والتحديث
p -= lr * g / (np.sqrt(cache[p]) + eps)
# الاستخدام:
# cache = {p: np.zeros_like(p) for p in params} # تهيئة لمرة واحدة
# لكل دُفعة صغيرة:
# grads = compute_gradients(loss, params)
# rmsprop(params, grads, cache)
# هذه هي الخوارزمية بالكامل. Adam يضيف الزخم فوق هذا.من RMSProp إلى Adam: إضافة الزخم
RMSProp يُكيِّف حجم الخطوة لكل معامل باستخدام العزم الثاني (مربعات التدرّجات)، لكنّه يظلّ يتبع اتجاه التدرّج الخام — وهذا الاتجاه قد يكون مشوّشاً مع الدُفعات الصغيرة.
(تقدير العزم التكيُّفي، 2014) يأخذ أفضل ما في الفكرتين:
- من الزخم: متوسط متحرك للتدرّج نفسه (العزم الأول) لتنعيم الاتجاه.
- من RMSProp: متوسط متحرك لمربعات التدرّجات (العزم الثاني) لضبط حجم الخطوة.
يضيف Adam أيضاً تصحيح الانحياز لأنّ كلا المتوسطين يبدآن من الصفر وبالتالي يكونان منحازين نحو الأسفل في الخطوات الأولى. هذا الجمع هو ما جعل Adam المُحسِّن الافتراضي لمعظم مهام التعلّم العميق منذ 2015.
بعبارة أخرى: RMSProp هو Adam بدون زخم وبدون تصحيح انحياز. إذا فهمت RMSProp فأنت تفهم نصف Adam بالفعل.
لماذا كان هذا مهمّاً
2011
نشر AdaGrad
قدّم دوشي وحَزَّان وسينغر معدّلات تعلّم تكيُّفية لكل معامل عن طريق تراكم مربعات التدرّجات. أسلوب ممتاز للسمات المتناثرة، لكنّ معدّل التعلّم يتلاشى تدريجياً نحو الصفر.
2012
تقديم RMSProp في محاضرة Coursera
اقترح هينتون استبدال المجموع التراكمي في AdaGrad بمتوسط متحرك أُسِّي، مما حلّ مشكلة تلاشي معدّل التعلّم. الفكرة لم تُنشر إلا في شرائح محاضرة.
2012
نشر Adadelta بشكلٍ مستقل
توصّل زايلر بشكلٍ مستقل إلى حلّ مشابه لمشكلة AdaGrad باستخدام المتوسطات المتحركة الأُسِّية، وأضاف متوسطاً متحركاً ثانياً لتحديثات المعاملات يُغني عن الحاجة لمعدّل تعلّم شامل.
2014
Adam يدمج RMSProp مع الزخم
دمج كينغما وبا تكيّف العزم الثاني من RMSProp مع تنعيم العزم الأول من الزخم، وأضافا تصحيح الانحياز. أصبح Adam بعدها المُحسِّن الأكثر استخداماً في التعلّم العميق.
2015
DQN يستخدم RMSProp
وكيل DQN الذي طوّرته DeepMind للعب ألعاب Atari اعتمد على RMSProp كمُحسِّن، مما أبرز فعاليته في التعلّم المعزّز ولفت إليه الانتباه على نطاق واسع.
2017
AdamW يفصل اضمحلال الأوزان
بيّن لوشتشيلوف وهوتر أنّ تنظيم L2 في Adam ليس مكافئاً لاضمحلال الأوزان، وقدّما AdamW كبديل. نواة RMSProp بقيت حجر الأساس في المُحسِّنات الحديثة.
المرجعTieleman, Hinton. Lecture 6.5-rmsprop: Divide the gradient by a running average of its recent magnitude. COURSERA: Neural Networks for Machine Learning, 2012.
مصطلحات هذه الورقة
- خوارزمية آر إم إس بروبRMSProp
- معدل التعلم التكيُّفيAdaptive Learning Rate
- المتوسط المتحرك الأُسّيExponential Moving Average
- معدل التعلمLearning Rate
- خوارزمية أداغرادAdaGrad
- الزخمMomentum
- الانحدار التدريجيGradient Descent
- الانحدار التدريجي العشوائيStochastic Gradient Descent (SGD)
- التقارب الحسابيConvergence
- الـمُحسِّنOptimizer