كيف يعمل backpropagation ، وكيف يمكنك استخدام Python لبناء شبكة عصبية

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

فهم العملية

مع ما يقرب من 100 مليار خلية عصبية ، يعالج الدماغ البشري البيانات بسرعة تصل إلى 268 ميل في الساعة! في جوهرها ، الشبكة العصبية هي مجموعة من الخلايا العصبية المتصلة بواسطة نقاط الاشتباك العصبي .

تم تنظيم هذه المجموعة في ثلاث طبقات رئيسية: الإدخال لاحقًا ، والطبقة المخفية ، وطبقة الإخراج.

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

في الرسم أعلاه ، تمثل الدوائر الخلايا العصبية بينما تمثل الخطوط نقاط الاشتباك العصبي.

دور المشبك هو أخذ ومضاعفة المدخلات والأوزان .

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

فيما يلي نظرة عامة موجزة عن كيفية عمل شبكة عصبية تلقائية بسيطة:

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

في جوهرها ، الشبكات العصبية بسيطة.

إنهم يقومون فقط بضرب المصفوفة بالمدخلات والأوزان ، ويطبقون وظيفة التنشيط.

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

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

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

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

التكاثر إلى الأمام

لنبدأ في برمجة هذا الولد الشرير! افتح ملف بيثون جديدًا. سترغب في الاستيراد numpyحيث سيساعدنا ذلك في عمليات حسابية معينة.

أولاً ، دعنا نستورد بياناتنا كمصفوفات فارغة باستخدام np.array. سنرغب أيضًا في تطبيع وحداتنا لأن مدخلاتنا تكون في غضون ساعات ، لكن ناتجنا هو نتيجة اختبار من 0-100. لذلك ، نحتاج إلى قياس بياناتنا عن طريق القسمة على القيمة القصوى لكل متغير.

بعد ذلك، دعونا تعرف على الثعبان classوالكتابة على initوظيفة حيث سنقوم تحديد معلمات لدينا مثل المدخلات، خفية، وطبقات الانتاج.

حان الوقت لحسابنا الأول. تذكر أن نقاط الاشتباك العصبي لدينا تؤدي حاصل الضرب النقطي ، أو ضرب المصفوفة للمدخلات والوزن. لاحظ أن الأوزان يتم إنشاؤها عشوائيًا وبين 0 و 1.

الحسابات وراء شبكتنا

في مجموعة البيانات ، بيانات الإدخال لدينا Xهي مصفوفة 3x2. بيانات المخرجات لدينا yهي مصفوفة 3x1. Xيجب ضرب كل عنصر في المصفوفة بالوزن المقابل ثم إضافته مع جميع النتائج الأخرى لكل خلية عصبية في الطبقة المخفية. إليك كيف يمكن لعنصر بيانات الإدخال الأول (ساعتان من الدراسة و 9 ساعات من النوم) حساب ناتج في الشبكة:

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

للحصول على القيمة النهائية للطبقة المخفية ، نحتاج إلى تطبيق وظيفة التنشيط.

دور وظيفة التنشيط هو إدخال اللاخطية. ميزة هذا هو أنه يتم تعيين الإخراج من نطاق 0 و 1 ، مما يسهل تغيير الأوزان في المستقبل.

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

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

أخيرًا ، لتطبيع الإخراج ، نقوم فقط بتطبيق وظيفة التنشيط مرة أخرى.

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

كيف ندرب نموذجنا على التعلم؟ حسنًا ، سنكتشف ذلك قريبًا جدًا. في الوقت الحالي ، دعنا نعد في تشفير شبكتنا.

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

تنفيذ الحسابات

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

بمجرد إعداد جميع المتغيرات ، نكون مستعدين لكتابة forwardدالة الانتشار الخاصة بنا . دعنا نمرر المدخلات الخاصة بنا X، وفي هذا المثال ، يمكننا استخدام المتغير zلمحاكاة النشاط بين طبقات الإدخال والإخراج.

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

أخيرًا ، نحتاج إلى تحديد وظيفة السيني لدينا:

ويوجد لدينا ذلك! شبكة عصبية (غير مدربة) قادرة على إنتاج مخرجات.

كما لاحظت ، نحن بحاجة إلى تدريب شبكتنا على حساب نتائج أكثر دقة.

Backpropagation - "التعلم" لشبكتنا

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

يعمل Backpropagation باستخدام وظيفة الخسارة لحساب مدى بعد الشبكة عن الإخراج المستهدف.

خطأ في الحساب

تتمثل إحدى طرق تمثيل دالة الخسارة في استخدام دالة متوسط ​​المجموع التربيعي للخسارة :

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

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

في هذه الحالة ، سنستخدم مشتقًا جزئيًا للسماح لنا بأخذ متغير آخر في الاعتبار.

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

إليك كيفية حساب التغيير التدريجي لأوزاننا:

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

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

دعنا نواصل ترميز Neural_Networkفئتنا عن طريق إضافة دالة sigmoidPrime (مشتق من السيني):

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

يمكننا الآن تحديد مخرجاتنا من خلال بدء نشر foward واستحداث وظيفة backward عن طريق استدعائها في trainالوظيفة:

لتشغيل الشبكة ، كل ما علينا فعله هو تشغيل trainالوظيفة. بالطبع ، سنرغب في القيام بذلك عدة مرات ، أو ربما آلاف المرات. لذلك ، سنستخدم forحلقة.

إليك 60 سطرًا كاملًا من الروعة:

ها أنت ذا! شبكة عصبية كاملة يمكنها التعلم من المدخلات والمخرجات.

بينما كنا نفكر في مدخلاتنا على أنها ساعات من الدراسة والنوم ، ومخرجاتنا كدرجات اختبار ، فلا تتردد في تغييرها إلى ما تريد ولاحظ كيف تتكيف الشبكة!

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

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

العرض والمصدر

المراجع

ستيفن ميلر

ويلش مختبرات

كبير شاه

تم نشر هذا البرنامج التعليمي في الأصل على Enlight ، وهو موقع ويب يستضيف مجموعة متنوعة من البرامج التعليمية والمشاريع للتعلم من خلال البناء! تحقق من المزيد من المشاريع مثل هذه :)