Okullar için Robotik ve Mühendislik · anaokulundan liseye

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 da nn.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.
CE = −log( ezy / Σk ezk )

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

Python: kayıp fonksiyonları ve optimize ediciler
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

  1. 10 sınıflı bir sınıflandırma için hangi kayıp fonksiyonu ve girdi doğrudur?

  2. Dar bir vadide SGD neden zikzak yapar?

  3. Adam'ın her parametre için adımı ayarlamasının kaynağı nedir?

  4. Eğitimin ilk birkaç adımında kayıp NaN oluyorsa en olası neden nedir?

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç