قراية
وضع الحكايات

الـ policy methods والـ reinforcement learning (التعلّم المعزَّز) بيبقى حقيقي فين

~24 دقيقة قراية الدرس 4 من 4 في الوحدة 14

أبعد من جدول القيم

الدرس 14.3 اتعلّم الـ action values وبعدين قرا policy منها: في كل state، خد الـ action اللي قيمة Q بتاعته أعلى. والـ policy عمرها ما اتدرّبت — كانت ناتج جانبي. والدرس ده بيدرّب الـ policy نفسها.

الـ parameterized policy (السياسة ذات المعاملات) πθ(a | s) هي function بـ weights θ بتاخد state وبتطلّع احتمال لكل action، أو parameters لتوزيع على الـ actions. وبعدين θ بتتعدّل عشان تخلّي الـ actions الكويسة أكتر احتمالًا. مفيش جدول Q، ولا argmax، ولا إبسيلون. وكتاب ساتون وبارتو Reinforcement Learning: An Introduction (الطبعة التانية، 2018) مخصّص فصل الـ policy gradient للانتقال ده بالظبط، وهو المرجع المعتاد للمادة اللي تحت.

تلات أوضاع بتخلّي ده أحسن بوضوح من تعلّم القيم.

الـ actions المتصلة. الـ agent بتاع تعلّم القيمة Q لازم يحسب maxa Q(s, a). فلو الـ action زاوية توجيه أو torque على مفصل — رقم حقيقي، أو vector من أربعين منهم — فالتكبير ده هو نفسه مسألة optimization، بتتحل جوه كل تحديث لوحده. أما الـ policy network فبتتجنّبه خالص: بتطلّع الـ action، أو متوسط توزيع على الـ actions وانتشاره.

الـ optimal policies العشوائية. الـ policies الـ greedy على القيم حتمية بحكم البنا. وساعات الـ optimal policy مبتبقاش حتمية فعلًا. في لعبة زي حجر-ورقة-مقص، أي policy حتمية ينفع تتستغل والـ optimal policy عشوائية منتظمة. وفي environment متشافة جزئيًا فيها statesين مختلفين بيبانوا زي بعض، العشوائية هي أحسن حاجة تقدر عليها. والـ policy اللي بتطلّع احتمالات تقدر تمثّل ده؛ والـ argmax متقدرش.

النعومة. تغيير صغير جدًا في قيمة Q ممكن يقلب الـ argmax فيغيّر الـ policy بشكل مش متصل. أما الـ policy gradient فبيزقّ احتمالات الـ actions شوية كل مرة، وده أسهل في التثبيت.

فكرة الـ policy gradient

الـ objective function J(θ) هي الـ return المتوقّع تحت الـ policy — يعني الـ agent بيلمّ reward قد إيه في المتوسط لو اتصرّف على حسب πθ. وإحنا عايزين نعلّيها، فعايزين الـ gradient بتاعها بالنسبة لـ θ. والعقبة إن θ مبتأثّرش في الـ return غير بإنها تغيّر الـ trajectories اللي بتحصل، ومساهمة الـ environment في ده مجهولة. والـ policy gradient theorem (مبرهنة تدرّج السياسة) هي اللي بتخلّي الـ gradient ينفع يتحسب رغم كده.

الـ policy gradient
\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}}\left[ \nabla_{\theta} \log \pi_{\theta}(a \mid s) \, Q^{\pi}(s,a) \right]
gradient الـ return المتوقّع هو توقّع لحاجة الـ agent يقدر يحسبها فعلًا: gradient لوغاريتم احتمال الـ action اللي خده، موزون بالـ action ده كان كويس قد إيه. والأهم إن مفيش فيه حد بيفاضل الـ environment — فـ dynamics الانتقال مبتظهرش، يبقى ده model-free بنفس المعنى اللي كان عليه الدرس 14.3. ودي الصيغة من غير خصم؛ ففي الإعداد الـ episodic المخصوم الـ gradient الدقيق بيوزن الحد عند الخطوة t بالعامل γt، وده عامل تقريبًا كل التطبيقات بتشيله عمليًا (سوتون وبارتو، 2018).

