Phase 08: Generative AI

Otomatik kodlayıcılar ve Variasyonel Otomatik kodlayıcılar (VAE)

Bir otomatik kodlayıcı sıkıştırır, sonra yeniden oluşturur. Hatırlıyor. Yaratmaz. Bir numara ekleyin kodu Gaussian görünmesi için zorlayın ve bir örneklemeci elde edersiniz.z = μ + σ·ε, bu yüzden 2026'da kullandığınız her gizli yayılma ve akış eşleşme görüntü modeli girişinde bir VAE'ye sahip.

Type: Build

Languages: Python

Prerequisites: Phase 3 · 02 (Backprop), Phase 3 · 07 (CNNs), Phase 8 · 01 (Taxonomy)

Time: ~75 minutes

Sorun

784 piksel MNIST rakamını 16 sayılık bir kodla sıkıştırın, sonra yeniden yapılandırın. Sıradan bir otomatik kodlayıcı MSE yeniden yapılandırmasını sağlar ancak kod alanı bir karışıklık.

Aslında istediğiniz şey: (a) kod alanı temiz ve düzgün bir dağılımdır.N(0, I), (b) herhangi bir örnekin çözümü bir olası rakam üretir ve (c) kodlayıcı ve dekoder hala iyi sıkıştırılır.

Kingma'nın 2013 VAE'si kodlayıcının bir dağıtım çıkartması için eğitilmesiyle bunu çözer.q(z|x) = N(μ(x), σ(x)²), bu dağılımı öncüye doğru çekerekN(0, I)KL cezası ile, sonra örnekleme yapılır.z-q(z|x)Anlamlama sırasında, kodlayıcıyı bırakın, örnekleyin.z ~ N(0, I)KL cezası, kod alanının yapılandırılmasını zorlar.

2026 yılında VAE'ler nadiren bağımsız olarak gönderir çiğ görüntü kalitesi için difüzyonla üst sınıflandırılmıştır ama her latent difüzyon modeli için tercih edilen kodlayıcılardır (SD 1/2/XL/3, Flux, AudioCraft).

Anlaşım

!Autoencoder vs VAE: the reparameterization trick

Autoencoder. z = encoder(x)- Evet .x̂ = decoder(z), kayıp = ||x - x̂||²- Kod alanı yapılandırılmamış.

VAE encoder.İki vektör çıkışı: μ(x)ve log σ²(x)Bu tanımlar .q(z|x) = N(μ, diag(σ²))- Evet .

Reparameterization trick.q(z|x)Örnekte farklılık gösterilmez.z = μ + σ·εneredeε ~ N(0, I)- Şimdi .z(μ, σ)Parametre dışı bir gürültü ekle gradientler akıyor μve σ- Evet .

Loss.Kanıt Alt Bağlantısı (ELBO), iki terim:

loss = reconstruction + β · KL[q(z|x) || N(0, I)]
     = ||x - x̂||²  + β · Σ_i ( σ_i² + μ_i² - log σ_i² - 1 ) / 2

Yeniden inşaat sürükler .x̂- Yolu xKL ' in itmesi .q(z|x)Bu yöntemin bir diğer yönü de, daha önce belirtilmiş olan bir sistemin bir parçası olarak, daha önce belirtilmiş olan bir sistemin bir parçası olarak, daha önce belirtilmiş olan bir sistemin bir parçası olarak, daha önce belirtilmiş olan bir sistemin bir parçası olarak, daha önce belirtilmiş olan bir sistemin bir parçası olarak, daha önce belirtilmiş olan bir sistemin bir parçası olarak, daha önce belirtilmiş olan bir sistemin bir parçası olarak, daha önce belirtilmiş olan bir sistemin bir parçası olarak, daha önce belirtilmiş bir sistemin bir parçası olarak, daha önce belirtilmiş bir sistemin bir parçası olarak, daha önce belirtilmiş bir sistemin bir parçası olarak, daha önce belirtilmiş bir sistemin bir parçası olarak, daha önce belirtilmiş bir sistemin bir parçası olarak, daha önce belirtilmiş bir sistemin bir parçası olarak, daha önce belirtilmiş bir sistemin bir parçası olarak, daha önce belirtilmiş bir sistemin bir parçası olarak, daha sonra belirtilmiş bir sistemin bir parçası olarak, daha sonra bir sistemin bir diğer sistemin bir parçası olarak, daha daha daha daha daha iyi bir şekilde, daha daha daha daha iyi bir şekilde, daha daha daha daha daha daha iyi bir şekilde, daha daha daha daha daha daha daha daha daha iyi bir şekilde, daha daha daha daha daha daha daha daha daha daha daha daha iyi bir şekilde, daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha daha keşfetmekleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyleyle

Sampling.Sonuç: çekimz ~ N(0, I)Bir ileri geçiş difüzyon gibi tekrarlayıcı örnekleme yok.

Yapın

code/main.pyBu uygulama, bir numpy veya meşale olmadan küçük bir VAE uygulamaktadır. Giriş, 8-D'deki 2 bileşenli Gaussian karışımından alınan 8 boyutlu sentetik veridir. Kodlayıcı ve dekodör tek gizli katmanlı MLP'lerdir. Tanh etkinleştirimi, ileri geçişi, kaybı ve el yazılı geri geçişi uyguluyoruz.

Adım 1: Kodlayıcı ileriye

pythondef encode(x, enc):
    h = tanh(add(matmul(enc["W1"], x), enc["b1"]))
    mu = add(matmul(enc["W_mu"], h), enc["b_mu"])
    log_sigma2 = add(matmul(enc["W_sig"], h), enc["b_sig"])
    return mu, log_sigma2

log σ²yerineσBöylece ağ çıkışı kısıtlı değildir (s'nin yumuşak artışı bir tuzak gradientleri σ ≈ 0'da ölür).

Adım 2: yeniden ölçümleme ve çözme

pythondef reparameterize(mu, log_sigma2, rng):
    eps = [rng.gauss(0, 1) for _ in mu]
    sigma = [math.exp(0.5 * lv) for lv in log_sigma2]
    return [m + s * e for m, s, e in zip(mu, sigma, eps)]

def decode(z, dec):
    h = tanh(add(matmul(dec["W1"], z), dec["b1"]))
    return add(matmul(dec["W_out"], h), dec["b_out"])

Adım 3: ELBO

pythondef elbo(x, x_hat, mu, log_sigma2, beta=1.0):
    recon = sum((a - b) ** 2 for a, b in zip(x, x_hat))
    kl = 0.5 * sum(math.exp(lv) + m * m - lv - 1 for m, lv in zip(mu, log_sigma2))
    return recon + beta * kl, recon, kl

Bu da bir diğer deyişle, bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir de bir bir de bir de bir de bir de bir bir de bir bir bir de bir de bir de bir de bir bir de bir de bir de bir bir bir de bir de bir de bir de bir de bir bir bir de bir bir bir de bir de bir de bir de bir bir bir de bir de bir bir de bir de bir bir de bir bir de bir de bir de bir de bir bir de bir bir de bir bir de bir bir de bir de bir bir de bir de bir de bir bir de bir bir de bir bir de bir de bir de bir bir de bir de bir de bir de bir bir de bir bir bir de bir de bir de bir bir de bir de bir de bir bir de bir de bir bir bir de bir de bir bir de bir de bir bir bir bir de bir de bir de bir de bir de bir de bir bir bir bir de bir de bir bir bir bir bir de bir de bir de bir bir bir de bir de bir bir bir bir de bir de bir bir bir bir de bir de bir de bir bir de bir de bir de bir bir bir de bir de bir de bir de

Dördüncü adım: oluştur

pythondef sample(dec, z_dim, rng):
    z = [rng.gauss(0, 1) for _ in range(z_dim)]
    return decode(z, dec)

Bu, üreticik model. Beş satır.

Tuzaklar

  • Posterior collapse.KL term sürücüleri q(z|x) → N(0, I)O kadar agresif kizhakkında hiçbir bilgi taşımaz.x. Düzeltme: β-anelleme (start β=0, ramp to 1), serbest bitler veya KL'yi aktif olmayan boyutlarda atlayın.
  • Blurry samples.Gaussian dekodör olasılığı, L2 için Bayes-optimal olan MSE yeniden yapılandırmasını içerir (ortalama) bir dizi makul rakamın ortalaması bulanık bir rakamdır. Düzelt: ayrı dekodör (VQ-VAE, NVAE), veya VAE'yi yalnızca bir kodlayıcı ve yataklarda yığın yayılması olarak kullanın (Stable Diffusion yapar).
  • β too large, too early.Arka çöküşü gör, β≈0.01'den başlayın ve ramp.
  • Latent dim too small.16-D, MNIST için, 256-D, ImageNet 2562, 2048-D için ImageNet 10242 için çalışır.

