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 w yang 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:

python
"""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:

text
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.0031

Keluarannya 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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:

MetrikMengukurKekuatanKelemahan
FIDjarak distribusi fiturstandar industri, sensitif mode collapsebutuh banyak sampel, terikat fitur Inception
Inception Scoreketajaman + keragaman kelasmurah, tanpa data pembandingtidak membandingkan data asli
Precision / Recallkualitas dan cakupan terpisahdiagnosa dua sumbu eksplisitambang manifold memengaruhi hasil
MMDjarak distribusi lewat kerneltanpa fitur pihak ketiga, teori kuatO(n²), sensitif pilihan kernel
Evaluasi manusiapreferensi nyatapaling relevan untuk produkmahal, 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:

KeluargaObjectif intiKualitas sampelKeragamanKecepatan samplingPemakaian khas
VAErekonstruksi + KLcukup (cenderung kabur)baikcepatrepresentasi laten, kompresi
GANminimax dua jaringantajamrawan mode collapsesangat cepatgambar fotorealistis, super-resolusi
Diffusionprediksi derau bertahaptajam dan beragambaiklambat (banyak langkah)text-to-image, audio, video
Autoregressiveprediksi token berikutnyatajam per-tokenbaiksedikit-sedikit per tokenteks (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 .