Kayıp Fonksiyonunuz Modele Gerçekte Ne Söyler: MSE, Cross-Entropy ve Yine de Eğiten Softmax Hatası

İçindekiler
Derin öğrenme eğitim döngüsünü tersten incelediğimizde geriye yayılım (.backward()), gradyan hesaplamaları ve optimizer.step() güncellemeleri tek bir değere dayanır: kayıp (loss). Kayıp fonksiyonu, tüm eğitim döngüsü boyunca modele "daha iyi"nin ne anlama geldiğini açıkça söylediğiniz yegâne yerdir; mimari, veri hattı ve optimizer sadece bu hedefe hizmet eder. Başlangıç seviyesindeki geliştiricilere sıkça yapılan "CrossEntropyLoss öncesinde asla softmax uygulama, eğitim sessizce çöker" uyarısı gerçeği tam yansıtmaz. Model sessizce çökmez; eğitilmeye devam eder ve benzer bir başarım oranına yaklaşır, ancak süreç boyunca ölçülebilir biçimde hatalı bir kayıp değeri üreterek geliştiriciyi yanıltır.
Kısa Yanıt
Probleminizin çıktı türüne göre karar mekanizması son derece nettir:
- Modelinizin ürettiği yanıt sayısal bir değer ise
MSELosskullanın. - Çıktı bir kategori veya sınıf ise
CrossEntropyLosstercih edin. - İkili (evet/hayır) sınıflandırma problemleri için
BCEWithLogitsLosskullanın.
Bu iki ana fonksiyonun matematiksel temeli oldukça yalındır:
- MSE:
((pred - target) ** 2).mean() - CrossEntropy:
-log(softmax(logits)[correct_class])
MSE: Tam Olarak Adının Söylediği Şey
Mean Squared Error (MSE); tahmin ile hedef arasındaki farkı alır, negatif hataların pozitifleri nötrlemesini önlemek için karesini hesaplar ve batch üzerinde ortalamasını alır:
import torch
import torch.nn as nn
pred = torch.tensor([2.5, 0.5, 3.0])
target = torch.tensor([3.0, 0.0, 3.0])
print(nn.MSELoss()(pred, target)) # tensor(0.1667)
print(((pred - target) ** 2).mean()) # tensor(0.1667)
Hatalar (-0.5, 0.5, 0.0), kareleri (0.25, 0.25, 0.0) ve ortalamaları 0.1667 olur. nn.MSELoss() nesnesi bu formülün doğrudan bir sarmalayıcısıdır. Buradaki kritik yazılımsal çıkarım karesel ceza mantığıdır: Tahminleri 1.0 birim kaydırdığınızda kayıp 1.0 olurken, 2.0 birim kaydırdığınızda kayıp 4.0 olur. İki kat büyük bir hata dört kat fazla cezalandırılır; bu yüzden MSE optimizasyon gücünün çoğunu veri setinizdeki aykırı değerlere (outliers) harcar.
Bir Öğleden Sonraya Mal Olan MSE Tuzağı
PyTorch dokümantasyonunda kolayca fark edilemeyen kritik bir boyut (shape) uyuşmazlığı tuzağı vardır. Bir nn.Linear(n, 1) katmanından çıkan (4, 1) boyutundaki tahmin ile DataFrame sütunundan gelen (4,) boyutundaki hedef etiketleri MSE'ye verdiğinizde:
pr = torch.tensor([[1.0], [2.0], [3.0], [4.0]]) # (4, 1)
tg = torch.tensor([1.0, 2.0, 3.0, 4.0]) # (4,)
print(nn.MSELoss()(pr, tg)) # tensor(2.5000)
Tahminler her satırda kusursuz olmasına rağmen kayıp 2.5000 çıkar. PyTorch'un broadcasting mekanizması (4, 1) ve (4,) tensörlerini (4, 4) ızgarasına genişleterek her tahmini tüm hedeflerle karşılaştırır. 16 karşılaştırmanın 12'si alakasız satırlar arasında yapılır. Hata fırlatılmadığı için fark edilmesi zor olan bu durum saatlerce hata aramanıza yol açabilir. Bu nedenle etiket tensörlerini kayıp fonksiyonuna vermeden önce boyut uyumunu mutlaka denetlemek gerekir.
Bu konuyu daha derinlemesine öğrenmek ister misin?
Edumints'teki ücretsiz kursları incele ve bugün başla.
Kurslara Göz At →