Model generatif kita kini mampu menghasilkan data, tetapi loss training tidak bisa menjadi jurinya: loss VAE mengukur batas bawah likelihood, loss diffusion mengukur kecocokan tebakan derau, dan loss GAN mengukur hasil permainan dua jaringan — tidak satu pun menyatakan apakah sampel yang dihasilkan bagus. Evaluasi generatif menuntut pertanyaan yang lebih tajam dari akurasi klasifikasi, karena “bagus” ternyata dua hal sekaligus: kualitas tiap sampel individually dan kesesuaian sampel terhadap keseluruhan distribusi data. Chapter penutup section ini membedah metrik standar — FID, Inception Score, precision-recall, MMD, evaluasi manusia — menguji satu di antaranya dengan implementasi NumPy yang angkanya nyata, lalu menutup dengan tabel sintesis seluruh keluarga model generatif yang telah kita bangun.
Kualitas dan Keragaman: Dua Sumbu yang Berbeda #
Bayangkan generator gambar kucing yang hanya menghasilkan satu pose yang sama sepuluh ribu kali. Setiap sampelnya tajam dan meyakinkan — kualitas tinggi — tetapi distribusinya miskin: keragaman data asli tidak tercakup. Sebaliknya, generator yang menyemburkan variasi acak tanpa kendali memiliki keragaman tanpa kualitas. Dua kegagalan klasik:
- Mode collapse pada GAN: generator menemukan sebagian mode data yang mudah “dijual” ke discriminator lalu berhenti menjelajah sisanya — dibahas mendalam di chapter Stabilitas Training GAN .
- Guidance berlebihan pada diffusion: bobot classifier-free guidance
wyang terlalu besar membuat sampel menempel pada prompt dengan tajam namun seragam.
Metrik evaluasi yang baik harus melihat kedua sumbu; itulah benang merah seluruh metrik berikut.
FID: Jarak Distribusi di Ruang Fitur #
Fréchet Inception Distance (FID, arxiv.org/abs/1706.08500 ) adalah standar de facto evaluasi gambar generatif. Idenya menghindari perbandingan sampel per sampel (sampel generatif tidak harus menyalin foto tertentu) dan membandingkan distribusi: sampel data asli dan sampel generatif sama-sama diteruskan melalui jaringan klasifikasi InceptionV3, fitur tengahnya dikumpulkan, lalu kedua gumpalan fitur dimodelkan sebagai Gaussian dengan mean dan kovarians masing-masing. FID adalah jarak Fréchet (Wasserstein-2) antara kedua Gaussian tersebut:
FID = ||μ_data − μ_sampel||² + Tr(Σ_data + Σ_sampel − 2·(Σ_data·Σ_sampel)^{1/2})
Nilai lebih rendah berarti distribusi fitur lebih mirip; FID = 0 saat kedua distribusi identik. Suku pertama menghukum pergeseran mean fitur (jenis gambar salah), suku kedua menghukum perbedaan bentuk sebaran (keragaman salah) — mode collapse membuat kovarians menyusut dan FID melonjak. Kelemahannya juga nyata: FID butuh ribuan sampel agar estimasi Gaussian stabil (bias menurun jumlah sampel), bergantung pada fitur Inception yang dilatih ImageNet sehingga kurang peka untuk domain jauh seperti citra medis, dan tidak menilai realism sampel individual.
Inception Score dan Precision-Recall #
Inception Score (IS, arxiv.org/abs/1606.03498
) lebih tua dan lebih sederhana: sampel diklasifikasikan InceptionV3; skor tinggi diberikan saat p(y|x) tajam untuk tiap sampel (gambar jelas terklasifikasikan) tetapi p(y) lintas sampel merata (banyak kelas tercakup). IS tinggi berarti sampel “percaya diri dan beragam” — namun tanpa pembanding data asli: generator yang menghasilkan gambar-gambar bagus dari kelas yang tidak ada di data tetap mendapat skor tinggi.
Precision dan recall untuk model generatif (arxiv.org/abs/1904.06991 ) memecah evaluasi tepat menjadi dua sumbu kita: precision mengukur berapa banyak sampel generatif jatuh di dalam manifold data (kualitas), recall mengukur berapa banyak data asli tercakup oleh sampel generatif (keragaman). Pasangan angka ini membedakan diagnosis — precision tinggi recall rendah menunjuk mode collapse; keduanya rendah menunjuk sampel berkualitas buruk.
MMD: Mengukur Jarak Distribusi Langsung lewat Kernel #
Maximum Mean Discrepancy (MMD) membandingkan dua distribusi tanpa bergantung fitur pihak ketiga: kedua sampel dipetakan lewat kernel (misalnya Gaussian RBF), dan MMD² adalah jarak antara rata-rata kedua sampel di ruang fitur kernel tersebut. Untuk kernel karakteristik, MMD² = 0 hanya jika kedua distribusi benar-benar sama. Berkas mmd_mini.py mengimplementasikan estimator tak-biasnya dalam murni NumPy dan menguji lima kasus:
"""Kernel MMD (maximum mean discrepancy) dengan kernel RBF, mini NumPy.
Lima kasus dibandingkan: distribusi sama, mean bergeser, skala berbeda,
mode collapse (satu dari dua cluster hilang), dan dua cluster lengkap.
Bandwidth kernel dipilih lewat heuristik median jarak antar titik.
"""
import numpy as np
rng = np.random.default_rng(11)
def matriks_jarak_kuadrat(a, b):
"""Matriks jarak kuadrat antar semua pasangan titik a dan b."""
d2 = (np.sum(a**2, axis=1)[:, None]
+ np.sum(b**2, axis=1)[None, :]
- 2.0 * a @ b.T)
return np.maximum(d2, 0.0)
def mmd2(x, y, sigma):
"""Estimator MMD^2 tak-bias dengan kernel Gaussian RBF."""
n, m = len(x), len(y)
kxx = np.exp(-matriks_jarak_kuadrat(x, x) / (2.0 * sigma**2))
kyy = np.exp(-matriks_jarak_kuadrat(y, y) / (2.0 * sigma**2))
kxy = np.exp(-matriks_jarak_kuadrat(x, y) / (2.0 * sigma**2))
suku_xx = (kxx.sum() - np.trace(kxx)) / (n * (n - 1))
suku_yy = (kyy.sum() - np.trace(kyy)) / (m * (m - 1))
return suku_xx + suku_yy - 2.0 * kxy.mean()
def sigma_median(x, y):
"""Heuristik median: sigma = median jarak antar titik yang berbeda."""
gab = np.vstack([x, y])
d = np.sqrt(matriks_jarak_kuadrat(gab, gab))
return float(np.median(d[d > 0.0]))
N = 200
def gauss(mean, std, n=N):
"""Sampel Gaussian 2D."""
return mean + std * rng.standard_normal((n, 2))
def dua_cluster():
"""Dua cluster Gaussian 2D di sekitar (1.5, 1.5) dan (-1.5, -1.5)."""
return np.vstack([
gauss(np.array([1.5, 1.5]), 0.3, N // 2),
gauss(np.array([-1.5, -1.5]), 0.3, N // 2),
])
kasus = [
("N(0,I) vs N(0,I) [sama]",
gauss(np.zeros(2), 1.0), gauss(np.zeros(2), 1.0)),
("N(0,I) vs N(+(0.8,0.8),I) [geser]",
gauss(np.zeros(2), 1.0), gauss(np.array([0.8, 0.8]), 1.0)),
("N(0,I) vs N(0, 2I) [skala]",
gauss(np.zeros(2), 1.0), gauss(np.zeros(2), 2.0)),
("2 cluster vs 1 cluster [collapse]",
dua_cluster(), gauss(np.array([1.5, 1.5]), 0.3)),
("2 cluster vs 2 cluster [sama]",
dua_cluster(), dua_cluster()),
]
print("MMD^2 kernel RBF, estimator tak-bias, 200 titik per sampel")
print()
print("kasus | sigma | MMD^2")
print("---------------------------------------+-------+----------")
for nama, x, y in kasus:
sigma = sigma_median(x, y)
print(f"{nama} | {sigma:5.2f} | {mmd2(x, y, sigma):9.4f}")Output yang Dihasilkan:
MMD^2 kernel RBF, estimator tak-bias, 200 titik per sampel
kasus | sigma | MMD^2
---------------------------------------+-------+----------
N(0,I) vs N(0,I) [sama] | 1.66 | 0.0026
N(0,I) vs N(+(0.8,0.8),I) [geser] | 1.76 | 0.1090
N(0,I) vs N(0, 2I) [skala] | 2.45 | 0.0787
2 cluster vs 1 cluster [collapse] | 0.76 | 0.3749
2 cluster vs 2 cluster [sama] | 3.04 | -0.0031Keluarannya membaca persis seperti teorinya. Dua kasus “sama” menghasilkan 0.0026 dan -0.0031 — praktis nol, dengan tanda yang boleh negatif karena estimator tak-bias (diagonal kernel disingkirkan, sisanya derau sampling). Pergeseran mean terdeteksi pada 0.1090, perbedaan skala pada 0.0787, dan mode collapse paling keras: 0.3749 — cluster yang hilang menjatuhkan seluruh setengah distribusi. Perhatikan pula kolom sigma: heuristik median memilih bandwidth berbeda untuk tiap kasus (0.76 hingga 3.04) mengikuti geometri data yang digabung. Mari kita telaah kode di atas baris per baris:
- Baris 13-18 (
matriks_jarak_kuadrat): jarak kuadrat semua pasangan dihitung lewat ekspansi||a−b||² = ||a||² + ||b||² − 2ab— satu operasi matriks untuk seluruh pasangan, jauh lebih cepat daripada loop ganda;np.maximum(d2, 0.0)menjepit pembulatan negatif sebelum diakarkan. - Baris 21-29 (
mmd2): tiga matriks kernel — dalam-x, dalam-y, dan silang. Estimator tak-bias menghapus diagonal (kxx.sum() − trace) karena pasangan titik-dengan-diri-sendiri selalu bernilai kernel 1 dan tidak membawa informasi; kedua suku dalam dan suku silang dirata-rata lalu digabung dengan tanda+ − 2— struktur yang menyerupai rumus chi-kuadrat dua sampel. - Baris 32-36 (
sigma_median): bandwidth RBF menentukan skala kepekaan; heuristik median memakai jarak antar titik yang berbeda dari kedua sampel yang digabung, sehingga kernel melihat struktur pada skala yang tepat tanpa perlu penyetelan manual. - Baris 42-52 (pembangkit data): kasus dibangun dari Gaussian 2D dan pasangan cluster — data mainan yang membuat tiap diagnosa (geser, skala, mode hilang) terisolasi satu per satu.
- Baris 55-74 (tabel): tiap kasus menghitung
sigma-nya sendiri lalu MMD² — pola evaluasi yang tepat untuk membandingkan angka antar kasus pada skala yang konsisten per kasus.
Evaluasi Manusia dan Praktik Lapangan #
Metrik otomatis selalu bisa “dimainkan”: model yang overfit terhadap fitur Inception memperbaiki FID tanpa memperbaiki kualitas yang dilihat manusia. Laboratorium model generatif besar karenanya menutup evaluasi dengan penilaian manusia — pembandingan berdampingan (side-by-side) dua keluaran model oleh manusia, atau skala preferensi bertingkat yang menjadi dasar metode alignment berbasis preferensi pada LLM. Kelemahannya jelas: mahal, lambat, dan subjektif antar penilai; praktik umum memakai kombinasi — FID/precision-recall untuk iterasi cepat eksperimen, evaluasi manusia untuk keputusan rilis. Tabel berikut merangkum posisi tiap metrik:
| Metrik | Mengukur | Kekuatan | Kelemahan |
|---|---|---|---|
| FID | jarak distribusi fitur | standar industri, sensitif mode collapse | butuh banyak sampel, terikat fitur Inception |
| Inception Score | ketajaman + keragaman kelas | murah, tanpa data pembanding | tidak membandingkan data asli |
| Precision / Recall | kualitas dan cakupan terpisah | diagnosa dua sumbu eksplisit | ambang manifold memengaruhi hasil |
| MMD | jarak distribusi lewat kernel | tanpa fitur pihak ketiga, teori kuat | O(n²), sensitif pilihan kernel |
| Evaluasi manusia | preferensi nyata | paling relevan untuk produk | mahal, lambat, subjektif |
Sintesis: Memilih Keluarga Model Generatif #
Section ini menempuh empat keluarga model generatif. Tabel penutup berikut merangkum posisi masing-masing sebagai alat bantu keputusan:
| Keluarga | Objectif inti | Kualitas sampel | Keragaman | Kecepatan sampling | Pemakaian khas |
|---|---|---|---|---|---|
| VAE | rekonstruksi + KL | cukup (cenderung kabur) | baik | cepat | representasi laten, kompresi |
| GAN | minimax dua jaringan | tajam | rawan mode collapse | sangat cepat | gambar fotorealistis, super-resolusi |
| Diffusion | prediksi derau bertahap | tajam dan beragam | baik | lambat (banyak langkah) | text-to-image, audio, video |
| Autoregressive | prediksi token berikutnya | tajam per-token | baik | sedikit-sedikit per token | teks (LLM), gambar piksel-urut |
VAE memberi struktur laten yang bersih dan menjadi fondasi komponen encoder-decoder pada model lain. GAN unggul pada kecepatan inference ketika kualitas per sampel menjadi fokus. Diffusion — dengan varian latent-nya — kini memimpin pembangkitan multimodal bersyarat. Autoregressive, keluarga yang kita telusuri di section Large Language Model , menguasai data sekuensial. Batas antar keluarga juga menipis: VAE diffusion hybrid dan model token-prediksi untuk latenz diffusion adalah arah riset aktif.
Keempat keluarga itu bersandar pada satu prasyarat yang sama: representasi data yang baik sebelum model generatif dibangun. Bagaimana memperoleh representasi tanpa label — dari tugas sampingan seperti menutup bagian masukan — adalah kisah section berikutnya, Self-Supervised dan Representation Learning .