شكل التعبير ده يستاهل وقفة، لأنه بيفسّر كل algorithm في باقي الدرس. ∇θ log πθ(a | s) هو الاتجاه في فضاء الـ weights اللي بيخلّي الـ action a أكتر احتمالًا في الـ state s. وضربه في Qπ(s, a) بيظبط حجم الاتجاه ده على قد ما الـ action كويس. اجمع على الخبرة وهتاخد: خلّي الـ actions الكويسة أكتر احتمالًا، على قد ما هي كويسة. ولأنه توقّع، ينفع يتقدّر بالـ sampling — شغّل الـ policy وخد المتوسط.

الـ REINFORCE ومشكلة الـ variance فيه

ويليامز (1992) إدّى أبسط تمثيل ليها. العب episode كاملة، ولكل خطوة استخدم الـ return الفعلي اللي جه بعدها — سمّيه Gt — بدل Qπ(s, a). الـ return حصل فعلًا، فهو عينة من غير bias لقيمة الـ action.

تحديث REINFORCE
\theta \leftarrow \theta + \alpha \, G_t \, \nabla_{\theta} \log \pi_{\theta}(A_t \mid S_t)
gradient ascent، مش descent — الإشارة موجبة لأن الهدف reward بتتكبّر مش loss بتتصغّر. فلو الـ episode مشيت كويس، Gt بتبقى كبيرة وموجبة وكل action اتاخد على الطريق بيتعزّز. وخد بالك إن الـ algorithm كله محتاج episode بتخلص، فهو على عكس طرق الـ temporal difference في الدرس 14.3 ميقدرش يتعلّم من خطوة واحدة.

الـ REINFORCE مالوش bias، وعمليًا فيه noise لدرجة إنه غالبًا مبينفعش يتستخدم. والمشكلة هي الـ variance. Gt هي مجموع كل reward في باقي الـ episode، فبتشرب كل حادثة عشوائية حصلت بعد الـ action — noise الـ environment، وكل اختيار بعدها الـ policy العشوائية خدته. فممكن actionين متطابقين في statesين متطابقين ييجي بعدهم returns مختلفين جامد، فواحد يتعزّز بقوة والتاني يتثبّط بقوة. تقدير الـ gradient بيشاور على الاتجاه الصح تقريبًا في المتوسط، بس أي تقدير لوحده ممكن يشاور تقريبًا على أي حتة، وإنك تقلّل ده بالمتوسط محتاج عدد ضخم من الـ episodes.

وفيه عيب تاني أدق. افترض إن كل reward في مهمة معيّنة موجبة — مثلًا كل action بيكسب بين +1 و+10. يبقى Gt دايمًا موجبة، فـ كل action اتاخد في أي وقت بيتعزّز، ومعاه الوحش. والتعلّم مبيحصلش غير لأن الـ actions الكويسة بتتعزّز أقوى. ودي طريقة مهدرة تستخدم بيها إشارة gradient، وهي اللي الفكرة الجاية بتعالجها.

الـ baselines والـ advantage

اطرح baseline (خط أساس) b(s) من الـ return قبل ما تستخدمه: بدّل Gt بـ Gt − b(St). وطول ما الـ baseline بيعتمد على الـ state بس مش على الـ action، الـ gradient بيفضل من غير bias — ساتون وبارتو بيثبتوا ده، والسبب إن الحد الزيادة مجموعه صفر لما تجمع على الـ actions. بس ممكن يقلّل الـ variance جامد، لأن الكمية اللي بتضرب لوغاريتم الاحتمال بقت مقارنة مش درجة مطلقة.

والـ baseline الطبيعي هو قيمة الـ state Vπ(s) — يعني الـ agent كان متوقّع يحقق قد إيه من الـ state دي تحت الـ policy الحالية بتاعته. وطرحها بيطلّع الـ advantage (الأفضلية).

