Backpropagation
الانتشار العكسي (Backpropagation) Backpropagation
الانتشار العكسي يحسب تدرّج الخسارة بالنسبة لكل وزن في الشبكة بتطبيق قاعدة السلسلة من المُخرج للخلف — يُمكّن المُحسّن من تحديث الأوزان بكفاءة.
الانتشار العكسي (Backpropagation) خوارزمية لحساب تدرّجات الخسارة بالنسبة لكل وزن (parameter) في الشبكة عبر تطبيق قاعدة السلسلة (chain rule) من المُخرج إلى المدخل. الفكرة بسيطة: لو طبقة ما تأخذ مُدخلاً من الطبقة السابقة وتُخرج قيمة، فإن تدرّج الخسارة بالنسبة لأوزانها يُحسب بضرب تدرّج الخسارة بالنسبة لمُخرجها في تدرّج المُخرج بالنسبة لأوزانها.
عمليًا، أُطر PyTorch و TensorFlow تنفّذ الانتشار العكسي تلقائيًا عبر autograd: استدعاء loss.backward() يحسب كل التدرّجات مرة واحدة، ثم optimizer.step() يحدّث الأوزان. أنت لا تكتب الانتشار العكسي يدويًا — لكن فهمه ضروري لتشخيص المشكلات (gradient vanishing/exploding) واتخاذ قرارات معمارية.
الآليات المرتبطة: Gradient Clipping (لمنع التدرّجات من الانفجار)، BatchNorm (لتحسين تدفّق التدرّجات)، Residual Connections (لتمكين الشبكات العميقة جدًا)، كلّها تخفف مشكلات معروفة في الانتشار العكسي.
الصياغة
loss = compute_loss(y_pred, y_true) loss.backward() # يحسب كل التدرّجات تلقائيًا optimizer.step() # يحدّث الأوزان optimizer.zero_grad() # يصفر التدرّجات للـ batch التالي
📄 مثال
import torch
import torch.nn as nn
model = nn.Linear(4, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
loss_fn = nn.MSELoss()
x = torch.randn(8, 4)
y = torch.randn(8, 1)
y_pred = model(x)
loss = loss_fn(y_pred, y)
loss.backward() # backpropagation — يحسب gradients لكل وزن
print(f"التدرّجات قبل الخطوة: {model.weight.grad.norm():.3f}")
optimizer.step() # يحدّث الأوزان باستخدام التدرّجات
optimizer.zero_grad() # يصفر التدرّجات قبل الـ batch التالي
print(f"الخسارة: {loss:.3f}")أهم النقاط
| النقطة | الوظيفة |
|---|---|
| loss.backward() | حساب التدرّجات لكل weight عبر graph الـ forward |
| Gradient | مشتقة جزئية للخسارة بالنسبة لكل وزن — اتجاه الزيادة |
| Autograd | محرك PyTorch يبني graph تفاضلي تلقائيًا أثناء forward |
| Chain Rule | الأساس الرياضي — تدرّج مركّب من تدرّجات جزئية مكدّسة |
💡 نصائح عملية
- استخدم torch.no_grad() فيInference (torch.no_grad) لتوفير الذاكرة ومنع حساب تدرّجات لا تحتاجها
- احفظ التدرّجات قبل optimizer.step() للتحقق — قيم صفرية أو NaN تعني مشكلة في forward أو البيانات
⚠️ أخطاء شائعة
- نسيان optimizer.zero_grad() بين الـ batches — التدرّجات تتراكم وينفجر النموذج (gradient explosion)
- عدم وضع torch.no_grad() في evaluation — يستهلك ذاكرة أكثر ويفتح باب أخطاء (تدرّجات تتسرّب)
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار AI-ML الكامل بالعربي.
📚 للتعمق التقني الكامل بالإنجليزية: PyTorch Documentation