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 yokNeden 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.
İlgili Derin Öğrenme soruları
- PyTorch ile bir sınıflandırma modeli için eksiksiz bir training loop yazın. Hangi adımlar sık unutulur?
- Transfer learning nedir? Önceden eğitilmiş bir modeli küçük bir veri setine nasıl fine-tune edersiniz?
- Embedding nedir? One-hot encoding'e göre avantajı nedir ve nerelerde kullanılır?
- Transformer mimarisini anlatın. Encoder-only, decoder-only ve encoder-decoder modeller arasındaki fark nedir?
- 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.
- RNN ve LSTM nasıl çalışır? Transformer'lar neden büyük ölçüde onların yerini aldı?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.