Softmax
تحوّل softmax متجهًا من قيم اللوغيت إلى احتمالات مجموعها واحد. يتناول الشرح الصيغة ودرجة الحرارة والاستقرار العددي والانتباه والشفرة البرمجية.
Softmax دالة تحوّل متجهًا من الدرجات الخام، تُسمى logits، إلى توزيع احتمالي: تقع كل قيمة ناتجة بين 0 و1، ويكون مجموع القيم الناتجة 1 بالضبط. بالنسبة إلى متجه z، تحسب الدالة softmax(z)ᵢ = e^(zᵢ) / Σⱼ e^(zⱼ)، إذ ترفع كل درجة إلى قوة أسية ثم تقسمها على مجموع القيم الأسية كلها. وتُعد Softmax طبقة الإخراج القياسية في الشبكات العصبية التي تختار فئة واحدة من بين فئات عديدة؛ كما تحوّل درجات التشابه إلى أوزان داخل آلية الانتباه في المحوّلات، وتحول درجات نموذج اللغة على مفرداته إلى احتمالات الرمز التالي. ويعكس اسمها كونها نسخة سلسة قابلة للاشتقاق من argmax، التي تضع الاحتمال كله على الدرجة الأكبر وحدها.
آلية عمل Softmax#
تجعل الدالة الأسية كل المخرجات موجبة وتضخّم الفروق بين الدرجات، لذا تستحوذ أكبر قيمة لوغيت على حصة غير متناسبة من الاحتمال. وتحافظ Softmax على ترتيب قيم اللوغيت، لذا تحصل أعلى درجة دائمًا على أعلى احتمال. ولا تهم سوى الفروق بين قيم اللوغيت: فإضافة ثابت واحد إلى كل قيمة لوغيت لا تغيّر المخرجات. وتستخدم المكتبات هذه الخاصية لتحقيق الاستقرار العددي، بطرح أكبر قيمة لوغيت قبل حساب الأس، لأن e¹⁰⁰⁰ يتجاوز نطاق الفاصلة العائمة ذات 32 بتًا.
تتحكم درجة الحرارة T في مدى حدّة التوزيع: softmax(z / T). تجعل قيم T الأقل من 1 التوزيع أكثر تركّزًا على الفئة الأعلى، بينما تجعل القيم الأكبر من 1 التوزيع أكثر تسطّحًا واقترابًا من التوزيع المنتظم. وتظهر الصيغة نفسها في الميكانيكا الإحصائية ضمن توزيع بولتزمان، حيث تمثل T درجة الحرارة حرفيًا. ويعرض مقتطف PyTorch أدناه كلا التأثيرين:
import torch
logits = torch.tensor([2.0, 1.0, 0.1])
# Divide logits by a temperature before softmax: low sharpens, high flattens
for temperature in [0.5, 1.0, 2.0]:
probs = torch.softmax(logits / temperature, dim=0)
print(f"T={temperature}: {[round(p, 3) for p in probs.tolist()]}")
# Adding a constant leaves softmax unchanged, so libraries subtract the max to avoid overflow
big = logits + 1000
naive = big.exp() / big.exp().sum()
print(f"Naive: {naive.tolist()}, torch.softmax: {[round(p, 3) for p in torch.softmax(big, dim=0).tolist()]}")عند T = 1، تصبح قيم logits 2.0 و1.0 و0.1 هي [0.659, 0.242, 0.099]. ويؤدي خفض درجة الحرارة إلى النصف إلى جعل التوزيع أكثر حدّة، ليصبح [0.864, 0.117, 0.019]، بينما يؤدي رفعها إلى الضعف إلى تسطيحه، ليصبح [0.502, 0.304, 0.194]. وعند إضافة 1,000 إلى كل قيمة logit، تفيض الصيغة الساذجة وتطبع [nan, nan, nan]، بينما تظل torch.softmax تُرجع [0.659, 0.242, 0.099].
Softmax في التدريب#
تُدرَّب المصنِّفات باستخدام softmax وخسارة الانتروبيا المتقاطعة معًا. وتساوي الخسارة −log(pᵧ)، أي اللوغاريتم السالب للاحتمال المخصّص للفئة الصحيحة y، ويكون تدرّجها بالنسبة إلى قيم logits ببساطة p − y، أي الاحتمالات المتوقعة ناقصًا التسمية أحادية الترميز. لذلك تدمج أطر العمل العمليتين: تأخذ CrossEntropyLoss في PyTorch قيم logits الخام وتحسب log-softmax داخليًا، وهو أكثر استقرارًا من حساب لوغاريتم الاحتمالات المحسوبة كلٌّ على حدة. يُخرج النموذج المدرَّب بهذه الطريقة قيم logits، ولا يُطبَّق softmax إلا عند الحاجة إلى الاحتمالات أثناء الاستدلال.
مواضع استخدام Softmax#
- تصنيف الصور: تنتج الطبقة الأخيرة من المصنّف قيمة logit واحدة لكل فئة، وتحولها Softmax إلى درجات الثقة التي يراها المستخدم.
- الانتباه: تحسب المحوّلات softmax(QKᵀ / √dₖ) على درجات التشابه بين الاستعلام وكل مفتاح، بحيث يكون مجموع أوزان انتباه كل رمز مساويًا لـ 1. ويمنع القسمة على √dₖ الدرجات من النمو مع الأبعاد وتشبيع Softmax.
- توليد النص: يطبّق نموذج اللغة الكبير (LLM) Softmax على مفردات تضم عشرات الآلاف أو مئات الآلاف من الرموز في كل خطوة، وتمثل درجة حرارة أخذ العينات قيمة T المذكورة أعلاه. ثم يختار أخذ العينات بالنواة من أصغر مجموعة من الرموز التي تبلغ احتمالاتها عتبة محددة.
- التعلّم المعزز: ينتج عن تطبيق Softmax على قيم الأفعال سياسة تختار عادةً أفضل فعل، مع الاستمرار في استكشاف الأفعال الأخرى؛ إذ توازن درجة الحرارة بين الاستكشاف والاستغلال.
تطبّق نماذج التصنيف في YOLO26 دالة Softmax في رأس التصنيف أثناء الاستدلال، وتحتوي سمة probs لكل نتيجة على التوزيع الكامل لفئات ImageNet الألف:
from ultralytics import YOLO
# Load a YOLO26 classification model trained on ImageNet
model = YOLO("yolo26n-cls.pt")
results = model("https://ultralytics.com/images/bus.jpg")
# probs holds the softmax output of the classification head
probs = results[0].probs
for index, conf in zip(probs.top5, probs.top5conf.tolist()):
print(f"{results[0].names[index]}: {conf:.3f}")
print(f"Sum over all 1,000 classes: {probs.data.sum().item():.3f}")يطبع هذا الشيفرة الفئات الخمس الأرجح مع احتمالاتها، ويكون مجموع الفئات الألف 1.000 لأن الرأس يعيد توزيعًا من Softmax.
Softmax مقارنةً بالدوال ذات الصلة#
- Sigmoid: تضغط كل درجة على نحو مستقل لتقع بين 0 و1، ولذلك ليس من الضروري أن يكون مجموع المخرجات 1. تلائم Sigmoid مسائل التصنيف الثنائي ومتعدد التسميات، مثل صورة تحتوي على شخص وحقيبة ظهر معًا، كما تستخدمها كواشف الأجسام عادةً لتقييم كل فئة. وبالنسبة إلى فئتين، تختزل Softmax تمامًا إلى Sigmoid للفرق بين قيمتي logits.
- Argmax: تُرجع فهرس أكبر درجة، وهو قرار حاسم لا تدرّج له. وتحافظ Softmax على الترتيب نفسه مع بقائها قابلة للاشتقاق، لذا يمكن تدريبها، كما أن تطبيق argmax على احتمالات Softmax يعطي النتيجة نفسها التي يعطيها تطبيق argmax على قيم logits.
- Log-softmax: لوغاريتم Softmax، ويُحسب مباشرةً لضمان الاستقرار، وتستخدمه خسارة الانتروبيا المتقاطعة.
- معايرة درجة الحرارة: أسلوب معايرة يضبط درجة حرارة واحدة على بيانات التحقق بعد التدريب، بحيث تتوافق احتمالات Softmax مع معدل صحة النموذج الفعلي. ولا يغيّر الفئة المتوقعة لأن قسمة كل قيم logits على قيمة T موجبة واحدة تحافظ على ترتيبها.










