اكتب منظمة العفو الدولية للفوز في بونغ من البداية مع التعلم التعزيز

هناك فرق كبير بين قراءة التعلم المعزز وتطبيقه فعليًا.

في هذا المنشور ، ستقوم بتطبيق شبكة Neural Network لتعزيز التعلم وستراها تتعلم المزيد والمزيد لأنها تصبح في النهاية جيدة بما يكفي للتغلب على جهاز الكمبيوتر في Pong! يمكنك اللعب مع ألعاب Atari الأخرى في OpenAI Gym.

بحلول نهاية هذا المنشور ، ستكون قادرًا على القيام بما يلي:

  • اكتب شبكة عصبية من الصفر.
  • تطبيق تدرج السياسات مع التعلم التعزيز.
  • قم بإنشاء AI لـ Pong يمكنه التغلب على الكمبيوتر في أقل من 250 سطرًا من Python.
  • استخدام OpenAI الصالة الرياضية.

مصادر

تستند الشفرة والفكرة جميعها بشكل صارم إلى منشور مدونة Andrej Karpathy. المقصود من الكود في me_pong.py هو أن يكون إصدار أبسط من pong.py الذي كتبه الدكتور كارباثي.

المتطلبات الأساسية وقراءة الخلفية

للمتابعة ، ستحتاج إلى معرفة ما يلي:

  • بيثون الأساسية
  • تصميم الشبكات العصبية و backpropogation
  • حساب التفاضل والتكامل والجبر الخطي

إذا كنت تريد الغوص بشكل أعمق في المواد الموجودة ، فاقرأ منشور المدونة الذي يستند إليه كل هذا. هذا المنشور هو مقدمة أبسط لتلك المادة.

عظيم! هيا بنا نبدأ.

اقامة

  1. افتح الكود لمتابعة
  2. اتبع الإرشادات لتثبيت OpenAI Gym. قد تحتاج إلى تثبيت cmake أولاً.
  3. قم بتشغيل تثبيت pip -e. [atari]
  4. ارجع إلى جذر هذا المستودع وافتح ملفًا جديدًا يسمى my_pong.py في محررك المفضل.
  5. هيا بنا إلى حل المشاكل. هذه هي المشكلة:

مشكلة

تعطى لنا ما يلي:

  • سلسلة من الصور (إطارات) تمثل كل إطار من لعبة Pong.
  • إشارة إلى أننا فزنا أو خسرنا اللعبة.
  • وكيل الخصم الذي هو لاعب الكمبيوتر بونغ التقليدية.
  • وكيل نتحكم فيه يمكننا أن نقول للتحرك صعودا أو هبوطا في كل إطار.

هل يمكننا استخدام هذه القطع لتدريب وكيلنا للتغلب على الكمبيوتر؟ علاوة على ذلك ، هل يمكننا أن نجعل حلنا عامًا بشكل كافٍ بحيث يمكن إعادة استخدامه للفوز في الألعاب التي لا تنسجم؟

حل

في الواقع ، يمكننا! يقوم Andrej بذلك عن طريق إنشاء شبكة Neural التي تأخذ كل صورة وتخرج أمرًا إلى AI لدينا للتحرك للأعلى أو للأسفل.

بنية Andrej في الحل من مدونته.

يمكننا تقسيم هذا أكثر قليلاً في الخطوات التالية:

تقوم شبكتنا العصبية ، المعتمدة بشكل كبير على حل أندريج ، بما يلي:

  1. التقط صورًا من اللعبة وقم بمعالجتها مسبقًا (قم بإزالة اللون ، الخلفية ، الاختزال وما إلى ذلك).
  2. استخدم الشبكة العصبية لحساب احتمال التحرك لأعلى.
  3. عينة من هذا التوزيع الاحتمال وإخبار الوكيل بالتحرك لأعلى أو لأسفل.
  4. إذا انتهت الجولة (فاتتك الكرة أو أن الخصم فوتها) ، فابحث عما إذا كنت قد فزت أم خسرت.
  5. عندما تنتهي الحلقة (حصل شخص ما على 21 نقطة) ، مرر النتيجة من خلال خوارزمية backpropagation لحساب التدرج لوزننا.
  6. بعد انتهاء 10 حلقات ، لخص التدرج وحرك الأوزان في اتجاه التدرج اللوني.
  7. كرر هذه العملية حتى يتم ضبط أوزاننا إلى الحد الذي يمكننا فيه التغلب على الكمبيوتر. هذا هو الأساس! دعنا نبدأ في النظر في كيفية تحقيق كودنا هذا.

