NumPy ile sayısal olarak kararlı (numerically stable) softmax ve cross-entropy loss yazın. Logit'lere göre gradyanı nedir?

Cevap

Naif softmax exp(x) / sum(exp(x)) büyük logit'lerde (örneğin 1000) exp overflow olur ve inf/inf = NaN üretir. Çözüm: softmax'ın her elemandan sabit çıkarmaya karşı değişmez olmasını kullanıp maksimumu çıkarmak.

import numpy as np

def softmax(z):
    # z: (N, C) logits
    z = z - z.max(axis=1, keepdims=True)     # en büyük değer 0 olur, overflow yok
    e = np.exp(z)
    return e / e.sum(axis=1, keepdims=True)

def log_softmax(z):
    z = z - z.max(axis=1, keepdims=True)
    return z - np.log(np.exp(z).sum(axis=1, keepdims=True))   # log-sum-exp hilesi

def cross_entropy(z, y):
    # y: (N,) sınıf indeksleri
    logp = log_softmax(z)
    return -logp[np.arange(len(y)), y].mean()

def cross_entropy_grad(z, y):
    p = softmax(z)
    p[np.arange(len(y)), y] -= 1             # p - onehot(y)
    return p / len(y)

z = np.array([[1000.0, 1001.0, 1002.0], [1.0, 2.0, 3.0]])
y = np.array([2, 0])
print(cross_entropy(z, y))                   # NaN yok

Neden log_softmax ayrı?

np.log(softmax(z)) yazmak, softmax çok küçük bir olasılık (0'a yuvarlanmış) döndürdüğünde log(0) = -inf üretir. Log-sum-exp formu bunu önler. PyTorch'ta nn.CrossEntropyLoss aynı nedenle doğrudan logit alır ve içeride log_softmax + NLLLoss uygular.

Gradyan

Softmax ve cross-entropy birlikte türetildiğinde sonuç çok sadedir:

dL/dz = softmax(z) - onehot(y)

Yani doğru sınıf için p_y - 1, diğer sınıflar için p_j. Tahmin doğru ve eminse gradyan sıfıra yaklaşır. Yanlış ve eminse gradyan büyüktür.

Doğrulamak için sayısal türev kullanılabilir: (L(z + eps) - L(z - eps)) / (2·eps) her eleman için analitik gradyanla karşılaştırılır.

  1. PyTorch ile bir sınıflandırma modeli için eksiksiz bir training loop yazın. Hangi adımlar sık unutulur?OrtaDerin ÖğrenmeYapay Zeka
  2. Transfer learning nedir? Önceden eğitilmiş bir modeli küçük bir veri setine nasıl fine-tune edersiniz?OrtaDerin ÖğrenmeYapay Zeka
  3. Embedding nedir? One-hot encoding'e göre avantajı nedir ve nerelerde kullanılır?KolayDerin ÖğrenmeYapay Zeka
  4. Transformer mimarisini anlatın. Encoder-only, decoder-only ve encoder-decoder modeller arasındaki fark nedir?ZorDerin ÖğrenmeYapay Zeka
  5. Self-attention nasıl çalışır? Scaled dot-product attention'ı NumPy ile yazın ve neden sqrt(d_k) ile bölündüğünü açıklayın.ZorDerin ÖğrenmeYapay Zeka
  6. RNN ve LSTM nasıl çalışır? Transformer'lar neden büyük ölçüde onların yerini aldı?OrtaDerin ÖğrenmeYapay Zeka

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle