4. ünite / 10
Kayıp fonksiyonları ve optimize ediciler
MSE, ikili ve çok sınıflı çapraz entropi, logit; SGD, momentum, RMSprop, Adam; öğrenme oranı ve zamanlayıcılar.
Bu ünitenin sonunda
- Probleme göre kayıp fonksiyonu seçmek (regresyon, ikili, çok sınıflı)
- CrossEntropyLoss'un logit beklediğini ve neden softmax uygulanmaması gerektiğini açıklamak
- SGD, momentum ve Adam'ın güncelleme kurallarını karşılaştırmak
- Öğrenme oranının çok küçük ve çok büyük olmasının belirtilerini tanımak
Ders notları
Kayıp fonksiyonu
- Regresyon:
nn.MSELoss(aykırılara duyarlı) ya dann.L1Loss/SmoothL1Loss. - İkili sınıflandırma:
nn.BCEWithLogitsLoss: sigmoid ve log'u birlikte, sayısal olarak kararlı hesaplar. - Çok sınıflı:
nn.CrossEntropyLoss: girdisi ham skorlar (logit), hedefi sınıf indeksi; içinde log_softmax vardır.
Optimize ediciler
SGD gradyanın tersine sabit oranla adım atar: θ ← θ − η·g. Dar ve uzun bir vadide (bir yönde dik, öbüründe sığ) dik yönde zikzak yapar, sığ yönde yavaş ilerler. Momentum geçmiş gradyanların hareketli toplamını kullanır (v ← μv + g); zikzaklar birbirini sönümler, tutarlı yönde hız birikir. RMSprop ve Adam her parametrenin adımını o parametrenin gradyan büyüklüğünün karekök ortalamasına böler: dik yönde küçük, sığ yönde büyük adım. Adam ayrıca momentum ve başlangıç sapması düzeltmesi içerir; pratikte iyi bir varsayılandır (lr = 1e-3).
Öğrenme oranı
Çok küçükse kayıp yavaş azalır; çok büyükse kayıp zıplar ya da NaN olur. Zamanlayıcılar (StepLR, CosineAnnealingLR, OneCycleLR) eğitim boyunca oranı değiştirir.
Görselleştiriciler
Optimize ediciler yarışı: SGD, Momentum, RMSprop, Adam
Uzun, dar bir vadide (ve Rosenbrock'ta) dört optimize edici aynı noktadan başlar. Öğrenme oranını değiştir: SGD zikzak yapar, momentum hız kazanır, Adam her parametrenin adımını kendi ölçeğine göre ayarlar.
3B kayıp yüzeyi ve yörüngeler
Aynı optimize ediciler, bu kez kayıp yüzeyinin üstünde 3B: yükseklik log(1 + f). Yüzeyi döndür, vadinin ne kadar dar olduğunu yandan gör; toplar her optimize edicinin adımlarını sırayla izler.
Kendin dene
Optimize edici yarışında vadi yüzeyini seç ve öğrenme oranını 0,05'te tut: 100 adımda hangisi minimuma en yakın? SGD'nin oranını yavaşça artır: hangi değerde zikzak başlıyor, hangi değerde ıraksıyor? Rosenbrock'a geç: Adam ve momentum muz biçimli vadiyi nasıl izliyor? Eyer yüzeyinde SGD neden eyer noktasında takılıyor?
Kod
import torch
from torch import nn
logits = torch.tensor([[2.0, 0.5, -1.0]]) # 3 sınıf için ham skorlar
target = torch.tensor([0]) # doğru sınıf indeksi
print(nn.CrossEntropyLoss()(logits, target)) # içinde log_softmax var: softmax uygulama
print(nn.BCEWithLogitsLoss()(torch.tensor([1.2]), torch.tensor([1.0])))
print(nn.MSELoss()(torch.tensor([2.5]), torch.tensor([3.0])))
# dar bir vadide üç optimize edici: f(x, y) = 0,04x² + y²
for name, make in [('SGD', lambda p: torch.optim.SGD(p, lr=0.05)),
('Momentum', lambda p: torch.optim.SGD(p, lr=0.05, momentum=0.9)),
('Adam', lambda p: torch.optim.Adam(p, lr=0.5))]:
xy = torch.tensor([-8.0, 1.6], requires_grad=True)
opt = make([xy])
for _ in range(100):
opt.zero_grad()
f = 0.04 * xy[0] ** 2 + xy[1] ** 2
f.backward()
opt.step()
print(f'{name:9s} f = {f.item():.5f} xy = {xy.detach().numpy().round(3)}')Colab defteri
PyTorch tarayıcıda çalışmaz; gerçek kodu Google Colab'da (ücretsiz GPU ile) çalıştır. Defteri indir, colab.research.google.com adresinde "Dosya → Not defteri yükle" ile aç, "Çalışma zamanı → Çalışma zamanı türünü değiştir → T4 GPU" seç ve hücreleri sırayla çalıştır.
Defteri indir (.ipynb)Sık yapılan hatalar
- CrossEntropyLoss'tan önce softmax uygulamak: kayıp içinde zaten log_softmax var; çift softmax öğrenmeyi yavaşlatır.
- BCELoss'a logit vermek: [0, 1] olasılık bekler; logit için BCEWithLogitsLoss kullan.
- Optimize ediciyi model.to(device)'dan önce kurup sonra modeli taşımak: genelde sorun olmaz ama optimizer durumunu yüklerken cihazlar karışır; önce modeli taşı.
- Kayıp NaN olunca eğitimi sürdürmek: öğrenme oranını düşür, gradyan kırpma (clip_grad_norm_) dene, girdiyi normalleştir.
Yazılım mühendisliği bağlantısı
Optimize edici ve kayıp seçimi deneysel bir karardır; kararı kayıt altına al.
- Her deneyin yapılandırmasını (lr, optimize edici, tohum) ve sonucunu bir tabloya ya da TensorBoard/W&B gibi bir izleme aracına yaz.
- Kayıp NaN olduğunda eğitimi durduran bir koruma (assert torch.isfinite(loss)) ekle; sessizce bozuk model kaydetme.
Kendini sına
10 sınıflı bir sınıflandırma için hangi kayıp fonksiyonu ve girdi doğrudur?
Dar bir vadide SGD neden zikzak yapar?
Adam'ın her parametre için adımı ayarlamasının kaynağı nedir?
Eğitimin ilk birkaç adımında kayıp NaN oluyorsa en olası neden nedir?
