Pilar ketiga menjawab pertanyaan yang berbeda dari dua chapter sebelumnya: bagaimana menafsirkan hasil model. Keluaran klasifikasi deep learning berupa probabilitas, data nyata selalu bervariasi, dan pemilihan loss yang tepat juga berakar pada teori peluang. Pada chapter ini kita bahas distribusi probabilitas, softmax sebagai pengubah skor menjadi peluang, ekspektasi sebagai rata-rata versi teori, serta intuisi maximum likelihood. Seluruh contoh dihitung nyata dengan NumPy pada angka kecil yang mudah diperiksa.

Distribusi Probabilitas: Peta Peluang Hasil #

Distribusi probabilitas memetakan setiap hasil mungkin beserta peluangnya, dengan total selalu tepat 1. Contoh paling sederhana adalah dadu: enam hasil, masing-masing berpeluang 1/6. Model klasifikasi deep learning memakai gagasan yang sama — untuk satu masukan, model menyusun peluang atas setiap kelas, misalnya kucing: 0.78, anjing: 0.18, burung: 0.04. Kumpulan angka tersebut membentuk distribusi, dan kelas berpeluang tertinggi menjadi prediksi. Dua istilah yang akan sering muncul:

  • Distribusi diskrit: hasilnya terhitung, seperti kelas kucing/anjing/burung.
  • Distribusi kontinu: hasilnya bilangan bebas, seperti tinggi badan; distribusi normal (Gaussian) adalah anggotanya yang paling terkenal.

Softmax: Mengubah Skor Menjadi Probabilitas #

Layer terakhir model klasifikasi menghasilkan skor mentah (logit) yang bisa positif, negatif, atau lebih besar dari 1 — jelas bukan peluang. Fungsi softmax mengubah kumpulan skor tersebut menjadi distribusi probabilitas yang sah: semua nilai dipaksa positif lewat np.exp, lalu dibagi hasil jumlahnya agar totalnya tepat 1. Alur transformasinya sebagai berikut:

Berkas softmax_probabilitas.py mengimplementasikan fungsi tersebut dari nol dan sekaligus menguji ketahanannya terhadap skor besar:

python
"""Softmax manual: mengubah skor mentah menjadi distribusi probabilitas."""

import numpy as np


def softmax(z):
    e = np.exp(z - np.max(z))       # kurangi maksimum agar np.exp tidak overflow
    return e / e.sum()


skor = np.array([2.0, 0.5, -1.0])   # contoh skor untuk 3 kelas
peluang = softmax(skor)
print("Skor            :", skor)
print("Peluang         :", np.round(peluang, 4))
print("Jumlah peluang  :", round(peluang.sum(), 4))
print("Kelas terpilih  :", int(np.argmax(peluang)))

skor_ekstrem = np.array([1000.0, 999.0, 0.0])   # nilai besar, rawan overflow
peluang_ekstrem = softmax(skor_ekstrem)
print("Peluang ekstrem :", np.round(peluang_ekstrem, 4))
print("Jumlah ekstrem  :", round(peluang_ekstrem.sum(), 4))

Output yang Dihasilkan:

text
Skor            : [ 2.   0.5 -1. ]
Peluang         : [0.7856 0.1753 0.0391]
Jumlah peluang  : 1.0
Kelas terpilih  : 0
Peluang ekstrem : [0.7311 0.2689 0.    ]
Jumlah ekstrem  : 1.0

Mari kita telaah kode di atas baris per baris:

  1. Baris 6-8 (def softmax(z)): inti transformasi — eksponensialkan seluruh skor, lalu normalisasi dengan hasil jumlahnya. Elemen dengan skor terbesar selalu berakhir dengan peluang terbesar.
  2. Baris 7 (np.exp(z - np.max(z))): mengurangi setiap skor dengan nilai terbesar sebelum eksponensial. Hasil pembagian tidak berubah, tetapi argumen np.exp menjadi ≤ 0 sehingga tidak terjadi overflow pada skor seperti 1000. Perilaku np.exp pada bilangan sangat besar inilah yang dijaga trik ini.
  3. Baris 11-16 (blok pertama): skor [2.0, 0.5, -1.0] berubah menjadi peluang [0.7856, 0.1753, 0.0391]. Baris jumlah membuktikan total tepat 1.0, dan np.argmax memilih kelas 0 sebagai prediksi.
  4. Baris 18-21 (blok ekstrem): skor [1000, 999, 0] tetap menghasilkan distribusi valid [0.7311, 0.2689, 0.0] tanpa galat numerik — bukti stabilisasi pada poin 2 berfungsi. Selisih skor yang besar membuat peluang memusat pada dua kelas teratas.

Ekspektasi: Rata-rata Versi Teori #

Ekspektasi adalah rata-rata yang dihitung dari peluang, bukan dari data: E[X] = Σ nilai × peluang untuk hasil diskrit. Contoh: durasi belajar harian Budi bernilai 0 jam dengan peluang 0.2, 5 jam dengan peluang 0.5, dan 10 jam dengan peluang 0.3, sehingga ekspektasinya 0×0.2 + 5×0.5 + 10×0.3 = 5.5 jam. Hukum bilangan besar menjamin rata-rata sampel yang cukup banyak akan merapat ke nilai tersebut. Dalam deep learning, expected loss yang kita minimalkan sebenarnya adalah ekspektasi loss atas distribusi data.

