مدرسة فلابي بيرد: برنامج تعليمي للتعلم التعزيزي

نشرت: 2022-03-11

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

في هذا البرنامج التعليمي للتعلم المعزز ، سأوضح كيف يمكننا استخدام PyTorch لتعليم شبكة عصبية لتعلم التعزيز كيفية لعب Flappy Bird. لكن أولاً ، سنحتاج إلى تغطية عدد من اللبنات الأساسية.

يمكن تقسيم خوارزميات التعلم الآلي تقريبًا إلى جزأين: خوارزميات التعلم التقليدية وخوارزميات التعلم العميق. عادةً ما تحتوي خوارزميات التعلم التقليدية على معلمات أقل بكثير من خوارزميات التعلم العميق ولديها قدرة تعليمية أقل بكثير.

أيضًا ، لا تستطيع خوارزميات التعلم التقليدية القيام باستخراج الميزات : يحتاج متخصصو الذكاء الاصطناعي إلى اكتشاف تمثيل جيد للبيانات ثم يتم إرساله بعد ذلك إلى خوارزمية التعلم. تتضمن أمثلة تقنيات التعلم الآلي التقليدية SVM ، والغابات العشوائية ، وشجرة القرار ، ووسائل $ k $ ، في حين أن الخوارزمية المركزية في التعلم العميق هي الشبكة العصبية العميقة .

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

يُعرف الكثير من تقنيات التعلم العميق منذ فترة طويلة جدًا ، ولكن التطورات الحديثة في الأجهزة عززت بسرعة البحث والتطوير في التعلم العميق. Nvidia هي المسؤولة عن توسيع المجال لأن وحدات معالجة الرسومات الخاصة بها قد أتاحت تجارب التعلم العميق السريع.

معلمات قابلة للتعلم والمعلمات التشعبية

تتكون خوارزميات التعلم الآلي من معلمات قابلة للتعلم يتم ضبطها في عملية التدريب والمعلمات غير القابلة للتعلم والتي يتم تعيينها قبل عملية التدريب. تسمى المعلمات التي تم تعيينها قبل التعلم المعلمات الفائقة .

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

خوارزميات التعلم الخاضعة للإشراف وغير الخاضعة للإشراف والمعززة

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

عندما نتحدث عن التعلم الخاضع للإشراف ، فإننا ننظر إلى أزواج $ (x_i، y_i) $. $ x_i $ هو إدخال الخوارزمية و $ y_i $ هو الناتج. مهمتنا هي العثور على وظيفة تقوم بالتعيين الصحيح من $ x_i $ إلى $ y_i $.

لضبط المعلمات القابلة للتعلم بحيث تحدد وظيفة تقوم بتعيين $ x_i $ إلى $ y_i $ ، يجب تحديد وظيفة الخسارة والمحسِّن. المحسن يقلل من وظيفة الخسارة. أحد الأمثلة على دالة الخسارة هو متوسط ​​الخطأ التربيعي (MSE):

\ [MSE = \ sum_ {i = 1} ^ {n} (y_i - \ Widehat {y_i}) ^ 2 \]

هنا ، $ y_i $ تسمية حقيقة أساسية و $ \ widehat {y_i} $ تسمية متوقعة. أحد المحسّنين المشهور جدًا في التعلم العميق هو النسب المتدرج العشوائي . هناك الكثير من الاختلافات التي تحاول تحسين طريقة التدرج العشوائي: آدم ، Adadelta ، Adagrad ، وهلم جرا.

تحاول الخوارزميات غير الخاضعة للإشراف إيجاد بنية في البيانات دون تزويدها صراحةً بالتسميات. $ k $ -means هو أحد أمثلة الخوارزميات غير الخاضعة للإشراف التي تحاول العثور على المجموعات المثلى في البيانات. يوجد أدناه صورة تحتوي على 300 نقطة بيانات. $ k $ - يعني أن الخوارزميات وجدت البنية في البيانات وخصصت تسمية مجموعة لكل نقطة بيانات. كل مجموعة لها لونها الخاص.

مجموعات نقاط البيانات المقسمة بالألوان. تم العثور على المجموعات بواسطة خوارزمية غير خاضعة للرقابة

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

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

