31.3 Diffúziós zajmodell és CNN-denoiser

31.3.1 Cél és előismeret

Ez az alfejezet a diffúziós generatív modellek matematikai magját, a Gauss-zajjal definiált forward folyamatot és a tanult visszalépést tárgyalja. A cél annak pontos megértése, hogy egy kép vagy vektor fokozatos zajosítása miként ad zárt alakú feltételes eloszlást, és hogyan tanítható ebből egy feltételes denoiser. Előismeret: a 31.2. GAN mint minimax probléma alfejezetben tárgyalt GAN-fogalmak, valamint a 27.3. Dice, IoU és aggregálás alfejezetben bemutatott U-Net-architektúra. A levezetéshez csak a független Gauss-változók összegének variancia-additivitását használjuk, amelyet az 5.2. Várható érték, variancia és likelihood egységben építettünk fel.

Induló kérdés: ha egy x0x_0 adatpontot TT lépésben egyre erősebb Gauss-zajjal rontunk, meg tudjuk-e becsülni a fordított irányú, zajt eltávolító lépés feltételes eloszlását anélkül, hogy a teljes Markov-láncot szimulálnánk?

31.3.2 Forward zajfolyamat: definíció és intuíció

Legyen az eredeti megfigyelés x0∈ℝdx_0\in\mathbb R^d. Kép esetén x0∈ℝC×H×Wx_0\in\mathbb R^{C\times H\times W}, ahol CC a csatornák, HH a magasság, WW a szélesség száma; az absztrakt képletekben d=C⋅H⋅Wd=C\cdot H\cdot W dimenziós oszlopvektornak tekintjük. Batchelt adat esetén Xt∈ℝN×C×H×WX_t\in\mathbb R^{N\times C\times H\times W}, ahol NN a batch mérete, és minden művelet elemenként értendő.

A noise schedule (zajütemezés) egy rögzített β1,…,βT∈(0,1)\beta_1,\dots,\beta_T\in(0,1) sorozat, ahol TT a teljes lépésszám. A forward (előre irányuló) folyamat egy Markov-lánc, amelynek átmeneti eloszlása minden t=1,…,Tt=1,\dots,T esetén

q(xt∣xt−1)=𝒩(xt;1−βtxt−1,βtI). q(x_t\mid x_{t-1})=\mathcal N\!\left(x_t;\sqrt{1-\beta_t}\,x_{t-1},\beta_t I\right).

Ez azt jelenti, hogy az xtx_t vektor feltételesen Gauss-eloszlású, átlaga 1−βtxt−1\sqrt{1-\beta_t}\,x_{t-1}, kovarianciamátrixa pedig βtI\beta_t I. A gyakorlati mintavételezés:

xt=1−βtxt−1+βtϵt,ϵt∼𝒩(0,I),ϵt⊥xt−1. x_t=\sqrt{1-\beta_t}\,x_{t-1}+\sqrt{\beta_t}\,\epsilon_t, \qquad \epsilon_t\sim\mathcal N(0,I),\quad \epsilon_t\perp x_{t-1}.

A βt\beta_t értékek kicsik, tipikusan 10−410^{-4} és 0,020{,}02 között növekednek; így az első lépések alig rontják a jelet, a végső lépések pedig csaknem teljesen zajossá teszik. A tanult visszalépés (reverse process) ezzel szemben egy pθ(xt−1∣xt)p_\theta(x_{t-1}\mid x_t) paraméteres eloszláscsalád, amelynek feladata a forward lépés közelítő megfordítása; ezt a későbbi szakasz tárgyalja. A két folyamat tehát külön objektum: a forward rögzített és analitikus, a reverse tanult és sztochasztikus.

31.3.3 Lemma: zárt alakú feltételes eloszlás

A következő állítás a fejezet levezetési kötelezettsége. Célja, hogy egy tetszőleges tt időpontbeli xtx_t eloszlását közvetlenül x0x_0-ból számíthassuk, anélkül hogy a közbülső lépéseket egyenként szimulálnánk.

Lemma (a Gauss-forward folyamat zárt alakja). Legyen αt=1−βt\alpha_t=1-\beta_t minden t=1,…,Tt=1,\dots,T esetén, és definiáljuk a kumulatív szorzatot

