Ana içeriğe geç

Giriş11 dkA — Sinir Ağı Temelleri

Softmax

Önkoşul:ReLU ve GELU

Kanca

Sigmoid, TEK bir sayıyı bir olasılığa çeviriyordu (10. ML dersi, ikili sınıflandırma). Ama “bu resim kedi mi, köpek mi, kuş mu?” gibi ÜÇ VEYA DAHA FAZLA seçenekli bir soru sorduğunda, tek bir sayı yetmez. Softmax, bu sorunun cevabı.

Sezgi

Softmax, bir grup ham skoru (logit), toplamı TAM OLARAK 1 olan bir olasılık dağılımına çevirir. Her sınıf için bir logit üretilir (örn. “kedi skoru”, “köpek skoru”, “kuş skoru”); softmax bunları birbirine göre karşılaştırıp, hangisinin ne kadar “olası” olduğunu gösteren pozitif sayılara dönüştürür.

Neden sadece “her skoru toplama böl” demiyoruz? Bu dersin can alıcı sorusu tam olarak bu.

Mekanizma

Önce softmax’ın temel davranışına bakalım:

Softmax fonksiyonu

# Sigmoid TEK bir sayıyı olasılığa çevirir. Softmax, BİRDEN FAZLA sayıyı (logit) -- toplamı
# 1 olan bir olasılık DAĞILIMINA çevirir. Çok sınıflı sınıflandırmanın çıktı katmanı budur.
def softmax(logitler):
    return np.exp(logitler) / np.sum(np.exp(logitler))

logitler = np.array([2.0, 1.0, 0.1])
olasiliklar = softmax(logitler)
print(f"Logit'ler (ham skorlar): {logitler}")
print(f"Softmax sonrası olasılıklar: {olasiliklar.round(4)}")
print(f"Toplam: {olasiliklar.sum():.6f}  (her zaman TAM OLARAK 1)")
Logit'ler (ham skorlar): [2.  1.  0.1]
Softmax sonrası olasılıklar: [0.659  0.2424 0.0986]
Toplam: 1.000000  (her zaman TAM OLARAK 1)

Toplam tam olarak 1 — geçerli bir olasılık dağılımı. Şimdi “neden sadece toplama bölmüyoruz” sorusuna cevap verelim:

Naif normalizasyon neden yetersiz

# Neden sadece "toplama böl" yeterli değil? Negatif logit'lerle deneyelim.
logitler_negatif = np.array([2.0, -1.0, 0.5])
naif_normalizasyon = logitler_negatif / logitler_negatif.sum()
print(f"\nNegatif logit içeren küme: {logitler_negatif}")
print(f"Naif normalizasyon (toplama böl): {naif_normalizasyon.round(4)}")
print(f"  Toplam: {naif_normalizasyon.sum():.4f}  -- ama NEGATİF bir 'olasılık' var, bu anlamsız!")
print(f"Softmax: {softmax(logitler_negatif).round(4)}")
print(f"  Toplam: {softmax(logitler_negatif).sum():.6f}  -- TÜM değerler pozitif, geçerli bir dağılım.")
print("Üstel fonksiyon (exp), her zaman POZİTİF çıktı verdiği için bu sorunu otomatik çözüyor.")

Negatif logit içeren küme: [ 2.  -1.   0.5]
Naif normalizasyon (toplama böl): [ 1.3333 -0.6667  0.3333]
  Toplam: 1.0000  -- ama NEGATİF bir 'olasılık' var, bu anlamsız!
Softmax: [0.7856 0.0391 0.1753]
  Toplam: 1.000000  -- TÜM değerler pozitif, geçerli bir dağılım.
Üstel fonksiyon (exp), her zaman POZİTİF çıktı verdiği için bu sorunu otomatik çözüyor.

Negatif bir logit olduğunda, naif normalizasyon NEGATİF bir “olasılık” üretiyor — bu anlamsız! Çoğu kişi “olasılığa çevirmek için sadece toplamı 1 yapmak yeterli” sanır. Değil, çünkü olasılıklar hem toplamı 1 OLMALI hem de HER BİRİ pozitif OLMALI — softmax’ın üstel fonksiyonu (exp), her zaman pozitif çıktı verdiği için bu ikinci koşulu otomatik garanti ediyor.