التعلم التعزيزي النشط والسلبي والمعكوس

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

أخيرًا ، يحاول التعلم التعزيزي العكسي إعادة بناء وظيفة المكافأة نظرًا لتاريخ الإجراءات ومكافآتها في الحالات المختلفة.

التعميم والتجهيز والتركيب

أي مثيل ثابت للمعلمات والمعلمات الفائقة يسمى نموذجًا. تتكون تجارب التعلم الآلي عادةً من جزأين: التدريب والاختبار.

أثناء عملية التدريب ، يتم ضبط المعلمات القابلة للتعلم باستخدام بيانات التدريب. في عملية الاختبار ، يتم تجميد المعلمات القابلة للتعلم ، وتتمثل المهمة في التحقق من مدى جودة النموذج في التنبؤ بالبيانات غير المرئية سابقًا. التعميم هو قدرة آلة التعلم على الأداء بدقة على مثال أو مهمة جديدة غير مرئية بعد تجربة مجموعة بيانات التعلم.

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

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

يوجد أدناه صورة تُظهر نقصًا في الملاءمة والتخصيص مقارنةً بموقف متوازن بين البيانات الإجمالية ووظيفة التنبؤ.

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

قابلية التوسع

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

الأداء مقابل كمية البيانات للتعلم العميق والخوارزميات التقليدية. تعمل الشبكات العصبية بشكل أفضل على نطاق واسع.

الشبكات العصبية

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

رسم بياني للشبكة العصبية ، يُظهر كل عقدة في طبقة الإدخال التي تم تعيينها لكل عقدة من الطبقة المخفية 1 ، والتي بدورها يتم تعيينها لكل عقدة من الطبقة المخفية 2 ، ثم يتم تعيينها أخيرًا إلى طبقة الإخراج ، والتي تتكون من عقدة واحدة

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

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

الشبكة العصبية التلافيفية

أحد أشكال الشبكة العصبية هو الشبكة العصبية التلافيفية . يتم استخدامه بشكل أساسي لمهام رؤية الكمبيوتر.

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

فيما يلي كيفية عمل نواة تلافيفية واحدة في طبقة تلافيفية. يتم تطبيق النواة على الصورة ويتم الحصول على ميزة ملتوية.

الرسوم المتحركة التي تسلط الضوء على النواة وتشغيلها كصورة تتم معالجتها ، وإخراج الميزة الملتوية المقابلة

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

\ [ReLU = \ max (0، x) \]

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

يوجد أدناه مخطط لوظيفة ReLU.

دالة ReLU ، تشبه القطر البسيط للرسم البياني y = x ، ولكن مع تعيين جميع قيم x السالبة على الصفر

كما ترى ، تقوم وظيفة ReLU هذه ببساطة بتغيير القيم السالبة إلى أصفار. هذا يساعد على منع تلاشي مشكلة التدرج. إذا اختفى التدرج اللوني ، فلن يكون له تأثير كبير في ضبط وزن الشبكة العصبية.

تتكون الشبكة العصبية التلافيفية من طبقات متعددة: طبقات تلافيفية وطبقات ReLU وطبقات متصلة بالكامل. تربط الطبقات المتصلة بالكامل كل خلية عصبية في طبقة واحدة بكل خلية عصبية في طبقة أخرى ، كما يتضح من الطبقتين المخفيتين في الصورة في بداية هذا القسم. تُخرج آخر خرائط الطبقة المتصلة بالكامل من الطبقة السابقة إلى قيم number_of_actions في هذه الحالة.

التطبيقات

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

تعزيز التعلم

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

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

في عام 2013 ، حققت شركة DeepMind الناشئة في لندن للذكاء الاصطناعي إنجازًا كبيرًا في تعلم التحكم في العوامل مباشرة من المدخلات الحسية عالية الأبعاد. قاموا بنشر ورقة ، لعب Atari مع Deep Reinforcement Learning ، حيث أظهروا كيف قاموا بتعليم شبكة عصبية اصطناعية للعب ألعاب Atari بمجرد النظر إلى الشاشة. تم الحصول عليها من قبل Google ، ثم نشرت ورقة جديدة في Nature مع بعض التحسينات: التحكم على مستوى الإنسان من خلال التعلم المعزز العميق .

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

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

