دوز مباشرة للمحتوى الرئيسي
دروس فالذكاء الاصطناعي

درّب نماذج اللغة الوكيلة باستعمال FlashREINFORCE

تعلّم كيفاش كيدرّب FlashREINFORCE وكلاء نماذج اللغة باستعمال عملية توليد وحدة لكل prompt، ومكافآت متمركزة على مستوى الدفعة، وأخذ عينات حسب أهمية الرموز، ومنطقة ثقة للتسلسل، وتحسين متوسط العيّنات. هاد الدليل كيغطي التثبيت، والمثال المرجعي على CPU، وخط تحديثات غير متزامن، وتحضير مشغّل Molt، وإرشادات عملية للاستقرار.

درّب نماذج اللغة الوكيلة باستعمال FlashREINFORCE

شنو هو FlashREINFORCE؟

FlashREINFORCE هو إطار ديال التعلّم بالتعزيز بلا ناقد، مخصص للتدريب غير المتزامن ديال النماذج اللغوية الوكيلة. تصمّم للخدمات اللي كتحتاج أفق طويل، واللي كتسالي فيها المسارات فوقات مختلفة بسبب الاستدلال متغيّر الطول، أو استدعاءات الأدوات، أو التفاعل مع البيئة.

عوض ما يولّد عدة مسارات متفرعة لكل prompt، كيستعمل FlashREINFORCE مسار واحد لكل prompt. وبالتالي، batch فيه B مسارات يقدر يغطي B ديال prompts مختلفين، والمسارات اللي سالاو يقدرو يوصلو للمتعلّم بلا ما يتسناو ردود متعددة على نفس prompt.

المستودع كيوفّر loss مرجعي مستقل بـ PyTorch، ومثال ديال تحديث optimizer على CPU، واختبارات، ومشغّلات Molt لـ R1 وQwen2.5-Math، وإعدادات للتجارب ديال الاستدلال، وأدوات Python، ونماذج mixture-of-experts، وALFWorld. مشغّلات التدريب الكامل غير المتزامن كتستعمل Molt.

التعلّم بالتعزيز خاصّو يدير REINFORCE.

علاش نستعملو مسار واحد؟

الطرق النسبية للمجموعة كتعتمد على مسارات متعددة من نفس prompt. فخدمات الوكلاء غير المتزامنة، هاد الشرط يقدر يفرض حواجز ديال المزامنة وينقص عدد الـ prompts المختلفين اللي كيغطيهم budget ثابت ديال المسارات.

التعلّم بمسار واحد كيحيد الحاجة للمسارات المتفرعة، ولكن كيخلق ثلاثة ديال مشاكل الاستقرار:

  • ما كايناش مجموعة ديال المسارات المتفرعة باش نبنيو منها baseline على مستوى prompt.
  • المسارات اللي تجمعات بشكل غير متزامن يقدرو يكونو تولّدو بسياسة سلوكية قديمة.
  • المسارات الفاشلة والطويلة يقدرو يهيمنو على التحديث إلا كان كل token كياخذ نفس الوزن على مستوى batch.

FlashREINFORCE كيعالج هاد المشاكل بـ One-Batch REINFORCE، وSequence Trust Region، وSample-Mean Optimization.

المكوّنات الأساسية

1. One-Batch REINFORCE

مع كل batch جديد، المتعلّم كيوسط المكافآت العددية عبر prompts مستقلين. إلا كانت R_i هي مكافأة المسار i، فـ advantage ديالو هي مكافأة المسار ناقص متوسط batch:

mean_reward = sum(R_j for j in batch) / B
A_i = R_i - mean_reward

المسارات اللي فوق المتوسط كتاخذ advantages موجبة، واللي تحت المتوسط كتاخذ advantages سالبة. هاد الشي كيوفّر feedback بإشارة موجبة أو سالبة بلا تدريب ناقد متعلَّم. المتعلّم كيدير تحديث واحد للـ optimizer على batch ومن بعد كيرميه.

2. Sequence Trust Region

كل مسار خاصو يحتافظ باحتمال سياسة السلوك اللي ولّد فعلياً كل token تم أخذ عينتو. المتعلّم كيعاد يحسب احتمال السياسة الحالية وكيكوّن نسبة أهمية على مستوى token:

rho_i_t = exp(current_log_probability_i_t
              - behavior_log_probability_i_t)

هاد النسبة كتصحّح توزيع الأفعال المأخوذة من عيّنة فـ history مخزّن. ولكن ما كتصحّحش كون الـ history راسو جا من سياسة سلوك قديمة، وداكشي علاش FlashREINFORCE كيقيس حتى الانحراف المتراكم على المسار كامل.

لكل فعل مأخوذ من عيّنة، كيحسب proxy ديال Bernoulli KL من احتمال السلوك p والاحتمال الحالي q:

d_i_t = p * log(p / q)
        + (1 - p) * log((1 - p) / (1 - q))

قيم الـ tokens كيتحسب ليها المتوسط على طول المسار. المسار كيتقبل غير إلا كان متوسط الـ proxy ديالو ما كيتجاوزش عتبة الثقة المضبوطة:

