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

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

المرحلة 1. خيبة الأمل

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

    الجبر الخطي؛

  • نظرية الرسوم البيانية؛

    نظرية الاحتمالات والإحصاء الرياضي.

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

المرحلة 2. اعتماد

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

المرحلة 3. التنمية

تذهب الآن مباشرة إلى نظرية منظمة العفو الدولية. يمكن تقسيمها إلى 3 فئات:

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

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

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

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

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

المرحلة 5. العمل

الآن، عندما تتخيل بوضوح كيفية إنشاء وكيفية استخدامها، حان الوقت لسحب معرفتك إلى مستوى جديد. أولا، سيتطلب ذلك دراسة الانضباط الذي يطلق عليه "تدريب الجهاز". ثانيا، تحتاج إلى تعلم كيفية العمل مع المكتبات ذات الصلة لغتها البرمجة المحددة. بالنسبة لبيوثون، تعتبرنا من قبلنا هي Scikit-Lake، NLTK، SCIPY، PYBRAIN و NUMP. ثالثا، في تطوير أي مكان لا يمكن القيام به من

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

الخطوة 1. الخلايا العصبية وطريقة التوزيع المباشر

إذن ما هي "الشبكة العصبية"؟ دعنا ننتظر مع هذا وأول تعامل مع عصبة واحدة.

يشبه الخلايا العصبية الوظيفة: يستغرق الأمر قليل من القيم لإدخال واحد وإرجاعه.

الدائرة أدناه تشير إلى الخلايا العصبية الاصطناعية. يتلقى 5 وعائدات 1. أدخل - هذا هو مجموع ثلاثة Sinaps متصلة بالعلم العصبي (ثلاثة أسهم على اليسار).

في الجانب الأيسر من الصورة نرى 2 قيم الإدخال (الأخضر) وإزاحة (أبرز مع البني).

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

تضاعفت قيم الإدخال من قبل ما يسمى "الأوزان"، 7 و 3 (أبرزت باللون الأزرق).

الآن نحن طي القيم التي تم الحصول عليها مع النزوح والحصول على رقم في حالتنا 5 (أبرز باللون الأحمر). هذا هو إدخال الخلايا العصبية الاصطناعية لدينا.

ثم ينتج الخلايا العصبية نوعا من الحساب وقضايا قيمة الإخراج. وصلنا 1 القيمة المدورة لل SIGID في النقطة 5 هي 1 (بمزيد من التفاصيل حول هذه الوظيفة، دعونا نتحدث لاحقا).

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

رسم توضيحي لشبكة عصبية مع ويكيبيديا.

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

الخطوة 2. Sigiid.

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

Sigmoid يعرض Sigmoid قيمتك (المحور الأفقي) على شريحة من 0 إلى 1.

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

ولكن على بعض مقاطع الفيديو لن تغادر. لفهم كامل، قررت أن أبكي وحدي. لذلك، بدأت في كتابة تنفيذ خوارزمية الانحدارية اللوجستية (التي تستخدم Sigmoid).

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

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

الخطوة 3. طريقة توزيع الأخطاء العكسية

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

جيمس لوبي، جامعة جورجيا التكنولوجيا للتكنولوجيا. دليل للمبتدئين، وبعد ذلك يمكنك إنشاء شبكة عصبية خاصة بك على ثعبان.

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

تحتوي هذه المقالة على ما تعلمته، ونأمل أن يكون مفيدا لك! مقالات مفيدة أخرى حول هذا الموضوع:

ما هي الشبكة العصبية؟

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

تتكون الشبكات العصبية من المكونات التالية:

  • طبقة مدخل، X
  • عدد التعسفي طبقات خفية
  • طبقة الإخراج، ŷ
  • جلس وزنها و النزوح بين كل طبقة د و ب.
  • خيار وظائف التنشيط لكل طبقة مخفية σ ؛ في هذا العمل، سوف نستخدم ميزة تنشيط Sigmoid.

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