α‾t=∏s=1tαs,α‾0=1. \bar\alpha_t=\prod_{s=1}^{t}\alpha_s, \qquad \bar\alpha_0=1.

Ha a forward folyamat a fenti Markov-átmenetet követi független ϵs∼𝒩(0,I)\epsilon_s\sim\mathcal N(0,I) zajokkal, akkor minden t=1,…,Tt=1,\dots,T esetén

q(xt∣x0)=𝒩(xt;α‾tx0,(1−α‾t)I). q(x_t\mid x_0)=\mathcal N\!\left(x_t;\sqrt{\bar\alpha_t}\,x_0,(1-\bar\alpha_t)I\right).

Bizonyítás. Teljes indukcióval dolgozunk. A t=1t=1 esetben α‾1=α1=1−β1\bar\alpha_1=\alpha_1=1-\beta_1, így a definícióból közvetlenül adódik az állítás.

Tegyük fel, hogy az állítás t−1t-1-re igaz, azaz

xt−1=α‾t−1x0+1−α‾t−1η,η∼𝒩(0,I), x_{t-1}=\sqrt{\bar\alpha_{t-1}}\,x_0+\sqrt{1-\bar\alpha_{t-1}}\,\eta, \qquad \eta\sim\mathcal N(0,I),

ahol η\eta független a tt-edik lépés ϵt\epsilon_t zajától. A forward rekurzió szerint

xt=αtxt−1+βtϵt. x_t=\sqrt{\alpha_t}\,x_{t-1}+\sqrt{\beta_t}\,\epsilon_t.

Behelyettesítve az indukciós feltevést:

xt=αtα‾t−1x0+αt1−α‾t−1η+βtϵt. x_t=\sqrt{\alpha_t}\sqrt{\bar\alpha_{t-1}}\,x_0 +\sqrt{\alpha_t}\sqrt{1-\bar\alpha_{t-1}}\,\eta +\sqrt{\beta_t}\,\epsilon_t.

Az első tag determinisztikus, mert x0x_0 adott. A második és harmadik tag független, nulla várható értékű Gauss-változó. Két független Gauss-változó összege is Gauss, és a kovarianciák összeadódnak; az 5.2. Várható érték, variancia és likelihood alfejezetben látott variancia-additivitás itt kovarianciamátrixokra alkalmazva:

Cov(αt1−α‾t−1η+βtϵt)=αt(1−α‾t−1)I+βtI. \operatorname{Cov}\!\left(\sqrt{\alpha_t}\sqrt{1-\bar\alpha_{t-1}}\,\eta+\sqrt{\beta_t}\,\epsilon_t\right) =\alpha_t(1-\bar\alpha_{t-1})I+\beta_t I.

Mivel βt=1−αt\beta_t=1-\alpha_t, a zárójelben

αt(1−α‾t−1)+1−αt=1−αtα‾t−1=1−α‾t. \alpha_t(1-\bar\alpha_{t-1})+1-\alpha_t =1-\alpha_t\bar\alpha_{t-1} =1-\bar\alpha_t.

A determinisztikus tag együtthatója pedig αtα‾t−1=α‾t\sqrt{\alpha_t}\sqrt{\bar\alpha_{t-1}}=\sqrt{\bar\alpha_t}. Következésképpen

xt=α‾tx0+1−α‾tϵ̃,ϵ̃∼𝒩(0,I), x_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\tilde\epsilon, \qquad \tilde\epsilon\sim\mathcal N(0,I),

ami éppen a lemma állítása. ◼\blacksquare

A bizonyítás kulcsa a feltételes eloszlás rekurzív szerkezete: minden lépésben egy αt\sqrt{\alpha_t} szorzó skálázza a korábbi jelet, és egy független zajtag adódik hozzá. A kumulatív szorzat α‾t\bar\alpha_t azt méri, hogy az eredeti x0x_0 jel mekkora hányada maradt meg. Ha a schedule-t úgy választjuk, hogy α‾T≈0\bar\alpha_T\approx 0, akkor q(xT∣x0)≈𝒩(0,I)q(x_T\mid x_0)\approx\mathcal N(0,I), tehát a lánc végén a feltételes eloszlás már nem függ érdemben x0x_0-tól.

31.3.4 Score-intuíció