رسم بياني لعملية اتخاذ القرار في ماركوف: تتخذ الدول (التي تحمل علامة "S") إجراءات (تم وضع علامة "أ" عليها) والتي لها احتمالات مختلفة فيما يتعلق بالحالة التي ينتهي بها الوكيل في المرحلة التالية ؛ تشير بعض المسارات المتبعة أيضًا إلى مكافأة

الوكيل قادر على أداء الأعمال ، وتحويل البيئة. نسمي المكافأة $ R_t $. إنها إشارة مرجعية رقمية تشير إلى مدى جودة أداء الوكيل في الخطوة $ t $.

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

للحصول على أداء جيد على المدى الطويل ، لا يجب أخذ المكافآت الفورية فحسب ، بل المكافآت المستقبلية أيضًا في الاعتبار. إجمالي المكافأة لحلقة واحدة من الخطوة الزمنية $ t $ هي $ R_t = r_t + r_ {t + 1} + r_ {t + 2} + \ ldots + r_n $. المستقبل غير مؤكد وكلما ذهبنا في المستقبل ، قد تتباعد التوقعات المستقبلية. لهذا السبب ، يتم استخدام مكافأة مستقبلية مخفضة: $ R_t = r_t + \ gamma r_ {t + 1} + \ gamma ^ 2r_ {t + 2} + \ ldots + \ gamma ^ {nt} r_n = r_t + \ gamma R_ {t + 1} $. يجب على الوكيل اختيار الإجراء الذي يزيد من المكافأة المستقبلية المخصومة.

Q- التعلم العميق

تمثل الدالة $ Q (s، a) $ الحد الأقصى للمكافأة المستقبلية المخصومة عند تنفيذ الإجراء $ a $ في الحالة $ s $:

\ [Q (s_t، a_t) = \ max R_ {t + 1} \]