إن إنشاء فئة شبكة عصبية على Python تبدو بسيطة:

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

انتاج | ŷ شبكة بسيطة ثنائية الطبقة العصبية:

في المعادلة المذكورة أعلاه، فإن الوزن W و Offset B هي المتغيرات الوحيدة التي تؤثر على الإخراج ŷ.

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

يتكون كل تكرار عملية التعلم من الخطوات التالية

  • حساب الخروج المتوقع ŷ يسمى التوزيع المباشر
  • تحديث الأوزان والنزاعات تسمى العكس

يوضح الرسم البياني التسلسل أدناه العملية:

التوزيع المباشر

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

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

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

فقدان وظيفة

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

مقدار المربعات الخطأ هو متوسط \u200b\u200bالفرق بين كل القيمة المتوقعة والفعالية.

الغرض من التعلم هو العثور على مجموعة من المقاييس والنزوح التي تقلل من وظيفة الخسارة.

التوزيع العكلي

الآن بعد أن قمنا بقياس خطأ توقعاتنا (الخسارة)، نحتاج إلى إيجاد طريقة نشر الخطأ وتحديث الأوزان لدينا وإزاحاتنا.

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

أذكر من التحليل الذي وظيفة المشتقة هي زاوية الظل من ميل الوظيفة.

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

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

فوش! كانت مرهقة، لكنها سمحت بالحصول على ما نحتاجه - مشتق (إمالة) من وظائف الخسارة فيما يتعلق بالأوزان. الآن يمكننا ضبط الأوزان بشكل مناسب.

أضف ميزة BackPropagation إلى التعليمات البرمجية الخاصة بنا على Python-E:

التحقق من عمل الأعصاب

الآن الآن لدينا رمز كامل على Python-E لتنفيذ التوزيع المباشر والعكس، دعونا نلقي نظرة على شبكتنا العصبية على المثال ومعرفة كيفية عملها.


مجموعة مثالية من المقاييس

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

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

دعونا نلقي نظرة على التنبؤ النهائي (الإخراج) من الشبكة العصبية بعد 1500 تكرارات.

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

لاحظ أن هناك اختلاف طفيف بين التنبؤات والقيم الفعلية. هذا أمر مرغوب فيه لأنه يمنع شبكة الخلايا العصبية بشكل أفضل لتعميم البيانات غير المرئية.

الانعكاسات النهائية

لقد تعلمت الكثير في عملية الكتابة من الصفر شبكة بلدي العصبية. على الرغم من أن مكتبات التعلم العميق، مثل Tensorflow و Keras، تسمح بإنشاء شبكات عميقة دون فهم كامل للعمل الداخلي للشبكة العصبية، أجد أن عالم البيانات المبتدئين - أنا مفيد للحصول على فهمهم الأعمق.

لقد استثمرت الكثير من وقتي الشخصية في هذا العمل، وآمل أن تكون مفيدة لك!

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

للعمل معها في بيثون هناك مكتبة python-mnist. لتثبيت:

pip تثبيت python-mniind

الآن يمكننا تحميل البيانات

من MniM Import MNIST MNDATA \u003d MNIST ("/ path_to_mnist_data_folder /") tr_images، tr_labels \u003d mndata.load_training () test_images، test_labels \u003d mndata.load_testing ()

يجب تنزيل المحفوظات التي تحتوي على البيانات بشكل مستقل، ويحدد البرنامج المسار إلى الكتالوج معهم. الآن المتغيرات TR_IMAGES و TEST_IMAGES تحتوي على صور للتواصل والاختبار المناسب. والمتغيرات Tr_Labels و Test_Labels هي ملصقات مع التصنيف الصحيح (I.E. الأرقام من الصور). جميع الصور هي حجم 28x28. حدد المتغير بالحجم.

img_shape \u003d (28، 28)