Matematik

Softmax formülü
softmax(zi)=ezijezj\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j} e^{z_j}}
SembolAnlamı
ziz_iii‘inci sınıfın ham skoru (logit)
ezie^{z_i}Üstel dönüşüm — her zaman POZİTİF, ve büyük skorları orantısız büyütür
jezj\sum_j e^{z_j}Normalizasyon sabiti — tüm üstel değerlerin toplamı, sonucu 1’e tamamlar

Üstel fonksiyon iki işi birden yapar: negatif sayıları bile pozitife çevirir, VE büyük skorlar arasındaki farkı ABARTARAK, en yüksek skorun daha da “baskın” olmasını sağlar.

Matematik tazelemeLogaritma ve üstel: neden her yerdeler

Kod

Softmax’ın bir de ayarlanabilir “keskinliği” var — sıcaklık (temperature):

Sıcaklığın softmax'a etkisi

# "Sıcaklık" (temperature), softmax'ı ne kadar "keskin" ya da "yumuşak" yapacağını kontrol eder.
# (Prompt Mühendisliği kategorisinde, dil modeli örneklemesinde bunu tekrar göreceğiz.)
def softmax_sicaklikli(logitler, sicaklik):
    return softmax(logitler / sicaklik)

for sicaklik in [0.1, 0.5, 1.0, 2.0, 5.0]:
    p = softmax_sicaklikli(logitler, sicaklik)
    print(f"sıcaklık={sicaklik:<4} olasılıklar={p.round(3)}  (en yüksek olasılık: {p.max():.3f})")
print("\nDüşük sıcaklık -> neredeyse tek bir sınıfa KİLİTLENİR (keskin). Yüksek sıcaklık -> neredeyse EŞİT dağılır (yumuşak).")
sıcaklık=0.1  olasılıklar=[1. 0. 0.]  (en yüksek olasılık: 1.000)
sıcaklık=0.5  olasılıklar=[0.864 0.117 0.019]  (en yüksek olasılık: 0.864)
sıcaklık=1.0  olasılıklar=[0.659 0.242 0.099]  (en yüksek olasılık: 0.659)
sıcaklık=2.0  olasılıklar=[0.502 0.304 0.194]  (en yüksek olasılık: 0.502)
sıcaklık=5.0  olasılıklar=[0.4   0.327 0.273]  (en yüksek olasılık: 0.400)

Düşük sıcaklık -> neredeyse tek bir sınıfa KİLİTLENİR (keskin). Yüksek sıcaklık -> neredeyse EŞİT dağılır (yumuşak).

Sıcaklık 0.1’de model neredeyse TEK bir sınıfa (%100) kilitleniyor; sıcaklık 5.0’da ise üç sınıf birbirine yaklaşıyor (%40, %33, %27). Bu fikri, Prompt Mühendisliği kategorisinde dil modeli örneklemesinde TEKRAR göreceğiz — aynı matematik, farklı bir bağlamda.

PyTorch ile doğrulama

logit_torch = torch.tensor([2.0, 1.0, 0.1])
p_torch = torch.softmax(logit_torch, dim=0)
print(f"\nPyTorch softmax: {p_torch.numpy().round(4)}")
print(f"Elle hesaplanan:  {softmax(logitler).round(4)}")

PyTorch softmax: [0.659  0.2424 0.0986]
Elle hesaplanan:  [0.659  0.2424 0.0986]
Solda üç sınıfın softmax olasılıklarını gösteren çubuk grafik; sağda farklı sıcaklık değerlerinde aynı logit'lerin nasıl farklı dağılımlar ürettiğini gösteren gruplu çubuk grafik.
Sol: softmax, ham skorları toplamı 1 olan bir olasılık dağılımına çeviriyor. Sağ: düşük sıcaklık dağılımı keskinleştirir, yüksek sıcaklık yumuşatır.

Nerede işe yarar

