الوعد اللي الدرس 1.2 قطعه
الدرس 1.2 سمّى تلات أنواع من الـ Machine Learning، وقال عن التالت إن «الـ reinforcement learning (التعلم المعزَّز) مختلف من الأساس عن الـ supervised والـ unsupervised learning الاتنين». وبعدين ركن النوع التالت ده على جنب. وكل وحدة بعده كانت عن dataset ثابتة: صفوف اتلمّت قبل ما تيجي، وmodel شغلته يربط كل صف بإجابة. والوحدة دي بترجع للوعد ده.
التحوّل مش عيلة models جديدة، ده صياغة جديدة للمشكلة. مفيش dataset. فيه موقف، ومجموعة حاجات مسموح لك تعملها، ورقم بييجي بعدها يقولّك اللي عملته نجح قد إيه. ولازم تستنتج من الرقم ده لوحده إيه اللي المفروض تعمله — والطريقة الوحيدة تعرف فعل ماجرّبتوش بيدفع قد إيه إنك تجرّبه.
المرجع المعتاد لكل اللي في الوحدة دي هو كتاب ساتون وبارتو Reinforcement Learning: An Introduction (الطبعة التانية، 2018). والرموز المستخدمة هنا هي رموزهم، عشان الكتاب يتقري كامتداد للأربع دروس دول مش كتمرين ترجمة.
الـ loop: ست كلمات بتعرّف الصياغة
للـ reinforcement learning رسمة واحدة، وهي loop فيها مربعين. الـ agent (الوكيل) هو اللي بيقرّر. والـ environment (البيئة) هي كل حاجة غيره — الدنيا اللي الـ agent شغّال فيها، ومعاها الحتت اللي ميقدرش يشوفها. والـ loop بتلف على خطوات زمنية منفصلة.
في كل خطوة الـ agent بيرصد state (حالة) St، ودي وصف للموقف دلوقتي. وبعدين بيختار action (فعل) At من الأفعال المتاحة في الـ state دي. والـ environment بترد بـ reward (مكافأة) Rt+1، وهي رقم scalar واحد، وبـ state جاية St+1. وبعدين الـ loop بتلف تاني. والـ episode (الحلقة) الواحدة هي تشغيلة واحدة من state البداية لـ terminal state — ماتش واحد، أو مشوار توصيل واحد، أو محادثة واحدة. وفيه مشاكل مالهاش terminal state أصلًا، واسمها continuing.
القاعدة اللي الـ agent ماشي عليها هي الـ policy (السياسة) بتاعته. الـ deterministic policy بتسمّي action واحد لكل state؛ والـ stochastic policy بتدّي كل action احتمال. والتعلّم في الصياغة دي معناه إنك تغيّر الـ policy لحد ما مجموع الـ rewards اللي بتلمّها يعدّي اللي كان عليه قبل كده.
الخط بين الـ agent والـ environment بيترسم عند حد سيطرة الـ agent، مش عند حد معرفته. فموتورات الروبوت ومفاصله جزء من الـ environment: الـ agent بيدّيها أوامر وبعدين بيكتشف إيه اللي حصل. وأي حاجة الـ agent ميقدرش يغيّرها بمزاجه واقعة في ناحية الـ environment، مهما كانت لازقة في الروبوت نفسه.
لا supervised ولا unsupervised — لسببين مش سبب واحد
التفسير المعتاد إن الـ reinforcement learning من غير labels. ده صح، وهو النص اللي على السطح. الـ supervised learning بيتقال له الـ action الصح ياخده؛ أما الـ reinforcement learning فمبيتقالوش غير قيمة الـ action اللي خده، ومفيش أي حاجة عن الأفعال اللي ماخدهاش. reward قيمتها 3 مبتقولش إذا كان 10 متاح. ده الفرق بين الـ feedback الـ instructive (الإرشادي) والـ feedback الـ evaluative (التقييمي)، وهو السبب اللي بيخلّي الـ agent مضطر يجرّب بدل ما يعمل fit وبس.
أما النص الأعمق فعادةً بيتساب من غير ما يتقال: توزيع البيانات بيعتمد على الـ policy. في الـ supervised learning مجموعة التدريب ثابتة، وكل افتراض في الكورس لحد دلوقتي قايم على ده — تقسيم الـ train والـ test، والـ cross-validation، وحتى معنى الـ overfitting. أما في الـ reinforcement learning فالـ policy الحالية بتاعة الـ agent هي اللي بتقرّر هيزور أنهي states، وبالتالي هيلمّ أنهي خبرة. حسّن الـ policy وتوزيع البيانات بيتحرّك. مشكلة التعلّم هنا non-stationary (غير مستقرة) بحكم البنا، وعدم استقرارها جاي من حاجة الـ learner نفسه عملها.
وبيطلع من ده نتيجتين على طول. الأولى: الـ policy اللي مبتزورش منطقة من فضاء الـ states مبتلمّش عنها أي معلومة، فممكن تبقى غلطانة فيها غلط عشوائي للأبد من غير ما حاجة تناقضها. والتانية: loop التحسين ممكن تتغذّى على نفسها، فـ policy أحسن شوية بتزور states مختلفة شوية، وده بيغيّر اللي هيتعلّم بعد كده. وأغلب الصعوبة العملية في الـ reinforcement learning — وأغلب سمعته في عدم الاستقرار — سببها الارتباط ده، مش غياب الـ labels.
ومش ده unsupervised learning كمان. الـ clustering والـ dimensionality reduction في الوحدة 5 بيدوّروا على بنية في بيانات موجودة أصلًا. أما هنا فيه هدف متصاغ كرقم، والـ agent بيتحاسب عليه. وساتون وبارتو بيقولوا نفس الكلام: الـ reinforcement learning نموذج تالت، مش حالة خاصة من واحد من النموذجين التانيين.
الـ reward المتأخرة ومشكلة الـ credit assignment
لو كل action بيدفع على طول، كانت المشكلة هتبقى مجرد lookup table. بس مش بيدفع على طول. النقلة اللي خسّرت ماتش الشطرنج ممكن تكون جت قبل الخسارة بأربعين نقلة. والتوصية اللي زقّت مستخدم يلغي اشتراكه اتشافت من تلات أسابيع. الـ reward متأخرة، والنتيجة شكل من مشكلة الـ credit assignment (إسناد الفضل) اللي الدرس 6.3 حلّها لـ layers الشبكة — بس هنا في الزمن مش في العمق.
ويستاهل تحط الحالتين جنب بعض. الـ backpropagation بيوزّع الـ credit على computational graph معروف وقابل للتفاضل، وكل مسار في الـ graph ده متاح يتفحص. أما الـ temporal credit assignment فمعندوش graph زي ده: الـ agent عنده سلسلة واحدة من الـ states والـ actions والـ rewards، ولازم يقرّر الـ reward المتأخرة دي بتاعة أنهي actions قديمة. وميقدرش يعيد تشغيل التاريخ ويغيّر action واحد.
وكل باقي الوحدة دي آليات للمشكلة الواحدة دي. الدرس 14.2 بيعرّف الكمية اللي بتحلّها من حيث المبدأ — قيمة الـ state، يعني الـ reward اللي تقدر تتوقّعها من هنا ورايح. والدرس 14.3 بيبيّن إزاي الكمية دي بتتقدّر من الخبرة خطوة بخطوة. والدرس 14.4 بيروح للـ policy على طول.
الـ exploration قصاد الـ exploitation: أصغر مثال حقيقي
قشّر الصياغة لحد ما مبيفضلش فيها غير صعوبة واحدة، وهتاخد الـ multi-armed bandit (الآلة متعددة الأذرع) (multi-armed bandit): state واحدة، وk actions، وreward بتتسحب من توزيع مجهول مربوط بالـ action اللي اخترته. مفيش حاجة تخطّط لها، لأن مفيش حاجة بتعملها بتغيّر الموقف اللي إنت فيه. والسؤال الوحيد اللي فاضل هو تسحب أنهي ذراع بعد كده، والسؤال ده صعب أصلًا. روبنز (1952) طرحه بالشكل ده في أدبيات الإحصاء، تحت عنوان الـ sequential design of experiments؛ وساتون وبارتو بيفتحوا كتابهم بيه لنفس السبب اللي بيخلّيه يظهر هنا.
اشتغل حالة بذراعين بإيدك. سحبت الذراع A تلات مرات وخدت rewards 1 و0 و1؛ وسحبت الذراع B مرة واحدة وخدت 0. والتقدير البديهي لقيمة كل ذراع هو متوسط الـ reward اللي دفعها لحد دلوقتي.
الـ agent الـ greedy (الجَشِع) البحت هيختار دلوقتي الذراع اللي تقديرها أعلى، وهي A، فياخد reward كمان، ويحدّث Q(A)، وبعدين يختار A تاني. وهيفضل يختار A لآخر الزمن. ولو الذراع B في الحقيقة بتدفع 0.8 في المتوسط والصفر الواحد ده كان مجرد حظ وحش، الـ agent عمره ما هيكتشف ده، لأن اكتشافه محتاج يسحب ذراع هو قرّر أصلًا إنها أوحش. ودي معضلة الـ exploration والـ exploitation (الاستكشاف والاستغلال) كلها: الـ exploitation للمعرفة الحالية هو الطريق الوحيد تلمّ بيه reward دلوقتي، والـ exploration هو الطريق الوحيد لمعرفة أحسن تستغلها بعدين. وكل خطوة بتصرف الميزانية على واحد فيهم.
وأبسط إجابة عملية هي الـ ε-greedy (الجَشِع مع ε): خد الـ action اللي تقديره أعلى أغلب الوقت، وباحتمال صغير ε اختار بدل كده اختيار عشوائي منتظم.
إعادة حساب المتوسط من الصفر بعد كل سحبة معناها تخزين كل reward. وده مش لازم: المتوسط ينفع يتحفظ خطوة بخطوة، والشكل اللي بياخده هو شكل تقريبًا كل قاعدة تحديث في الوحدة دي.
الـ reward hacking: هتاخد اللي قِسته
كل اللي فات بيفترض إن الـ reward بتقول اللي إنت قصدته. وتحديدها هو أصعب مهمة هندسية في الـ reinforcement learning التطبيقي، وصعوبتها من نوع محدّد: الـ agent optimizer مبيتعبش للرقم الحرفي، ومش شايل معاك افتراضاتك اللي متقالتش عن الطريقة اللي المفروض الرقم ده يعلى بيها.
كافئ روبوت تنضيف على كمية التراب اللي بيلمّها وممكن يتعلّم يقلب الصندوق ويلمّه تاني. وكافئ recommendation system على الكليكات وهيتعلّم أنهي عناوين أصعب تقاومها، وده مش نفس السؤال عن أنهي مقالات تستاهل تتقري. وكافئ عدّاء في simulation على السرعة لقدّام وممكن يلاقي وضعية بتستغل bug في محرّك الفيزيا بدل ما يتعلّم يجري. وفي كل حالة الـ agent معملش حاجة غلط: كبّر الـ objective function اللي اتدّت له.
إشارة الـ reward هي إزاي تقول للـ agent إيه اللي عايزه يتعمل — مش إزاي عايزه يتعمل. وساتون وبارتو صريحين إن حط الـ subgoals في الـ reward غلط: كافئ agent الشطرنج على أخد القطع أو السيطرة على السنتر وممكن يلاقي طرق يعمل ده بالظبط وهو بيخسر الماتش. والمعرفة المسبقة عن الطريقة مكانها الـ initial policy أو تقديرات القيمة الابتدائية، مش الـ reward.
وبيطلع من ده عادتين عمليتين. اكتب الـ agent ممكن يكبّر الـ reward اللي إنت مقترحها إزاي وهو بيهزم قصدك، قبل ما تدرّب أي حاجة. وراقب السلوك، مش منحنى الـ reward بس — فمنحنى reward طالع هو بالظبط شكل الـ reward hacking من بره.
الـ reinforcement learning بيستاهل تكلفته فين فعلًا
الـ reinforcement learning بيبقى الأداة الغلط أكتر بكتير ما بيبقى الأداة الصح. وبيستاهل تكلفته لما تلات حاجات يتحققوا مع بعض: إن القرارات تبقى متسلسلة، بحيث اللي بتعمله دلوقتي يغيّر اللي هتقابله بعدين؛ وإن الـ feedback يبقى evaluative ومتأخر، فمحدش يقدر يسلّمك actions صح عليها labels؛ وإن الخبرة تبقى رخيصة كفاية إنها تتلمّ، من نظام حقيقي أو من simulator كويس. ولو واحدة من التلاتة وقعت، فالـ supervised learning عادةً أسرع وأرخص وأسهل في الـ debugging.
ودي أربع بيئات بيناسبها فعلًا:
الـ control (التحكّم). الروبوتات والطيران والتبريد وأنظمة الطاقة وجدولة الموارد. المشكلة متسلسلة بطبيعتها، وsimulator فيزيائي يقدر يدّي خبرة رخيصة، والـ cost function في حالات كتير معروفة بجد.
الألعاب. ساحة الإثبات التاريخية، لأن القواعد مظبوطة والـ reward مفيهاش لبس والـ self-play يقدر يولّد خبرة على قد ما تستحمل. والوضوح اللي بيخلّي الألعاب مثالية هو نفسه اللي بيخلّي نتايجها صعبة تتنقل.
الـ recommendation والتفاعل. أنهي عنصر تعرضه بعد كده قرار متسلسل تحت feedback evaluative، وصياغة الـ multi-armed bandit اللي فوق هي الوصف الأمين لجزء كبير منه. وخد بالك إن الارتباط اللي اتذكر في القسم اللي فات حقيقي هنا: الـ policy بتشكّل الـ log، والـ log هو بياناتك الوحيدة.
الـ reinforcement learning from human feedback (التعلم المعزَّز من التغذية الراجعة البشرية). والدرس 9.3 بيغطّيه كالخطوة اللي حوّلت predictor بالكلمة الجاية لـ model بيمشي ورا التعليمات. وكريستيانو وزمايله (2017) أسّسوا الـ pattern اللي الوحدة دي رايحة له: بدل ما تكتب reward function بإيدك، لمّ مقارنات من بني آدمين بين أزواج من مقاطع سلوك قصيرة، واعمل fit لـ reward model على التفضيلات دي، وبعدين حسّن الـ policy قصاد الـ reward اللي اتعمل لها fit. والدرس 14.4 بيرجع له بعد ما طرق الـ policy gradient تبقى متاحة.
والحدود الأمينة مكانها هنا برضه، والدرس 14.4 هيقولها زي ما ينبغي: الـ reinforcement learning جعان عينات، وحسّاس لتحديد الـ reward، ومتعب في إعادة الإنتاج، وكتير الفجوة بين الـ simulator والواقع بتهزمه. ومفيش في ده سبب تعدّي الوحدة — ده سبب إنك تعرف الصياغة دي لما تبقى فيها بجد.
- الـ reinforcement learning هو الصياغة التالتة اللي الدرس 1.2 سمّاها: agent بياخد actions في environment، وبيرصد states، وبياخد reward scalar — ومفيش dataset.
- الـ reward بتاعة الـ action في الزمن t بتتكتب Rt+1، لأنها بتوصل مع الـ state اللي بعدها. والـ episode هي تشغيلة واحدة لحد terminal state.
- الـ feedback evaluative مش instructive: بتعرف قيمة الـ action اللي خدته ومفيش حاجة عن الأفعال اللي ماخدتهاش.
- الفرق الأعمق عن الـ supervised learning إن توزيع البيانات بيعتمد على الـ policy، فتحسين الـ policy بيغيّر البيانات — المشكلة non-stationary بحكم البنا.
- الـ reward متأخرة، وده بيخلّي الـ temporal credit assignment هي المشكلة المركزية؛ وعلى عكس الـ backpropagation مفيش graph قابل للتفاضل تمشي وراه.
- الـ multi-armed bandit (روبنز، 1952) بيعزل الـ exploration عن الـ exploitation. والـ ε-greedy بيخلّي احتمال كل action فوق ε/k، فكل تقدير بيفضل يتصلّح.
- التقديرات بتتحفظ بشكل incremental كقيمة قديمة زائد خطوة ناحية الخطأ — ودي شكل تقريبًا كل تحديث في الوحدة دي.
- الـ reward hacking هو الفشل الافتراضي: الـ agent بيكبّر اللي إنت قِسته. فحدّد إيه اللي عايزه في الـ reward، وحط إزاي في الـ initial policy، زي ما ساتون وبارتو بينصحوا.
- بيستاهل تكلفته في الأماكن اللي القرارات فيها متسلسلة والـ feedback evaluative ومتأخر والخبرة رخيصة: الـ control، والألعاب، والـ recommendation، والـ RLHF (كريستيانو وزمايله، 2017؛ الدرس 9.3).