A lemma lehetővé teszi a score (pontszámfüggvény) közvetlen kiszámítását. A feltételes sűrűség logaritmusa, elhagyva az xtx_t-től nem függő konstanst:

logq(xt∣x0)=−∥xt−α‾tx0∥22(1−α‾t)−d2log(2π(1−α‾t)). \log q(x_t\mid x_0) =-\frac{\|x_t-\sqrt{\bar\alpha_t}\,x_0\|^2}{2(1-\bar\alpha_t)} -\frac{d}{2}\log\!\big(2\pi(1-\bar\alpha_t)\big).

Az xtx_t szerinti gradiens, a láncszabályt komponensenként alkalmazva:

∇xtlogq(xt∣x0)=−xt−α‾tx01−α‾t. \nabla_{x_t}\log q(x_t\mid x_0) =-\frac{x_t-\sqrt{\bar\alpha_t}\,x_0}{1-\bar\alpha_t}.

Ha bevezetjük a standardizált zajt

ϵ=xt−α‾tx01−α‾t, \epsilon=\frac{x_t-\sqrt{\bar\alpha_t}\,x_0}{\sqrt{1-\bar\alpha_t}},

akkor

∇xtlogq(xt∣x0)=−ϵ1−α‾t. \nabla_{x_t}\log q(x_t\mid x_0) =-\frac{\epsilon}{\sqrt{1-\bar\alpha_t}}.

Tehát a feltételes score egy negatív előjelű, 1/1−α‾t1/\sqrt{1-\bar\alpha_t} tényezővel skálázott zaj. Ez a mennyiség azonban ismeri x0x_0-t, generáláskor viszont a hálózat csak (xt,t)(x_t,t)-t látja, és a mintavételhez a marginális qt(xt)=∫q(xt∣x0)pdata(x0)dx0q_t(x_t)=\int q(x_t\mid x_0)\,p_{\text{data}}(x_0)\,dx_0 sűrűség score-ja kell. A kettő kapcsolata egy további feltételes várhatóérték-azonosság.

Lemma (marginális score és optimális zajprediktor). Ha az integrálás és a deriválás felcserélhető, akkor

∇xtlogqt(xt)=𝔼[∇xtlogq(xt∣x0)|xt]=−𝔼[ϵ∣xt,t]1−α‾t. \nabla_{x_t}\log q_t(x_t) =\mathbb E\bigl[\nabla_{x_t}\log q(x_t\mid x_0)\,\big|\,x_t\bigr] =-\frac{\mathbb E[\epsilon\mid x_t,t]}{\sqrt{1-\bar\alpha_t}}.

Bizonyítás. ∇qt(xt)=∫∇xtq(xt∣x0)pdata(x0)dx0=∫q(xt∣x0)∇xtlogq(xt∣x0)pdata(x0)dx0\nabla q_t(x_t)=\int\nabla_{x_t}q(x_t\mid x_0)\,p_{\text{data}}(x_0)\,dx_0=\int q(x_t\mid x_0)\,\nabla_{x_t}\log q(x_t\mid x_0)\,p_{\text{data}}(x_0)\,dx_0. Elosztva qt(xt)q_t(x_t)-vel a súly q(xt∣x0)pdata(x0)/qt(xt)=q(x0∣xt)q(x_t\mid x_0)p_{\text{data}}(x_0)/q_t(x_t)=q(x_0\mid x_t), a Bayes-tétel szerinti utóeloszlás, így a jobb oldal a feltételes score xtx_t-re vett feltételes várható értéke. A feltételes score fenti alakjába helyettesítve kapjuk a második egyenlőséget. ▫\square

