Diffusion Models DDPM sıfırdan
Type: Build
Languages: Python
Prerequisites: Phase 3 · 02 (Backprop), Phase 8 · 02 (VAE)
Time: ~75 minutes
Sorun
Örnek almak ister misin ?p_data(x)GAN'lar genellikle farklı bir minimum oyun oynar. VAE'ler Gaussian dekodöründen bulanık örnekler üretir. Gerçekten istediğiniz şey (a) tek sabit bir kayıp (saddle point, no minimax) olan bir eğitim hedefi.log p(x)(böylelikle olasılığınız var) ve (c) SOTA kalitesine uyan örnekler.
Sohl-Dickstein et al. (2015) teorik bir cevabı vardı: Markov zinciri tanımlamak q(x_t | x_{t-1})Bu da yavaş yavaş Gaussian gürültüsünü ekler ve ters bir zincir oluşturur.p_θ(x_{t-1} | x_t)Bu, bir kayıpın bir satır olarak basitleştirilebileceğini gösterdi. 2020 yılında bu bir meraklılıktu. 2021 yılında en son örnekler üretti. 2022 yılında Stable Diffusion oldu. 2026 yılında altyapı.
Anlaşım
!DDPM: forward noise, reverse denoise
Forward process q.Gaussian gürültüsünü ekleyin .TKapalı form matematikin ele alınması 'nin nedeni kumületif adımın da Gaussian olmasıdır:
q(x_t | x_0) = N( sqrt(α̅_t) · x_0, (1 - α̅_t) · I )neredeα̅_t = ∏_{s=1..t} (1 - β_s)β_t- Seç .β_t1e-4'den 0.02'e kadar lineer olarak T=1000 adım üzerinde ve x_TYaklaşık olarak N(0, I)- Evet .
Reverse process p_θ.Bir sinir ağını öğrenin .ε_θ(x_t, t)Bu da eklenen gürültüyü tahmin eder.x_t, aşağıdakilerle tanımlanır:
x_{t-1} = (1 / sqrt(α_t)) · ( x_t - (β_t / sqrt(1 - α̅_t)) · ε_θ(x_t, t) ) + σ_t · zneredeσ_tYa dasqrt(β_t)Bu ifade çirkin ama sadece cebir çözmek için x_{t-1}Arka tarafı verildiği içinq(x_{t-1} | x_t, x_0)ve yerine getirmekx_0gürültü tahminleri ile.
Training loss.
L_simple = E_{x_0, t, ε} [ || ε - ε_θ( sqrt(α̅_t) · x_0 + sqrt(1 - α̅_t) · ε, t ) ||² ]Örnekx_0Verilerden, rastgele bir seçin.t, örnekε ~ N(0, I), gürültülü hesaplayın .x_tBir atışta kapalı formda, gürültüye geri döner.
Sampling.Başlayın .x_T ~ N(0, I)- Geri adımını tekrarla .t = T- ...1- Tamam.
Neden işe yarıyor?
Üç içgüdü:
- Denoising is easy; generating is hard.- Evet .
t=T, veriler saf gürültü ağ küçük bir sorunu çözmek zorunda.t=0... ağ sadece birkaç piksel temizlemek zorunda.tBu sorun zor ama ağın her gürültü seviyesinden aynı ağırlıklardan akıp giden birçok gradiyenti var.
- Score matching in disguise.Vincent (2011) gürültü tahmininin tahminle eşdeğer olduğunu kanıtladı
∇_x log q(x_t | x_0)Bu puanı kullanan geri SDE, yoğunluk gradiyenti 'nin yukarısına doğru yüksek olasılık bölgelerine doğru yönlendirilmiş rastgele bir yürüyüş yapar.
- The ELBO reduces to simple MSE.DDPM'nin parametreleştirmesiyle bu KL terimleri, belirli koeficientlerle gürültü öngörüsü üzerinde MSE'ye basitleştirilmiştir; Ho koeficientleri düşürmüştür (sadece kayıp olarak adlandırılır) ve kalitesi iyileştirilmiştir.
Yapın
code/main.py1 boyutlu DDPM uygulamasını uyguluyor. Veriler iki modlu bir karışım. "net" ise küçük bir MLP'dir.(x_t, t)Bu, bir çizgi kaybı, örneği alınarak geri zincir tekrarlanır.
Adım 1: Önceki program (kapalı form)
pythonbetas = [1e-4 + (0.02 - 1e-4) * t / (T - 1) for t in range(T)]
alphas = [1 - b for b in betas]
alpha_bars = []
cum = 1.0
for a in alphas:
cum *= a
alpha_bars.append(cum)İkinci adım: örnekx_tTek bir atışta
pythondef forward_sample(x0, t, alpha_bars, rng):
a_bar = alpha_bars[t]
eps = rng.gauss(0, 1)
x_t = math.sqrt(a_bar) * x0 + math.sqrt(1 - a_bar) * eps
return x_t, epsAdım 3: Tek eğitim adımı
pythondef train_step(x0, model, alpha_bars, rng):
t = rng.randrange(T)
x_t, eps = forward_sample(x0, t, alpha_bars, rng)
eps_hat = model_forward(model, x_t, t)
loss = (eps - eps_hat) ** 2
return loss, gradient_step(model, ...)4. adım: ters örnekleme
pythondef sample(model, alpha_bars, T, rng):
x = rng.gauss(0, 1)
for t in range(T - 1, -1, -1):
eps_hat = model_forward(model, x, t)
beta_t = 1 - alphas[t]
x = (x - beta_t / math.sqrt(1 - alpha_bars[t]) * eps_hat) / math.sqrt(alphas[t])
if t > 0:
x += math.sqrt(beta_t) * rng.gauss(0, 1)
return x40 zaman aşamasıyla ve 24 birim MLP ile 1 boyutlu bir sorun için, bu, iki mod karışımını ~ 200 dönemde öğrenir.
Zaman şartlandırması
Ağ hangi zaman aşamasını tanımladığını bilmesi gerekiyor.
- Sinusoidal embedding.Transformer pozisyon kodlaması gibi.
embed(t) = [sin(t/ω_0), cos(t/ω_0), sin(t/ω_1), ...]Bir MLP'yi geçiyor ve ağda yayınlanıyor. - Film / group-norm conditioning.Proje, her blokta kanal ölçeğine/kıskançlığa (FiLM) yerleştirilmektedir.
Oyuncak kodumuz sinusoidal → concat kullanıyor.
Tuzaklar
- Schedule matters a lot.Düzsel
βDDPM'nin varsayılan, ancak cosine şeması (Nichol & Dhariwal, 2021) aynı hesaplama için daha iyi FID verir. - Timestep embedding is fragile.Çürük geçiyor .
tbir yüzerken oyuncak 1-D için çalışır ama görüntüler için başarısız olur; her zaman uygun bir yerleştirme kullanın. - V-prediction vs ε-prediction.Sık rejimler için (çok küçük veya çok büyük t),
εSinyal-gürültü zayıflığı.v = α·ε - σ·x) daha istikrarlıdır; SDXL, SD3 ve Flux kullanırlar. - Classifier-free guidance.Sonuçta, hem koşullu hem de koşulsuz hesaplayın.
εO zaman ...ε_cfg = (1 + w) · ε_cond - w · ε_uncond- Evet .w ≈ 3-78. derste ele alındı. - 1000 steps is a lot.Üretim DDIM (20-50 adım), DPM-Solver (10-20 adım) veya destillasyon (1-4 adım) kullanır.
Kullan
| Role | Typical stack in 2026 |
|---|---|
| Image pixel-space diffusion (small, toy) | DDPM + U-Net |
| Image latent diffusion | VAE encoder + U-Net or DiT (Lesson 07) |
| Video latent diffusion | Spatiotemporal DiT (Sora, Veo, WAN) |
| Audio latent diffusion | Encodec + diffusion transformer |
| Science (molecules, proteins, physics) | Equivariant diffusion (EDM, RFdiffusion, AlphaFold3) |
Diffusion, evrensel üreticiden oluşan omurgasıdır. Akış eşleşimi (Desin 13) genellikle aynı kalite için çıkarım hızı üzerinde kazanan 2024-2026 rakipidir.
Gönder
- Kaydet .
outputs/skill-diffusion-trainer.md. Yetenek bir veri kümesi + hesaplama bütçesi ve çıkışları alır: program (lineer/kosin/sigmoid), tahmin hedefi (ε/v/x), adım sayısı, rehberlik ölçeği, örnekleme ailesi ve değerlendirme protokolü.
Egzersizler
- Easy.T' yi 40 ' dan 10 ' a değiştirin
code/main.py- Örnek kalitesi (işlemlerin görsel histogramı) nasıl bozulur? - Medium.E-büyüklüğünden V-büyüklüğüne geçin. Geri adımları tekrar alın. Son örnek kalitesini karşılaştırın.
- Hard.Sınıf etiketi üzerinde koşul
c ∈ {0, 1}, eğitim sırasında ve örnekleme zamanında kullanımı %10 düşürmekε = (1+w)·ε_cond - w·ε_uncondŞartlı modda vurma oranını ölçmekw = 0, 1, 3, 7- Evet .
Anahtar Terimler
| Term | What people say | What it actually means |
|---|---|---|
| Forward process | "Adding noise" | Fixed Markov chain q(x_t | x_{t-1}) that destroys the data. |
| Reverse process | "Denoising" | Learned chain p_θ(x_{t-1} | x_t) that reconstructs the data. |
| β schedule | "The noise ladder" | Per-step variance; linear, cosine, or sigmoid. |
| α̅ | "Alpha bar" | Cumulative product ∏(1 - β); gives closed-form x_t from x_0. |
| Simple loss | "MSE on noise" | ||ε - ε_θ(x_t, t)||²; all variational derivations collapse to this. |
| ε-prediction | "Predict noise" | Output is the noise added; standard DDPM. |
| V-prediction | "Predict velocity" | Output is α·ε - σ·x; better conditioning across t. |
| DDPM | "The paper" | Ho et al. 2020; linear β, 1000 steps, U-Net. |
| DDIM | "Deterministic sampler" | Non-Markov sampler, 20-50 steps, same training objective. |
| Classifier-free guidance | "CFG" | Mix conditional and unconditional noise predictions to amplify conditioning. |
Üretim Notu: Diffüzyona ilişkin sonuçlar bir adım sayım sorunu
DDPM kağıdı T=1000 ters adımları çalışır. Kimse üretimde bu gemi. Her gerçek sonuç yığın üç stratejiden birini seçer ve her haritada temiz bir şekilde üretim çerçevesinde "kenden gecikme geliyor"
- Faster sampler, same model.DDIM (20-50 adım), DPM-Solver++ (10-20), UniPC (8-16).
ε_θAğırlıklar dokunulmamış. - Distillation.Öğrenciyi daha az adımla öğretmenine eşleştirmek için eğit: Gelişmiş Destillation (2 → 1), Düzgünlik Modeller (Özbürekli → 1-4), LCM, SDXL-Turbo, SD3-Turbo. Gecikme 5-10 x daha azaltır, yeniden eğitime ihtiyaç duyar.
- Caching and compilation.
torch.compile(unet, mode="reduce-overhead")TensorRT-LLM'in yayılma arka planları.xformers/SDPA dikkat, bf16 ağırlıkları. Adımlık gecikme ~ 2 ×. (1) ve (2) ile yığılır.
Bir üretim dağıtım sunucu için bütçe konuşması, LLM için üretim literatüründe tarif edilen gibi: gecikme num_steps × step_cost + VAE_decode, geçiş batch_size × (num_steps × step_cost)^-1TTFT küçüktür (bir adım); TPOT eşdeğeri tam yanıt süresi, çünkü görüntü oluşturma kullanıcı açısından "her zaman"dır.
Daha Fazla Okumak
- Sohl-Dickstein et al. (2015). Deep Unsupervised Learning using Nonequilibrium Thermodynamics yayılma kağıdı, zamanından önce.
- Ho, Jain, Abbeel (2020). Denoising Diffusion Probabilistic Models DDPM.
- Song, Meng, Ermon (2021). Denoising Diffusion Implicit Models DDIM, daha az adım.
- Nichol & Dhariwal (2021). Improved DDPM- Kosinus programı, öğrenilmiş değişim.
- Dhariwal & Nichol (2021). Diffusion Models Beat GANs on Image Synthesis sınıflandırıcı rehberliği.
- Ho & Salimans (2022). Classifier-Free Diffusion GuidanceCFG.
- Karras et al. (2022). Elucidating the Design Space of Diffusion-Based Generative Models (EDM) Tek bir notasyon, en temiz tarif.
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.