Phase 08: Generative AI

GAN Generatör vs. Ayrımcı

Goodfellow'un 2014'te yaptığı numara yoğunluğu tamamen atlamak. İki ağ. Biri sahte yapıyor. Biri yakalıyor. Sahte gerçekten ayırt edilemez olana kadar dövüşüyorlar. Bu işe yaramaz.

Type: Build

Languages: Python

Prerequisites: Phase 3 · 02 (Backprop), Phase 3 · 08 (Optimizers), Phase 8 · 02 (VAE)

Time: ~75 minutes

Sorun

VAE'ler bulanık örnekler üretir çünkü MSE dekodör kaybı ortalama görüntü için Bayes-optimal ve birçok makul rakamın ortalaması bulanık bir rakamdır. makulluğu ödüllendiren bir kaybı istiyorsunuz, herhangi bir hedefe piksel açısından yakınlık değil. Makulluğu için kapalı bir biçim yoktur. Bunu öğrenmelisiniz.

Goodfellow'un fikri: sınıflandırıcı eğitmek.D(x)Gerçek görüntüleri sahte görüntülerden ayırt etmek için bir jeneratör eğit.G(z)- Akılsızlık .DKayıp sinyalini .GNeyse .DBu sinyal güncelleştiriler gibiGEğer iki ağ da bir araya gelirse,GBilgi dağıtımını hiç yazmadan öğrenmiş.log p(x)- Evet .

Bu bir karşılaşma eğitimi.

min_G max_D  E_real[log D(x)] + E_fake[log(1 - D(G(z)))]

2026'da GAN'lar artık SOTA jeneratörü değil (haşlama ve akış eşleşimi bu taçı yedi). Ancak StyleGAN 2/3 şimdiye kadar gönderilen en keskin yüz modelleri olarak kalır, GAN ayrımcıları, difüzyon eğitiminde algı kaybı olarak kullanılır ve karşıtlık eğitimi gerçek zamanlı difüzyon göndermenizi sağlayan hızlı 1 adımlı destillasiyonları (SDXL-Turbo, SD3-Turbo, LCM) güçlendirir.

Anlaşım

!GAN training: generator and discriminator in minimax

Generator G(z).Bir gürültü vektörünü haritası z ~ N(0, I)bir örnek için x̂. Dekodör şeklinde bir ağ (sıkı veya transpose konfor).

Discriminator D(x).Bir örnekin bir skalar olasılık (veya puan) haritasına yerleştirildi.

Loss.İki alternatif güncelleme:

  • Train D: loss_D = -[ log D(x) + log(1 - D(G(z))) ]- Gerçek = 1'de ikili çapraz entropi, sahte = 0'da.
  • Train G: loss_G = -log D(G(z))Bu Goodfellow'un kullandığı doymayan formdur (orjinal)log(1 - D(G(z))) DKendine güvenen biri.

Training loop.Bir adım atmak .DBir adım daha .GTekrar ediyorum.

Why it works.- EğerGTam olarak eşleşir .p_dataO zaman ...DOrası şansın değil . Her yerde 0.5 çıkış .GDaha fazla gradient kalmaz.

