Backpropagation
يطبّق الانتشار العكسي قاعدة السلسلة عكسيًا عبر شبكة عصبية للحصول على تدرج كل وزن في مرور واحد. الرياضيات والتكلفة والشيفرة.
الانتشار العكسي، اختصارًا لعبارة «الانتشار الخلفي للأخطاء»، هو خوارزمية تحسب مدى مساهمة كل وزن في الشبكة العصبية في خطأ أحد التنبؤات. وانطلاقًا من دالة الخسارة، تطبّق الخوارزمية قاعدة السلسلة طبقةً تلو أخرى باتجاه المدخلات، وتعيد استخدام كل نتيجة وسيطة، بحيث تنتج جولة عكسية واحدة التدرج لكل وزن، سواء احتوى النموذج على آلاف المعلمات أو ملياراتها. ثم يستخدم المحسّن هذه التدرجات لتحديث الأوزان، ما يجعل الانتشار العكسي خطوة التعلّم في كل نماذج التعلّم العميق تقريبًا. وقد ذاع استخدامه في الشبكات العصبية على يد روميلهارت وهينتون وويليامز في بحثهم المنشور في مجلة Nature عام 1986 بعنوان تعلّم التمثيلات عبر الانتشار العكسي للأخطاء.
آلية عمل الانتشار العكسي#
يتطلب التدريب على دفعة تمريرين. يمرر التمرير الأمامي المدخلات عبر كل طبقة، ويخزن التنشيطات الوسيطة، وينتهي بحساب الخسارة. ويبدأ التمرير العكسي من الخسارة ويزور الطبقات بترتيب عكسي. وتتلقى كل طبقة تدرج الخسارة بالنسبة إلى مخرجها، ويُسمى التدرج الوارد، ثم تضربه في مشتقاتها المحلية لإنتاج نتيجتين: تدرج أوزان الطبقة، الذي يُحتفظ به للمحسّن، والتدرج بالنسبة إلى مدخل الطبقة، الذي يصبح التدرج الوارد للطبقة التي تسبقها.
بما أن كل طبقة لا تحتاج إلا إلى التدرج الوارد والتنشيطات المخزنة، فلا يُحسب أي مشتق مرتين. وبلغة التفاضل الآلي، فإن الانتشار العكسي هو تفاضل النمط العكسي في الرسم البياني الحسابي للشبكة، ويبني PyTorch هذا الرسم البياني أثناء التمرير الأمامي، ثم يجتازه عكسيًا عند استدعاء loss.backward(). وفي شبكة ذات وزنين، يمكن التحقق من نتيجة التفاضل التلقائي في PyTorch بمقارنتها بقاعدة السلسلة المكتوبة يدويًا:
import torch
# A two-weight network: prediction = w2 * tanh(w1 * x)
x, target = torch.tensor(1.5), torch.tensor(0.5)
w1 = torch.tensor(0.8, requires_grad=True)
w2 = torch.tensor(-1.2, requires_grad=True)
# Forward pass, keeping the hidden activation h for the backward pass
h = torch.tanh(w1 * x)
loss = (w2 * h - target) ** 2
# Backward pass: autograd applies the chain rule from the loss back to each weight
loss.backward()
# The same chain rule by hand, reusing the upstream gradient dL/dy for both weights
dL_dy = 2 * (w2 * h - target)
dL_dw2 = dL_dy * h
dL_dw1 = dL_dy * w2 * (1 - h**2) * x
print(f"autograd: dL/dw1 = {w1.grad:.4f}, dL/dw2 = {w2.grad:.4f}")
print(f"by hand: dL/dw1 = {dL_dw1:.4f}, dL/dw2 = {dL_dw2:.4f}")يطبع السطران dL/dw1 = 1.6475, dL/dw2 = -2.5016. وتحسب النسخة المكتوبة يدويًا dL_dy مرة واحدة وتعيد استخدامها للوزنين، وهو مبدأ إعادة الاستخدام نفسه الذي يتيح للتفاضل التلقائي التعامل مع شبكات تضم مليارات الأوزان. والانتشار العكسي عبر الزمن (BPTT) هو الخوارزمية نفسها مطبقةً على شبكة عصبية متكررة مفككة عبر خطواتها الزمنية.
الانتشار العكسي مقابل المحسّن#
لا يحسب الانتشار العكسي إلا التدرجات، ولا يغيّر أي أوزان. وتحول خوارزمية تحسين، مثل الانحدار المتدرج العشوائي (SGD) أو Adam، هذه التدرجات إلى تحديثات للأوزان، بعد تحجيمها وفق معدل التعلّم. ويضيف PyTorch نتيجة كل تمرير عكسي إلى التدرجات المخزنة بالفعل للأوزان، لذا يمكن لخطوة واحدة للمحسّن أن تجمع عدة دفعات:
يستخدم تدريب Ultralytics YOLO هذا الأسلوب، أي تراكم التدرجات، للوصول إلى حجم دفعة اسمي يبلغ 64 صورة (nbs=64): بعد الإحماء، تنفّذ عملية التشغيل batch=16 الانتشار العكسي لكل دفعة، لكنها تنفّذ خطوة بالمحسّن عند كل دفعة رابعة، بعد قصّ التدرج المجمّع بحيث لا يتجاوز معياره 10.
تلاشي التدرجات وانفجارها#
تضرب مرحلة الانتشار العكسي المشتقات المحلية طبقةً بعد أخرى، لذا قد يتقلص حجم التدرج أو يزداد هندسيًا مع العمق. عندما تكون معظم العوامل أقل من 1، كما في وحدات sigmoid المشبعة، لا تتلقى الطبقات الأولى أي إشارة تقريبًا، وهذه هي مشكلة تلاشي التدرج. وعندما تكون معظم العوامل أكبر من 1، تؤدي مشكلة انفجار التدرج إلى تحديثات هائلة وخسائر NaN. وتحافظ دوال التنشيط من عائلة ReLU وتهيئة الأوزان بمقاييس مناسبة وتطبيع الدفعات والوصلات الالتفافية في الشبكات المتبقية على استقرار مقادير التدرجات عبر مئات الطبقات.
تكلفة الحوسبة والذاكرة#
يجب أن يبقى كل تنشيط يحتاج إليه مشتق محلي في الذاكرة من مرحلة الانتشار الأمامي حتى تصل إليه مرحلة الانتشار العكسي، لذا تزداد ذاكرة التدريب مع حجم الدفعة ودقة الإدخال والعمق، ويتطلب التدريب ذاكرة أكبر بكثير من الاستدلال. يخزّن نقاط التحقق للتدرج بعض التنشيطات فقط ويعيد حساب الباقي أثناء الانتشار العكسي، ما يوازن بين زيادة الحوسبة وخفض استهلاك الذاكرة، بينما يحتفظ الاستدلال بدقة مختلطة بمعظم التنشيطات بتنسيقات 16 بت تشغل نصف مساحة الأعداد العشرية ذات 32 بت. ومن ناحية الحوسبة، تكلف مرحلة الانتشار العكسي نحو ضعف مرحلة الانتشار الأمامي، لأن كل طبقة تحسب التدرجات لأوزانها ومدخلاتها معًا؛ ولهذا تحتسب تقديرات قوانين القياس نحو 6 عمليات فاصلة عائمة لكل معلمة في كل رمز تدريبي: 2 في الانتشار الأمامي و4 في الانتشار العكسي.










