إصدار تجريبي لعملية النشر
$$ \definecolor{input}{RGB}{66, 133, 244} \definecolor{output}{RGB}{219, 68, 55} \definecolor{dinput}{RGB}{244, 180, 0} \definecolor{doutput}{RGB}{15, 157, 88} \definecolor{dweight}{RGB}{102, 0, 255} $$

خوارزمية الانتشار

تُعدّ خوارزمية النشر الخلفي ضرورية لتدريب الشبكات العصبية الكبيرة بسرعة. توضّح هذه المقالة آلية عمل الخوارزمية.

يُرجى التمرير للأسفل...

شبكة عصبونية بسيطة

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

يتم ربط العُقد في الطبقات المجاورة بالأوزان \(w_{ij}\)، وهي معلّمات الشبكة.

وظيفة التفعيل

تحتوي كل عُقدة على إدخال إجمالي \(\color{input}x\)ووظيفة تفعيل \(f(\color{input}x\color{black})\) ومخرجات \(\color{output}y\color{black}=f(\color{input}x\color{black})\). \(f(\color{input}x\color{black})\) يجب أن تكون دالة غير خطية، وإلا لن تتمكن الشبكة العصبونية إلا من تعلّم النماذج الخطية.

دالة التفعيل الشائعة الاستخدام هي الدالّة الصفرية: \(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\).

دالة الخطأ

والهدف هو التعرّف على القيم التقديرية للشبكة تلقائيًا من البيانات، بحيث يكون الإخراج المتوقّع \(\color{output}y_{output}\) قريبًا من الهدف \(\color{output}y_{target}\) لجميع المدخلات \(\color{input}x_{input}\).

نستخدم مقياس دالة \(E\)لقياس مدى بُعدنا عن الهدف. دالة الخطأ الشائعة هي \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \).

الانتشار الأمامي

سنبدأ بأخذ مثال على الإدخال \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) وتعديل طبقة الإدخال للشبكة.

للحفاظ على الاتّساق، نعتبر الإدخال مشابهًا لأي عُقدة أخرى ولكن بدون دالة تفعيل، بحيث يكون مخرجاته متساويًا مع الإدخال، أي \( \color{output}y_1 \color{black} = \color{input} x_{input} \).

الانتشار الأمامي

والآن، عدّلنا الطبقة المخفية الأولى. نأخذ مخرجات \(\color{output}y\) العُقد في الطبقة السابقة ونستخدم قيم الترجيح لاحتساب إدخال \(\color{input}x\) العُقد في الطبقة التالية.
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$

الانتشار الأمامي

بعد ذلك، نحدّث مخرجات العُقد في الطبقة المخفية الأولى. ولهذا السبب، نستخدم دالة التفعيل \( f(x) \).
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$

الانتشار الأمامي

باستخدام هذه الصيغ ننشرها لبقية الشبكة والحصول على النتيجة النهائية للشبكة.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$

مشتق الخطأ

تحدّد خوارزمية انتشار البيانات مدى إمكانية تعديل كل وزن للشبكة بعد مقارنة الناتج المتوقّع بالنتائج المطلوبة لمثال محدّد. ولهذا السبب، عليك احتساب طريقة تغيُّر الخطأ في ما يتعلّق بكل وزن \(\color{dweight}\frac{dE}{dw_{ij}}\).
بعد الحصول على مشتقات الخطأ، يمكننا تعديل قيم الترجيح باستخدام قاعدة تعديل بسيطة:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
حيث يكون \(\alpha\) ثابتًا موجبًا، يُشار إليه باسم معدل التعلّم، الذي نحتاج إلى تحسينه بشكل تجريبي.

[ملاحظة] تكون قاعدة التعديل بسيطة جدًا: إذا انخفض الخطأ عند زيادة الوزن (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\))، يمكنك زيادة الوزن، أو إذا ارتفع الخطأ عند زيادة الوزن (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\))، يمكنك تقليل الوزن.

المشتقات الإضافية

للمساعدة في حساب \(\color{dweight}\frac{dE}{dw_{ij}}\)، نخزّن أيضًا كل عُقدة مشتقة أخرى لكل عُقدة: كيفية تغيُّر الخطأ باستخدام:
  • إجمالي إدخال العُقدة \(\color{dinput}\frac{dE}{dx}\) و
  • مخرجات العقدة \(\color{doutput}\frac{dE}{dy}\).

مكدّس

لنبدأ في نشر المشتقات من الخطأ. وبما أنّنا نحصل على نتيجة متوقّعة لهذا المثال من الإدخال، يمكننا احتساب مدى تغيُّر الخطأ باستخدام هذا الناتج. بالاستناد إلى وظيفة الخطأ \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) لدينا ما يلي:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$

مكدّس

والآن، \(\color{doutput} \frac{dE}{dy}\) يمكننا الآن \(\color{dinput}\frac{dE}{dx}\) استخدام قاعدة السلسلة.
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
حيث تكون \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) \(f(\color{input}x\color{black})\) هي دالة تفعيل Sigmoid.

مكدّس

بعد أن ننتج مشتقًا من الخطأ بشأن إجمالي إدخال عُقدة، يمكننا الحصول على المشتق من الخطأ في ما يتعلق بالترجيحات الواردة في تلك العُقدة.
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$

مكدّس

وباستخدام قاعدة السلسلة، يمكننا أيضًا الحصول على \(\frac{dE}{dy}\) من الطبقة السابقة. لقد صنعنا دائرة كاملة.
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$

مكدّس

ما عليك سوى تكرار الصيغ الثلاث السابقة حتى نحسب جميع مشتقات الأخطاء.

النهاية

جارٍ الحوسبة...