Fungsi loss

MSE dan cross-entropy sebagai ukuran kekeliruan yang diminimalkan.

Daftar isi

Fungsi loss merangkum kekeliruan prediksi sebuah model menjadi satu angka yang diminimalkan oleh proses pelatihan. Topik ini menetapkan sifat yang dituntut dari fungsi loss, membedah MSE untuk regresi dan cross-entropy untuk klasifikasi, dan menutup dengan tabel pemilihan loss sesuai bentuk tugas. Setelah selesai, pilihan fungsi loss berhenti menjadi argumen yang disalin dari contoh dan menjadi keputusan yang berdasar.

Loss sebagai satu angka yang diminimalkan#

Proses pelatihan menuntut sasaran numerik yang tunggal, karena algoritma optimasi hanya tahu naik dan turun pada satu sumbu. Fungsi loss L(y^,t) L(\hat{y}, t) menerima prediksi y^ \hat{y} dan target t t , mengembalikan angka nonnegatif, dan bernilai nol tepat ketika prediksi sempurna. Pada satu batch berisi m m contoh, yang diminimalkan adalah rata-ratanya:

Lbatch=1m∑j=1mL(y^j,tj) L_{\text{batch}} = \frac{1}{m} \sum_{j=1}^{m} L(\hat{y}_j, t_j)

Dua sifat praktis mengikuti definisi ini. Pertama, rata-rata membuat nilai loss tidak bergantung pada ukuran batch, sehingga kurva loss antar batch dapat dibandingkan. Kedua, setiap fungsi loss membawa asumsi tentang sifat kekeliruan yang wajar untuk tugasnya, sehingga salah memilih loss sama dengan menyuruh model mengejar sasaran yang keliru.

MSE untuk regresi#

Mean squared error mendefinisikan L=1m∑j(y^j−tj)2 L = \frac{1}{m} \sum_j (\hat{y}_j - t_j)^2 , yaitu rata-rata kuadrat selisih prediksi dan target. Penjumlahannya membatalkan tanda sehingga prediksi terlalu tinggi dan terlalu rendah sama-sama dihitung, sedangkan kuadrat memberi hukuman yang tumbuh cepat pada kesalahan besar. Sifat kuadrat ini membuat model sangat menghindari prediksi yang jauh meleset, dan sekaligus membuat MSE sensitif terhadap pencilan pada data.

Kode berikut menghitung MSE pada beberapa pasangan prediksi dan target kecil, sehingga perilaku hukuman kuadratnya terlihat pada angka yang nyata.

python Contoh: MSE pada prediksi regresi
import torch
import torch.nn.functional as F

prediksi = torch.tensor([2.5, 0.0, 2.0, 8.0])
target = torch.tensor([3.0, -0.5, 2.0, 7.0])
mse = F.mse_loss(prediksi, target)
print("selisih       :", (prediksi - target).tolist())
print("kuadrat selisih:", ((prediksi - target) ** 2).tolist())
print("MSE           :", round(mse.item(), 4))
text Keluaran
selisih       : [-0.5, 0.5, 0.0, 1.0]
kuadrat selisih: [0.25, 0.25, 0.0, 1.0]
MSE           : 0.375

Perhatikan contoh ketiga yang selisihnya nol dan menyumbang nol pada loss, sedangkan contoh keempat yang selisihnya satu menyumbang satu perempat dari total. Apabila kesalahan besar memang lebih merugikan secara proporsional, sifat ini diinginkan. Apabila setiap kesalahan seharusnya dihargai sama, Mean absolute error 1m∑j∣y^j−tj∣ \frac{1}{m} \sum_j |\hat{y}_j - t_j| menjadi alternatif yang lebih tahan pencilan.

Cross-entropy untuk klasifikasi#

Klasifikasi menghasilkan peluang, dan kekeliruannya diukur dari seberapa sedikit peluang yang diberikan kepada jawaban yang benar. Cross-entropy mendefinisikan L=−log⁡p^benar L = -\log \hat{p}_{\text{benar}} , sehingga prediksi yang memberi peluang 1 kepada kelas benar bernilai nol, dan peluang kecil kepada kelas benar dihukum sangat berat karena logaritma menuju −∞-\infty saat peluang menuju nol. Untuk batch, yang diambil adalah rata-ratanya.

Kelas prediksi dinyatakan sebagai distribusi peluang lewat softmax, yang menormalisasi keluaran linier z z menjadi p^k=ezk/∑iezi \hat{p}_k = e^{z_k} / \sum_i e^{z_i} . Pada praktiknya, softmax dan log tidak pernah dipanggil berurutan secara manual karena penyebut ezi e^{z_i} dapat meluber pada nilai besar. PyTorch menyediakan log_softmax yang stabil secara numerik, dan cross_entropy menghitung keduanya dalam satu langkah dari logits mentah.

python Contoh: cross-entropy pada klasifikasi tiga kelas
import torch
import torch.nn.functional as F

logits = torch.tensor([[2.0, 1.0, 0.1]])
target = torch.tensor([0])
peluang = F.softmax(logits, dim=1)
loss = F.cross_entropy(logits, target)
print("peluang per kelas:", [round(v, 3) for v in peluang.squeeze(0).tolist()])
print("-log peluang benar:", round(-torch.log(peluang[0, 0]).item(), 3))
print("cross_entropy    :", round(loss.item(), 3))
text Keluaran
peluang per kelas: [0.659, 0.242, 0.099]
-log peluang benar: 0.417
cross_entropy    : 0.417

Keluarannya memperlihatkan identitas keduanya, yaitu cross_entropy tepat sama dengan −log⁡-\log peluang kelas benar setelah softmax. Perhatikan pula bentuk argumennya, yaitu logits tanpa softmax dan target berupa indeks kelas, karena kesalahan bentuk ini adalah penyebab error paling umum pada pemakaian pertama.

Memilih loss sesuai bentuk tugas#

Pemilihan loss mengikuti bentuk keluaran dan bentuk target, dan tabel berikut memadatkannya untuk tugas-tugas yang muncul sepanjang jalur ini.

TugasKeluaran modelLoss yang dipakai
Regresi nilai kontinuSatu angka tanpa aktivasimse_loss atau l1_loss
Klasifikasi dua kelasSatu logitbinary_cross_entropy_with_logits
Klasifikasi banyak kelasLogit per kelascross_entropy
Pembanding dua distribusiPeluang per kelasKL divergence

Satu kesalahan pemilihan yang paling sering terjadi adalah menerapkan softmax manual lalu memanggil cross_entropy, sehingga softmax dihitung dua kali dan pelatihan berjalan tanpa error tetapi dengan sinyal yang melemah. Kaidah yang aman adalah membiarkan fungsi loss mengurus transformasi terakhirnya, dan menyimpan logits mentah hingga baris loss.

Ringkasan#

  • Loss merangkum kekeliruan batch menjadi satu angka rata-rata nonnegatif yang menjadi sasaran seluruh optimasi.
  • MSE menghukum kesalahan besar secara kuadrat dan cocok untuk regresi, sedangkan MAE lebih tahan pencilan.
  • Cross-entropy mengukur kekurangan peluang pada kelas benar, dan dipanggil dari logits mentah karena softmax plus log yang stabil sudah diurus di dalamnya.
  • Bentuk keluaran dan target menentukan loss yang tepat, dan tabel pemilihannya cukup untuk seluruh tugas pada jalur ini.

Referensi#