Cross-entropy dari logits
Untuk batch berisi N contoh dan C kelas, logits[i] adalah skor mentah contoh ke-i, dan targets[i] adalah kelas yang benar. Kembalikan rata-rata cross-entropy:
Hasilnya harus berhingga walau logits bernilai ±1000.
logits = [[0, 0]], targets = [0] → 0.6931 // log 2: tebakan 50/50
logits = [[2, 1, 0.1]], targets = [0] → 0.4170
Intuisi
Cross-entropy menghukum model berdasarkan seberapa kecil probabilitas yang diberikan ke jawaban yang benar. Jika p=1, loss-nya 0. Jika p=0.5, loss-nya log2≈0.69. Jika p→0, loss-nya →∞. Model yang yakin tapi salah dihukum sangat berat.
Sebagai patokan, untuk C kelas tebakan acak memberi loss logC. Untuk model bahasa karakter dengan 65 karakter, loss awal sekitar log65≈4.17. Kalau loss awalmu jauh dari angka ini, ada yang salah dengan inisialisasi.
Kenapa langsung dari logits
−logsoftmax(z)y=logj∑ezj−zyMenghitung softmax dulu lalu log bisa menghasilkan log(0) = -inf. Bentuk log-sum-exp di atas stabil. Inilah alasan nn.CrossEntropyLoss di PyTorch menerima logits, bukan probabilitas.
Gradiennya indah
∂zi∂Li=softmax(zi)−onehot(yi)Gradien ini adalah “prediksi dikurangi kebenaran”, sama seperti regresi linear.
Penjelasan
Yang diminta. Rata-rata −logpbenar untuk batch logits (N, C) dengan label targets (N,). Hasilnya satu angka.
Ide kunci: jangan hitung softmax lalu log. Tulis langsung:
−logsoftmax(z)y=−(zy−logj∑ezj)=log-sum-explogj∑ezj−zyBagian log-sum-exp dihitung stabil dengan trik maksimum: log∑jezj=m+log∑jezj−m.
Langkah di kode:
m = logits.max(axis=1, keepdims=True)berbentuk(N, 1).lse = m[:, 0] + np.log(np.exp(logits - m).sum(axis=1))berbentuk(N,).picked = logits[np.arange(N), targets]. Ini fancy indexing: baris ke-i, kolomtargets[i], sehingga terambil logit kelas yang benar untuk setiap contoh.(lse - picked).mean(), diubah kefloat.
Cek. Logits [0, 0]: kedua kelas 50/50, loss =log2≈0.693. Case [[1000, 0], [0, 1000]] dengan target [0, 0]: contoh pertama benar dan sangat yakin (loss ≈ 0), contoh kedua salah dan sangat yakin (loss ≈ 1000), sehingga rata-ratanya 500.
Yang dikembalikan: satu float.
Topik
Petunjuk 1
CE untuk satu contoh = −log softmax(logits)[target] = log Σ_j exp(z_j) − z_target.
Petunjuk 2
Hitung log Σ exp dengan trik max: m + log Σ exp(z − m). Ambil logit target dengan logits[np.arange(N), targets].
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.