A lemma szétválasztja a tanítási zajcélt és az elérhető optimális regressziós függvényt. A tanítás egyes mintáin a cél a konkrét ϵ\epsilon realizáció, de mivel a hálózat csak (xt,t)(x_t,t)-t látja, az MSE-t minimalizáló függvény az ϵ*(xt,t)=𝔼[ϵ∣xt,t]\epsilon^*(x_t,t)=\mathbb E[\epsilon\mid x_t,t] feltételes várható érték, nem minden egyes realizáció pontos zaja (a négyzetes veszteség minimalizálója a feltételes várható érték). A lemma szerint ez éppen a marginális score skálázott változata: ∇logqt(xt)=−ϵ*(xt,t)/1−α‾t\nabla\log q_t(x_t)=-\epsilon^*(x_t,t)/\sqrt{1-\bar\alpha_t}. Ebben az értelemben ekvivalens a zajpredikció és a score-becslés: a kettő optimuma egy ismert skálázással egymásba vihető. Egy kétpontos, egydimenziós ellenőrzésben (x0∈{−1,1}x_0\in\{-1,1\}, α‾t=0,6\bar\alpha_t=0{,}6) a zárt alakú marginális score és a −𝔼[ϵ∣xt]/1−α‾t-\mathbb E[\epsilon\mid x_t]/\sqrt{1-\bar\alpha_t} gépi pontossággal egyezett.

31.3.5 Conditional denoiser és tanítási cél

A conditional denoiser (feltételes zajeltávolító) egy ϵθ:ℝd×{1,…,T}→ℝd\epsilon_\theta:\mathbb R^d\times\{1,\dots,T\}\to\mathbb R^d paraméteres függvény, amelynek bemenete egy zajos xtx_t vektor és a tt időindex, kimenete pedig a hozzáadott zaj becslése. Képeknél a be- és kimenet alakja megegyezik: ϵθ(Xt,t)∈ℝN×C×H×W\epsilon_\theta(X_t,t)\in\mathbb R^{N\times C\times H\times W}. A tt feltételt a gyakorlatban beágyazzák, és a hálózat közbülső rétegeihez adják.

A tanítási cél a zajpredikciós MSE. Legyen pdatap_{\text{data}} az adateloszlás, t∼Uniform{1,…,T}t\sim\mathrm{Uniform}\{1,\dots,T\}, ϵ∼𝒩(0,I)\epsilon\sim\mathcal N(0,I), és xt=α‾tx0+1−α‾tϵx_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\epsilon. Ekkor

Lt(θ)=𝔼x0∼pdata,t,ϵ[∥ϵ−ϵθ(xt,t)∥2]. L_t(\theta)= \mathbb E_{x_0\sim p_{\text{data}},\,t,\,\epsilon}\Big[\big\|\epsilon-\epsilon_\theta(x_t,t)\big\|^2\Big].

A veszteség minimalizálása azt jelenti, hogy a hálózat minden tt-re megtanulja a hozzáadott zajt rekonstruálni. Ez regressziós feladat, nem minmax játék: ellentétben a 31.2. GAN mint minimax probléma alfejezetben tárgyalt GAN-nal, itt nincs külön diszkriminátor, és a forward folyamat rögzített. A [P20] modellcsalád ezt a zajpredikciós paraméterezést használja; a jelen levezetés a forward folyamat standard tulajdonságaiból adódik.

A tanítási cél fontos tulajdonsága, hogy a q(xt∣x0)q(x_t\mid x_0) zárt alakja miatt minden tanítópélda egyetlen lépésben előállítható: nem kell a teljes tt hosszúságú zajozási láncot végigjárni.

31.3.6 Sampling: a tanult visszalépés

A sampling (mintavételezés) során a cél új, az adateloszláshoz hasonló x0x_0 előállítása. Kiindulunk egy tiszta zajból: xT∼𝒩(0,I)x_T\sim\mathcal N(0,I). Ezután minden t=T,T−1,…,1t=T,T-1,\dots,1 lépésben alkalmazzuk a tanult reverse átmenetet. A DDPM-féle paraméterezésben a reverse eloszlás

pθ(xt−1∣xt)=𝒩(xt−1;μθ(xt,t),σt2I), p_\theta(x_{t-1}\mid x_t) =\mathcal N\!\big(x_{t-1};\mu_\theta(x_t,t),\sigma_t^2 I\big),

ahol

μθ(xt,t)=1αt(xt−βt1−α‾tϵθ(xt,t)). \mu_\theta(x_t,t) =\frac{1}{\sqrt{\alpha_t}}\Big(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon_\theta(x_t,t)\Big).

A σt2\sigma_t^2 variancia tipikusan βt\beta_t vagy a posterior variancia

β̃t=1−α‾t−11−α‾tβt. \tilde\beta_t=\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\,\beta_t.

