مدخل إلى الشبكات العصبية: البيرسيبترون (Perceptron) متعدد الطبقات
في القسم اللي فات تعرّفنا على أبسط نموذج للشبكات العصبية: بيرسيبترون بطبقة وحدة، وهو نموذج خطي يصنّف البيانات إلى فئتين.
بهالقسم بنوسّع النموذج إلى إطار عمل أقدر وأمرن، عشان نقدر:
- نسوي تصنيفًا متعدد الفئات، مو بس تصنيفًا ثنائيًا.
- نحل مسائل الانحدار بالإضافة إلى مسائل التصنيف.
- نفصل فئات ما تنفصل خطيًا.
وبنبني بعد إطار عمل معياري خاص بنا في Python، يخلّينا نركّب بُنى مختلفة للشبكات العصبية.
خلّونا نبدأ بصياغة مسألة تعلّم الآلة (Machine Learning). نفترض إن عندنا مجموعة تدريب X ومعها التسميات Y، ونبي نبني نموذجًا f يعطي أدق تنبؤات ممكنة. نقيس جودة التنبؤات باستخدام دالة الخسارة (loss function) ℒ. ومن دوال الخسارة اللي نستخدمها كثير:
- في مسائل الانحدار، إذا كنّا نبي نتنبأ برقم، نقدر نستخدم الخطأ المطلق ∑i|f(x(i))-y(i)|، أو الخطأ التربيعي ∑i(f(x(i))-y(i))2.
- في التصنيف نستخدم خسارة 0-1، وهي عمليًا نفسها دقة النموذج، أو نستخدم الخسارة اللوجستية.
في البيرسيبترون ذي الطبقة الوحدة، عرّفنا الدالة f كدالة خطية f(x)=wx+b. هنا w مصفوفة الأوزان، وx متجه سمات الإدخال، وb متجه الانحياز. ومع بُنى ثانية للشبكات العصبية، تقدر الدالة تأخذ شكلًا أعقد.
في التصنيف، غالبًا نبي مخرج الشبكة يعطينا احتمالات الفئات. عشان نحوّل أرقامًا عامة إلى احتمالات — مثلًا لتطبيع المخرج — نستخدم غالبًا دالة Softmax σ، وتصير الدالة f بالشكل f(x)=σ(wx+b).
في تعريف f اللي فوق، نسمّي w وb المعاملات (parameters): θ=⟨w,b⟩. وباستخدام مجموعة البيانات ⟨X,Y⟩، نقدر نحسب الخطأ الكلي على المجموعة كلها كدالة في المعاملات θ.
✅ هدف تدريب الشبكة العصبية إننا نقلّل الخطأ عن طريق تغيير المعاملات θ.
التحسين بالانحدار المتدرّج
فيه طريقة معروفة لتحسين الدوال اسمها الانحدار المتدرّج (gradient descent). فكرتها إننا نحسب مشتقة دالة الخسارة بالنسبة إلى المعاملات — وفي الحالة متعددة الأبعاد نسمّيها التدرّج — وبعدها نغيّر المعاملات باتجاه يقلّل الخطأ. نصيغها كذا:
- نهيّئ المعاملات بقيم عشوائية w(0), b(0).
- نكرّر الخطوات التالية مرات كثيرة:
- w(i+1) = w(i)-η∂ℒ/∂w
- b(i+1) = b(i)-η∂ℒ/∂b
من حيث المبدأ، المفروض نحسب خطوات التحسين أثناء التدريب على مجموعة البيانات كلها؛ تذكّروا إن الخسارة مجموع عبر كل عينات التدريب. لكن بالواقع ناخذ أجزاء صغيرة اسمها دفعات مصغّرة (minibatches)، ونحسب التدرّجات على جزء من البيانات. ولأننا نختار هالجزء عشوائيًا كل مرة، نسمّي الطريقة الانحدار المتدرّج العشوائي (Stochastic Gradient Descent — SGD).
البيرسيبترون متعدد الطبقات والانتشار العكسي
مثل ما شفنا، الشبكة ذات الطبقة الوحدة تقدر تصنّف الفئات القابلة للفصل خطيًا. وإذا نبي نموذجًا أغنى، نقدر نركّب أكثر من طبقة. رياضيًا، هذا يعني إن الدالة f يصير شكلها أعقد ونحسبها على كم خطوة:
- z1=w1x+b1
- z2=w2α(z1)+b2
- f = σ(z2)
هنا α هي دالة تنشيط غير خطية (non-linear activation function)، وσ هي دالة Softmax، والمعاملات هي θ=<w1,b1,w2,b2>.
تظل خوارزمية الانحدار المتدرّج نفسها، لكن حساب التدرّجات يصير أصعب. باستخدام قاعدة السلسلة في التفاضل، نقدر نحسب المشتقات كالتالي:
- ∂ℒ/∂w2 = (∂ℒ/∂σ)(∂σ/∂z2)(∂z2/∂w2)
- ∂ℒ/∂w1 = (∂ℒ/∂σ)(∂σ/∂z2)(∂z2/∂α)(∂α/∂z1)(∂z1/∂w1)
✅ نستخدم قاعدة السلسلة عشان نحسب مشتقات دالة الخسارة بالنسبة إلى المعاملات.
لاحظوا إن الجزء الموجود بأقصى اليسار متكرر في كل التعبيرات. لذلك نقدر نبدأ من دالة الخسارة ونحسب المشتقات باتجاه «الخلف» عبر الرسم البياني الحسابي. ومن هنا جاء اسم طريقة تدريب البيرسيبترون متعدد الطبقات: الانتشار العكسي (Backpropagation).
وصف الشكل: رسم بياني حسابي للانتشار العكسي
✅ بنشرح الانتشار العكسي بتفصيل أكبر في مثال دفتر Jupyter.
الخلاصة
بنينا بهالدرس مكتبة شبكات عصبية خاصة بنا، واستخدمناها في مهمة تصنيف بسيطة ثنائية الأبعاد.
🚀 تحدّي
في الدفتر المرفق، بتطبّقون إطار عمل من صنعكم لبناء نماذج بيرسيبترون متعددة الطبقات وتدريبها. ومن خلال التطبيق بتشوفون بالتفصيل وشلون تشتغل الشبكات العصبية الحديثة.
انتقلوا إلى دفتر OwnFramework وطبّقوا خطواته.
المراجعة والتعلّم الذاتي
الانتشار العكسي خوارزمية شائعة في الذكاء الاصطناعي (AI) وتعلّم الآلة (ML)، ويستاهل تقرؤون عنه بتفصيل أكثر.
في هالمختبر، المطلوب تستخدمون الإطار اللي بنيتوه بهالدرس عشان تحلّون تصنيف أرقام MNIST المكتوبة بخط اليد.