mean_drift_i = sum(d_i_t for t in trajectory_i) / T_i
mask_i = 1 if mean_drift_i <= delta else 0

المسار المرفوض ما كيساهم فحتى loss ديال tokens. وبالتالي، قرار الثقة كيتطبق على الـ history المخزّن كامل، ماشي على tokens معزولين.

3. Sample-Mean Optimization

المتوسط التلقائي ديال batch على مستوى token كيعطي للمسارات الطويلة تأثير أكبر. هاد الشي يقدر يكون مضر ملي كيكون rollout طويل وفاشل فيه خطوات وسطية مفيدة ولكن كيسالي بمكافأة سالبة.

FlashREINFORCE كيدير أولاً المتوسط ديال مساهمات الـ tokens داخل كل مسار، ومن بعد كيدير المتوسط بين المسارات:

trajectory_term_i = (
    mask_i * advantage_i / trajectory_length_i
    * sum(importance_ratio_i_t for each token t)
)
objective = sum(trajectory_term_i for i in batch) / B

وبالتالي كل مسار كياخذ الوزن 1/B كيفما كان طول الرد. الـ loss العملي كيستعمل نسب الأهمية المفصولة عن التدرّج. الطريقة الأساسية ما كتستعملش ناقد متعلَّم، ولا قصّ النسبة، ولا forward pass ديال نموذج مرجعي.

التثبيت والإعداد المحلي

دير clone أو حمّل مستودع FlashREINFORCE، دخل للدليل الجذري ديالو، وثبّتو فـ editable mode مع dependencies ديال الاختبارات:

pip install -e '.[test]'

من بعد شغّل مثال CPU المرفق:

python examples/toy_update.py

هاد المثال كيتأكد باللي objective المرجعي يقدر ينتج تحديث ديال optimizer على CPU. راه مثال للتحقق الوظيفي، وماشي إعادة إنتاج لنتائج benchmarks ديال الورقة.

وفالأخير، شغّل مجموعة الاختبارات:

python -m pytest -q

نجاح المثال والاختبارات كيعني باللي التنفيذ المرجعي المحلي والـ dependencies ديالو متوفرين.

استكشف التنفيذ المرجعي

الـ objective المرجعي المركزي كاين فـ flashreinforce/loss.py. كيغطي العمليات الموصوفة فالورقة وREADME:

  • توسيط المكافآت عبر batch.
  • أخذ عينات الأهمية على مستوى token.
  • قبول الثقة على مستوى المسار.
  • التحسين بمتوسط العينات.
  • التصفية الاختيارية ديال tokens الفاشلة باستعمال entropy.

بدا بـ examples/toy_update.py باش تشوف كيفاش الـ loss المرجعي كيساهم فتحديث ديال optimizer. من بعد شوف flashreinforce/loss.py باش تربط tensors والـ masks ديال المثال بالمراحل الفردية ديال objective.

مثال CPU هو أسلم مسار للاستعمال الأساسي، حيت ما كيحتاجش للبنية التحتية الكاملة ديال التوزيع والتشغيل.

فهم التحديث غير المتزامن ذو المرور الواحد

تحديث FlashREINFORCE فالإنتاج كيدوز من ست مراحل:

  1. الجمع: عمال التشغيل كيبعثو بشكل مستقل مسار مكتمل واحد لكل prompt. كل مسار كيتضمن المكافأة ديالو واحتمالات سياسة السلوك الحقيقية اللي تستعملات باش يتختارو التوكنات ديالو.
  2. التجميع: المتعلّم كياخذ المسارات المكتملة الجاية وعددها B، وكيعاير المكافآت ديالها حول المتوسط باش يحصل على مزايا موقعة.
  3. التصحيح: المتعلّم كيعيد حساب احتمالات اللوغاريتم ديال السياسة الحالية، وكيبني نسب أهمية التوكنات.
  4. الثقة: كيحسب مؤشر تقريبي لمتوسط KL ديال الأفعال المختارة لكل مسار، وكيقبل المسار كامل غير إلا كانت القيمة داخل العتبة المضبوطة.
  5. التحسين: كيدير المتوسط داخل كل مسار مقبول، ومن بعد كيدير المتوسط عبر الدفعة، وكيطبق خطوة وحدة ديال المحسّن.
  6. الحذف: ما كيعيدش تشغيل الدفعة المجموعة من أجل تحديثات إضافية للمتعلّم.

الخطوة الأخيرة ديال الحذف جزء مهم من الطريقة. FlashREINFORCE كيستعمل تحديث واحد للدفعة كاملة لكل دفعة تجمعات حديثاً، بلا ما يدير عدة تحديثات متسلسلة للدفعات الصغيرة من نفس لقطة سياسة السلوك.

معاينة إعدادات تدريب Molt

المستودع فيه scripts/train_molt.py لإطلاق التدريب عبر التنفيذ غير المتزامن ديال Molt. قبل ما تخصص موارد لتدريب كامل، استعمل الوضع الجاف ديالو باش تعاين خيارات التدريب:

python scripts/train_molt.py --dry-run

راجع docs/training.md من أجل إعداد GPU، وتحضير البيانات، وأوامر التدريب، والربط بين الورقة البحثية والكود، والقيود المعروفة ديال إعادة الإنتاج. الدليل examples/README.md فيه إعدادات جاهزة للمهام، وتجارب الإزالة، ومشغّل المدرّب الأصلي مع فحوصات الإمكانيات.

مشغّلات R1 وQwen2.5-Math مثبتة فالمستودع. إعدادات استعمال الأدوات وALFWorld كتحتاج حتى لوكلاء وبيئات متوافقة، لذلك راجع متطلبات التشغيل ديالها قبل ما تطلق هاد التجارب.

البيانات اللي خاص كل مسار يحافظ عليها

التحديث كيعتمد على المعلومات اللي كتتسجل أثناء التوليد. فحده الأدنى، تدفق التدريب المفاهيمي كيحتاج تسلسل التوكنات المكتمل، والمكافأة العددية ديالو، واحتمال السلوك المرتبط بكل فعل مختار. من بعد، المتعلّم كيحصل على احتمالات السياسة الحالية المقابلة عبر تقييم الأفعال والسياقات المخزنة.

ما تعوضش احتمالات أخذ العينات المسجلة باحتمالات كتعاود تبنيها من بعد. تقييم لاحق للنموذج ماشي مضمون يعاود نفس الاحتمال اللي استعملو محرك الاستدلال فعلياً أثناء أخذ العينات.

نصائح متقدمة للاستقرار

حافظ على دعم أخذ العينات

التصحيح الدقيق ديال الأهمية كيفترض أن السياسة المستهدفة ما كتعيّنش كتلة احتمالية خارج دعم سياسة السلوك. الاقتطاع القوي بـ top-k أو top-p يقدر يخرق هاد الافتراض. لذلك خاص اختيار إعدادات أخذ العينات مع مراعاة شرط الدعم.

ما تعتبرش أخذ عينات الأهمية على مستوى التوكن تصحيحاً كاملاً للمسار

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

خلي التحديثات جديدة

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

حافظ على الترجيح على مستوى المسار

دير متوسط مساهمات التوكنات داخل كل مسار قبل ما تدير متوسط المسارات عبر الدفعة. تسطيح جميع التوكنات الصالحة فمتوسط واحد على مستوى الدفعة غادي يرجع يضيف معامل مرتبط بطول الاستجابة، ويخلي المسارات الطويلة تاخذ وزناً أكبر من اللازم.

فسّر قناع الثقة بشكل صحيح

منطقة الثقة ديال التسلسل كتدير قرار قبول واحد للمسار كامل. إلا تجاوز مسار العتبة، كتتحيد جميع خسائر التوكنات ديالو من داك التحديث.

فرّق بين التحقق وإعادة الإنتاج

مثال CPU كيتحقق غير من تحديث واحد للمحسّن. إعادة إنتاج النتائج البحثية كتحتاج إعدادات GPU والبيانات والنموذج والوكيل والبيئة ووقت التشغيل غير المتزامن الموثقة فدليلي التدريب والأمثلة.

مجالات التطبيق المبلغ عنها

التجارب المبلغ عليها كتشمل الاستدلال الرياضي، واستعمال أدوات Python عبر عدة أدوار، وتدريب نماذج الخبراء المتعددين، واتخاذ قرارات تفاعلية فـ ALFWorld. ملف README كيوثق تدريباً مستقراً للاستدلال المتسلسل الطويل حتى لـ 6,000 تحديث باستعمال DeepSeek-R1-Distill-Qwen-1.5B، ونتائج الاستدلال الرياضي باستعمال Qwen2.5-Math-1.5B، وتجارب أدوات Python باستعمال Qwen2.5-7B-Instruct وQwen3-30B-A3B، وتجارب ALFWorld باستعمال Qwen2.5-7B-Instruct.

هاد النتائج كتبرهن على النطاق المقصود للإطار، ولكن ما خاصش نتوقعوها من مثال تحديث CPU الصغير.

موارد مفيدة

الخلاصة

كيجمع FlashREINFORCE بين تغطية البرومبتات فـ rollout واحد وتحديث مدمج بلا ناقد. المكافآت اللي كيتحسبو على مستوى الدفعة كيعطيو مزايا موقّعة، وأخذ عينات الأهمية ديال التوكنات كيعالج الأفعال القديمة، ومنطقة الثقة ديال التسلسل كتحكم فـ الانحراف المتراكم ديال المسار، والتحسين بمتوسط العينات كيمنع طول الجواب من تحديد وزن المسار.

بدا بالتثبيت القابل للتعديل، ومثال التحديث على CPU، والاختبارات. منين يخدمو هادو، جرّب مشغّل Molt باستعمال --dry-run وتبع دليل التدريب باش توجد GPU والبيانات حسب كل موديل. المشروع متوفر بموجب رخصة Apache 2.0.