يتم الحصول على تقدير المكافأة المستقبلية من خلال معادلة بيلمان: $ Q (s، a) = r + \ gamma \ max_ {a '} Q (s'، a ') $. بعبارة أخرى ، الحد الأقصى للمكافأة المستقبلية في حالة $ s $ والإجراء $ a $ هو المكافأة الفورية بالإضافة إلى الحد الأقصى للمكافأة المستقبلية للحالة التالية.

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

هناك جانبان أكثر أهمية يجب ذكرهما حول التعلم العميق Q: الاستكشاف والاستغلال. مع الاستغلال ، يتم اتخاذ القرار الأفضل بالنظر إلى المعلومات الحالية. يجمع الاستكشاف المزيد من المعلومات.

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

يظهر أدناه "خوارزمية Deep Q-Learning مع إعادة تشغيل التجربة" من ورقة DeepMind التي تلعب Atari مع Deep Reinforcement Learning.

التعلم العميق Q مع خوارزمية تجربة إعادة التشغيل في الكود الزائف

يشير DeepMind إلى الشبكات التلافيفية المدربة على نهجها مثل شبكات Deep Q (DQN).

مثال على التعلم العميق Q باستخدام Flappy Bird

كانت Flappy Bird لعبة محمولة شهيرة تم تطويرها في الأصل بواسطة فنان ومبرمج ألعاب الفيديو الفيتنامي Dong Nguyen. في ذلك ، يتحكم اللاعب في طائر ويحاول الطيران بين الأنابيب الخضراء دون أن يصطدم بها.

يوجد أدناه لقطة شاشة من استنساخ Flappy Bird تم ترميزه باستخدام PyGame:

لقطة شاشة من FlapPyBird ، استنساخ Flappy Bird مشفر باستخدام PyGame

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

لقطة شاشة لـ DeepLearningFlappyBird ، شوكة للنسخة مع رسومات مبسطة

ولكن بدلاً من استخدام TensorFlow ، قمت ببناء إطار عمل تعليمي معزز عميق باستخدام PyTorch. PyTorch هو إطار عمل تعليمي عميق لإجراء تجارب سريعة ومرنة. يوفر موترات وشبكات عصبية ديناميكية في Python مع تسريع GPU قوي.

إن بنية الشبكة العصبية هي نفسها المستخدمة في DeepMind في ورقة التحكم على مستوى الإنسان من خلال التعلم المعزز العميق .

طبقة إدخال حجم المرشح خطوة عدد المرشحات التنشيط انتاج |
التحويل 1 84 × 84 × 4 8x8 4 32 ReLU 20 × 20 × 32
التحويل 2 20 × 20 × 32 4x4 2 64 ReLU 9x9x64
التحويل 3 9x9x64 3 × 3 1 64 ReLU 7 × 7 × 64
نادي 4 7 × 7 × 64 512 ReLU 512
fc5 512 2 خطي 2

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

يتكون الإدخال من أربع صور متتالية بالأبيض والأسود مقاس 84x84. يوجد أدناه مثال لأربع صور يتم تغذيتها بالشبكة العصبية.

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

أربعة إطارات متتالية بالأبيض والأسود من استنساخ Flappy Bird ، يتم تغذيتها مباشرة إلى شبكة عصبية

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

هذا جزء من الكود الذي يحدد الشبكة العصبية. تمت تهيئة أوزان الشبكات العصبية لتتبع التوزيع المنتظم $ \ mathcal {U} (- 0.01، 0.01) $. تم ضبط جزء التحيز من معلمات الشبكات العصبية على 0.01. تمت تجربة العديد من التهيئة المختلفة (زي Xavier ، Xavier normal ، Kaiming uniform ، Kaiming عادي ، منتظم ، وعادي) ، لكن التهيئة المذكورة أعلاه جعلت الشبكة العصبية تتقارب وتتدرب بشكل أسرع. حجم الشبكة العصبية 6.8 ميغا بايت.

 class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.number_of_actions = 2 self.gamma = 0.99 self.final_epsilon = 0.0001 self.initial_epsilon = 0.1 self.number_of_iterations = 2000000 self.replay_memory_size = 10000 self.minibatch_size = 32 self.conv1 = nn.Conv2d(4, 32, 8, 4) self.relu1 = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(32, 64, 4, 2) self.relu2 = nn.ReLU(inplace=True) self.conv3 = nn.Conv2d(64, 64, 3, 1) self.relu3 = nn.ReLU(inplace=True) self.fc4 = nn.Linear(3136, 512) self.relu4 = nn.ReLU(inplace=True) self.fc5 = nn.Linear(512, self.number_of_actions) def forward(self, x): out = self.conv1(x) out = self.relu1(out) out = self.conv2(out) out = self.relu2(out) out = self.conv3(out) out = self.relu3(out) out = out.view(out.size()[0], -1) out = self.fc4(out) out = self.relu4(out) out = self.fc5(out) return out

في المنشئ ، ستلاحظ وجود معلمات تشعبية محددة. لم يتم إجراء تحسين Hyperparameter لغرض منشور المدونة هذا. بدلاً من ذلك ، يتم استخدام المعلمات الفائقة في الغالب من أوراق DeepMind. هنا ، تم ضبط بعض المعلمات الفائقة لتكون أقل من ورقة DeepMind ، لأن Flappy Bird أقل تعقيدًا من ألعاب Atari التي استخدموها للضبط.

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

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

 optimizer = optim.Adam(model.parameters(), lr=1e-6) criterion = nn.MSELoss()

يجب إنشاء اللعبة:

 game_state = GameState()

يتم تعريف ذاكرة إعادة التشغيل على أنها قائمة بايثون:

 replay_memory = []

الآن نحن بحاجة إلى تهيئة الحالة الأولى. الإجراء هو موتر ثنائي الأبعاد:

  • [1 ، 0] تمثل "لا تفعل شيئًا"
  • [0 ، 1] تمثل "fly up"

تعطينا طريقة frame_step الشاشة التالية والمكافأة والمعلومات حول ما إذا كانت الحالة التالية هي المحطة. المكافأة هي 0.1 عن تحرك كل طائر دون أن يموت عندما لا يمر عبر أنبوب ، 1 إذا نجح الطائر في المرور عبر أنبوب و -1 إذا تحطم الطائر.

تعمل وظيفة resize_and_bgr2gray على اقتصاص الأرضية وتغيير حجم الشاشة إلى صورة 84x84 وتغيير مساحة اللون من BGR إلى الأبيض والأسود. تقوم وظيفة image_to_tensor بتحويل الصورة إلى موتر PyTorch وتضعها في ذاكرة GPU إذا كان CUDA متاحًا. أخيرًا ، يتم توصيل آخر أربع شاشات متتالية معًا وجاهزة للإرسال إلى الشبكة العصبية.

 action = torch.zeros([model.number_of_actions], dtype=torch.float32) action[0] = 1 image_data, reward, terminal = game_state.frame_step(action) image_data = resize_and_bgr2gray(image_data) image_data = image_to_tensor(image_data) state = torch.cat((image_data, image_data, image_data, image_data)).unsqueeze(0)

تم تعيين epsilon الأولي باستخدام هذا السطر من التعليمات البرمجية:

 epsilon = model.initial_epsilon

يتبع الحلقة اللانهائية الرئيسية. تتم كتابة التعليقات في الكود ويمكنك مقارنة الكود مع Deep Q-learning مع خوارزمية Experience Replay المكتوبة أعلاه.

تقوم الخوارزمية بأخذ عينات من دفعات صغيرة من ذاكرة إعادة التشغيل وتحديث معلمات الشبكة العصبية. يتم تنفيذ الإجراءات باستخدام استكشاف الجشع إبسيلون . يتم تلدين إبسيلون بمرور الوقت. دالة الخسارة التي يتم تصغيرها هي $ L = \ frac {1} {2} \ left [\ max_ {a '} Q (s'، a ') - Q (s، a) \ right] ^ 2 $. $ Q (s، a) $ هي قيمة الحقيقة الأساسية المحسوبة باستخدام معادلة بيلمان ويتم الحصول على $ \ max_ {a '} Q (s'، a ') $ من الشبكة العصبية. تعطي الشبكة العصبية قيمتين Q للإجراءين المحتملين وتتخذ الخوارزمية الإجراء بأعلى قيمة Q.

 while iteration < model.number_of_iterations: # get output from the neural network output = model(state)[0] # initialize action action = torch.zeros([model.number_of_actions], dtype=torch.float32) if torch.cuda.is_available(): # put on GPU if CUDA is available action = action.cuda() # epsilon greedy exploration random_action = random.random() <= epsilon if random_action: print("Performed random action!") action_index = [torch.randint(model.number_of_actions, torch.Size([]), dtype=torch.int) if random_action else torch.argmax(output)][0] if torch.cuda.is_available(): # put on GPU if CUDA is available action_index = action_index.cuda() action[action_index] = 1 # get next state and reward image_data_1, reward, terminal = game_state.frame_step(action) image_data_1 = resize_and_bgr2gray(image_data_1) image_data_1 = image_to_tensor(image_data_1) state_1 = torch.cat((state.squeeze(0)[1:, :, :], image_data_1)).unsqueeze(0) action = action.unsqueeze(0) reward = torch.from_numpy(np.array([reward], dtype=np.float32)).unsqueeze(0) # save transition to replay memory replay_memory.append((state, action, reward, state_1, terminal)) # if replay memory is full, remove the oldest transition if len(replay_memory) > model.replay_memory_size: replay_memory.pop(0) # epsilon annealing epsilon = epsilon_decrements[iteration] # sample random minibatch minibatch = random.sample(replay_memory, min(len(replay_memory), model.minibatch_size)) # unpack minibatch state_batch = torch.cat(tuple(d[0] for d in minibatch)) action_batch = torch.cat(tuple(d[1] for d in minibatch)) reward_batch = torch.cat(tuple(d[2] for d in minibatch)) state_1_batch = torch.cat(tuple(d[3] for d in minibatch)) if torch.cuda.is_available(): # put on GPU if CUDA is available state_batch = state_batch.cuda() action_batch = action_batch.cuda() reward_batch = reward_batch.cuda() state_1_batch = state_1_batch.cuda() # get output for the next state output_1_batch = model(state_1_batch) # set y_j to r_j for terminal state, otherwise to r_j + gamma*max(Q) y_batch = torch.cat(tuple(reward_batch[i] if minibatch[i][4] else reward_batch[i] + model.gamma * torch.max(output_1_batch[i]) for i in range(len(minibatch)))) # extract Q-value q_value = torch.sum(model(state_batch) * action_batch, dim=1) # PyTorch accumulates gradients by default, so they need to be reset in each pass optimizer.zero_grad() # returns a new Tensor, detached from the current graph, the result will never require gradient y_batch = y_batch.detach() # calculate loss loss = criterion(q_value, y_batch) # do backward pass loss.backward() optimizer.step() # set state to be state_1 state = state_1

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

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

هنا تسلسل قصير مع شبكة عصبية مدربة.

رسم متحرك لاستنساخ Flappy Bird يتم تشغيله بواسطة الشبكة العصبية المدربة الناتجة

تم تدريب الشبكة العصبية الموضحة أعلاه باستخدام وحدة معالجة الرسومات Nvidia GTX 1080 المتطورة لبضع ساعات ؛ باستخدام حل قائم على وحدة المعالجة المركزية بدلاً من ذلك ، قد تستغرق هذه المهمة المحددة عدة أيام. تم ضبط FPS لمحرك اللعبة على عدد كبير جدًا أثناء التدريب: 999 ... 999 - بمعنى آخر ، أكبر عدد ممكن من الإطارات في الثانية. في مرحلة الاختبار ، تم ضبط FPS على 30.

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

رسم بياني يوضح كيفية تغيير الحد الأقصى لقيمة Q أثناء التكرارات. بدءًا من الصفر ومع عدة ارتفاعات هبوطية ، فإنه يُظهر اتجاهًا عامًا نحو الحد الأقصى لقيمة Q حوالي 12 أو 13 بعد حوالي مليون تكرار.

الكود الكامل والنموذج مسبق التدريب متاحان هنا.

التعلم المعزز العميق: ثنائي الأبعاد وثلاثي الأبعاد وحتى الحياة الواقعية

في هذا البرنامج التعليمي التعليمي المعزز من PyTorch ، أوضحت كيف يمكن للكمبيوتر أن يتعلم لعب Flappy Bird دون أي معرفة سابقة باللعبة ، باستخدام نهج التجربة والخطأ فقط كما يفعل الإنسان عند مواجهة اللعبة لأول مرة.

من المثير للاهتمام أنه يمكن تنفيذ الخوارزمية في بضعة أسطر من التعليمات البرمجية باستخدام إطار عمل PyTorch. الورقة التي تستند إليها الطريقة في هذه المدونة قديمة نسبيًا ، ويتوفر الكثير من الأوراق الجديدة مع التعديلات المختلفة التي تتيح تقاربًا أسرع. منذ ذلك الحين ، تم استخدام التعلم المعزز العميق للعب الألعاب ثلاثية الأبعاد والأنظمة الروبوتية في العالم الحقيقي.

تعمل شركات مثل DeepMind و Maluuba و Vicarious بشكل مكثف على التعلم المعزز العميق. تم استخدام هذه التكنولوجيا في AlphaGo ، الذي تغلب على Lee Sedol ، أحد أفضل لاعبي Go في العالم. في ذلك الوقت ، كان يُعتقد أن الأمر سيستغرق عشر سنوات على الأقل حتى تتمكن الآلات من هزيمة أفضل اللاعبين في Go.

قد يؤدي تدفق الاهتمام والاستثمارات في التعلم المعزز العميق (وفي الذكاء الاصطناعي بشكل عام) إلى الذكاء الاصطناعي العام المحتمل (AGI) - ذكاء على مستوى الإنسان (أو حتى أبعد منه) يمكن التعبير عنه في شكل خوارزمية و على أجهزة الكمبيوتر. لكن الذكاء الاصطناعي العام يجب أن يكون موضوع مقال آخر.


مراجع:

  • إزالة الغموض عن التعلم المعزز العميق
  • التعلم العميق المعزز لفلابي بيرد
  • "الشبكة العصبية التلافيفية" في ويكيبيديا
  • "التعلم المعزز" في ويكيبيديا
  • "عملية اتخاذ القرار ماركوف" في ويكيبيديا
  • دورة كلية لندن الجامعية على RL
الموضوعات ذات الصلة: برنامج تعليمي عميق للتعلم: من المدركين إلى الشبكات العميقة