تخطَّ إلى المحتوى

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}")

أهم النقاط

النقطةالوظيفة
MSEMean Squared Error — للانحدار، يعاقب الأخطاء الكبيرة
MAE / L1Mean 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