A mintavételezési algoritmus:

  1. xT∼𝒩(0,I)x_T\sim\mathcal N(0,I);
  2. t=T,…,1t=T,\dots,1 esetén:

A t=1t=1-nél használt z=0z=0 választás heurisztika: az utolsó lépésben a determinisztikus átlagot használjuk, hogy a minta kevésbé legyen szórásos. A teljes eljárás iteratív: nem egyetlen nagy ugrással távolítjuk el a zajt, hanem TT kis léptékű korrekcióval. Ez az iteratív denoising a diffúziós modellek jellegzetessége.

31.3.7 U-Net szerepe

A ϵθ\epsilon_\theta hálózat architektúrája képek esetén szinte mindig U-Net típusú. Ennek oka, hogy a bemenet és a kimenet térbeli felbontása megegyezik: a zajtérkép ugyanolyan alakú, mint a zajos kép. A 27.3. Dice, IoU és aggregálás alfejezetben megismert U-Net encoder–decoder szerkezete skip-kapcsolatokkal lehetővé teszi, hogy a hálózat egyszerre lássa a nagy léptékű kontextust és a finom térbeli részleteket. A diffúziós U-Net további eleme az időbélyeg-kondicionálás: a tt indexből egy kis beágyazó réteg vektort képez, amelyet az egyes blokkok csatornánkénti skálázásra vagy eltolásra használnak. Így ugyanaz a hálózat minden időlépéshez alkalmazkodik anélkül, hogy TT külön modellt kellene tárolni.

A számítási költség a 19.3. EfficientNet és architektúraskálázás alfejezetben tárgyalt skálázási elvekhez hasonlóan viselkedik: a konvolúciós rétegek költsége a térbeli felbontás és a csatornaszám szorzatával nő. A diffúziós modellek teljes költsége azonban ennél is nagyobb, mert a mintavételezés TT hálózati kiértékelést igényel. Ez a fő oka annak, hogy a gyakorlati alkalmazásokban gyorsított mintavételezőket keresnek; ezek tárgyalása túlmutat jelen egységen.

31.3.8 Labor: zajozás demonstrációja szintetikus vektoron

A labor célja a forward zajozás és a zárt alakú eloszlás numerikus ellenőrzése, teljes nagymodell tanítása nélkül. A kód PyTorch-ot használ, CPU-n, float32 pontossággal. Munka könyvtár: lab/n123_diffusion_demo/.

# n123_demo.py — forward zajozás és zárt alak ellenőrzése
import torch

torch.manual_seed(1234)
dtype = torch.float32
device = "cpu"

d = 8                      # vektordimenzió
T = 10                     # lépésszám
x0 = torch.linspace(-1.0, 1.0, d, dtype=dtype, device=device)  # (d,)

# Lineáris noise schedule
beta = torch.linspace(1e-4, 0.02, T, dtype=dtype, device=device)  # (T,)
alpha = 1.0 - beta
alpha_bar = torch.cumprod(alpha, dim=0)  # (T,)

# Egyetlen forward minta rögzített zajjal
g = torch.Generator(device=device).manual_seed(7)
eps = torch.randn(d, dtype=dtype, device=device, generator=g)  # (d,)
t = 5
xt = torch.sqrt(alpha_bar[t-1]) * x0 + torch.sqrt(1.0 - alpha_bar[t-1]) * eps
print("x0   =", x0.numpy())
print("x5   =", xt.numpy())

# Monte-Carlo ellenőrzés: M független zajrealizáció
M = 20000
samples = torch.empty(M, d, dtype=dtype, device=device)
for i in range(M):
    e = torch.randn(d, dtype=dtype, device=device)
    samples[i] = torch.sqrt(alpha_bar[t-1]) * x0 + torch.sqrt(1.0 - alpha_bar[t-1]) * e

emp_mean = samples.mean(dim=0)
emp_var = samples.var(dim=0, unbiased=False)
theo_mean = torch.sqrt(alpha_bar[t-1]) * x0
theo_var = torch.full_like(x0, 1.0 - alpha_bar[t-1])
print("max |emp. mean - theo. mean| =", (emp_mean - theo_mean).abs().max().item())
print("max |emp. var  - theo. var | =", (emp_var - theo_var).abs().max().item())