الـ advantage function
A^{\pi}(s,a) = Q^{\pi}(s,a) - V^{\pi}(s)
الـ action ده كان أحسن قد إيه من قيمة الـ state في المتوسط. الـ advantage الموجبة معناها إن الـ action عدّى التوقّعات والمفروض يبقى أكتر احتمالًا؛ والسالبة معناها إنه أقل منها والمفروض يبقى أقل احتمالًا. وفي state كل الـ actions فيها بتوصل لنتيجة كويسة، كل الـ advantages بتبقى قريبة من الصفر والـ policy بتتساب في حالها زي ما المفروض — وده بالظبط اللي return من غير تعديل مقدرش يعبّر عنه.

وده بيشيل كمان مشكلة الـ rewards اللي كلها موجبة. ففي مهمة كل action فيها بيكسب بين +1 و+10، action بـ reward +2 في state قيمتها +6 الـ advantage بتاعته −4 فبيبقى أقل احتمالًا. الدرجات المطلقة بقت نسبية.

الـ actor والـ critic

الـ advantage محتاجة Vπ(s)، ومحدش يعرفها. يبقى اتعلّمها هي كمان. درّب شبكتين جنب بعض:

شبكتين، وظيفتين

الـ actor (الفاعل) (actor) هو الـ policy πθ(a | s). بيختار الـ actions، وبيتحدّث في اتجاه الـ policy gradient، متظبّط بالـ advantage اللي الـ critic بيبلّغ عنها.

الـ critic (الناقد) (critic) بيقدّر V(s). وبيتحدّث بـ temporal-difference regression عادي — نفس فكرة الـ bootstrapping بخطوة واحدة من الدرس 14.3، بتصغير مربّع الـ TD error مش objective بتاع policy.

والـ critic بيشتري أكتر من تقليل الـ variance. فلأنه يقدر يقدّر قيمة الـ state الجاية، الـ advantage ينفع تتقرّب من انتقال واحد: Rt+1 + γV(St+1) − V(St) — وده هو الـ TD error تاني. فطرق الـ actor-critic، على عكس الـ REINFORCE، مش محتاجة episode بتخلص. وده بيخلّيها تنفع لمهام continuing مالهاش حد episode خالص.

والتمن هو الـ bias. تقدير الـ critic لـ V غلط، خصوصًا في أول التدريب، فالـ advantage اللي بيبلّغ عنها غلط، فالـ gradient عليه bias. الـ REINFORCE كان من غير bias وفيه noise لدرجة مستحيلة؛ والـ actor-critic عليه bias وبيشتغل. وكل طريقة policy gradient عملية واقعة في حتة على الـ trade-off ده، والمقبض اللي بيحدّد مكانها هو عدد خطوات الـ reward الحقيقية اللي بتستخدمها قبل ما تسلّم الموضوع لتقدير الـ critic.

الـ PPO: ليه بقى الاختيار الافتراضي

طرق الـ policy gradient فيها هشاشة محدّدة. الـ gradient بيقولّك اتجاه مش مسافة، وتحديث واحد حجمه زيادة ممكن يبوّظ الـ policy. وده أوحش من ما هو باين: الـ policy هي كمان اللي بتولّد البيانات. والـ policy اللي باظت بتلمّ خبرة وحشة متقدرش تتعافى منها، فخطوة وحشة واحدة ممكن تنهي الـ run كلها.

شولمان وزمايله (2017) اقترحوا الـ Proximal Policy Optimization (تحسين السياسة القريب) (Proximal Policy Optimization، أو PPO)، اللي بيعالج ده بإنه يرفض يسيب الـ policy تبعد عن الـ policy اللي لمّت البيانات. بيعرّف probability ratio — الـ policy الجديدة بتخلّي الـ action أكتر احتمالًا قد إيه من القديمة — وبيعمل له clipping.