نقوم بتحويل جميع البيانات إلى صفائف Numpy وتطبيعها (نعطي الحجم من -1 إلى 1). هذا سيزيد من دقة الحسابات.

استيراد NPPY ك NP لأني في النطاق (0، Len (Test_Images)): Test_Images [i] \u003d np.array (test_images [i]) / 255 لأني في النطاق (0، Len (tr_images)): tr_images [i] \u003d np.array (tr_images [i]) / 255

لاحظ أنه على الرغم من أن الصور قد تم تمثيلها في شكل صفيف ثنائي الأبعاد، فإننا سوف نستخدم أحادية الأبعاد، فهي أبسط للحوسبة. الآن تحتاج إلى فهم "ما هي الشبكة العصبية"! وهذا مجرد معادلة مع عدد كبير من المعاملات. لدينا مجموعة من 28 * 28 \u003d 784 عنصرا عند المدخل ووزن 784 آخر لتحديد كل رقم. أثناء تشغيل الشبكة العصبية، اضرب قيم مدخلات الوزن. طي البيانات وأضف إزاحة. يتم تطبيق النتيجة على وظيفة التنشيط. في حالتنا، سيكون relu. هذه الميزة صفر لجميع الحجج السلبية والوسيطة لجميع الإيجابية.

لا يزال هناك العديد من ميزات التنشيط! ولكن هذه هي أسهل شبكة عصبية! نحدد هذه الميزة مع Numpy

Def Relu (x): ارجع np.maximum (x، 0)

الآن لحساب الصورة في الصورة تحتاج إلى حساب النتيجة لمدة 10 مجموعات من المعاملات.

Def nn_calculate (img): resp \u003d قائمة (نطاق (0، 10)) لأني في النطاق (0.10): r \u003d w [:، i] * img r \u003d relu (np.sum (r) + b [i] ) resp [i] \u003d r العودة np.argmax (resp)

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

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

W \u003d (2 * np.random.rand (10، 784) - 1) / 10 b \u003d (2 * np.random.rand (10) - 1) / 10 ل n في النطاق (Len (tr_images)): img \u003d tr_images [n] cls \u003d tr_labels [n] #Forward inflosation resp \u003d np.zeros (10، dtype \u003d np.float32) لأني في النطاق (0.10): r \u003d w [i] * img r \u003d relu (np. sum (r) + b [i]) resp [i] \u003d r resp_cls \u003d np.argmax (resp) resp \u003d np.zeros (10، dtype \u003d np.float32) resp \u003d 1.0 # الانتشار true_resp \u003d np. zeros ( 10، dtype \u003d np.float32) true_resp \u003d 1.0 خطأ \u003d resp - true_resp delta \u003d خطأ * ((resp\u003e \u003d 0) * np.ones (10)) لأني في النطاق (0.10): w [i] - \u003d np .dot (img، دلتا [i]) b [i] - \u003d delta [i]

في عملية التعلم، ستكون المعاملات مشابهة قليلا للأرقام:

تحقق من دقة العمل:

def nn_calculate (img): resp \u003d list (النطاق (0، 10)) لأني في النطاق (0.10): r \u003d w [i] * img r \u003d np.maximum (np.sum (r) + b [i] ، 0) #relu resp [i] \u003d r العودة np.argmax (resp) total \u003d len (test_images) صالح \u003d 0 غير صالح \u003d لأني في النطاق (0، الإجمالي): img \u003d test_images [i] المتوقع \u003d nn_calculate (img ) true \u003d test_labels [i] إذا توقع \u003d\u003d صحيح: صالح \u003d صالح + 1 آخر: غير صالح.Append (("الصورة": IMG، "المتوقع": "صحيح": "صحيح")) طباعة ("الدقة () ". تنسيق (صالح / إجمالي))

حصلت على 88٪. ليس بارد جدا، ولكن مثيرة جدا للاهتمام!