# Oracle denoiser: a demonstrációban ismeri a valódi eps-t
def oracle_denoiser(x, t_idx):
    return eps  # alak (d,)

# Egy reverse lépés a DDPM-átlaggal, t=5 -> t=4
a_t = alpha[t-1]
ab_t = alpha_bar[t-1]
beta_t = beta[t-1]
eps_hat = oracle_denoiser(xt, t)
mu = (xt - (beta_t / torch.sqrt(1.0 - ab_t)) * eps_hat) / torch.sqrt(a_t)
z = torch.randn_like(xt)
x_prev = mu + torch.sqrt(beta_t) * z
print("reverse mu (t=5)  =", mu.numpy())
print("reverse sample x4 =", x_prev.numpy())

Futtatási parancs: python n123_demo.py. Az ellenőrzés a Monte-Carlo átlag és variancia összehasonlítása a lemma által adott elméleti értékekkel. Várható kimenet (számított, nem mért): M=20000M=20000 mellett a maximális abszolút hiba 10−210^{-2} nagyságrendű, a reverse minta pedig sztochasztikusan ingadozik a μ\mu átlag körül. A labor nem tanít hálózatot, és nem állít semmit a generált minták minőségéről.

31.3.9 Feladatok

F1 (fogalmi, nehézség 1). Magyarázza el, mi a különbség a forward zajfolyamat és a tanult visszalépés között. Adja meg mindkettő definícióját, a paraméterek szerepét és azt, hogy melyik rögzített, illetve tanult.

F2 (levezetési, nehézség 2). Legyen T=3T=3, β1=0,1\beta_1=0{,}1, β2=0,2\beta_2=0{,}2, β3=0,3\beta_3=0{,}3, és x0=(1,−1)⊤∈ℝ2x_0=(1,-1)^\top\in\mathbb R^2. Számítsa ki α‾3\bar\alpha_3 értékét, a q(x3∣x0)q(x_3\mid x_0) feltételes eloszlás átlagát és varianciáját, valamint a feltételes score-t az x3=(0,2,−0,3)⊤x_3=(0{,}2,-0{,}3)^\top pontban.

F3 (implementációs, nehézség 1). Írjon Python-függvényt, amely egy (N,d)(N,d) alakú X0X_0 batchhez és egy tt indexhez a lemma zárt alakjából mintát generál. A függvény adja vissza a zajos XtX_t batch-et. Ellenőrizze egy N=3N=3, d=4d=4 eseten, hogy a kapott tensor alakja (3,4)(3,4), és hogy a Monte-Carlo-átlag közelíti az elméleti átlagot.

F4 (hibakeresési, nehézség 2). Tekintse a következő hibás mintavételezési lépést:

# hibás reverse lépés
x_prev = x_t - eps_hat

ahol eps_hat a denoiser kimenete. Mi a hiba? Milyen eloszlásbeli következménye van annak, ha ezt a lépést használjuk t=5t=5-nél a labor kódjában? Javítsa a kódot a helyes DDPM-formulával, és indokolja a javítás minden tényezőjét.

F5 (kísérlettervezési, nehézség 3). Tervezzen egy kis kísérletet, amely szintetikus, 16 dimenziós vektorokon betanít egy két rejtett rétegű MLP-denoiser-t a zajpredikciós MSE-célra. Adja meg a protokollt: adateloszlás, split, batch méret, tanítási lépésszám, seed, metrika. Mi az a legfontosabb korlát, amely miatt ebből a toy kísérletből nem szabad általános következtetést levonni a képi diffúziós modellekre?

31.3.10 Megoldások és indoklás

F1 megoldás. A forward zajfolyamat q(xt∣xt−1)=𝒩(xt;1−βtxt−1,βtI)q(x_t\mid x_{t-1})=\mathcal N(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_t I) rögzített Markov-lánc, amelyet a βt∈(0,1)\beta_t\in(0,1) schedule egyértelműen meghatároz. Nincs tanulható paramétere, és a mintavételezése a fenti rekurzív zajhozzáadás. A tanult visszalépés ezzel szemben pθ(xt−1∣xt)=𝒩(xt−1;μθ(xt,t),σt2I)p_\theta(x_{t-1}\mid x_t)=\mathcal N(x_{t-1};\mu_\theta(x_t,t),\sigma_t^2 I), ahol θ\theta tanulható paraméter. A kettő iránya ellentétes: a forward x0x_0-ból xTx_T-be tart, a reverse xTx_T-ből x0x_0-ba. A forward analitikus és nem tanul semmit; a reverse entrópiás és a tanítási cél minimalizálásával illeszkedik a forward inverzének közelítésére.