الـ probability ratio
r_t(\theta) = \frac{\pi_{\theta}(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)}
بتساوي 1 لما الـ policy المتحدّثة تتفق مع الـ policy اللي لمّت البيانات. وفوق 1 معناها إن الـ action بقى أكتر احتمالًا؛ وتحت 1 أقل احتمالًا. والـ ratio هي مقياس التحديث اتنقل قد إيه، متعبّر عنه بالوحدات الوحيدة المهمة هنا — احتمالات الـ actions.
الـ clipped objective
L^{\text{CLIP}}(\theta) = \mathbb{E}_t\!\left[ \min\!\left( r_t(\theta)\hat{A}_t, \; \text{clip}\!\left(r_t(\theta),\, 1-\epsilon,\, 1+\epsilon\right)\hat{A}_t \right) \right]
خد الأصغر من الـ objective من غير clipping ونسخة الـ ratio بتاعتها محصورة في [1 − ε، 1 + ε]، وε عادةً حوالي 0.1 لـ 0.2. ولأنه الأصغر، الـ objective بيبطّل يكافئ التحديث أول ما الـ ratio تخرج من منطقة الثقة — فالـ gradient بيتفرد ومبيفضلش فيه حافز تزقّ أكتر. وخد بالك إن ε هنا مدى clipping ومالهاش علاقة بإبسيلون الـ exploration في الدرس 14.3.

طب ليه بقى default منتشر؟ مش لأنه أكتر اختيار متطوّر، لكن بسبب الخصائص العملية اللي شولمان وزمايله كانوا عايزين يحقّقوها — الخصائص اللي بتفرق لما تبقى مضطر تخلّي حاجة تشتغل:

إيه اللي خلّى PPO الـ default

استقرار من غير أدوات تقيلة. طرق الـ trust region اللي قبله فرضت قيد شبهه بس احتاجت معلومات second-order عن انحناء الـ objective. أما PPO فبياخد أثر قريب من clipping وmin، باستخدام gradients first-order بس — فبيدخل في أي framework للـ automatic differentiation عادي.

hyperparameters قليلة، وdefaults متسامحة. مدى clipping، وlearning rate، وعدد epochs. والطرق اللي محتاجة عشر إعدادات متظبّطة بعناية مبتنجاش لما تتخبط في مسائل جديدة.

إعادة استخدام البيانات. الـ clipping هو اللي بيخلّي إنك تاخد كذا epoch gradient على نفس الـ batch من الخبرة اللي اتلمّت آمن، وده مهم لما التفاعل مع الـ environment يبقى الجزء الغالي.

ومكانته كـ default أوضح ما تكون في pipeline الـ RLHF اللي تحت، اللي فيه شغل InstructGPT (أويانج وزمايله، 2022) بيستخدم algorithm PPO عشان يعمل fine-tuning لـ language model من الـ human feedback — وده الإعداد اللي أغلب الممارسين بيقابلوه فيه دلوقتي.

الـ RLHF: المكان اللي أغلب الناس بيقابلوا فيه الـ reinforcement learning فعلًا

الدرس 9.3 قدّم الـ reinforcement learning from human feedback كالخطوة اللي حوّلت predictor بالكلمة الجاية لـ assistant. ومع الـ policy gradients في إيدك، الآلية ينفع تتشرح زي ما ينبغي. العقبة اللي RLHF بيحلّها إن مفيش reward function لـ «إجابة مفيدة». متقدرش تكتبها، والـ reinforcement learning محتاج واحدة. فـ الـ reward function بتتعلّم من مقارنات بني آدمين.

كريستيانو وزمايله (2017) أسّسوا الطريقة دي، فدرّبوا agents من تفضيلات بني آدمين بين أزواج من مقاطع سلوك بدل reward مكتوبة بالإيد. وأويانج وزمايله (2022)، يعني ورقة InstructGPT، طبّقوا نفس البنية على الـ language models. تلات مراحل:

بيانات التفضيل ← الـ reward model ← PPO

1. بيانات التفضيل. اسحب كذا رد لنفس الـ prompt واسأل annotators بني آدمين بيفضّلوا أنهي واحد. وخد بالك إيه اللي بيتلمّ: ترتيب، مش درجة. فالناس متّسقين أكتر بكتير في إنهم يقولوا أنهي إجابة أحسن من إنهم يحطوا رقم على أي واحدة.

2. الـ reward model. درّب model يتنبأ بالتفضيلات دي — بياخد prompt ورد وبيطلّع قيمة scalar، متعمل لها fit بحيث الردود المفضّلة تاخد درجة أعلى. وده supervised learning عادي، وهو بيحوّل كوم من أحكام البني آدمين للـ reward function اللي الـ reinforcement learning طالبها.

3. الـ fine-tuning بـ PPO. دلوقتي بقت مسألة policy gradient: الـ policy هي الـ language model، والـ action هو إطلاق token، والـ reward جاية من الـ reward model. والـ PPO بيحسّنها، مع penalty على البعد عن الـ model الأصلي — وده اللي بيمنع الـ language model إنه ينهار لأي نص بايظ الـ reward model بالصدفة بيبالغ في تقديره.

الـ penalty بتاعة المرحلة التالتة دي تستاهل انتباه، لأنها مشكلة الـ reward hacking من الدرس 14.1 وهي واصلة للـ production. فالـ reward model بديل ناقص لحكم البني آدم، والـ policy اللي بتتحسّن قصاده بقوة كفاية هتلاقي أخطاءه بدل ما ترضي البني آدمين اللي اتعمل له fit عليهم. والقيد هو اللي بيخلّي الـ optimization أمين. وكورس GenAI-101 بيغطّي الـ pipeline ده من ناحية الـ language model؛ أما الـ reinforcement learning اللي جوّاه فهو مادة الدرس ده.

حدود صريحة

الـ reinforcement learning طلّع نتايج مذهلة بجد، وفي نفس الوقت هو أقل أدوات الكورس ده موثوقية. وأربع حدود يستاهلوا يتقالوا صراحةً، لأن النجاحات المنشورة عادةً مبتعلنش عنهم.

الـ sample inefficiency (عدم كفاءة العينات). agents الـ reinforcement learning محتاجة كميات مذهلة من التفاعل — ملايين الـ episodes غالبًا على مهام البني آدم بيتقنها في دقايق. ولما التفاعل يبقى رخيص وسريع، زي في simulator أو لعبة، ده مجرد إزعاج. ولما كل عينة تكلّف حركة روبوت حقيقية أو جلسة مستخدم حقيقية أو دولار حقيقي، غالبًا بيبقى قاتل. وده لوحده أكبر سبب إن الـ reinforcement learning أندر في الـ production من اللي سمعته بتقوله.

تحديد الـ reward. الـ supervised learning بيطلب منك labels. والـ reinforcement learning بيطلب منك reward function، ودي أصعب تجيبها صح، لأن الـ agent بيحسّن بالظبط اللي إنت كتبته مش اللي إنت قصدته. والـ reward hacking في الدرس 14.1 مش شكل فشل غريب؛ ده النتيجة الافتراضية لـ reward function غلط شوية.

فجوة الـ sim-to-real. الرد المعتاد على عدم كفاءة العينات هو التدريب في simulation، اللي العينات فيها رخيصة والأخطاء ببلاش. بس الـ policy المتدرّبة في simulation اتعلّمت الـ simulator، ومعاه أخطاؤه. فاحتكاك التلامس وnoise الـ sensors والـ latency والـ dynamics اللي ماتعملهاش model كلها بتختلف في الدنيا الحقيقية، والـ policy ممكن تستغل artifact في الـ simulator مالوش وجود بره. والـ domain randomization — يعني تنويع parameters الـ simulator بقصد عشان محدش يقدر يعتمد على أي شذوذ واحد — هو التخفيف المعتاد، وهو بيضيّق الفجوة مش بيقفلها.

