Otomatik kodlayıcılar ve Variasyonel Otomatik kodlayıcılar (VAE)
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 ) / 2Yeniden 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_sigma2log σ²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, klBu 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:
| Situation | Pick |
|---|---|
| Image-latent encoder for diffusion | Stable Diffusion VAE (sd-vae-ft-ema) or Flux VAE |
| Audio-latent encoder | Encodec (Meta), SoundStream, or DAC (Descript) |
| Video latents | Sora'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 generation | Plain 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
- 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? - 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.
- Hard.Uzaklaştırma
code/main.pyMini VQ-VAE'ye dönüştürülür: süreklizK=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
| Term | What people say | What it actually means |
|---|---|---|
| Autoencoder | Encode-decode network | x → z → x̂, learn MSE. Not generative. |
| VAE | AE with a sampler | Encoder outputs a distribution, KL penalty shapes code space. |
| ELBO | Evidence lower bound | log p(x) ≥ recon - KL[q(z|x) || p(z)]; tight when q = p(z|x). |
| Reparameterization | z = μ + σ·ε | Rewrites stochastic node as deterministic + pure noise. Enables backprop through sampling. |
| Prior | p(z) | Target distribution for the latent, typically N(0, I). |
| Posterior collapse | "KL term wins" | Encoder ignores x, outputs the prior; decoder must hallucinate. |
| β-VAE | Tunable KL weight | loss = recon + β·KL. Higher β = more disentangled but blurrier. |
| VQ-VAE | Discrete latent | Replace 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()vepipe.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-fixher zaman fp16- sabit variansı tercih edin veya bf16 kullanın.
Daha Fazla Okumak
- Kingma & Welling (2013). Auto-Encoding Variational Bayes VAE kağıdı.
- Higgins et al. (2017). β-VAE: Learning Basic Visual Concepts with a Constrained Variational Framework çözülmüş β-VAE.
- van den Oord et al. (2017). Neural Discrete Representation Learning VQ-VAE.
- Vahdat & Kautz (2021). NVAE: A Deep Hierarchical Variational Autoencoder En son görüntü VAE.
- Rombach et al. (2022). High-Resolution Image Synthesis with Latent Diffusion Models Dönüştürme; VAE kodlayıcı olarak.
- Défossez et al. (2022). High Fidelity Neural Audio Compression Encodec, sesli VAE standardı.
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.