F2 megoldás. Először kiszámítjuk az α\alpha-kat: α1=0,9\alpha_1=0{,}9, α2=0,8\alpha_2=0{,}8, α3=0,7\alpha_3=0{,}7. Így α‾3=0,9⋅0,8⋅0,7=0,504\bar\alpha_3=0{,}9\cdot0{,}8\cdot0{,}7=0{,}504. A lemma szerint

q(x3∣x0)=𝒩(x3;0,504x0,(1−0,504)I)=𝒩(x3;(0,7099,−0,7099)⊤,0,496I). q(x_3\mid x_0) =\mathcal N\!\big(x_3;\sqrt{0{,}504}\,x_0,(1-0{,}504)I\big) =\mathcal N\!\big(x_3;(0{,}7099,-0{,}7099)^\top,0{,}496I\big).

A feltételes score az x3=(0,2,−0,3)⊤x_3=(0{,}2,-0{,}3)^\top pontban:

∇x3logq(x3∣x0)=−x3−0,504x00,496=−(0,2−0,7099,−0,3+0,7099)⊤0,496=(1,028,−0,826)⊤. \nabla_{x_3}\log q(x_3\mid x_0) =-\frac{x_3-\sqrt{0{,}504}\,x_0}{0{,}496} =-\frac{(0{,}2-0{,}7099,\,-0{,}3+0{,}7099)^\top}{0{,}496} =(1{,}028,-0{,}826)^\top.

Alakellenőrzés: a score vektor dimenziója d=2d=2, megegyezik x3x_3 dimenziójával.

F3 megoldás. A függvény:

import torch

def forward_sample(X0, t, alpha_bar):
    # X0: (N,d), t: int, alpha_bar[t-1] skalár
    N, d = X0.shape
    eps = torch.randn(N, d)
    Xt = torch.sqrt(alpha_bar[t-1]) * X0 + torch.sqrt(1.0 - alpha_bar[t-1]) * eps
    return Xt

Ellenőrzés: N=3N=3, d=4d=4, X0X_0 tetszőleges, például torch.zeros(3,4). Ekkor xtx_t átlaga elméletileg nulla, varianciája 1−α‾t1-\bar\alpha_t. A Monte-Carlo-átlag 2000020000 ismétléssel 10−210^{-2} tűrésen belül egyezzen. A kimenet alakja (3,4).

F4 megoldás. A hibás kód két problémát rejt. Egyrészt hiányzik a 1αt\frac{1}{\sqrt{\alpha_t}} skálázás, másrészt a zajtag kivonásánál a βt1−α‾t\frac{\beta_t}{\sqrt{1-\bar\alpha_t}} együttható hiányzik. A helyes formula a labor kódjában szereplő mu kifejezés. A hibás lépés következménye, hogy a kapott xt−1x_{t-1} nem a pθ(xt−1∣xt)p_\theta(x_{t-1}\mid x_t) eloszlásból származik: a várható értéke eltér a posterior átlagtól, és a varianciája nulla, tehát a mintavételezés determinisztikussá válik. A javítás ellenőrzése: vessük össze a javított mu értékét a labor kódjában szereplő számítással, és futtassuk le egy batch-re; a kimenet varianciája a hozzáadott zz miatt közelítse a βt\beta_t értéket.

F5 megoldás. Lehetséges protokoll: az adateloszlás legyen x0∼𝒩(μ0,Σ0)x_0\sim\mathcal N(\mu_0,\Sigma_0), például μ0=0\mu_0=0, Σ0=I\Sigma_0=I; generáljunk 1000010000 tanító- és 20002000 tesztvektort. Használjunk T=20T=20 lépést, lineáris schedule-t βt∈[10−4,0,02]\beta_t\in[10^{-4},0{,}02]. Minden batchhez válasszunk véletlen tt-t, adjunk hozzá zajt a zárt alakból, és minimalizáljuk az MSE-t egy 16→64→64→1616\to64\to64\to16 MLP-vel. Tanulási ráta 10−310^{-3}, Adam, 50005000 lépés, batch méret 128128, seed 12341234. Metrika: teszt MSE a zajpredikcióra, valamint a generált minták hisztogramjának vizuális összehasonlítása a valódi eloszlással. A legfontosabb korlát: a 16 dimenziós Gauss-toy feladat nem tartalmazza a képek térbeli struktúráját, a nagy TT és a U-Net architektúra hatásait, ezért az eredményből nem következtethetünk képi diffúziós modellek teljesítményére.

