المستوى المطلوب: مبتدئ. كل اللي محتاجه إنك تكون جرّبت ChatGPT أو Claude مرة واحدة. مفيش رياضيات ثقيلة، والكود في الآخر اختياري تمامًا.
بعد المقال ده هتعرف بالظبط إزاي نموذج زي ChatGPT اتحوّل من آلة بتكمّل كلام على النت لمساعد بيرد عليك بأدب، بيرفض يأذيك، وبيحاول يفيدك فعلاً. الاسم العلمي للحكاية دي هو RLHF، يعني "التعلّم المعزّز من ملاحظات البشر".
المشكلة باختصار
نموذج اللغة الخام اتدرّب على حاجة واحدة بس: توقّع الكلمة التالية في نصوص الإنترنت. مفيهوش أي فكرة عن معنى "مفيد" أو "مؤدب" أو "آمن". لو سألته سؤال، ممكن يرد بكلام سام، أو معلومة مخترعة، أو يكمّل سؤالك بأسئلة تانية بدل ما يجاوب. كل المساعدين اللي بتستخدمهم النهاردة اتظبطوا بـ RLHF علشان يتصرّفوا صح، فلو بتتعامل مع أي منتج AI، انت بتلمس نتيجة RLHF كل يوم.
الفكرة الأول بمثال بسيط
تخيّل معاك طبّاخ جديد موهوب جدًا. حافظ ألف وصفة ويعرف يطبخ أي حاجة، بس مش عارف ذوق زباين المطعم. كل يوم بيطلّع طبقين من نفس الأكلة، والزبون بيدوق ويقول: "الطبق ده أحسن من ده". الطبّاخ مش بيتعلّم وصفة جديدة، هو بيتعلّم يميل ناحية اللي الناس بتفضّله. بعد آلاف التذوّقات، بقى بيطبخ على طول الأكل اللي الزباين بتحبه.
RLHF بيشتغل بنفس المنطق بالظبط. النموذج بيقترح ردّين على نفس السؤال، وبشر بيقولوا "الرد ده أحسن"، والنموذج يعدّل نفسه علشان يقرّب من الردود اللي البشر بيفضّلوها. مفيش حد بيكتب للنموذج القاعدة؛ هو بيستنتجها من التفضيلات.
الشرح العلمي: تلات مراحل
دلوقتي بعد ما الصورة اتضحت، خلّينا ندخل في التفاصيل. RLHF مش خطوة واحدة، ده تلات مراحل ورا بعض.
- الضبط الإشرافي (SFT): بنجمع أمثلة كتبها بشر لأسئلة وإجاباتها المثالية، وبنعمل fine-tune للنموذج عليها. هنا النموذج بيتعلّم شكل الإجابة الكويسة: يجاوب بدل ما يكمّل السؤال.
- نموذج المكافأة (Reward Model): بنعرض للنموذج ردّين على نفس السؤال، وبشر بيرتّبوهم (A أحسن من B). بندرّب نموذج تاني اسمه نموذج المكافأة يدّي كل رد درجة رقمية تعبّر عن رضا البشر عنه.
- التعلّم المعزّز (RL/PPO): النموذج يحاول يطلّع ردود بترفع الدرجة اللي بيدّيها نموذج المكافأة، بخوارزمية اسمها PPO. النتيجة: النموذج يتعلّم يتصرّف زي ما البشر عايزين.
مثال كود تقدر تجرّبه
قلب تدريب نموذج المكافأة سطر واحد: خلّي درجة الرد المُفضَّل أعلى من المرفوض. ده بيتحسب بخسارة اسمها Bradley-Terry. السكربت ده بيشتغل فعلاً بـ PyTorch:
import torch
import torch.nn.functional as F
# درجات نموذج المكافأة لردّين على نفس السؤال
reward_chosen = torch.tensor([2.1]) # الرد اللي فضّله الإنسان
reward_rejected = torch.tensor([0.4]) # الرد المرفوض
# خسارة الترتيب: بتقلّ كل ما الفرق بين الدرجتين يكبر
loss = -F.logsigmoid(reward_chosen - reward_rejected)
print(round(loss.item(), 3)) # ~0.167