Loss Functions
دوال الخسارة (Loss Functions) Loss Functions
دالة الخسارة تقيس مدى خطأ تنبؤ النموذج — الرقم الذي يسعى المُحسّن لتقليله. MSE للانحدار، CrossEntropy للتصنيف المتعدد، BCE للتصنيف الثنائي.
دالة الخسارة تحوّل الفرق بين تنبؤ النموذج والحقيقة لرقم scalar قابل للتفاضل — الهدف الكامل للتدريب. اختيارها يجب أن يعكس المهمة بدقة: لا تستخدم MSE لتصنيف أو CrossEntropy لانحدار (نظريًا يعمل لكن النتائج رديئة).
للانحدار: MSE (متوسط مربع الفروقات — يعاقب الأخطاء الكبيرة)، MAE (متوسط القيم المطلقة — أكثر مقاومة للقيم الشاذة)، Huber (مزيج — خطي للأخطاء الكبيرة، تربيعي للصغيرة).
للتصنيف الثنائي: Binary Cross-Entropy (BCE) مع مُخرج Sigmoid. للتصنيف المتعدد: Categorical Cross-Entropy مع مُخرج Softmax. في PyTorch، nn.CrossEntropyLoss يجمع Softmax + NLL Loss داخليًا، فالمُخرج يجب أن يكون logits بدون Softmax.
الخسارة ليست مقياس تقييم: قيمتها للتدريب فقط (قابلة للتفاضل، موجّهة للتدرج). للتقييم البشري استخدم accuracy، F1، R² — مقياسات أوضح لكنها غير مفاضلة (discrete).
الصياغة
MSE = mean((y_pred − y_true)²) MAE = mean(|y_pred − y_true|) BCE = −mean(y·log(p) + (1−y)·log(1−p)) CCE = −Σ y_c · log(p_c) (y one-hot)
📄 مثال
import torch
import torch.nn as nn
# انحدار — MSE
reg_loss = nn.MSELoss()
y_pred = torch.tensor([2.5, 0.0, 2.1])
y_true = torch.tensor([3.0, -0.5, 2.0])
print(f"MSE: {reg_loss(y_pred, y_true):.3f}")
# تصنيف متعدد — CrossEntropy (تأخذ logits مباشرة)
ce_loss = nn.CrossEntropyLoss()
logits = torch.tensor([[1.5, 0.2, 0.1]]) # 3 فئات
target = torch.tensor([0]) # الفئة الصحيحة
print(f"CrossEntropy: {ce_loss(logits, target):.3f}")
# تصنيف ثنائي — BCEWithLogits (أكثر استقرارًا من BCE+Sigmoid)
bce_loss = nn.BCEWithLogitsLoss()
print(f"BCE: {bce_loss(torch.tensor([0.5]), torch.tensor([1.0])):.3f}")أهم النقاط
| النقطة | الوظيفة |
|---|---|
| MSE | Mean Squared Error — للانحدار، يعاقب الأخطاء الكبيرة |
| MAE / L1 | Mean Absolute Error — للانحدار، أكثر مقاومة للقيم الشاذة |
| CrossEntropyLoss | للتصنيف المتعدد — يأخذ logits، يطبّق Softmax داخليًا |
| BCEWithLogitsLoss | للتصنيف الثنائي — يجمع Sigmoid + BCE، أكثر استقرارًا عدديًا |
💡 نصائح عملية
- استخدم BCEWithLogitsLoss بدل BCE+Sigmoid منفصلين — الاستقرار العددي أفضل (يحمي من log(0))
- حين فئتك غير متوازنة جدًا، جرب Focal Loss أو أوزان للفئات داخل CrossEntropyLoss
⚠️ أخطاء شائعة
- تطبيق Softmax ثم CrossEntropyLoss — nn.CrossEntropyLoss يطبّق Softmax داخليًا، فالتطبيق المزدوج يسبب خطأ
- استخدام MSE لتصنيف ثنائي — يعمل تقنيًا لكن التقارب أبطأ وأقل استقرارًا من BCE
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار AI-ML الكامل بالعربي.
📚 للتعمق التقني الكامل بالإنجليزية: PyTorch Documentation