Statistik Ringkas Data Nyata #

Teori peluang bicara dari distribusi yang diketahui; statistika bekerja ke arah sebaliknya — menyimpulkan sifat distribusi dari data teramati. Tiga besaran paling dasar: rata-rata (pusat data), varians (sebaran terhadap rata-rata), dan simpangan baku (akar varians, satuannya sama dengan data). Berkas statistik_data.py membuat 1000 data sintetis durasi belajar dari distribusi normal, menghitung ketiganya, lalu membandingkan rata-rata sampel dengan ekspektasi teoretis:

python
"""Rata-rata, varians, dan ekspektasi pada data sintetis durasi belajar."""

import numpy as np

np.random.seed(42)                # hasil tetap sama setiap kali dijalankan

durasi = np.random.normal(loc=5.0, scale=1.5, size=1000)   # jam per hari

print("n sampel          :", durasi.size)
print("rata-rata         :", round(durasi.mean(), 4))
print("varians           :", round(durasi.var(), 4))
print("simpangan baku    :", round(durasi.std(), 4))

nilai = np.array([0.0, 5.0, 10.0])            # durasi mungkin (jam)
peluang = np.array([0.2, 0.5, 0.3])           # peluang tiap durasi
ekspektasi = np.sum(nilai * peluang)
print("Ekspektasi diskrit:", round(ekspektasi, 4))

contoh = np.random.choice(nilai, size=10000, p=peluang)
print("Rata-rata sampel  :", round(contoh.mean(), 4))

Output yang Dihasilkan:

text
n sampel          : 1000
rata-rata         : 5.029
varians           : 2.1553
simpangan baku    : 1.4681
Ekspektasi diskrit: 5.5
Rata-rata sampel  : 5.4575

Mari kita telaah kode di atas baris per baris:

  1. Baris 5 (np.random.seed(42)): mengunci generator acak agar contoh menghasilkan angka yang sama setiap dijalankan — kebiasaan wajib untuk materi yang dapat direproduksi.
  2. Baris 7 (np.random.normal(loc=5.0, scale=1.5, size=1000)): membuat 1000 sampel dari distribusi normal rata-rata 5 dan simpangan baku 1.5. Rincian fungsinya ada di dokumentasi NumPy .
  3. Baris 10-12 (mean, var, std): rata-rata sampel 5.029 dekat dengan loc=5, dan simpangan baku 1.4681 dekat dengan scale=1.5 — statistik sampel memang mendekati parameter populasi. Varians 2.1553 kira-kira kuadrat simpangan bakunya, sesuai definisi.
  4. Baris 14-17 (nilai, peluang): menghitung ekspektasi diskrit contoh durasi Budi secara manual — hasilnya 5.5 jam.
  5. Baris 19-20 (np.random.choice(...)): mengambil 10.000 sampel dari distribusi Budi, lalu mencatat rata-ratanya 5.4575. Nilai tersebut dekat dengan ekspektasi teoretis 5.5, menunjukkan hukum bilangan besar bekerja.

Maximum Likelihood secara Intuitif #

Satu pertanyaan menyatukan seluruh chapter: bagaimana memilih parameter model yang “paling masuk akal” dilihat dari data? Maximum likelihood menjawab: pilih parameter yang membuat data yang benar-benar teramati menjadi paling mungkin terjadi. Kita tidak butuh rumus lanjutan untuk memakai intuisi ini, karena beberapa loss standar ternyata adalah maximum likelihood yang tersamar:

  • Regresi + MSE: mengasumsikan galat berdistribusi normal di sekitar prediksi; meminimalkan MSE sama dengan memaksimalkan peluang data di bawah asumsi tersebut.
  • Klasifikasi + cross-entropy: mengasumsikan keluaran berdistribusi kategori lewat softmax; meminimalkan cross-entropy sama dengan memaksimalkan peluang label yang benar.
BesaranFungsi NumPyPeran di Deep Learning
Rata-rataarr.mean()Pusat data; dasar normalisasi z-score
Variansarr.var()Sebaran data; dasar inisialisasi bobot
Simpangan bakuarr.std()Skala sebaran; memantau pergerakan loss
Ekspektasinp.sum(nilai * peluang)Nilai harapan; bentuk teoretis dari loss
Softmaxnp.exp(z) / np.exp(z).sum()Keluaran klasifikasi multi-kelas

Ketiga pilar matematika kini lengkap: aljabar linear menyusun model, kalkulus melatihnya, probabilitas menafsirkan hasilnya. Yang belum kita bahas adalah proses kerjanya sebagai satu sistem — bagaimana data disiapkan, model dilatih, dan kualitas hasilnya diukur secara jujur. Sistem tersebut bernama siklus machine learning dan menjadi topik chapter berikutnya.