الـ reproducibility. نتايج الـ reinforcement learning بتختلف بين الـ runs أكتر بكتير من نتايج الـ supervised learning، لأن الـ agent بيولّد بياناته: exploration محظوظ بدري ممكن يوصّل لـ policy كويسة، وواحد منحوس يوصّل لفشل، من نفس الـ code. ونفس الـ algorithm على نفس المهمة بـ random seeds مختلفة ممكن يطلّع منحنيات تعلّم مختلفة جدًا. فإنك تبلّغ عن run واحدة مش دليل، والمقارنات بين الـ algorithms محتاجة seeds كتير وتبليغ عن التشتّت.

اختبار مفيد

قبل ما تمدّ إيدك للـ reinforcement learning، اسأل هل المسألة محتاجة فعلًا تتعلّم من النتايج. فلو معاك أمثلة عليها labels للسلوك الصح، فالـ supervised learning أرخص وأثبت وأسهل في الـ debugging. والـ reinforcement learning بيستاهل تكلفته لما الـ action الصح ميبقاش معروف مسبقًا بس النتيجة تبقى ينفع تتقيّم — الألعاب، والـ control، وتحسين التفضيل زي RLHF. وفي الأماكن اللي الـ reinforcement learning بيتستخدم فيها فعلًا على نطاق واسع، عادةً بيبقى آخر مرحلة في pipeline الباقي فيه supervised، وده بالظبط شكل RLHF.

أهم النقط
  • طرق الـ policy بتدرّب πθ(a | s) على طول بدل ما تستنتج policy من الـ action values. وبتكسب مع الـ actions المتصلة، اللي فيها maxa Q مسألة optimization في حد ذاتها، ولما الـ optimal policy تبقى عشوائية فعلًا.
  • الـ policy gradient توقّع لـ ∇θ log πθ(a | s) موزون بالـ action كان كويس قد إيه: خلّي الـ actions الكويسة أكتر احتمالًا، على قد ما هي كويسة. ومفيش فيه حد بيفاضل الـ environment.
  • الـ REINFORCE (ويليامز، 1992) بيستخدم الـ return الفعلي للـ episode ومالوش bias بس الـ variance بتاعه عالي جدًا، لأن الـ return بيشرب كل حادثة عشوائية جت بعد الـ action. وكمان محتاج episode بتخلص.
  • طرح baseline بيعتمد على الـ state بيخلّي الـ gradient من غير bias وبيقلّل الـ variance. والاختيار الطبيعي بيدّي الـ advantage A = Q − V: الـ action كان أحسن قد إيه من قيمة الـ state.
  • الـ actor-critic بيتعلّم الـ policy والـ value function مع بعض. والـ critic بيخلّي التحديثات بخطوة واحدة ممكنة — لأن الـ advantage بتبقى الـ TD error — بتمن bias من critic ناقص.
  • الـ PPO (شولمان وزمايله، 2017) بيعمل clipping للـ probability ratio عشان التحديث ميبعدش عن الـ policy اللي لمّت البيانات. وبقى default منتشر لأسباب هندسية: first-order بس، وhyperparameters قليلة، وإعادة استخدام آمنة لـ batch على كذا epoch.
  • الـ RLHF هو بيانات تفضيل، وبعدين reward model متعمل له fit على الترتيبات دي، وبعدين fine-tuning بـ PPO مع penalty على البعد عن الـ model الأصلي — كريستيانو وزمايله (2017) وأويانج وزمايله (2022).
  • الحدود الصريحة: الـ sample inefficiency، وتحديد الـ reward، وفجوة الـ sim-to-real، وضعف الـ reproducibility على الـ random seeds. ولو معاك أمثلة عليها labels للسلوك الصح، فاستخدم الـ supervised learning بداله.
اللي فات الـ Q-learning (تعلّم القيمة Q) نظرة عامة الختام اكتملت الدورة