Why it breaks.Mod çöküşü (GBir mod bulur D- ...bunu sonsuza kadar sınıflandırıp, bir araya getiremiyorum.DÇok hızlı öğrenir ve log DBu nedenle, eğitimde de bir değişiklik yapılması gerekmektedir.

GAN'ları çalıştıran variantlar

YearInnovationFix
2015DCGANConv/deconv, batch norm, LeakyReLU — the first stable architecture.
2017WGAN, WGAN-GPReplace BCE with Wasserstein distance + gradient penalty. Fixes vanishing gradient.
2017Spectral normalizationLipschitz-bound the discriminator. Still used in 2026 discriminators.
2018Progressive GANTrain low-res first, add layers. First megapixel results.
2019StyleGAN / StyleGAN2Mapping network + adaptive instance norm. State of the art for fixed-domain photorealism.
2021StyleGAN3Alias-free, translation-equivariant — still the face gold standard in 2026.
2022StyleGAN-XLConditional, class-aware, larger scale.
2024R3GANRebrands with stronger regularization; works on 1024² without tricks.

Yapın

code/main.py1 boyutlu verilere göre küçük bir GAN'ı eğitir: iki Gaussians karışımı. Generatör ve ayrımcı tek katmanlı MLP'lerdir. Ön, geriye ve minimax döngüsünü elle uyguluyoruz. Amaç iki anahtar başarısızlık modunu (mod çöküş + kaybolan gradient) görmektir.

Adım 1: Doymayan kayıp

Vanilya Goodfellow kaybı .log(1 - D(G(z)))D'nin G'nin sahte olduğunu yüksek güvenle sahte olarak sınıflandırırken 0'ya gider.-log D(G(z))D'nin güven içindeyken patlar ve G'ye güçlü bir sinyal verir.

pythondef g_loss(d_fake):
    # maximize log D(G(z))  <=>  minimize -log D(G(z))
    return -sum(math.log(max(p, 1e-8)) for p in d_fake) / len(d_fake)

Adım 2: Bir jeneratör adımı başına bir ayrımcı adım

pythonfor step in range(steps):
    # train D
    real_batch = sample_real(batch_size)
    fake_batch = [G(z) for z in sample_noise(batch_size)]
    update_D(real_batch, fake_batch)

    # train G
    fake_batch = [G(z) for z in sample_noise(batch_size)]  # fresh fakes
    update_G(fake_batch)

G için yeni sahte, aksi takdirde gradientler eskidir.

Adım 3: Mod çöküşünü kontrol edin

pythonif step % 200 == 0:
    samples = [G(z) for z in sample_noise(500)]
    mode_a = sum(1 for s in samples if s < 0)
    mode_b = 500 - mode_a
    if min(mode_a, mode_b) < 50:
        print("  [!] mode collapse: one mode is starved")

Kanonik semptom: iki gerçek moddan biri üretilmeyi bırakır. Ayrımcı onu düzeltmeyi bırakır çünkü asla sahte olarak görülmez.

Tuzaklar

  • Discriminator too strong.D'nin öğrenme hızını 2-5 kat azaltın veya örnek/katman gürültüsü ekleyin.
  • Generator memorizes a mode.D girişlerine gürültü ekleyin, minibatch-dizginci katmanı kullanın veya WGAN-GP'ye geçin.
  • Batch norm leaking statistics.Aynı BN katmanından akışan gerçek parti + sahte parti istatistiklerini karıştırır.
  • Inception-score gaming.FID ve IS düşük örnek sayımlarında gürültülüdür.
  • One-shot sampling is a lie for conditional tasks.Hala CFG ölçekleri, kesim hileleri ve kullanılabilir çıkışlar elde etmek için yeniden örneklenmeye ihtiyacınız var.

Kullan

2026 GAN yığın:

SituationPick
Photoreal human faces, fixed poseStyleGAN3 (sharpest, smallest)
Anime / stylized facesStyleGAN-XL or Stable Diffusion LoRA
Image-to-image translationPix2Pix / CycleGAN (Phase 8 · 04) or ControlNet (Phase 8 · 08)
Fast 1-step text-to-imageAdversarial distillation of diffusion (SDXL-Turbo, SD3-Turbo)
Perceptual loss inside a diffusion trainerSmall GAN discriminator on image crops
Anything multi-modal, open-endedDon't — use diffusion or flow matching

GAN'lar keskin ama dar. Bir kez alanınız fotoğrafları açtığında, keyfi metin istekleri, video yayıma geçiyor.

Gönder

  • Kaydet .outputs/skill-gan-debugger.md. Skill, başarısız bir GAN çalışmasını (kayıp eğri, örnek şebekesi, veri kümesi boyutu) alır ve olası nedenlerin sıralamalı bir listesini, tek satırlı düzeltmeleri ve tekrar çalıştırma protokolünü çıkarır.

Egzersizler

  1. Easy.Çık .code/main.py- O zaman ayarlayın.D_LR = 5 * G_LRG'nin kaybı ne kadar hızlı bir sabit haline gelir?
  2. Medium.Goodfellow BCE kaybını WGAN kaybıyla değiştirin: loss_D = E[D(fake)] - E[D(real)]- Evet .loss_G = -E[D(fake)], ve D'nin ağırlıklarını [-0.01, 0.01]- Eğitim daha istikrarlı mı?
  3. Hard.1-D örneğini 2-D verilere (bir yüzük üzerinde 8 Gaussians karışımı) uzatın. Generatörün 1k, 5k, 10k adımlarında kaç tane 8 mod yakaladığını takip edin. Minibatch ayrımcılığını uygulayın ve yeniden ölçün.

Anahtar Terimler

TermWhat people sayWhat it actually means
Generator"G"Noise-to-sample network, G: z → x̂.
Discriminator"D"Classifier D: x → [0, 1], real vs fake.
Minimax"The game"min_G max_D of a joint objective.
Non-saturating loss"The fix"Use -log D(G(z)) for G instead of log(1 - D(G(z))).
Mode collapse"G memorized one thing"Generator produces few distinct outputs despite diverse data.
WGAN"Wasserstein"Replace BCE with Earth-Mover distance + gradient penalty; smoother gradient.
Spectral norm"Lipschitz trick"Constrain D's weight norms to bound its slope; stabilizes training.
StyleGAN"The one that works"Mapping network + AdaIN; best-in-class for faces, still in 2026.

Üretim notu: Tek çekim sonucu GAN'ın kalıcı avantajıdır

GAN'lar artık açık alan üretimi için örnek kalitesi üzerinde kazanmazlar, ancak hala sonuçlandırma maliyetinde kazanırlar.

  • No prefill, no decode stages.Tek bir tane .G(z)TTFT ≈ toplam gecikme.
  • No KV-cache pressure.Tek durum ağırlıklar.Battery boyutu, cache değil, aktivasyon belleği ile sınırlıdır.
  • Trivial continuous batching.Her istek aynı sabit FLOPs'i aldığı için, sunucu'nun hedef yerleşimindeki statik bir parti genellikle en iyisidir.

Bu nedenle GAN destilasyonu (SDXL-Turbo, SD3-Turbo, ADD, LCM) 2026'da hızlı metin-resim için baskın tekniktir: yavaş jeneratörleri hızlılara dönüştürmek için bir antrenman zaman düğmesi olarak kalır.

Daha Fazla Okumak

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.