مرِّر شبكة صغيرة عبر تمرير أمامي وتمرير خلفي وخطوة تحديث واحدة في المِنصّة، وتوقَّع — قبل أن تقرأ من الشاشة — المُخرَج ŷ والخطأ، وتدرّجًا واحدًا لوزن ∂L/∂w، والقيمة الجديدة للوزن بعد خطوة نزول تدرّجي واحدة.
الانتشار الخلفي ليس سوى محاسبة قاعدة السلسلة: أيّ قيمة مخزّنة يعيد كل تدرّج استخدامها. التمرير الأمامي يحسب القيم ويخزّنها؛ والتمرير الخلفي يعيد استخدامها ليحسب ∂L/∂w لكل وزن؛ ثم تدفع خطوة نزول تدرّجي واحدة كل وزن إلى أسفل المنحدر، w ← w − η ∂L/∂w. وأداء الثلاثة على شبكة واحدة ملموسة، بأرقام يمكنك التحقّق منها، هو ما يحوّل الانتشار الخلفي من صيغة إلى شيء تراه.
افتح المِنصّة واضبط المؤشّرات الأساسية أدناه. ثم اكتب في شبكة المُعامِلات القابلة للتحرير هذه الشبكة المبنيّة يدويًّا بالضبط — الأوزان النظيفة تجعل كل رقم أدناه قابلًا للتحقّق يدويًّا. كل خطوة بعدها تسير عبر نفس المُتدرِّج والشبكة.
Depth -> 1 Width -> 2 Activation -> sigmoid Loss -> MSE Data -> one row
x = [1, 0] y = 1 W[1] = [[1,0],[0,0]] b[1] = [0,0] W[2] = [[1,1]] b[2] = [0]
وحدة المُخرَج دائمًا sigmoid، فيبقى ŷ احتمالًا. يُظهر المُتدرِّج قيم التمرير الأمامي، وتطبع الشبكة ∂L/∂w بجانب كل وزن، وتطبع خطوة التحديث كل وزن جديد — كل رقم تتوقّعه موجود هناك.
انتقل إلى Output ŷ في المُتدرِّج. عند x = [1, 0] تكون التنشيطات القبلية المخفيّة z[1] = [1, 0]، فيكون a[1] = [σ(1), σ(0)] = [0.7311, 0.5]، ثم z[2] = 1·0.7311 + 1·0.5 = 1.2311. توقَّع ŷ = σ(1.2311)، ثم اقرأه.
يقرأ المُخرَج ŷ = 0.7740 — رقم واحد في (0, 1). هذا هو التمرير الأمامي كله: طبقةً طبقة، قيم تدخل واحتمال واحد يخرج.
انتقل إلى Loss L. الهدف هو y = 1 والخطأ هو MSE، ويُكتَب L = (ŷ − y)² لهذا الصفّ الواحد. توقَّع L من ŷ = 0.7740، ثم اقرأه.
يقرأ الخطأ L = 0.0511 — وهو (0.7740 − 1)². عددٌ قياسيّ واحد يلخّص كم ابتعد هذا التنبّؤ عن الهدف؛ والتمرير الخلفي موجود ليجعله أصغر.
انظر الآن إلى الشبكة القابلة للتحرير، عند وزن المُخرَج W[2]11. يعيد التمرير الخلفي استخدام a[1]1 = 0.7311 المخزّنة: التدرّج هو ∂L/∂W[2]11 = δ[2] · a[1]1، مع دلتا المُخرَج δ[2] = 2(ŷ−y)·ŷ(1−ŷ) = −0.0791. توقَّع ∂L/∂W[2]11، ثم اقرأه بجانب الوزن.
تطبع الشبكة ∂L/∂W[2]11 = -0.0578. القيمة السالبة تعني أنّ رفع هذا الوزن يخفض الخطأ — ولاحظ أنّه أعاد استخدام قيمة خزّنها التمرير الأمامي مسبقًا بدل إعادة حسابها. إعادة الاستخدام هذه هي جوهر الانتشار الخلفي كله.
اضبط معدّل التعلّم على η = 1 (مؤشّر Learning rate عند 0 على مقياسه اللوغاريتمي) وانتقل إلى التحديث. يحرّك النزول التدرّجي الوزن عكس تدرّجه: W[2]11 ← W[2]11 − η ∂L/∂W[2]11 = 1 − 1·(−0.0578). توقَّع W[2]11 الجديد، ثم اقرأه.
تطبع خطوة التحديث W[2]11 ← 1.0578. ولأنّ التدرّج كان سالبًا ارتفع الوزن، وخطوة كهذه لكل وزن دفعةً واحدة هي بالضبط ما يفعله التدريب — آلاف المرّات.
كل ما سبق ينتظرك في المِنصّة. اكتب أيّ أوزان في الشبكة، ومرِّر عبر الأمامي والخلفي وراقب كل تدرّج يعيد استخدام قيمة مخزّنة، ثم طبّق التحديثات وراقب الخطأ يهبط. بدّل التنشيط إلى ReLU أو كدّس طبقات مخفيّة لترى التدرّجات تتلاشى.
- شغّلتَ تمريرًا أماميًّا حتى المُخرَج ŷ = 0.7740
- قرأتَ خطأ MSE L = 0.0511 للهدف y = 1
- راقبتَ التمرير الخلفي يُنتج تدرّجًا واحدًا، ∂L/∂W[2]11 = -0.0578، بإعادة استخدام قيمة مخزّنة
- أخذتَ خطوة نزول تدرّجي واحدة عند η = 1: W[2]11 ← 1.0578
- كل قيمة توقّعتها هي حساب العرض الأمامي والخلفي نفسه، لا صورة تقريبية