Loss
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 37/78
- 5 dk
Loss, model tahmininin ne kadar yanlış olduğunu ölçer.
Kayıp fonksiyonları
Kayıp fonksiyonu problemin türüne göre seçilir:
nn.MSELoss: regresyon.nn.CrossEntropyLoss: çok sınıflı sınıflandırma; ham logitleri ve tam sayı etiketleri alır, softmax'ı içeride yapar.nn.BCEWithLogitsLoss: ikili sınıflandırma; ham logit ve 0/1 ondalık etiket alır.
ce = nn.CrossEntropyLoss()
logit = torch.zeros(2, 3) # her sınıfa eşit skor
print(round(ce(logit, torch.tensor([0, 2])).item(), 4)) # 1.0986 = log(3)CrossEntropyLoss'a softmax uygulanmış olasılık vermek sık yapılan bir hatadır; sonuç çalışır ama yanlış öğrenir.
MSE ve ortalama
Kayıplar varsayılan olarak toplu veri üzerinden ortalama alır (reduction="mean"). "sum" toplamı, "none" örnek başına kayıpları verir; örnek ağırlıklandırma için yararlıdır:
mse = nn.MSELoss()
t = torch.tensor([1., 2., 3.])
g = torch.tensor([1., 4., 6.])
print(mse(t, g).item()) # (0 + 4 + 9) / 3 = 4.333...
print(nn.MSELoss(reduction="none")(t, g).tolist()) # [0.0, 4.0, 9.0]MSE'de tahmin ve hedefin şekli aynı olmalıdır; aksi halde yayınlama sessizce yanlış sonuç üretir.
Uygulama Kayıpları hesapla
Logitler sıfırken nn.CrossEntropyLoss() değerini (round(..., 4)) yazdır. Ardından doğru sınıfa 10, diğerlerine 0 logit veren tensör için kaybı round(..., 4) ile yazdır. Son olarak [1., 2., 3.] ile [1., 4., 6.] arasındaki reduction="sum" MSE'yi yazdır.
Başlangıç kodu
import torch
from torch import nn
ce = nn.CrossEntropyLoss()
y = torch.tensor([0, 2])
# buraya yazÖrnek çözüm
import torch
from torch import nn
ce = nn.CrossEntropyLoss()
y = torch.tensor([0, 2])
print(round(ce(torch.zeros(2, 3), y).item(), 4))
iyi = torch.zeros(2, 3)
iyi[torch.arange(2), y] = 10.0
print(round(ce(iyi, y).item(), 4))
print(nn.MSELoss(reduction="sum")(torch.tensor([1., 2., 3.]), torch.tensor([1., 4., 6.])).item())Beklenen çıktı
1.0986 0.0001 13.0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 CrossEntropyLoss'a hangi girdi verilmelidir?
- Softmax olasılıkları ve one-hot etiketler
- Sigmoid çıktıları
- Tahmin edilen sınıflar
- Ham logitler ve int64 etiketler Doğru cevap
Açıklama: İçeride log-softmax uygulanır; dışarıda softmax yapmak onu iki kez uygulamaktır.
2 Örnek başına kayıpları al.
kayip_fn = nn.MSELoss(reduction=____)
kayip_fn = nn.MSELoss(reduction="none")
Açıklama: "none" indirgeme yapmadan her örneğin kaybını döndürür.
3 Kayıpları eşleştir.
| Kavram | Anlamı |
|---|---|
MSELoss |
Regresyon |
CrossEntropyLoss |
Çok sınıflı, logit |
BCEWithLogitsLoss |
İkili, logit |
reduction="sum" |
Toplam kayıp |