Softmax, çok sınıflı sınıflandırmanın standart çıktı katmanıdır:

  • Görüntü sınıflandırma. “Bu resim hangi 1000 kategoriden birine ait?” gibi sorularda, çıktı katmanı softmax kullanır.
  • Dil modellerinin bir sonraki kelime tahmini. Bir sonraki bölümde (NLP kategorisi) göreceğimiz gibi, bir dil modeli her adımda TÜM kelime dağarcığı üzerinde bir softmax çalıştırır.
  • Attention mekanizmasının çekirdeği. NLP kategorisinde göreceğimiz self-attention, “hangi kelimeye ne kadar dikkat edeyim” sorusunu softmax ile cevaplar.

Bu 3 hatayı yaparsın:

  1. Softmax’ı sigmoid ile karıştırmak — sigmoid TEK bir sayıyı, softmax BİRDEN FAZLA sayıyı BİRLİKTE bir dağılıma çevirir.
  2. Softmax çıktısındaki en yüksek olasılığı “kesinlik” sanmak — %66 olasılık, modelin %66 “emin” olduğu anlamına gelmez, sadece göreli bir skordur.
  3. Sıcaklığı unutup sonuçların hep aynı “keskinlikte” olacağını varsaymak — aynı logit’ler, farklı sıcaklıklarda çok farklı dağılımlar üretebilir.

Kendini test et

1. Softmax ile sigmoid arasındaki temel fark nedir?
  1. Aralarında hiçbir fark yoktur
  2. Sigmoid TEK bir sayıyı bir olasılığa çevirir; softmax BİRDEN FAZLA sayıyı, toplamı 1 olan bir olasılık DAĞILIMINA çevirir (doğru cevap)
  3. Softmax sadece 2 sınıfla çalışır
  4. Sigmoid sadece görüntülerde kullanılır

Neden: Sigmoid, ikili sınıflandırmada tek bir olasılık üretir; softmax, çok sınıflı sınıflandırmada tüm sınıfların olasılıklarını BİRLİKTE, toplamı 1 olacak şekilde üretir.

2. Notebook'ta negatif logit içeren kümede naif normalizasyon (toplama bölme) neden başarısız oldu?
  1. Kod hatalıydı
  2. Negatif bir sayıyı toplam pozitifken böldüğünde, sonuç NEGATİF çıkabilir -- ama olasılıklar asla negatif olamaz (doğru cevap)
  3. Naif normalizasyon her zaman doğru sonuç verir
  4. Toplam 1 olmadı

Neden: Toplama bölmek sadece toplamı 1 yapmayı garanti eder, her bir değerin pozitif olmasını GARANTİ ETMEZ -- negatif bir logit, negatif bir "olasılığa" dönüşebilir.

3. Softmax'ta sıcaklık (temperature) parametresi düşürüldüğünde ne olur?
  1. Tüm sınıflar eşit olasılık alır
  2. Dağılım daha "keskin" hale gelir -- en yüksek logit'e sahip sınıf, olasılığı neredeyse 1'e yaklaştırarak baskın hale gelir (doğru cevap)
  3. Toplam olasılık 1'den farklı olur
  4. Hiçbir etkisi yoktur

Neden: Düşük sıcaklık, logit'ler arasındaki farkları büyüterek dağılımı keskinleştirir -- en yüksek skorlu sınıf neredeyse tüm olasılığı alır.

Özet

Özet

  • Softmax, birden fazla ham skoru (logit), toplamı 1 olan bir olasılık dağılımına çevirir.
  • Üstel fonksiyon (exp), tüm değerlerin pozitif kalmasını garanti eder -- sadece toplama bölmek bunu sağlamaz.
  • Softmax, çok sınıflı sınıflandırmanın standart çıktı katmanıdır.
  • Sıcaklık (temperature), dağılımın ne kadar "keskin" (düşük sıcaklık) veya "yumuşak" (yüksek sıcaklık) olacağını kontrol eder.
  • Softmax, dil modellerinin kelime tahmininden attention mekanizmasına kadar birçok yerde tekrar karşımıza çıkacak.
Sonraki adım: Aktivasyon fonksiyonu özet kartı →