31.3.11 Tipikus tévedés és ellenpélda

Gyakori tévedés a zajpredikciós cél és a mintavételezési eljárás összekeverése. A tanítási cél a hozzáadott ϵ\epsilon zajt prediktálja, de a mintavételezéskor ezt a predikciót transzformálni kell a reverse átlagba. Ellenpélda: tegyük fel, hogy valaki a tanítás során közvetlenül x0x_0-t prediktálja (x̂0\hat x_0), majd a mintavételnél mégis a zajpredikciós formulát használja, azaz ϵ̂=(xt−α‾tx̂0)/1−α‾t\hat\epsilon=(x_t-\sqrt{\bar\alpha_t}\hat x_0)/\sqrt{1-\bar\alpha_t} nélkül. Ez inkonzisztens paraméterezés: a hálózat kimenetét zajként értelmezi, pedig az x0x_0-becslés. A két cél különböző skálázást és különböző reverse átlagot eredményez, ami torz mintákat ad. A labor oracle denoiser példája éppen azt mutatja, hogy még ha a zajt pontosan ismerjük is, a mintavételi lépésben a μ\mu-formulát kell alkalmazni, nem pedig egyszerűen kivonni a predikált zajt.

31.3.12 Önellenőrzés és visszahívás

Önellenőrzés: a lemma bizonyításában minden kovarianciamátrix II-vel arányos, tehát a komponensek függetlenek maradnak; a α‾t\bar\alpha_t monoton csökken, mert αt∈(0,1)\alpha_t\in(0,1). A t=0t=0 határesetben a képlet degenerált Dirac-eloszlást adna, ezért a lemma csak t≥1t\ge1-re érvényes.

Visszahívás a 30.3. Negatív nélküli módszerek és collapse alfejezetből: ott a kontrasztív reprezentációtanulás collapse-a volt a degeneráció; itt a forward folyamat rögzített, ezért a diffúziós tanítás nem szenved ugyanabban a minmax-instabilitásban. Ugyanakkor ha a denoiser konstans zajt prediktál, az is degenerált modell; ennek kiszűrése a validációs MSE-vel történik. A 27.3. Dice, IoU és aggregálás alfejezetben látott U-Net itt nem szegmentál, hanem zajtérképet állít elő; a skip-kapcsolatok szerepe azonban analóg. A 19.3. EfficientNet és architektúraskálázás alfejezetben tárgyalt költségszkálázás itt is érvényes: a hálózat költsége a felbontás és csatornaszám növelésével nő, és a mintavételezés TT-szeres kiértékelést igényel.

31.3.13 Rövid összefoglaló

A diffúziós modell egy rögzített Gauss-forward folyamatból indul, amely xt=1−βtxt−1+βtϵtx_t=\sqrt{1-\beta_t}x_{t-1}+\sqrt{\beta_t}\epsilon_t rekurzióval zajosítja az adatot. A lemmában beláttuk, hogy q(xt∣x0)q(x_t\mid x_0) zárt alakú: átlaga α‾tx0\sqrt{\bar\alpha_t}x_0, varianciája 1−α‾t1-\bar\alpha_t. A feltételes score arányos a negatív zajjal, ezért a tanult denoiser zajpredikciós MSE-céllal tanítható. A mintavételezés TT reverse lépésből áll, amelyek a predikált zajból számított reverse átlag körül Gauss-zajt adnak. A U-Net a térbeli zajtérkép becslésére és az időfeltétel beépítésére szolgál. A következő alkalmazás: 31.4. Generatív felhasználás és értékelés alfejezetben a generatív felhasználás és az értékelés kérdéseit vizsgáljuk.

31.3.14 Források