Kullan

2026 VAE'nin birimleri:

SituationPick
Image-latent encoder for diffusionStable Diffusion VAE (sd-vae-ft-ema) or Flux VAE
Audio-latent encoderEncodec (Meta), SoundStream, or DAC (Descript)
Video latentsSora's spatiotemporal patches, Latte VAE, WAN VAE
Disentangled representation learningβ-VAE, FactorVAE, TCVAE
Discrete latents (for transformer modelling)VQ-VAE, RVQ (ResidualVQ)
Continuous latents for generationPlain VAE, then condition a flow/diffusion model in that latent space

Bir latent-difüzyon modeli, kodlayıcı ve dekodör arasında yaşayan bir difüzyon modeli olan bir VAE'dir. VAE kaba sıkıştırmayı yapar, difüzyon modeli ağır yüklemeyi yapar. Video (VAE + video-difüzyon DiT) ve ses (Encodec + MusicGen transformatörü) için aynı desen.

Gönder

  • Kaydet .outputs/skill-vae-trainer.md- Evet .

Yetenek alınması: veri kümesi profili + laten-dim hedefi + aşağıdaki kullanım (yakınlama, örnekleme veya laten-difüzyona giriş) ve çıkışlar: mimarlık seçimi (sırf/β/VQ/RVQ), β programı, laten-dim, dekodör olasılığı (Gaussian vs kategorik) ve değerlendirme planı (recon MSE, KL per dim, Fréchet mesafesi q(z|x)ve N(0, I))

Egzersizler

  1. Easy.Değişiklikβİçeridecode/main.py- ...0.01- Evet .0.1- Evet .1.0- Evet .5.0Son yeniden yapılanma MSE ve KL'yi kaydet. Sentetik verileriniz için en iyi Pareto beta hangisi?
  2. Medium.Gaussian dekoder olasılığını Bernoulli olasılığı (çaplak entropi kaybı) ile değiştirin. Aynı sentetik verilerin ikili sürümünde örnek kalitesini karşılaştırın.
  3. Hard.Uzaklaştırmacode/main.pyMini VQ-VAE'ye dönüştürülür: sürekli zK=32 giriş kod defterinde en yakın komşu arayışı ile. Yeniden inşa MSE'yi karşılaştırın ve kaç kod defter girişinin kullanıldığını bildirin (kod defter çöküşü gerçek).

Anahtar Terimler

TermWhat people sayWhat it actually means
AutoencoderEncode-decode networkx → z → x̂, learn MSE. Not generative.
VAEAE with a samplerEncoder outputs a distribution, KL penalty shapes code space.
ELBOEvidence lower boundlog p(x) ≥ recon - KL[q(z|x) || p(z)]; tight when q = p(z|x).
Reparameterizationz = μ + σ·εRewrites stochastic node as deterministic + pure noise. Enables backprop through sampling.
Priorp(z)Target distribution for the latent, typically N(0, I).
Posterior collapse"KL term wins"Encoder ignores x, outputs the prior; decoder must hallucinate.
β-VAETunable KL weightloss = recon + β·KL. Higher β = more disentangled but blurrier.
VQ-VAEDiscrete latentReplace continuous z with nearest codebook vector; enables transformer modelling.

Üretim notu: VAE bir difüzyon sunucusundaki en sıcak yoludur

Stable Diffusion / Flux / SD3 borusunda VAE'ye istek başına iki kez çağrılır bir kez kodlamak için (img2img / inpainting yapıyorsanız) ve bir kez de kodlamaktır. 10242'de dekodör geçişi genellikle tüm borusunda en büyük tek etkinleştirme hafızası zirvesidür çünkü yukarıdaki örnekler 128×128×16- Yeterince .1024×1024×3İki pratik sonuç:

  • Slice or tile the decode. diffusersAçıklamalarpipe.vae.enable_slicing()ve pipe.vae.enable_tiling()Tiling küçük bir dikiş eseriyle ticaret yapıyor .O(tile²)- Anımsamak yerine .O(H·W)- 10242+ için gerekli.
  • bf16 decoder, fp32 numerics for the final resize.SD 1.x VAE fp32'de serbest bırakıldı ve 10242+ SDXL gemilerinde fp16'a döküldüğünde sessizçe NaNs üretir.madebyollin/sdxl-vae-fp16-fix her zaman fp16- sabit variansı tercih edin veya bf16 kullanın.

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.