متعة تعلم الألة Machine Learning – الجزء 2

938

في الجزء 1، قلنا أن ال machine learning تستخدم خوارزميات لمعرفة أشياء مهمة بالبيانات بدون كتابة code لحل مشكلة معينة.

في هذا الدرس، سنرى بعض من هذه الخوارزميات لإنشاء أشياء ممتعة مثل مراحل بألعاب الفيديو لتبدو كما لو أنها من صنع البشر. سنبني neural network ونغذيها ببعض مراحل لعبة Super Mario ونشاهدها في إنشاء مراحل جديدة.

عمل توقعات أقرب للواقع

في الجزء 1، تم إنشاء خوارزمية بسيطة لتقدير قيمة سعر المنزل بناءً على بعض المدخلات بناءً علي مدخلات كالتالي:

وصلنا إلي إنشاء دالة التخمين:

قمنا بتخمين سعر المنزل بضرب كل صفة للمنزل بوزن وبعد ذلك جميع حاصل الضرب.

بدون إستخدام code، لنعبر عن تلك الدالة بشكل أبسط:

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

يمكننا تشغيل الخوارزمية أكثر من مرة بأوزان مختلفة لنستفيد من تلك المعلومة:

لدينا أربع توقعات للسعر. لندمج هذه التوقعات في قيمة واحدة ونُغذي الخوارزمية بها بعد ذلك.

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

 

ما هي ال neural network؟

لندمج الأربع الحالات السابقة في شكل واحد:

هذه هي neural network. كل node تقم بإستقبال مدخلات، تطبيق الأوزان، وحساب المخرجات. بتغيير الـ nodes يمكننا تمثيل دوال معقدة.

لجعل الأمور أبسط، تخطينا العديد من المراحل مثل activation function، لكن الأمر الأهم هو أننا أتممنا التالي:

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

لا يمكننا تصميم شكل من خلال مكعب واحد لكن يمكننا فعل ذلك بتركيب أكثر من شكل سوياً.

إدراج memory لـ neural network

ال neural network تقوم دائماً بإرجاع نفس الحل لنفس المدخلات. هذه يعني أنها stateless.

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

تخيل لو أعطيتك لوحة مفاتيح وطلبت منك كتابة قصة. قبل أن تبدأ، أريد تخمين أول حرف تكتبه. ما هو الحرف؟

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

النموذج يبدو كالتالي:

لنجعل المشكلة أصعب. نفترض أني أريد تخمين الحرف التالي. هذا أمر شيق أكثر.

لتكن الكلمات الأولى كالتالي:

Robert Cohn was once middleweight boxi

ما هو الحرف التالي؟

من المحتمل أنك خمنت حرف n. هذا بناءً علي الحروف التي شاهدتها مسبقاً في الجملة أو على خبرتك باللغة. أيضاً كلمة middleweight تعطينا دليل أكثر أننا نتحدث عن boxing.

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

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

بتتبع حالة النموذج ليس يمكننا فقط توقع الحرف التالي بل يمكننا أيضاً توقع الحرف التالي بناءً على الحروف السابقة.

هذه هي الفكرة الرئيسية ل Recurrent Neural Network أو RNN. يتم تحديث الشبكة كل مرة نستخدمها بناءً على الحالات السابقة. كلما زادت ال memory في هذا الشبكة كلما استطاعت إستخدام خبرات سابقة أكثر للتوقع.

 

ما هي فائدة توقع الحرف التالي؟

تخمين الحرف التالي في قصة ما يبدو أنه بلا فائدة. لماذا؟

إستخدام جيد هو توقع الحرف التالي في لوحة مفاتيح الهاتف المحمول:

ماذا لم طلبنا من النموذج أن يتوقع الحرف التالي أكثر من مرة؟ يمكننا أن نطلب منه كتابة قصة.

 

إنشاء قصة.

شاهدنا مسبقاً كيف يمكن تخمين الحرف التالي في جملة ما. لنحاول توقع قصة كاملة.

النموذج سيتم إنشائه من النص الكامل لقصة The Sun Also Rises التي تتكون من 362,239 حرف بإستخدام 84 حرف فقط (تشمل الحروف الكبيرة والصغيرة وغيرها). هذه البيانات تعتبر صغيرة مقارنة بتطبيقات الواقع. لجعل النموذج أكثر واقعية، يجب أن يكون لدينا في كل وقت العديد من العينات النصية.

ببداية تدرب ال RNN، يبدو أنها ليست جيدة في التوقعات. هذا ما توقعته بعد 100 دورة من التدريب:

hjCTCnhoofeoxelif edElobe negnk e iohehasenoldndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.

Ddelnss.eelaishaner” cot AAfhB ht ltny

ehbih a”on bhnte ectrsnae abeahngy

amo k ns aeo?cdse nh a taei.rairrhelardr er deffijha

يمكنك ملاحظة أنها تعلمت أن بعض الكلمات بينهم مسافات.

بعد 1000 دورة تدريب، الأمور بدأت في التحسن:

hing soor ither. And the caraos, and the crowebel for figttier and ale the room of me? Streat was not to him Bill-stook of the momansbed mig out ust on the bull, out here. I been soms

inick stalling that aid.

 “Hon’t me and acrained on .Hw’s don’t you for the roed,” In’s pair.”

 “Alough marith him.”

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

بعد عدة آلاف من دورات التدريب، الأمر تحسن أكثر:

