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 adatpontot 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?
Legyen az eredeti megfigyelés . Kép esetén , ahol a csatornák, a magasság, a szélesség száma; az absztrakt képletekben dimenziós oszlopvektornak tekintjük. Batchelt adat esetén , ahol a batch mérete, és minden művelet elemenként értendő.
A noise schedule (zajütemezés) egy rögzített sorozat, ahol a teljes lépésszám. A forward (előre irányuló) folyamat egy Markov-lánc, amelynek átmeneti eloszlása minden esetén
Ez azt jelenti, hogy az vektor feltételesen Gauss-eloszlású, átlaga , kovarianciamátrixa pedig . A gyakorlati mintavételezés:
A értékek kicsik, tipikusan és 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 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.
A következő állítás a fejezet levezetési kötelezettsége. Célja, hogy egy tetszőleges időpontbeli eloszlását közvetlenül -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 minden esetén, és definiáljuk a kumulatív szorzatot
Ha a forward folyamat a fenti Markov-átmenetet követi független zajokkal, akkor minden esetén
Bizonyítás. Teljes indukcióval dolgozunk. A esetben , így a definícióból közvetlenül adódik az állítás.
Tegyük fel, hogy az állítás -re igaz, azaz
ahol független a -edik lépés zajától. A forward rekurzió szerint
Behelyettesítve az indukciós feltevést:
Az első tag determinisztikus, mert 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:
Mivel , a zárójelben
A determinisztikus tag együtthatója pedig . Következésképpen
ami éppen a lemma állítása.
A bizonyítás kulcsa a feltételes eloszlás rekurzív szerkezete: minden lépésben egy szorzó skálázza a korábbi jelet, és egy független zajtag adódik hozzá. A kumulatív szorzat azt méri, hogy az eredeti jel mekkora hányada maradt meg. Ha a schedule-t úgy választjuk, hogy , akkor , tehát a lánc végén a feltételes eloszlás már nem függ érdemben -tól.
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 -től nem függő konstanst:
Az szerinti gradiens, a láncszabályt komponensenként alkalmazva:
Ha bevezetjük a standardizált zajt
akkor
Tehát a feltételes score egy negatív előjelű, tényezővel skálázott zaj. Ez a mennyiség azonban ismeri -t, generáláskor viszont a hálózat csak -t látja, és a mintavételhez a marginális 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
Bizonyítás. . Elosztva -vel a súly , a Bayes-tétel szerinti utóeloszlás, így a jobb oldal a feltételes score -re vett feltételes várható értéke. A feltételes score fenti alakjába helyettesítve kapjuk a második egyenlőséget.
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 realizáció, de mivel a hálózat csak -t látja, az MSE-t minimalizáló függvény az 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: . 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 (, ) a zárt alakú marginális score és a gépi pontossággal egyezett.
A conditional denoiser (feltételes zajeltávolító) egy paraméteres függvény, amelynek bemenete egy zajos vektor és a időindex, kimenete pedig a hozzáadott zaj becslése. Képeknél a be- és kimenet alakja megegyezik: . A 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 az adateloszlás, , , és . Ekkor
A veszteség minimalizálása azt jelenti, hogy a hálózat minden -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 zárt alakja miatt minden tanítópélda egyetlen lépésben előállítható: nem kell a teljes hosszúságú zajozási láncot végigjárni.
A sampling (mintavételezés) során a cél új, az adateloszláshoz hasonló előállítása. Kiindulunk egy tiszta zajból: . Ezután minden lépésben alkalmazzuk a tanult reverse átmenetet. A DDPM-féle paraméterezésben a reverse eloszlás
ahol
A variancia tipikusan vagy a posterior variancia
A mintavételezési algoritmus:
A -nél használt 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 kis léptékű korrekcióval. Ez az iteratív denoising a diffúziós modellek jellegzetessége.
A 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 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 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 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.
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):
mellett a maximális abszolút hiba
nagyságrendű, a reverse minta pedig sztochasztikusan ingadozik a
á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.
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 , , , , és . Számítsa ki értékét, a feltételes eloszlás átlagát és varianciáját, valamint a feltételes score-t az pontban.
F3 (implementációs, nehézség 1). Írjon Python-függvényt, amely egy alakú batchhez és egy indexhez a lemma zárt alakjából mintát generál. A függvény adja vissza a zajos batch-et. Ellenőrizze egy , eseten, hogy a kapott tensor alakja , é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_hatahol eps_hat a denoiser kimenete. Mi a hiba? Milyen
eloszlásbeli következménye van annak, ha ezt a lépést használjuk
-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?
F1 megoldás. A forward zajfolyamat rögzített Markov-lánc, amelyet a 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 , ahol tanulható paraméter. A kettő iránya ellentétes: a forward -ból -be tart, a reverse -ből -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 -kat: , , . Így . A lemma szerint
A feltételes score az pontban:
Alakellenőrzés: a score vektor dimenziója , megegyezik 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 XtEllenőrzés:
,
,
tetszőleges, például torch.zeros(3,4). Ekkor
átlaga elméletileg nulla, varianciája
.
A Monte-Carlo-átlag
ismétléssel
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
skálázás, másrészt a zajtag kivonásánál a
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
nem a
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
miatt közelítse a
értéket.
F5 megoldás. Lehetséges protokoll: az adateloszlás legyen , például , ; generáljunk tanító- és tesztvektort. Használjunk lépést, lineáris schedule-t . Minden batchhez válasszunk véletlen -t, adjunk hozzá zajt a zárt alakból, és minimalizáljuk az MSE-t egy MLP-vel. Tanulási ráta , Adam, lépés, batch méret , seed . 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 é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.
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 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 -t prediktálja (), majd a mintavételnél mégis a zajpredikciós formulát használja, azaz nélkül. Ez inkonzisztens paraméterezés: a hálózat kimenetét zajként értelmezi, pedig az -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 -formulát kell alkalmazni, nem pedig egyszerűen kivonni a predikált zajt.
Önellenőrzés: a lemma bizonyításában minden kovarianciamátrix -vel arányos, tehát a komponensek függetlenek maradnak; a monoton csökken, mert . A határesetben a képlet degenerált Dirac-eloszlást adna, ezért a lemma csak -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 -szeres kiértékelést igényel.
A diffúziós modell egy rögzített Gauss-forward folyamatból indul, amely rekurzióval zajosítja az adatot. A lemmában beláttuk, hogy zárt alakú: átlaga , varianciája . 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 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.