|
3 weeks ago | |
---|---|---|
.. | ||
solution | 3 weeks ago | |
README.md | 3 weeks ago | |
assignment.md | 3 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
مقدمة إلى التعلم التعزيزي وخوارزمية Q-Learning
رسم توضيحي بواسطة Tomomi Imura
يتضمن التعلم التعزيزي ثلاثة مفاهيم مهمة: الوكيل، بعض الحالات، ومجموعة من الإجراءات لكل حالة. من خلال تنفيذ إجراء في حالة معينة، يحصل الوكيل على مكافأة. تخيل مرة أخرى لعبة الكمبيوتر "سوبر ماريو". أنت ماريو، وأنت في مستوى من اللعبة، تقف بجانب حافة منحدر. فوقك توجد عملة معدنية. كونك ماريو، في مستوى معين من اللعبة، في موقع معين... هذه هي حالتك. التحرك خطوة إلى اليمين (إجراء) سيجعلك تسقط من الحافة، وهذا سيمنحك درجة رقمية منخفضة. ومع ذلك، فإن الضغط على زر القفز سيجعلك تحصل على نقطة وستبقى على قيد الحياة. هذا نتيجة إيجابية ويجب أن تمنحك درجة رقمية إيجابية.
باستخدام التعلم التعزيزي والمحاكاة (اللعبة)، يمكنك تعلم كيفية لعب اللعبة لتحقيق أقصى قدر من المكافآت، وهي البقاء على قيد الحياة وتسجيل أكبر عدد ممكن من النقاط.
🎥 انقر على الصورة أعلاه للاستماع إلى ديمتري وهو يناقش التعلم التعزيزي
اختبار ما قبل المحاضرة
المتطلبات والإعداد
في هذا الدرس، سنجرب بعض الأكواد بلغة Python. يجب أن تكون قادرًا على تشغيل كود Jupyter Notebook من هذا الدرس، سواء على جهاز الكمبيوتر الخاص بك أو في السحابة.
يمكنك فتح دفتر الدرس ومتابعة هذا الدرس للبناء عليه.
ملاحظة: إذا كنت تفتح هذا الكود من السحابة، ستحتاج أيضًا إلى جلب ملف
rlboard.py
، الذي يُستخدم في كود الدفتر. أضفه إلى نفس الدليل الذي يحتوي على الدفتر.
المقدمة
في هذا الدرس، سنستكشف عالم بيتر والذئب، المستوحى من حكاية موسيقية خرافية من تأليف الملحن الروسي سيرجي بروكوفييف. سنستخدم التعلم التعزيزي لتمكين بيتر من استكشاف بيئته، جمع التفاح اللذيذ وتجنب مواجهة الذئب.
التعلم التعزيزي (RL) هو تقنية تعلم تتيح لنا تعلم السلوك الأمثل لوكيل agent في بيئة environment معينة من خلال إجراء العديد من التجارب. يجب أن يكون للوكيل في هذه البيئة هدف goal محدد بواسطة دالة مكافأة reward function.
البيئة
للتبسيط، دعونا نعتبر أن عالم بيتر هو لوحة مربعة بحجم width
x height
، مثل هذه:
كل خلية في هذه اللوحة يمكن أن تكون:
- أرض، يمكن لبيتر والمخلوقات الأخرى المشي عليها.
- ماء، لا يمكن المشي عليه بالطبع.
- شجرة أو عشب، مكان يمكن الراحة فيه.
- تفاحة، تمثل شيئًا يود بيتر العثور عليه لإطعام نفسه.
- ذئب، وهو خطير ويجب تجنبه.
يوجد وحدة Python منفصلة، rlboard.py
، تحتوي على الكود للعمل مع هذه البيئة. نظرًا لأن هذا الكود ليس مهمًا لفهم مفاهيمنا، سنقوم باستيراد الوحدة واستخدامها لإنشاء اللوحة النموذجية (كتلة الكود 1):
from rlboard import *
width, height = 8,8
m = Board(width,height)
m.randomize(seed=13)
m.plot()
يجب أن يطبع هذا الكود صورة للبيئة مشابهة للصورة أعلاه.
الإجراءات والسياسة
في مثالنا، سيكون هدف بيتر هو العثور على تفاحة، مع تجنب الذئب والعوائق الأخرى. للقيام بذلك، يمكنه ببساطة التجول حتى يجد تفاحة.
لذلك، في أي موضع، يمكنه الاختيار بين أحد الإجراءات التالية: أعلى، أسفل، يسار، ويمين.
سنعرّف هذه الإجراءات كقاموس، ونربطها بأزواج من التغيرات المنسقة المقابلة. على سبيل المثال، التحرك إلى اليمين (R
) سيقابل الزوج (1,0)
. (كتلة الكود 2):
actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
action_idx = { a : i for i,a in enumerate(actions.keys()) }
لتلخيص، الاستراتيجية والهدف في هذا السيناريو هما كما يلي:
-
الاستراتيجية، الخاصة بوكيلنا (بيتر) تُعرف بما يسمى السياسة. السياسة هي دالة تُرجع الإجراء في أي حالة معينة. في حالتنا، تمثل حالة المشكلة اللوحة، بما في ذلك الموضع الحالي للاعب.
-
الهدف، من التعلم التعزيزي هو في النهاية تعلم سياسة جيدة تتيح لنا حل المشكلة بكفاءة. ومع ذلك، كخط أساس، دعونا نعتبر السياسة الأبسط المسماة المشي العشوائي.
المشي العشوائي
دعونا نحل مشكلتنا أولاً من خلال تنفيذ استراتيجية المشي العشوائي. مع المشي العشوائي، سنختار الإجراء التالي عشوائيًا من بين الإجراءات المسموح بها، حتى نصل إلى التفاحة (كتلة الكود 3).
-
قم بتنفيذ المشي العشوائي باستخدام الكود أدناه:
def random_policy(m): return random.choice(list(actions)) def walk(m,policy,start_position=None): n = 0 # number of steps # set initial position if start_position: m.human = start_position else: m.random_start() while True: if m.at() == Board.Cell.apple: return n # success! if m.at() in [Board.Cell.wolf, Board.Cell.water]: return -1 # eaten by wolf or drowned while True: a = actions[policy(m)] new_pos = m.move_pos(m.human,a) if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water: m.move(a) # do the actual move break n+=1 walk(m,random_policy)
يجب أن تُرجع استدعاء
walk
طول المسار المقابل، والذي يمكن أن يختلف من تشغيل إلى آخر. -
قم بتشغيل تجربة المشي عدة مرات (على سبيل المثال، 100 مرة)، واطبع الإحصائيات الناتجة (كتلة الكود 4):
def print_statistics(policy): s,w,n = 0,0,0 for _ in range(100): z = walk(m,policy) if z<0: w+=1 else: s += z n += 1 print(f"Average path length = {s/n}, eaten by wolf: {w} times") print_statistics(random_policy)
لاحظ أن متوسط طول المسار حوالي 30-40 خطوة، وهو عدد كبير نسبيًا، بالنظر إلى أن متوسط المسافة إلى أقرب تفاحة حوالي 5-6 خطوات.
يمكنك أيضًا رؤية كيف يبدو تحرك بيتر أثناء المشي العشوائي:
دالة المكافأة
لجعل سياستنا أكثر ذكاءً، نحتاج إلى فهم أي الحركات "أفضل" من غيرها. للقيام بذلك، نحتاج إلى تعريف هدفنا.
يمكن تعريف الهدف من خلال دالة المكافأة، التي ستُرجع قيمة درجة لكل حالة. كلما زاد الرقم، كانت دالة المكافأة أفضل. (كتلة الكود 5)
move_reward = -0.1
goal_reward = 10
end_reward = -10
def reward(m,pos=None):
pos = pos or m.human
if not m.is_valid(pos):
return end_reward
x = m.at(pos)
if x==Board.Cell.water or x == Board.Cell.wolf:
return end_reward
if x==Board.Cell.apple:
return goal_reward
return move_reward
الشيء المثير للاهتمام حول دوال المكافأة هو أنه في معظم الحالات، نحصل فقط على مكافأة كبيرة في نهاية اللعبة. هذا يعني أن خوارزميةنا يجب أن تتذكر بطريقة ما الخطوات "الجيدة" التي تؤدي إلى مكافأة إيجابية في النهاية، وتزيد من أهميتها. وبالمثل، يجب تثبيط جميع الحركات التي تؤدي إلى نتائج سيئة.
خوارزمية Q-Learning
الخوارزمية التي سنناقشها هنا تُسمى Q-Learning. في هذه الخوارزمية، تُعرف السياسة بدالة (أو بنية بيانات) تُسمى جدول Q. يسجل الجدول "جودة" كل إجراء في حالة معينة.
يُسمى جدول Q بهذا الاسم لأنه غالبًا ما يكون من الملائم تمثيله كجدول، أو مصفوفة متعددة الأبعاد. نظرًا لأن لوحتنا لها أبعاد width
x height
، يمكننا تمثيل جدول Q باستخدام مصفوفة numpy ذات الشكل width
x height
x len(actions)
: (كتلة الكود 6)
Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
لاحظ أننا نبدأ جميع قيم جدول Q بقيمة متساوية، في حالتنا - 0.25. هذا يتوافق مع سياسة "المشي العشوائي"، لأن جميع الحركات في كل حالة متساوية الجودة. يمكننا تمرير جدول Q إلى دالة plot
لتصور الجدول على اللوحة: m.plot(Q)
.
في مركز كل خلية يوجد "سهم" يشير إلى الاتجاه المفضل للحركة. نظرًا لأن جميع الاتجاهات متساوية، يتم عرض نقطة.
الآن نحتاج إلى تشغيل المحاكاة، استكشاف بيئتنا، وتعلم توزيع أفضل لقيم جدول Q، مما سيمكننا من العثور على المسار إلى التفاحة بشكل أسرع بكثير.
جوهر Q-Learning: معادلة بيلمان
بمجرد أن نبدأ في التحرك، سيكون لكل إجراء مكافأة مقابلة، أي يمكننا نظريًا اختيار الإجراء التالي بناءً على أعلى مكافأة فورية. ومع ذلك، في معظم الحالات، لن تحقق الحركة هدفنا المتمثل في الوصول إلى التفاحة، وبالتالي لا يمكننا أن نقرر فورًا أي اتجاه هو الأفضل.
تذكر أن النتيجة الفورية ليست هي المهمة، بل النتيجة النهائية، التي سنحصل عليها في نهاية المحاكاة.
لأخذ هذه المكافأة المؤجلة في الاعتبار، نحتاج إلى استخدام مبادئ البرمجة الديناميكية، التي تتيح لنا التفكير في مشكلتنا بشكل تكراري.
افترض أننا الآن في الحالة s، ونريد الانتقال إلى الحالة التالية s'. من خلال القيام بذلك، سنحصل على المكافأة الفورية r(s,a)، المعرفة بواسطة دالة المكافأة، بالإضافة إلى بعض المكافآت المستقبلية. إذا افترضنا أن جدول Q يعكس بشكل صحيح "جاذبية" كل إجراء، فإننا في الحالة s' سنختار الإجراء a الذي يتوافق مع القيمة القصوى لـ Q(s',a'). وبالتالي، فإن أفضل مكافأة مستقبلية ممكنة يمكننا الحصول عليها في الحالة s ستُعرف بـ max
التحقق من السياسة
نظرًا لأن جدول Q يسرد "جاذبية" كل إجراء في كل حالة، فمن السهل استخدامه لتحديد التنقل الفعّال في عالمنا. في أبسط الحالات، يمكننا اختيار الإجراء الذي يتوافق مع أعلى قيمة في جدول Q: (كتلة الكود 9)
def qpolicy_strict(m):
x,y = m.human
v = probs(Q[x,y])
a = list(actions)[np.argmax(v)]
return a
walk(m,qpolicy_strict)
إذا جربت الكود أعلاه عدة مرات، قد تلاحظ أنه أحيانًا "يتوقف"، وتحتاج إلى الضغط على زر الإيقاف في الدفتر لمقاطعته. يحدث هذا لأن هناك حالات قد تشير فيها حالتان إلى بعضهما البعض من حيث قيمة Q المثلى، وفي هذه الحالة ينتهي الأمر بالوكيل بالتنقل بين تلك الحالات إلى ما لا نهاية.
🚀التحدي
المهمة 1: قم بتعديل وظيفة
walk
لتحديد الحد الأقصى لطول المسار بعدد معين من الخطوات (على سبيل المثال، 100)، وشاهد الكود أعلاه يعيد هذه القيمة من وقت لآخر.
المهمة 2: قم بتعديل وظيفة
walk
بحيث لا تعود إلى الأماكن التي زارتها مسبقًا. سيمنع هذاwalk
من التكرار، ومع ذلك، قد ينتهي الأمر بالوكيل بأن يكون "محاصرًا" في موقع لا يستطيع الهروب منه.
التنقل
سياسة التنقل الأفضل هي تلك التي استخدمناها أثناء التدريب، والتي تجمع بين الاستغلال والاستكشاف. في هذه السياسة، سنختار كل إجراء باحتمالية معينة، تتناسب مع القيم في جدول Q. قد تؤدي هذه الاستراتيجية إلى عودة الوكيل إلى موقع سبق أن استكشفه، ولكن كما ترى من الكود أدناه، فإنها تؤدي إلى مسار متوسط قصير جدًا إلى الموقع المطلوب (تذكر أن print_statistics
يشغل المحاكاة 100 مرة): (كتلة الكود 10)
def qpolicy(m):
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
return a
print_statistics(qpolicy)
بعد تشغيل هذا الكود، يجب أن تحصل على طول مسار متوسط أصغر بكثير من السابق، في نطاق 3-6.
التحقيق في عملية التعلم
كما ذكرنا، عملية التعلم هي توازن بين الاستكشاف واستغلال المعرفة المكتسبة حول هيكل مساحة المشكلة. لقد رأينا أن نتائج التعلم (القدرة على مساعدة الوكيل في العثور على مسار قصير إلى الهدف) قد تحسنت، ولكن من المثير أيضًا ملاحظة كيف يتصرف متوسط طول المسار أثناء عملية التعلم:
يمكن تلخيص التعلم كما يلي:
-
زيادة متوسط طول المسار. ما نراه هنا هو أنه في البداية، يزيد متوسط طول المسار. ربما يرجع ذلك إلى أنه عندما لا نعرف شيئًا عن البيئة، فمن المحتمل أن نقع في حالات سيئة، مثل الماء أو الذئب. ومع تعلمنا المزيد واستخدام هذه المعرفة، يمكننا استكشاف البيئة لفترة أطول، ولكننا لا نزال لا نعرف جيدًا مكان التفاح.
-
انخفاض طول المسار مع زيادة التعلم. بمجرد أن نتعلم بما يكفي، يصبح من الأسهل للوكيل تحقيق الهدف، ويبدأ طول المسار في الانخفاض. ومع ذلك، لا نزال منفتحين على الاستكشاف، لذا غالبًا ما ننحرف بعيدًا عن المسار الأفضل، ونستكشف خيارات جديدة، مما يجعل المسار أطول من المثالي.
-
زيادة الطول بشكل مفاجئ. ما نلاحظه أيضًا في هذا الرسم البياني هو أنه في مرحلة ما، زاد الطول بشكل مفاجئ. يشير هذا إلى الطبيعة العشوائية للعملية، وأنه يمكننا في مرحلة ما "إفساد" معاملات جدول Q عن طريق الكتابة فوقها بقيم جديدة. يجب تقليل هذا بشكل مثالي عن طريق تقليل معدل التعلم (على سبيل المثال، في نهاية التدريب، نقوم فقط بتعديل قيم جدول Q بقيمة صغيرة).
بشكل عام، من المهم أن نتذكر أن نجاح وجودة عملية التعلم تعتمد بشكل كبير على المعلمات، مثل معدل التعلم، انخفاض معدل التعلم، وعامل الخصم. غالبًا ما يُطلق على هذه المعلمات اسم المعلمات الفائقة، لتمييزها عن المعلمات، التي نقوم بتحسينها أثناء التدريب (على سبيل المثال، معاملات جدول Q). عملية العثور على أفضل قيم للمعلمات الفائقة تُسمى تحسين المعلمات الفائقة، وهي تستحق موضوعًا منفصلًا.
اختبار ما بعد المحاضرة
الواجب
إخلاء المسؤولية:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية Co-op Translator. بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.