Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
Generativní model s latentní proměnnou, VAE napsaný od nuly s trikem převzorkování, uspořádaný latentní prostor, generování číslic ze šumu proti obyčejnému autoenkodéru, vliv β a zhroucení, interpolace a kde se VAE používají.
Série Základy AI Díl 75 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
- Proč z obyčejného autoenkodéru nejde dobře generovat.
- Jak VAE funguje: rozdělení místo bodu, trest KL a trik s převzorkováním.
- Co stojí β, proč jsou obrázky VAE rozmazané a kde se VAE dnes používají.
Co se hodí znát předem: Autoenkodéry: síť, která se učí data stlačit a zase rozbalit, Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
Autoenkodér z dílu o reprezentacích umí obrázek stlačit do pár čísel a zase ho z nich složit. Nabízí se otázka: když dekodér umí z kódu udělat číslici, nemohli bychom mu dát kód, který jsme si vymysleli, a dostat novou číslici, kterou nikdo nenakreslil? U obyčejného autoenkodéru to skoro nefunguje. Variační autoenkodér je jeho úprava, která přesně tohle umožní — a je to první z generativních modelů, kterým se v téhle části série budeme věnovat.
Navazuje na díly Autoenkodéry a reprezentace a Informace a entropie (KL divergence).
1. Od komprese ke generování
Definice — generativní model
Nechť 𝒳 je množina možných dat (u nás obrázky 8 × 8 s jasy pixelů v [0, 1], tedy 𝒳 = [0, 1]64), n ≥ 1 a x1, …, xn ∈ 𝒳 jsou trénovací data, o kterých předpokládáme, že jsou nezávislými vzorky z neznámého rozdělení pdata na 𝒳. Nechť Θ je množina přípustných parametrů a pro každé θ ∈ Θ je pθ rozdělení na 𝒳. Generativní model je soustava rozdělení (pθ)θ ∈ Θ spolu s postupem, jak z rozdělení pθ vzorkovat (vyrábět nová x ~ pθ). Učení vybere θ tak, aby pθ bylo co nejblíž pdata, typicky jako odhad maximální věrohodnosti
θ̂ = argmaxθ ∈ Θ ∑i=1n log pθ(xi).
Model s latentní proměnnou navíc zavede latentní prostor 𝒵 = ℝk (k ≥ 1), na něm pevnou hustotu p(z) (prior) a pro každý kód z ∈ 𝒵 rozdělení pθ(x | z) na 𝒳 (dekodér). Rozdělení dat je pak
pθ(x) = ∫𝒵 pθ(x | z) p(z) dz,
a vzorkuje se ve dvou krocích:
- vylosuj z ~ p(z);
- vylosuj x ~ pθ(x | z) — v praxi (i u nás) se často bere rovnou výstup dekodéru, tj. pravděpodobnosti pixelů.
Nová x tedy vypadají jako data, ale nejsou jejich kopií. V dalším textu index θ vynecháváme a píšeme p(x | z), p(x).
Klasifikátor odpovídá „co to je“. Generativní model umí odpovědět „ukaž mi něco, co by mohlo být v datech“. Recept: hoď kostkou pár čísel, předej je malíři (dekodéru) a ten podle nich namaluje obrázek.
p(x) = ∫ p(x | z) · p(z) dz
- p(z)
- rozdělení kódu (prior) — volíme ho sami a jednoduché, u nás N(0, I), protože z něj pak při generování umíme losovat
- p(x | z)
- dekodér — jak pravděpodobný je obrázek x, když dostaneme kód z; u nás síť, která pro každý pixel vrátí pravděpodobnost, že svítí
- ∫ … dz
- součet přes všechny možné kódy — obrázek mohl vzniknout z kteréhokoli kódu; integrál přes celý latentní prostor ale neumíme spočítat, a proto ho VAE nahradí odhadem (níže)
Háček u obyčejného autoenkodéru: nevíme, odkud kód losovat. Kodér umístí číslice do latentního prostoru, kam se mu zlíbí. U naší sítě s dvourozměrným kódem leží kódy testovacích číslic kolem bodu (-3,9; -0,9) se směrodatnou odchylkou 4,3 a 6,0, a mezi skupinami jsou díry, ve kterých dekodér nikdy nic neviděl.
2. Variační autoenkodér
Definice — variační autoenkodér (VAE)
Nechť 𝒳 = [0, 1]64 je množina obrázků, k ≥ 1 rozměr kódu, I jednotková matice k × k a β > 0. Všechny logaritmy v tomto díle jsou přirozené (log = ln). Variační autoenkodér (VAE; Diederik Kingma a Max Welling, 2013) se skládá ze tří částí:
- kodér — neuronová síť, která obrázku x ∈ 𝒳 přiřadí vektory μ(x) ∈ ℝk a log σ²(x) ∈ ℝk (logaritmus po složkách); ty určují rozdělení kódu q(z | x) = N(μ(x), diag σ²(x)), tj. souřadnice z1, …, zk jsou nezávislé a zj ~ N(μj(x), σj²(x)) (normální rozdělení);
- dekodér — neuronová síť, která kódu z ∈ ℝk přiřadí rozdělení p(x | z) na 𝒳 (u nás vektorem pravděpodobností pixelů y(z) ∈ (0, 1)64);
- prior p(z) = N(0, I), normované normální rozdělení na ℝk.
Parametry obou sítí se učí minimalizací průměru přes trénovací obrázky ze ztráty
L(x) = −Ez ~ q(z | x)[log p(x | z)] + β · DKL(q(z | x) ‖ N(0, I)),
kde pro hustoty q, p na ℝk je DKL(q ‖ p) = ∫ q(z) log q(z)/p(z) dz spojitá obdoba KL divergence z dílu o informaci (s přirozeným logaritmem, v natech). První člen ztráty je chyba rekonstrukce (u nás binární křížová entropie pixelů, viz níže), druhý trest za to, jak moc se rozdělení kódu liší od prioru. Pro q = N(μ, diag σ²) vychází
DKL(q ‖ N(0, I)) = ½ ∑j=1k (μj² + σj² − log σj² − 1).
VAE tedy kóduje obrázek do rozdělení, ne do bodu, a trestá ho za odchylku od rozdělení, ze kterého se pak generuje. S β = 1 je −L(x) dolní mez log p(x) (ELBO, věta níže).
Kodér nesmí říct „tahle sedmička bydlí přesně tady“, ale jen „někde v tomhle obláčku“. Dekodér pak musí umět nakreslit sedmičku z kteréhokoli místa obláčku. A trest KL tlačí všechny obláčky k počátku a nedovolí jim být příliš malé — takže se překrývají, vyplní prostor a mezi nimi nezůstanou díry.
L(x) = −Ez ~ q(z | x)[ log p(x | z) ] + β · DKL( q(z | x) ‖ N(0, I) )
- −Ez ~ q[log p(x | z)]
- chyba rekonstrukce — jak špatně dekodér nakreslí x z kódu vylosovaného z obláčku. Střední hodnota přes celý obláček (ne jen jeho střed) nutí dekodér kreslit správně v celém okolí kódu; minus proto, že logaritmus pravděpodobnosti chceme co největší a ztrátu co nejmenší
- β
- váha trestu — nastavuje kompromis mezi přesností a pořádkem v prostoru; β = 1 je přesně ELBO, jiné hodnoty zkoušíme v oddílu o β
- DKL(q(z | x) ‖ N(0, I))
- vzdálenost obláčku od rozdělení, ze kterého budeme losovat — bez ní by kodér obláčky zmenšil na body a rozházel je daleko od sebe (rekonstrukce by byla lepší) a máme zpátky obyčejný autoenkodér
DKL(q(z | x) ‖ N(0, I)) = ½ ∑j=1k ( μj² + σj² − log σj² − 1 )
- DKL
- trest z předchozího vzorce, pro normální rozdělení spočtený přesně; souřadnice kódu jsou nezávislé, proto je to součet přes j
- μj²
- posun středu obláčku od počátku — roste kvadraticky, takže vzdálené kódy stojí hodně a kodér je stahuje k nule, kde budeme losovat
- σj² − log σj²
- šířka obláčku — funkce s − log s má minimum 1 právě v s = 1; trestá příliš široký obláček, ale hlavně příliš úzký (−log σ² → ∞ pro σ → 0), aby se z obláčku nestal bod
Věta — ELBO je dolní mez log-věrohodnosti
Nechť p(z) je hustota na ℝk (prior), pro každé z ∈ ℝk je p(x | z) rozdělení na 𝒳 (dekodér), x ∈ 𝒳 je obrázek s p(x) = ∫ p(x | z) p(z) dz > 0 a
p(z | x) = p(x | z) p(z)/p(x)
je aposteriorní hustota kódu (Bayesova věta). Nechť q(z | x) je libovolná hustota na ℝk, která je kladná jen tam, kde je kladná p(z | x), a pro kterou níže uvedené střední hodnoty Eq = Ez ~ q(z | x) existují a jsou konečné. Pak
log p(x) = Eq[log p(x | z)] − DKL(q(z | x) ‖ p(z)) + DKL(q(z | x) ‖ p(z | x)),
a proto
log p(x) ≥ Eq[log p(x | z)] − DKL(q(z | x) ‖ p(z)),
s rovností právě když q(· | x) = p(· | x).
Důkaz. log p(x) nezávisí na z, takže je rovno své střední hodnotě přes q. Podle Bayesovy věty je pro každé z s q(z | x) > 0
p(x) = p(x | z) p(z)/p(z | x) = p(x | z) · p(z)/q(z | x) · q(z | x)/p(z | x),
kde jsme zlomek rozšířili q(z | x). Zlogaritmujeme a vezmeme střední hodnotu přes z ~ q(z | x):
log p(x) = Eq[log p(x | z)] + Eq[log p(z)/q(z | x)] + Eq[log q(z | x)/p(z | x)].
Druhý člen je podle definice −DKL(q(z | x) ‖ p(z)), třetí DKL(q(z | x) ‖ p(z | x)). KL divergence je vždy nezáporná a rovná nule právě pro shodná rozdělení (Gibbsova nerovnost z dílu o informaci, pro hustoty platí stejně), takže vynecháním třetího členu dostaneme nerovnost i podmínku rovnosti. ∎
Pravá strana nerovnosti je ELBO (evidence lower bound) a s β = 1 je to přesně −L(x). Minimalizací L tedy zvedáme dolní mez log p(x), aniž bychom museli počítat integrál. Mez je tím těsnější, čím blíž je q(z | x) skutečnému aposteriornímu rozdělení p(z | x).
Definice — binární křížová entropie pixelů
Nechť x ∈ [0, 1]64 je obrázek (jasy pixelů xj, j = 1, …, 64) a y ∈ (0, 1)64 výstup dekodéru, kde yj chápeme jako pravděpodobnost, že pixel j svítí. Binární křížová entropie obrázku x vůči předpovědi y je
BCE(x, y) = −∑j=164 [ xj log yj + (1 − xj) log(1 − yj) ].
Pro černobílý obrázek x ∈ {0, 1}64 a dekodér, podle kterého pixely svítí nezávisle, každý s pravděpodobností yj(z), je přesně BCE(x, y(z)) = −log p(x | z). U šedých jasů xj ∈ (0, 1) se stejný výraz používá jako chyba rekonstrukce.
Příklad pro jeden pixel: svítí (x = 1) a dekodér řekne 0,9 → −ln 0,9 ≈ 0,105; řekne 0,5 → ln 2 ≈ 0,693; nesvítí (x = 0) a dekodér řekne 0,9 → −ln 0,1 ≈ 2,303. Sebejistý omyl stojí nejvíc. Protože výstup je sigmoida, yj = 1/1 + e−aj, je derivace podle jejího vstupu aj prostě ∂BCE/∂aj = yj − xj — stejně jako u logistické regrese.
Definice — trik s převzorkováním (reparametrization trick)
Nechť μ(x) ∈ ℝk a σ(x) ∈ (0, ∞)k jsou výstupy kodéru pro obrázek x. Trik s převzorkováním místo přímého losování z ~ q(z | x) = N(μ(x), diag σ²(x)) postupuje takto:
- vylosuj ε = (ε1, …, εk) s nezávislými εj ~ N(0, 1) — šum, jehož rozdělení nezávisí na parametrech sítě;
- polož pro j = 1, …, k zj = μj(x) + σj(x) · εj.
Takto získané z má rozdělení přesně q(z | x) (lineární transformace normální veličiny je normální), a přitom je to derivovatelná funkce parametrů: ∂zj/∂μj = 1 a ∂zj/∂σj = εj. Gradient tedy projde zpětným šířením až do kodéru, což u samotného losování z ~ N(μ, σ²) nejde.
Náhodu „vytkneme ven“: místo „vylosuj bod z obláčku“ řekneme „vylosuj obecný šum a posuň a roztáhni ho podle kodéru“. Posun a roztažení jsou obyčejné počty, a ty se derivovat dají.
zj = μj(x) + σj(x) · εj, σj = exp(½ · log σj²), εj ~ N(0, 1)
- μj(x)
- střed obláčku, výstup kodéru — ∂zj/∂μj = 1, gradient dekodéru projde do kodéru beze změny
- σj(x)
- šířka obláčku — kodér nevrací σ, ale log σ², které smí být jakékoli reálné číslo; exponenciála z něj vždy udělá kladnou šířku, takže síť nemusí hlídat žádnou podmínku. ∂zj/∂σj = εj
- εj ~ N(0, 1)
- veškerá náhoda — nezávisí na žádném parametru, takže přes ni nic derivovat nemusíme; při generování kodér vynecháme a z losujeme rovnou z N(0, I)
Příklad — jedna testovací číslice (0) v naučeném VAE s k = 2
kodér: μ = (0,285; 1,587), log σ² = (−2,695; −1,931) → σ = (0,260; 0,381)
j = 1: ½ (0,081 + 0,068 + 2,695 − 1) ≈ 0,922
j = 2: ½ (2,518 + 0,145 + 1,931 − 1) ≈ 1,797 → DKL ≈ 2,72 natu
převzorkování s ε = (0,5; −1,0): z = (0,285 + 0,260 · 0,5; 1,587 − 0,381 · 1,0) = (0,415; 1,206)
(barvy podle vzorců pro DKL a převzorkování výše)
Většinu trestu tu nedělá vzdálenost od počátku, ale úzkost obláčku: člen −log σ² přispívá 2,695 a 1,931. Kodér by chtěl kód co nejpřesnější, DKL ho drží širší. Průměrná DKL přes testovací číslice je 3,42 natu. Chyba rekonstrukce téhle číslice (ze středu μ) je 34,6 natu na 64 pixelů.
def krok_vae(davka, beta=1.0):
for x in davka:
mu, logvar = koder(x) # k + k čísel
sigma = exp(0.5 * logvar)
eps = normal(0, 1, size=len(mu)) # náhoda zvenku
z = mu + sigma * eps # trik s převzorkováním
y = dekoder(z) # pravděpodobnosti pixelů
rek = -sum(x * log(y) + (1 - x) * log(1 - y))
kl = 0.5 * sum(mu**2 + exp(logvar) - logvar - 1)
zpetne_sireni(rek + beta * kl) # gradient projde z → mu, sigma → kodér
adam_krok() # průměrný gradient dávky
Naše síť: 64 pixelů → 32 neuronů (tanh) → μ a log σ² (k čísel každé) → 32 neuronů → 64 pixelů (sigmoida), učená Adamem 150 epoch na 600 syntetických číslicích. Stejná síť, jen bez šumu ε a bez trestu KL, je obyčejný autoenkodér — srovnání je tedy férové.
3. Uspořádaný latentní prostor
Obě sítě seskupí stejné číslice k sobě. Autoenkodér je ale rozhodí po velké ploše — obě kružnice normálního rozdělení jsou proti ní malé. Kódy VAE leží kolem počátku se směrodatnou odchylkou 1,14 a 1,04, tedy přesně tam, odkud budeme losovat.
Jak vypadá celý prostor, ukáže mřížka: pravidelně rozmístěné body latentního prostoru, každý prošlý dekodérem.
U VAE se číslice plynule přelévají jedna v druhou a téměř každé políčko je čitelná číslice. Poctivě: v rovině je i dekodér autoenkodéru docela hladký a jeho mřížka také obsahuje hlavně číslice. Rozdíl naplno ukáže až kód s více rozměry.
4. Generování: nové číslice ze šumu
Vylosujeme 200 kódů a necháme je dekódovat: u VAE z N(0, I), u autoenkodéru (aby měl férovou šanci) z normálního rozdělení napasovaného na jeho skutečné kódy. Kvalitu měříme vzdáleností (střední kvadratickou chybou) vzorku k nejbližší trénovací číslici. Skutečné testovací číslice mají k nejbližší trénovací průměrně 0,017, náhodný šum 0,159.
Definice — vzdálenost k nejbližší trénovací číslici a napasované rozdělení
Nechť x(1), …, x(600) ∈ [0, 1]64 jsou trénovací číslice. Vzdálenost obrázku y ∈ [0, 1]64 k nejbližší trénovací číslici je
d(y) = mini ∈ {1, …, 600} 1/64 ∑j=164 (yj − x(i)j)²,
tedy střední kvadratická chyba (MSE) k nejpodobnější číslici. Pro vylosované obrázky y(1), …, y(200) je kvalita generátoru průměr
d̄ = 1/200 ∑s=1200 d(y(s)).
Malé d̄ znamená „vzorky vypadají jako některé skutečné číslice“ — pozor, nulu by dostal i generátor, který jen kopíruje trénovací data.
Nechť c(1), …, c(N) ∈ ℝk jsou kódy, které kodér autoenkodéru přiřadí N = 200 testovacím číslicím. Napasované rozdělení je N(m, diag s²), kde pro j = 1, …, k
mj = 1/N ∑i=1N c(i)j, sj = √1/N ∑i=1N (c(i)j − mj)².
Autoenkodér tedy losuje zj = mj + sj · εj s nezávislými εj ~ N(0, 1), tj. každou souřadnici z normálního rozdělení se stejným průměrem a směrodatnou odchylkou, jaké mají jeho skutečné kódy (pro k = 2: m = (−3,9; −0,9), s = (4,3; 6,0)). Souřadnice se losují nezávisle — případnou závislost mezi nimi napasované rozdělení nezachytí.
| velikost kódu k | rekonstrukce AE (MSE) | rekonstrukce VAE (MSE) | vzorky AE | vzorky VAE |
|---|---|---|---|---|
| 2 | 0,051 | 0,063 | 0,042 | 0,044 |
| 8 | 0,025 | 0,036 | 0,090 | 0,054 |
| 16 | 0,017 | 0,039 | 0,112 | 0,055 |
S dvourozměrným kódem jsou na tom obě sítě podobně (0,042 proti 0,044). S osmi rozměry se autoenkodér rozpadne: jeho vzorky mají vzdálenost 0,090, víc než v půli cesty k šumu, zatímco VAE drží 0,054. S šestnácti je to 0,112 proti 0,055. Kódy autoenkodéru v mnoha rozměrech leží na tenké, pokroucené ploše a náhodný bod z napasovaného normálního rozdělení se na ni prakticky nikdy netrefí.
Cena: VAE rekonstruuje hůř. S k = 16 je jeho chyba rekonstrukce 0,039 proti 0,017 u autoenkodéru, a jeho obrázky jsou rozmazanější. Kód je zašuměný, takže dekodér se naučí kreslit „průměr“ toho, co by mohlo v okolí kódu být. Rozmazanost je známá slabina VAE.
5. Rekonstrukce proti pořádku: β
Váha β určuje, jak silně trest KL tlačí kódy k normálnímu rozdělení. Pět VAE s kódem k = 2 a různým β:
| β | KL (natů na obrázek) | rekonstrukce (MSE) | vzorky (vzdálenost) |
|---|---|---|---|
| 0,1 | 8,18 | 0,053 | 0,044 |
| 0,5 | 4,71 | 0,057 | 0,044 |
| 1 | 3,42 | 0,063 | 0,044 |
| 2 | 2,07 | 0,076 | 0,052 |
| 5 | 0,05 | 0,131 | 0,075 |
Malé β nechá kódy volnější (KL 8,2) a rekonstrukce je přesnější. Velké β je stlačí k nule. Při β = 5 klesne KL na 0,05: kodér přestal do kódu cokoli ukládat a dekodér kreslí pořád zhruba totéž, ať dostane jakýkoli kód. Tomu se říká zhroucení posteriorního rozdělení (posterior collapse).
Definice — nat a KL jako cena kódu
Nat je jednotka informace odpovídající přirozenému logaritmu: jev s pravděpodobností p ∈ (0, 1] nese −ln p natů (místo −log2 p bitů). Protože ln p = ln 2 · log2 p, je
1 nat = 1/ln 2 bitu ≈ 1,443 bitu.
Nechť x je náhodný obrázek s rozdělením dat pdata (u nás rovnoměrně vybraná testovací číslice), kód z má při daném x rozdělení q(z | x) kodéru a p(z) = N(0, I) je prior. Označme
q(z) = Ex ~ pdata[q(z | x)]
rozdělení kódů všech obrázků dohromady a I(x; z) vzájemnou informaci obrázku a kódu (spojitá obdoba definice z dílu o informaci). Pak platí
Ex ~ pdata[DKL(q(z | x) ‖ p(z))] = I(x; z) + DKL(q(z) ‖ p(z)) ≥ I(x; z),
tedy průměrná KL divergence přes data shora omezuje informaci, kterou kód nese o obrázku. Je to „cena“, kterou kodér platí za to, co do kódu o obrázku uloží.
Při β = 0,1 je to nejvýš 8,18 natu ≈ 11,8 bitu na obrázek, při β = 5 jen 0,05 natu ≈ 0,07 bitu — méně než jedna desetina bitu, kód tedy o obrázku skoro nic neříká a dekodéru nezbývá než kreslit pořád totéž.
Naopak β větší než 1 záměrně používá β-VAE (Irina Higgins a kol., 2017): silnější tlak na nezávislé souřadnice kódu vede k tomu, že jednotlivé rozměry často odpovídají srozumitelným vlastnostem (natočení, tloušťka tahu).
6. Plynulé přechody
Vezmeme kódy dvou testovacích číslic (sítě s osmirozměrným kódem, z každé cifry obrázek, který VAE rekonstruuje nejlépe) a projdeme po přímce mezi nimi v osmi krocích: z(t) = (1 − t) · za + t · zb pro t = 0, 1/7, 2/7, …, 1, kde za, zb jsou středy μ obou číslic. Každý mezibod dekódujeme.
Přechod je u obou sítí plynulý: mezikroky jsou věrohodné tvary mezi oběma číslicemi. Po přímce mezi dvěma skutečnými kódy se od dat daleko nedostaneme, takže tady obyčejný autoenkodér nezaostává — jeho slabinou je jen losování naslepo. Stejný princip u velkých modelů umožňuje plynule měnit třeba výraz tváře nebo styl obrázku.
7. Kde se VAE používají
- Komprese pro jiné generátory. Stable Diffusion (latentní difúze, Robin Rombach a kol., 2022) nepracuje s pixely, ale s kódem autoenkodéru s malým trestem KL: obrázek 512 × 512 × 3 stlačí na 64 × 64 × 4 a difúze běží v tom menším prostoru. O difúzi bude jeden z dalších dílů.
- Diskrétní kódy. VQ-VAE (Aäron van den Oord a kol., 2017) místo spojitého kódu vybírá položky z naučeného slovníku. Obrázek se tak stane posloupností „tokenů“, kterou umí generovat transformer.
- Vědecká data. Molekuly, buněčná data, zvuk — všude, kde je užitečný hladký prostor, ve kterém se dá hledat a interpolovat.
Ostrostí obrázků VAE prohrávají s GAN a s difúzními modely. Mají ale stabilní učení, skutečnou pravděpodobnostní interpretaci a kodér zdarma.
8. Shrnutí
- Generativní model se učí rozdělení dat, aby z něj šlo vzorkovat; s latentní proměnnou losuje kód a dekóduje ho.
- VAE kóduje do rozdělení N(μ, σ²) a ztráta = rekonstrukce + β · KL k N(0, I). Trik z = μ + σε umožní derivovat přes losování.
- Kódy VAE leží kolem počátku a vyplní prostor; kódy autoenkodéru jsou rozházené a s dírami.
- S 8 rozměry kódu: vzorky autoenkodéru 0,090, VAE 0,054 (skutečné číslice 0,017, šum 0,159).
- Cena je horší rekonstrukce a rozmazanost; příliš velké β vede ke zhroucení (KL 0,05).
Chcete si to osahat? Nechte AI agenta naučit VAE s dvourozměrným kódem na datové sadě MNIST a vykreslit mřížku dekódovaných obrázků — uvidíte celou „mapu“ ručně psaných číslic.
Máte na to jiný názor? Napište na support@coden-app.com.