He went over to the gate of the café. It was like a country bed.

 “Do you know it’s been me.”

 “Damned us,” Bill said.

 “I was dangerous,” I said. “You were she did it and think I would a fine cape you,” I said.

 “I can’t look strange in the cab.”

 “You know I was this is though,” Brett said.

 “It’s a fights no matter?”

 “It makes to do it.”

 “You make it?”

 “Sit down,” I said. “I wish I wasn’t do a little with the man.”

 “You found it.”

 “I don’t know.”

 “You see, I’m sorry of chatches,” Bill said. “You think it’s a friend off back and make you really drunk.”

في هذه المرحلة، الخوارزمية تعلمت صيغة كتابة القصة. بعض الجُمل تعطي معنى مفهوماً على الأقل.

لنقارن هذا بالنص الأصلي من القصة:

 “Sit down,” said Harvey, “I’ve been looking for you.”

 “What’s the matter?”

 “Nothing. Just looking for you.”

 “Been out to the races?”

 “No. Not since Sunday.”

 “What do you hear from the States?”

 “Nothing. Absolutely nothing.”

 “What’s the matter?”

من النظر إلي النص الواقعي والنص الآخر، بجد أن تنسيق الكلام صحيح. هذا أمر مبهر.

ليس من الضروري كتابة النص من البداية. يمكننا تغذية النموذج بالحروف الأولي لكي يُكمل بعدها.

لنقم بتخمين إسم المؤلف لعمل غلاف مزيف لكتاب خيالي بتغذية النموذج بأول مجموعة حروف مثل Er، He، و The S.

الأمر المزهل أن الخوارزمية تتعلم أي نمط في البيانات. يمكنها إنشاء خطابات أشبه بالواقعية من خطابات Obama. لكن لماذا نجعل الأمر مقتصر على اللغة؟ يمكننا تطبيق ذلك على أي بيانات متسلسلة.

إنشاء Super Mario

في سنة 2015، Nintendo أصدرت Super Mario Maker لأجهزة الـ Wii U.

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

هل يمكننا استخدام النموذج لإنشاء مراحل بلعبة Super Mario؟

أولاً نحتاج إلي بيانات لتدريب النموذج. يمكنك إستخدام بعض المراحل من إصدار 1985:

يمكننا الحصول علي نسخة من اللعبة وتخزين تصميم كل مرحلة في الذاكرة. هذه هي أول مرحلة من اللعبة:

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

يمكننا التعبير عن الشبكة بمجموعة حروف، وكل حرف يمثل كائن داخل الشبكة:

قمنا بإستبدال كل كائن في المرحلة بحرف كالتالي:

‘-’ blank space

‘=’ solid block

‘#’ breakable brick

‘?’ coin block

وهكذا حتى نربط كل كائن بحرف.

إنتهيت بملف نصي شيبه المعروض أسفل:

لننظر إلي الملف النصي، لا نلاحظ أن اللعبة بها أنماط إذا نظرنا إليهم كمجموعة صفوف:

لكن الأمر يصبح أفضل إذا نظرنا إليها كمجموعة أعمدة:

لجعل الخوارزمية تنتج الأنماط، نحتاج إلى تغذيتها بالبيانات عمود عمود كالتالي:

 

تدريب النموذج

كما كان في السابق، النموذج يتحسن كلما تدرب أكثر.

بعد عدة مراحل في التدريب، النموذج أنتج التالي:

من المفترض أن يتعلم النموذج أن – و= يتكرران كثيراً ولكنه لم يلحظ ذلك بعد.

بعد آلاف دورات التدريب، الناتج يبدو كالتالي،

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

بمزيد من التدريب، يتحسن الناتج كالتالي:

لنقم بإعادة مرحلة كاملة تم إنتاجها من النموذج إلي الصيغة الأصلية بإرجاعها لشكلها الأفقي:

في النهاية، نقم بإنشاء المرحلة بلعبة Super Mario:

 

التطبيقات بسيطة مقارنة بالواقع

ال RNN يتم إستخدامه للتدريب في بعض التطبيقات الواقعية مثل speech detection و language translation. ما قمنا بإنشائه هو تطبيق بسيط جداً. السبب في ذلك عدم توفر بيانات كثيرة لتدريب النموذج.

بتوفر بيانات كثيرة مثل مئات الآلاف من العينات، يمكننا إنشاء نموذج أفضل بكثير.

لأن ال machine learning أصبح مهماً، الفرق بين البرنامج الجيد والبرنامج السيئ سيعتمد على كمية البيانات المستخدمة في التدريب.

علي سبيل المثال، أنتجت Google مكتبة TensorFlow لإنشاء تطبيقات ضخمة. اهتمت Google بتلك التطبيقات لأن لديها كميات ضخمة من البيانات.

 

لمزيد من المعلومات:

Further Reading

في ال machine learning، لا يوجد طريق واحد لحل المشكلة. لديك عدة حلول لنفس المشكلة. دمج أكثر من طريقة يعتبر من أحد الوسائل لتحسين النتائج.

لذلك لا تكتفي بهذا المصدر وأنظر إلي المصادر الأخري:

https://medium.com/@justin_michaud/super-mario-bros-level-generation-using-torch-rnn-726ddea7e9b7

http://julian.togelius.com/Hoover2015Composing.pdf

http://julian.togelius.com/Dahlskog2014Linear.pdf


تم ترجمة هذا المقال بواسطة أحمد جاد.

المقال الأصلي موجود في هذا الرابط لصاحبه (Adam Geitgey).

https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471

تعليقات