Přeskočit na obsah
coden

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.

12 minut Matěj Žalmánek 2026-10-16

Série Základy AI Díl 77 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat

Celá osnova série 83 z 83 témat hotovo

Co si odnesete
  • 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.

Laicky řečeno

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)
10,000100,99991,0000,010
20,001110,99880,9990,035
250,024320,73510,8570,515
370,036430,50450,7100,704
380,037440,48560,6970,717
500,049550,28300,5320,847
1000,100000,00560,0750,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.

Trojka v dopředném procesu (zleva t = 0, 10, 25, 50, 75, 100)

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ů:

  1. 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é.
  2. Vzorkování (vstup: naučená síť εθ; výstup: vzorek x0 ∈ ℝd):
    1. vylosuj xT ~ N(0, I);
    2. 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;
    3. 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á.

Laicky řečeno

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
Střední hodnota je přes obrázky z dat, rovnoměrně vylosovaný krok t ∈ {1, …, T} a šum ε ~ N(0, I); v praxi průměr přes dávku. Ho a kol. tuhle jednoduchou ztrátu dostali zjednodušením variační dolní meze (té, kterou optimalizuje i VAE) — vypustili v ní váhy jednotlivých kroků.

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
Závorka vynásobená prvním činitelem je odhad středu obrázku o krok méně zašuměného; pak se k němu přidá tolik náhody, kolik jí do kroku patří.
# 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:

t = 100 t = 50 t = 25 t = 10 t = 0 souřadnice x₁ (bez jednotky) x₂ (bez jednotky)
Zpětný proces: od šumu (t = 100) k datům (t = 0)

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):

  1. zvol časy T = tn > tn−1 > … > t0 = 0 (u nás rovnoměrně rozložené);
  2. vylosuj xT ~ N(0, I);
  3. pro i = n, n − 1, …, 1 proveď krok DDIM z času ti do času ti−1;
  4. 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.

Laicky řečeno

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é
Krok je „odšumuj úplně a pak znovu zašum na úroveň času s“. DDIM tak může skočit libovolně daleko.
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ší.

0 %25 %50 %75 %100 % 63 · 8/8 100 79 · 8/8 50 77 · 8/8 20 70 · 8/8 10 60 · 8/8 5 0 · 0/8 2 kroky vzorkování (počet) kvalita (% vzorků do 3σ)
Kvalita a pokrytí na kružnici podle počtu kroků vzorkování DDPM (100 kroků) DDIM nejlepší běh GAN

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ů.

difúze GAN, semínko 2 VAE
Prvních deset vzorků
modelvzdálenost k nejbližší číslicinejméně zastoupená cifra (z 200)cifer s méně než 10 vzorky
VAE (k = 8)0,054100
GAN, semínko 10,04933
GAN, semínko 20,04206
difúze (100 kroků)0,063120

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ší
Při vzorkování se ε̃ dosadí místo εθ; cena jsou dva průchody sítí na krok. Ho a Salimans píší tentýž vzorec jako (1 + w′) εθ(…, c) − w′ εθ(…, ∅), tedy w = 1 + w′. Knihovna diffusers má pro Stable Diffusion výchozí w = 7,5.

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.

Agent na vašem počítači, ovládaný z telefonu