حسنًا ، بعد أن وصفنا المشكلة والحل ، دعنا نكتب بعض الرموز!

الشفرة

سنقوم الآن باتباع الكود في me_pong.py. يرجى الاحتفاظ بها مفتوحة وقراءة على طول! الكود يبدأ هنا:

def main ():

التهيئة

أولاً ، دعونا نستخدم OpenAI Gym لتوفير بيئة لعبة والحصول على صورتنا الأولى من اللعبة.

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

  • batch_size: عدد الجولات التي نلعبها قبل تحديث أوزان شبكتنا.
  • جاما: عامل الخصم الذي نستخدمه لخصم تأثير الإجراءات القديمة على النتيجة النهائية. (لا تقلق بشأن هذا بعد)
  • decay_rate: المعلمة المستخدمة في خوارزمية RMSProp. (لا تقلق بشأن هذا بعد)
  • num_hidden_layer_neurons: كم عدد الخلايا العصبية الموجودة في طبقتنا المخفية.
  • learning_rate: المعدل الذي نتعلم به من نتائجنا لحساب الأوزان الجديدة. معدل أعلى يعني أننا نتفاعل أكثر مع النتائج ويعني معدل أقل أننا لا نتفاعل بقوة مع كل نتيجة.

بعد ذلك ، نقوم بتعيين العدادات والقيم الأولية والأوزان الأولية في شبكتنا العصبية.

يتم تخزين الأوزان في المصفوفات. الطبقة 1 من شبكتنا العصبية هي مصفوفة 200 × 6400 تمثل الأوزان لطبقتنا المخفية. بالنسبة للطبقة 1 ، يمثل العنصر w1_ij وزن الخلية العصبية i لإدخال البكسل j في الطبقة 1.

الطبقة 2 هي مصفوفة 200 × 1 تمثل أوزان إخراج الطبقة المخفية في ناتجنا النهائي. بالنسبة للطبقة 2 ، يمثل العنصر w2_i الأوزان التي نضعها على تنشيط الخلايا العصبية في الطبقة المخفية.

نقوم بتهيئة أوزان كل طبقة بأرقام عشوائية في الوقت الحالي. نقسم على الجذر التربيعي لعدد حجم البعد لتطبيع أوزاننا.

بعد ذلك ، قمنا بإعداد المعلمات الأولية لـ RMSProp (طريقة لتحديث الأوزان التي سنناقشها لاحقًا). لا تقلق كثيرًا بشأن فهم ما تراه أدناه. أقوم بإعداده هنا بشكل أساسي حتى نتمكن من متابعة المتابعة على طول الكود الرئيسي.

سنحتاج إلى جمع مجموعة من الملاحظات والقيم الوسيطة عبر الحلقة واستخدامها لحساب التدرج اللوني في النهاية بناءً على النتيجة. فيما يلي إعداد المصفوفات حيث سنجمع كل هذه المعلومات.

حسنًا ، لقد انتهينا جميعًا من الإعداد! إذا كنت متابعًا ، فيجب أن يبدو مثل هذا:

تفو. الآن الجزء الممتع!

معرفة كيفية التحرك

جوهر خوارزمية لدينا سوف يعيش في حلقة حيث نقوم باستمرار التحرك ثم نتعلم بناء على نتائج هذه الخطوة. سنضع كل شيء في الوقت الحالي في الوقت الحالي ولكن في الواقع قد تقوم بإعداد شرط توقف لإيقاف العملية.

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

دعنا ننتقل إلى preprocess_observations لنرى كيف يمكننا تحويل الصورة التي يقدمها OpenAI Gym إلى شيء يمكننا استخدامه لتدريب شبكتنا العصبية. الخطوات الأساسية هي:

  1. قص الصورة (نحن نهتم فقط بالأجزاء التي نعلمها).
  2. اختزال الصورة.
  3. قم بتحويل الصورة إلى أبيض وأسود (اللون ليس مهم بشكل خاص لنا).
  4. إزالة الخلفية.
  5. قم بالتحويل من مصفوفة 80 × 80 من القيم إلى مصفوفة 6400 × 1 (قم بتسوية المصفوفة بحيث تكون أسهل في الاستخدام).
  6. قم فقط بتخزين الفرق بين الإطار الحالي والإطار السابق إذا كنا نعرف الإطار السابق (نحن نهتم فقط بما تم تغييره).

الآن وبعد أن قمنا بمعالجة الملاحظات مسبقًا ، دعنا ننتقل إلى إرسال الملاحظات فعليًا عبر شبكتنا العصبية لتوليد احتمال إخبار منظمة العفو الدولية بالارتقاء. فيما يلي الخطوات التي سنتخذها:

كيف بالضبط applic_neural_nets تأخذ الملاحظات والأوزان وتولد احتمال الصعود؟ هذا هو مجرد تمرير إلى الأمام للشبكة العصبية. دعونا نلقي نظرة على الكود أدناه لمزيد من المعلومات:

كما ترون ، ليست هناك خطوات كثيرة على الإطلاق! دعنا نذهب خطوة بخطوة:

  1. قم بحساب قيم الطبقة المخفية غير المجهزة من خلال البحث ببساطة عن المنتج النقطي للأوزان [1] (أوزان الطبقة 1) ومراقبة_المصفوفة. إذا كنت تتذكر ، فإن الأوزان [1] هي مصفوفة 200 × 6400 ، و notes_matrix هي مصفوفة 6400 × 1. لذلك سوف يعطينا منتج النقطة مصفوفة من الأبعاد 200 × 1. لدينا 200 خلية عصبية لذلك كل صف يمثل ناتج خلية واحدة.
  2. بعد ذلك ، نقوم بتطبيق دالة العتبة غير الخطية على قيم الطبقة المخفية هذه - في هذه الحالة مجرد ReLU بسيطة. على مستوى عالٍ ، يقدم هذا الخطية التي تجعل شبكتنا قادرة على حساب الوظائف غير الخطية بدلاً من الوظائف الخطية البسيطة.
  3. نحن نستخدم قيم تنشيط الطبقة المخفية هذه لحساب قيم طبقة المخرجات. يتم ذلك عن طريق منتج نقطة بسيط من القيم المخفية (200 × 1) والأوزان [‘2 '] (1 × 200) والتي تعطي قيمة واحدة (1 × 1).
  4. أخيرًا ، نطبق دالة السينيويد على قيمة المخرجات هذه بحيث تكون بين 0 و 1 وبالتالي فهي احتمال صحيح (احتمال الصعود).

دعنا نعود إلى الخوارزمية الرئيسية وواصلنا. الآن وقد حصلنا على احتمال الصعود ، نحتاج الآن إلى تسجيل النتائج للتعلم لاحقًا واختيار إجراء لإخبار منظمة العفو الدولية لدينا بتنفيذ:

نختار إجراءً من خلال قلب عملة وهميّة تهبط "للأعلى" مع احتمال up_probability وهبوطًا مع 1 - up_probability. إذا هبط الأمر ، فاختر إخبار منظمة العفو الدولية بالارتفاع وإذا لم يكن الأمر كذلك ، فسنخبره بالهبوط. نحن أيضا

بعد القيام بذلك ، ننقل الإجراء إلى OpenAI Gym عبر env.step (حركة).

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

الآن وبعد أن اتخذنا هذه الخطوة ، فقد حان الوقت للبدء في التعلم ، لذلك نتعرف على الأوزان الصحيحة في شبكتنا العصبية!

تعلم

التعلم هو كل شيء عن رؤية نتيجة الإجراء (أي ما إذا كنا قد فزنا في الجولة أم لا) وتغيير أوزاننا وفقًا لذلك. الخطوة الأولى للتعلم هي طرح السؤال التالي:

  • كيف يؤثر تغيير احتمالية المخرجات (الصعود) على نتيجة الفوز بالجولة؟

رياضيا ، هذا هو مجرد مشتق من نتائجنا فيما يتعلق بمخرجات الطبقة النهائية لدينا. إذا كانت L هي قيمة نتاجنا لنا وكانت f هي الوظيفة التي تمدنا بتنشيط الطبقة الأخيرة لدينا ، فإن هذا المشتق هو isL / ∂f فقط.

في سياق التصنيف الثنائي (أي يتعين علينا فقط إخبار منظمة العفو الدولية بأحد الإجراءين ، لأعلى أو لأسفل) ، فقد تبين أن هذا المشتق هو

لاحظ أن σ في المعادلة أعلاه تمثل وظيفة السيني. اقرأ قسم تصنيف السمات هنا لمزيد من المعلومات حول كيفية الحصول على المشتق أعلاه. نحن تبسيط هذا أكثر أدناه:

∂L / ∂f = true_label (0 أو 1) - تنبأ بالتنبؤ (0 أو 1)

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

سيكون توقعنا لهذه الجولة هو احتمال الصعود حسبنا. باستخدام ذلك ، لدينا حساب ∂L / ∂f يمكن حسابه بواسطة

رائع! لدينا التدرج في العمل.

والخطوة التالية هي معرفة كيف نتعلم بعد نهاية أي حلقة (أي عندما نفقد أو خصمنا من الكرة ويحصل شخص ما على نقطة). نقوم بذلك عن طريق حساب التدرج في السياسة للشبكة في نهاية كل حلقة. الحدس هنا هو أننا إذا فزنا في الجولة ، نود أن تنشئ شبكتنا المزيد من الإجراءات التي أدت بنا إلى الفوز. بدلاً من ذلك ، إذا خسرنا ، فسنحاول توليد القليل من هذه الإجراءات.

يوفر لنا OpenAI Gym المتغير السهل الاستخدام لإخبارنا عند انتهاء إحدى الحلقات (أي أننا أخطأنا الكرة أو أخطأ خصمنا الكرة). عندما نلاحظ أننا قد انتهينا ، فإن أول ما نقوم به هو تجميع جميع ملاحظاتنا وحسابات التدرج للحلقة. هذا يسمح لنا بتطبيق خبراتنا على جميع الإجراءات في الحلقة.

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

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

سنأخذ هذا الترجيح في الاعتبار عن طريق خصم المكافآت الخاصة بنا ، بحيث يتم خصم المكافآت من الإطارات السابقة أكثر من المكافآت مقابل الإطارات اللاحقة. بعد ذلك ، سنستخدم أخيرًا backpropagation لحساب التدرج اللوني (أي الاتجاه الذي نحتاجه لتحريك أوزاننا لتحسين).

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

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

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

أربع معادلات أساسية للطبقة الخلفية. المصدر: مايكل نيلسن

هدفنا هو إيجاد ∂C / ∂w1 (BP4) ، ومشتق دالة التكلفة فيما يتعلق بأوزان الطبقة الأولى ، و ∂C / ∂w2 ، مشتق دالة التكلفة بالنسبة لأوزان الطبقة الثانية. ستساعدنا هذه التدرجات على فهم الاتجاه الذي يجب أن نحرك فيه الأوزان لتحقيق أكبر تحسن.

بادئ ذي بدء ، دعنا نبدأ بـ ∂C / ∂w2. إذا كانت ^ l2 هي تنشيط الطبقة المخفية (الطبقة 2) ، نرى أن الصيغة هي:

في الواقع ، هذا هو بالضبط ما نفعله هنا:

بعد ذلك ، نحتاج إلى حساب ∂C / ∂w1. الصيغة لذلك هي:

ونعلم أيضًا أن ^ l1 هي مجرد قيم ملاحظتنا.

لذلك كل ما نحتاجه الآن هو δ ^ l2. بمجرد أن نحصل على ذلك ، يمكننا حساب ∂C / ∂w1 والعودة. نحن نفعل ذلك بالضبط أدناه:

إذا كنت تتابع ذلك ، فستبدو وظيفتك كما يلي:

مع ذلك ، لقد انتهينا من backpropagation وحساب التدرجات لدينا!

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

لتحديث الأوزان ، نطبق RMSProp ، وهي خوارزمية لتحديث الأوزان الموصوفة من قبل Sebastian Reuder هنا.

ننفذ هذا أدناه:

هذه هي الخطوة التي تقوم بتعديل أوزاننا وتسمح لنا بالتحسن مع مرور الوقت.

هذا هو الأساس ذلك! بعبارة كلية ، يجب أن يبدو هكذا.

لقد قمت فقط بترميز شبكة عصبية كاملة للعب Pong! uncomment env.render () وقم بتشغيله لمدة 3-4 أيام لرؤيته أخيراً تغلب على الكمبيوتر! ستحتاج إلى القيام ببعض التخليل كما حدث في حل Andrej Karpathy لتتمكن من عرض نتائجك عند الفوز.

أداء

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

النظر في التغيير والتبديل المعلمات أو استخدام شبكات العصبية الملتوية لزيادة الأداء.

قراءة متعمقة

إذا كنت ترغب في إجراء مزيد من التمهيدي في تعلم الشبكات العصبية والتعزيز ، فهناك بعض الموارد الكبيرة لمعرفة المزيد (أعمل في Udacity كمدير لبرامج التعلم الآلي):

  • Andrej Karpathy's Original Post Post
  • دورة Udacity المجانية للتعلم العميق من Google
  • Udacity 's دورة التعلم تحت الإشراف المجاني بواسطة Georgia Tech
  • كتاب مايكل نيلسن للتعلم العميق
  • كتاب سوتون وبارتو لتعليم التعزيز