Difúzní modely: jak se z čistého šumu stane obrázek
Dopředný proces přidávání šumu, síť, která odhaduje šum, DDPM a DDIM napsané od nuly, osm shluků bez zhroucení módů, kolik kroků vzorkování je potřeba, srovnání s VAE a GAN na číslicích a cesta k obrázkům podle textu.
Série Základy AI Díl 77 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Jak funguje dopředný a zpětný proces difúze.
- Proč se difúze učí stabilněji než GAN a co stojí počet kroků.
- Jak se z difúze stane generátor obrázků podle textu.
Co se hodí znát předem: Generativní adversariální sítě (GAN): padělatel proti detektivovi, Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
Stable Diffusion, Midjourney, DALL·E 3 i modely, které generují video, stojí na stejném nápadu, a ten je překvapivě prostý. Je snadné obrázek zničit — stačí do něj postupně přidávat šum, až zbude jen šum. Kdybychom se naučili každý malý krok vrátit, mohli bychom začít z čistého šumu a krok po kroku z něj vyloupnout obrázek. V tomhle dílu to naprogramujeme od nuly a porovnáme s VAE a GAN na stejných datech.
Navazuje na díly Generativní adversariální sítě a Variační autoenkodéry.
1. Dopředný proces: obrázek se rozpouští v šumu
Definice — dopředný (difúzní) proces
Nechť d ≥ 1 je rozměr dat, x0 ∈ ℝd obrázek z dat, T ≥ 1 počet kroků a β1, …, βT ∈ (0, 1) plán rozptylů. Nechť ε1, …, εT ~ N(0, I) jsou navzájem nezávislé náhodné vektory, nezávislé na x0 (I je jednotková matice d × d). Dopředný (difúzní) proces je posloupnost náhodných vektorů x1, …, xT ∈ ℝd daná rekurencí
xt = √1 − βt · xt−1 + √βt · εt, t = 1, …, T.
Označme
ᾱt = ∏s=1t (1 − βs) pro t = 1, …, T, ᾱ0 = 1.
Pak pro každé t platí uzavřený tvar (věta níže)
xt = √ᾱt · x0 + √1 − ᾱt · ε, ε ~ N(0, I) nezávislé na x0,
tj. při daném x0 má xt rozdělení N(√ᾱt x0, (1 − ᾱt) I). Posloupnost ᾱt je klesající, a když je pro dost velké t téměř nulová, má xt téměř rozdělení N(0, I) — čistý šum, ve kterém po x0 nezůstala skoro žádná stopa.
Kapka inkoustu ve sklenici vody: chvíli je vidět tvar kapky, pak se rozplývá, nakonec je voda rovnoměrně nabarvená a původní tvar se nedá poznat. Uzavřený vzorec říká, že ke kterémukoli okamžiku se dá skočit přímo — nemusíme simulovat všechny kroky.
xt = √ᾱt · x0 + √1 − ᾱt · ε
- xt
- zašuměný obrázek v kroku t — přesně to, co síť při učení dostane na vstup
- √ᾱt
- kolik zbylo z původního obrázku; ᾱt je součin všech (1 − βs) do kroku t, takže s každým krokem klesá
- x0
- původní obrázek z dat
- √1 − ᾱt
- kolik je tam šumu; odmocniny jsou proto, že se sčítají rozptyly: (√ᾱ)² + (√1 − ᾱ)² = 1, takže data s rozptylem 1 mají rozptyl 1 v každém kroku a na konci plynule přejdou v N(0, I)
- ε
- jeden vzorek šumu z N(0, I) — právě ten bude síť hádat; že ho známe, dělá z učení obyčejnou regresi
Věta — proč stačí jeden skok
Nechť x0, x1, …, xT je dopředný proces s plánem β1, …, βT ∈ (0, 1) a ᾱt = ∏s=1t (1 − βs). Pak pro každé t = 1, …, T existuje náhodný vektor ε ~ N(0, I) nezávislý na x0 takový, že
xt = √ᾱt x0 + √1 − ᾱt ε.
Důkaz. Indukcí podle t. Pro t = 1 je to přímo definice kroku, protože ᾱ1 = 1 − β1. Nechť tvrzení platí pro t − 1, tj. xt−1 = √ᾱt−1 x0 + √1 − ᾱt−1 ε′ s ε′ ~ N(0, I) nezávislým na x0. Dosadíme do kroku t:
xt = √1 − βt √ᾱt−1 x0 + √1 − βt √1 − ᾱt−1 ε′ + √βt εt.
První člen je √ᾱt x0, protože ᾱt = (1 − βt) ᾱt−1. Zbylé dva jsou nezávislé normální vektory se středem 0 (ε′ závisí jen na x0 a ε1, …, εt−1); jejich součet je opět normální se středem 0 a rozptyly se sečtou:
(1 − βt)(1 − ᾱt−1) + βt = 1 − (1 − βt) ᾱt−1 = 1 − ᾱt.
Součet je tedy roven √1 − ᾱt ε pro ε ~ N(0, I) nezávislé na x0. ∎
Příklad — náš plán šumu v číslech
β roste lineárně: βt = β1 + (βT − β1) · t − 1/T − 1, tedy o βT − β1/T − 1 = 0,00101 na krok.
| t | βt | ᾱt | √ᾱt (signál) | √1 − ᾱt (šum) |
|---|---|---|---|---|
| 1 | 0,00010 | 0,9999 | 1,000 | 0,010 |
| 2 | 0,00111 | 0,9988 | 0,999 | 0,035 |
| 25 | 0,02432 | 0,7351 | 0,857 | 0,515 |
| 37 | 0,03643 | 0,5045 | 0,710 | 0,704 |
| 38 | 0,03744 | 0,4856 | 0,697 | 0,717 |
| 50 | 0,04955 | 0,2830 | 0,532 | 0,847 |
| 100 | 0,10000 | 0,0056 | 0,075 | 0,997 |
Druhý řádek ověříme ručně: ᾱ2 = (1 − β1)(1 − β2) = 0,9999 · 0,99889 = 0,99879. Signál a šum se vyrovnají (ᾱ = 0,5) mezi kroky 37 a 38; v kroku 100 má původní obrázek váhu jen 0,075 proti 0,997 u šumu (barvy podle vzorce výše).
U nás T = 100 a β roste lineárně od 0,0001 do 0,1. Podíl původního signálu √ᾱt je v kroku 25 0,86, v kroku 50 0,53 a v kroku 100 už jen 0,07.
2. Zpětný proces: síť, která hádá šum
Definice — DDPM (denoising diffusion probabilistic model)
Nechť T, β1, …, βT a ᾱt jsou jako v dopředném procesu, pdata je rozdělení dat na ℝd a εθ : ℝd × {1, …, T} → ℝd je neuronová síť s parametry θ, která ze zašuměného obrázku a čísla kroku odhaduje přidaný šum. DDPM (denoising diffusion probabilistic model; Jonathan Ho, Ajay Jain a Pieter Abbeel, 2020; myšlenka Jaschy Sohl-Dicksteina a kol., 2015) je dvojice postupů:
- Učení: parametry θ se volí minimalizací střední kvadratické chyby L(θ) = Ex0, t, ε ‖ε − εθ(√ᾱt x0 + √1 − ᾱt ε, t)‖², kde x0 ~ pdata, t je rovnoměrně rozdělené na {1, …, T}, ε ~ N(0, I) a všechny tři jsou nezávislé.
- Vzorkování (vstup: naučená síť εθ; výstup: vzorek x0 ∈ ℝd):
- vylosuj xT ~ N(0, I);
- pro t = T, T − 1, …, 1 vylosuj z ~ N(0, I) (pro t = 1 polož z = 0) a spočítej xt−1 = 1/√1 − βt (xt − βt/√1 − ᾱt · εθ(xt, t)) + √βt · z;
- po kroku t = 1 vrať x0.
Síť se tedy učí obyčejnou regresí odhadnout šum a při vzorkování ho krok po kroku odečítá.
Síť dostane rozmazanou, zašuměnou fotku a otázku „kolik šumu v ní je a jak vypadá?“. Když ho umí odhadnout, umí ho i trochu odečíst. Opakujeme stokrát, pokaždé s trochou čerstvé náhody — a ze šumu se vynoří obrázek. Učení je přitom obyčejná regrese: žádný soupeř jako u GAN, žádné kompromisy jako u VAE.
L(θ) = Ex0, t, ε ‖ε − εθ(√ᾱt x0 + √1 − ᾱt ε, t)‖²
- ε
- šum, který jsme do obrázku sami přidali — správná odpověď, proto ho známe bez jakéhokoli označování dat
- εθ(…, t)
- odhad šumu sítí; dostává i číslo kroku t, protože při t = 2 má šumu najít málo a při t = 100 je v xt skoro jen šum
- √ᾱt x0 + √1 − ᾱt ε
- zašuměný obrázek xt vyrobený jedním skokem — díky uzavřenému vzorci se pro každý příklad stačí vylosovat t a ε, nic se nesimuluje krok po kroku
xt−1 = 1/√1 − βt · (xt − βt/√1 − ᾱt · εθ(xt, t)) + √βt · z
- xt
- současný zašuměný stav — začíná se od čistého šumu xT ~ N(0, I)
- εθ(xt, t)
- odhad šumu, který v xt je
- βt/√1 − ᾱt
- jak velký kus odhadnutého šumu odečíst — jen podíl odpovídající jednomu kroku (βt), přepočtený na celkovou úroveň šumu √1 − ᾱt; u nás 0,01 v kroku 1 a 0,10 v kroku 100
- 1/√1 − βt
- vrací zmenšení z dopředného kroku (tam se násobilo √1 − βt); v kroku 100 je to 1,054
- √βt · z
- čerstvý šum z ~ N(0, I) (v posledním kroku z = 0) — zpětný proces je náhodný jako dopředný; bez něj by se vzorky stahovaly k průměrným obrázkům. Velikost √βt je jedna ze dvou voleb, které Ho a kol. zkoušeli
# učení (DDPM)
opakuj 16 000×:
pro každý z 64 příkladů dávky:
x₀ = náhodný příklad z dat
t = náhodně z 1 … 100
ε = vektor náhodných čísel z N(0, 1)
x_t = √ᾱ_t · x₀ + √(1 − ᾱ_t) · ε
chyba = ‖ε − ε_θ(x_t, kód(t))‖² / rozměr
krok Adamu na průměrné chybě
# vzorkování (DDPM, 100 kroků)
x = vektor z N(0, 1)
pro t = 100, 99, …, 1:
ε̂ = ε_θ(x, kód(t))
z = vektor z N(0, 1), v kroku t = 1 nula
x = (x − β_t / √(1 − ᾱ_t) · ε̂) / √(1 − β_t) + √β_t · z
vrať x
Definice — sinusový kód času
Nechť T ≥ 1 je počet kroků a t ∈ {1, …, T}. Sinusový kód času je vektor kód(t) ∈ [−1, 1]8,
kód(t) = (sin πt/T, cos πt/T, sin 2πt/T, cos 2πt/T, sin 4πt/T, cos 4πt/T, sin 8πt/T, cos 8πt/T),
tj. dvojice (sin fπt/T, cos fπt/T) pro frekvence f = 1, 2, 4, 8. Síť dostane místo čísla t těchto osm čísel. Pomalé frekvence říkají „zhruba kde v procesu jsme“, rychlé rozliší sousední kroky; všechna čísla jsou mezi −1 a 1, takže žádný vstup nepřeváží ostatní.
Pro t = 25 (čtvrtina procesu, úhly π/4, π/2, π a 2π): kód(25) = (0,707; 0,707; 1,000; 0,000; 0,000; −1,000; 0,000; 1,000).
Naše síť je obyčejná vícevrstvá síť z dílu o GAN: na vstupu xt a osm čísel sinusového kódu času t (jako poziční kódování v transformeru), na výstupu odhad šumu. Na kružnici má dvě skryté vrstvy po 64 neuronech, na číslicích po 128. Učí se Adamem 16 000 kroků.
3. Osm shluků bez zhroucení
Stejná data jako v minulém dílu: osm shluků na kružnici. Takhle vypadá 400 vzorků během zpětného procesu:
Ještě v kroku 25 jsou body skoro rovnoměrně rozházené (kvalita 3 %), v kroku 10 se rýsuje kružnice a v posledních deseti krocích se body seběhnou do shluků. Na konci jsou pokryté všechny 8 shluky a každý dostal 28 až 50 z 500 vzorků. Kvalita (podíl do 3σ od středu) je 63 %.
Rozdíl proti GAN není v kvalitě, ale ve spolehlivosti. GAN pokryl všech osm shluků jen v jednom ze čtyř běhů; difúze to udělala v jediném běhu, který jsme pustili (jeden běh není důkaz, ale je to v souladu s tím, co se o difúzi ví). Ztráta difúze totiž není hra, ale regrese, a síť je trestána za každý vzorek dat — za žádný shluk se nedá „vykašlat“.
4. Kolik kroků je potřeba
Definice — DDIM
Nechť εθ je naučená síť DDPM, ᾱt jako v dopředném procesu a ᾱ0 = 1. Pro časy 0 ≤ s < t ≤ T a stav xt ∈ ℝd definujeme odhad čistého obrázku a krok DDIM z času t do času s:
x̂0 = xt − √1 − ᾱt εθ(xt, t)/√ᾱt, xs = √ᾱs x̂0 + √1 − ᾱs εθ(xt, t).
Vzorkování DDIM s n kroky (Jiaming Song, Chenlin Meng a Stefano Ermon, 2020):
- zvol časy T = tn > tn−1 > … > t0 = 0 (u nás rovnoměrně rozložené);
- vylosuj xT ~ N(0, I);
- pro i = n, n − 1, …, 1 proveď krok DDIM z času ti do času ti−1;
- vrať x0 (v posledním kroku je ᾱ0 = 1, takže x0 = x̂0).
DDIM tedy používá stejnou naučenou síť jako DDPM, ale po volbě xT už nic nelosuje (je deterministické) a může skákat po libovolně velkých krocích.
Místo sta drobných krůčků uděláme dvacet větších. V každém se síť zeptá „jak by asi vypadal hotový obrázek?“ a podle toho skočí kus cesty. Když jsou skoky moc velké, síť se netrefí.
xs = √ᾱs · x̂0 + √1 − ᾱs · εθ(xt, t), x̂0 = xt − √1 − ᾱt εθ/√ᾱt
- xt
- stav, ve kterém právě jsme
- εθ
- odhad šumu — tatáž síť jako u DDPM, nic se nepřeučuje
- x̂0
- odhad hotového obrázku: uzavřený vzorec dopředného procesu obrácený pro x0; dělí se √ᾱt, které je na začátku malé, takže tady je odhad nejméně přesný
- √ᾱs
- kolik obrázku má být v cílovém čase s — stejný činitel jako v dopředném procesu, jen pro jiný čas
- √1 − ᾱs
- kolik šumu má zůstat; DDIM přitom použije tentýž odhadnutý šum, žádný nový nelosuje — proto je deterministické
Příklad — proč dva kroky nestačí (zjednodušeně)
DDIM s n kroky jde po rovnoměrně rozložených časech: s 5 kroky 100 → 80 → 60 → 40 → 20 → 0, se 2 kroky 100 → 50 → 0. První skok je vždy z t = 100, kde √ᾱ100 = 0,075.
Když se síť v odhadu šumu splete o δ, splete se odhad x̂0 o δ · √1 − ᾱ100/√ᾱ100 = 13,3 δ — chyba se zesílí víc než desetkrát. Po dosazení do skoku do času s se nový stav liší od správného o δ · (√1 − ᾱs − √ᾱs · 13,3) (barvy podle vzorce DDIM výše):
- 5 kroků, skok 100 → 80: činitel −1,59,
- 2 kroky, skok 100 → 50: činitel −6,23,
Při malém skoku se špatný odhad x̂0 přimíchá s malou vahou √ᾱ80 = 0,19 a další kroky ho opravují. Při skoku do poloviny procesu vejde s vahou √ᾱ50 = 0,53 a zbývá jediný krok. Úvaha sleduje jen jednu chybu v jednom kroku a předpokládá, že jinak síť odhaduje přesně; ukazuje ale, proč jsou první, nejzašuměnější kroky nejcitlivější.
DDIM s 50 kroky dosáhne kvality 79 % — víc než DDPM se 100 kroky (63 %), nejspíš proto, že nepřidává náhodný šum, který naše nepřesná síť nestihne v posledních krocích odstranit. Ještě s 10 kroky je to 70 %, s 5 kroky 60 %. Při 2 krocích se vzorkování rozpadne (0 %). Počet kroků je hlavní cena difúze: každý krok je jeden průchod sítí, kdežto GAN vygeneruje obrázek jedním průchodem.
5. Číslice: srovnání tří generátorů
Na číslicích 8 × 8 (pixely převedené do rozsahu −1 až 1) se síť učí 16 000 kroků.
| model | vzdálenost k nejbližší číslici | nejméně zastoupená cifra (z 200) | cifer s méně než 10 vzorky |
|---|---|---|---|
| VAE (k = 8) | 0,054 | 10 | 0 |
| GAN, semínko 1 | 0,049 | 3 | 3 |
| GAN, semínko 2 | 0,042 | 0 | 6 |
| difúze (100 kroků) | 0,063 | 12 | 0 |
Tady je potřeba být poctivý: naše difúze má vzdálenost 0,063, hůř než VAE (0,054) i GAN (0,042). Na obrázcích je vidět zbytkový šum. Zastoupení cifer je ale vyrovnané — nejméně častá cifra má 12 vzorků, u GAN se semínkem 2 chybí dvě cifry úplně.
Proč je ostrost horší? Malá vícevrstvá síť musí odšumovat obrázky ve všech sto úrovních šumu najednou, a to je těžší úloha než jedno zobrazení šum → obrázek u GAN. Zato se poctivě zlepšuje s výpočtem: vzdálenost vzorků klesala během učení 0,096 (krok 4 000), 0,082 (krok 8 000), 0,068 (krok 12 000), 0,063 (krok 16 000) (rychlý odhad z 100 vzorků DDIM s 20 kroky). Žádné zhroucení ani výkyvy. Skutečné difúzní modely používají konvoluční sítě U-Net nebo transformery se stovkami milionů parametrů a učí se týdny — a pak vyhrávají i ostrostí.
6. Od číslic k obrázkům podle textu
- Podmínka. Síť εθ(xt, t, c) dostane navíc popis c — embedding textu z jazykového modelu, připojený přes pozornost (díl o pozornosti). Učí se na miliardách dvojic obrázek–popisek.
- Navádění bez klasifikátoru (classifier-free guidance, Jonathan Ho a Tim Salimans, 2021). Síť se učí s popisem i bez něj a při vzorkování se odhad posune ve směru „s popisem minus bez popisu“, zesílený koeficientem. Obrázek pak víc odpovídá zadání za cenu menší pestrosti.
- Latentní difúze. Difúze běží v malém latentním prostoru autoenkodéru, ne v pixelech — viz díl o VAE. Stable Diffusion (2022) díky tomu běží i na herní kartě.
- Méně kroků. Lepší vzorkovače a destilace (síť se naučí napodobit mnoho kroků v jednom či několika) zkrátily generování ze stovek kroků na jednotky.
ε̃ = εθ(xt, t, ∅) + w · (εθ(xt, t, c) − εθ(xt, t, ∅))
- εθ(…, ∅)
- odhad šumu bez popisu (prázdná podmínka ∅) — „jak vypadá libovolný obrázek“; síť se ho naučí tím, že při učení popis občas náhodně zahodí
- εθ(…, c) − εθ(…, ∅)
- o co se odhad změní, když síť popis zná — směr, kterým popis obrázek táhne
- w
- síla navádění: w = 0 ignoruje popis, w = 1 je obyčejný podmíněný model, w > 1 vliv popisu přehání — obrázek víc odpovídá zadání, ale vzorky jsou si podobnější
7. Shrnutí
- Dopředný proces postupně přidává šum; ke kterémukoli kroku se dá skočit vzorcem √ᾱ x₀ + √1 − ᾱ ε.
- Síť se učí odhadnout přidaný šum — obyčejná regrese. Generuje se zpětně od čistého šumu.
- Na osmi shlucích pokryla difúze všechny v jediném běhu (DDIM s 50 kroky 79 %); GAN jen v jednom ze čtyř běhů.
- Méně kroků (DDIM) zrychlí vzorkování; s 10 kroky je kvalita 70 %, s 2 kroky se rozpadne.
- Na číslicích pokrývá difúze všechny cifry, ostrostí s naší malou sítí zaostává; zlepšuje se ale stabilně s výpočtem.
Chcete si to osahat? Nechte AI agenta naučit malý DDPM na dvourozměrných datech (třeba body ve tvaru vašich iniciál) a vykreslit, jak se body během zpětného procesu skládají do písmen.
Máte na to jiný názor? Napište na support@coden-app.com.