Přeskočit na obsah
coden

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

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

Série Základy AI Díl 75 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
  • 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:

  1. vylosuj z ~ p(z);
  2. 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).

Laicky řečeno

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)
Generování je snadné (vylosuj z, dekóduj), učení potřebuje p(x) — a to je ten těžký integrál.

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

  1. 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í);
  2. 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);
  3. 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).

Laicky řečeno

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
Ztráta pro jeden obrázek; učí se průměr přes dávku. Oba členy se měří v natech (přirozený logaritmus).

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
„− 1“ jen posune minimum na nulu: DKL = 0 právě tehdy, když μ = 0 a σ = 1, tedy když q je samo N(0, I). Derivace, které program přičítá ke gradientu: ∂DKL/∂μj = μj a ∂DKL/∂(log σj²) = 1/2(σj² − 1).
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:

  1. vylosuj ε = (ε1, …, εk) s nezávislými εj ~ N(0, 1) — šum, jehož rozdělení nezávisí na parametrech sítě;
  2. 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.

Laicky řečeno

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)
Posunutá a roztažená normální veličina je opět normální: zj ~ N(μj, σj²), tedy přesně vzorek z q(z | x).
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

00000000000000000000111111111111111111112222222222222222222233333333333333333333444444444444444444445555555555555555555566666666666666666666777777777777777777778888888888888888888899999999999999999999 obyčejný autoenkodér kód z₁ (bez jednotky) kód z₂ (bez jednotky) 00000000000000000000111111111111111111112222222222222222222233333333333333333333444444444444444444445555555555555555555566666666666666666666777777777777777777778888888888888888888899999999999999999999 VAE kód z₁ (bez jednotky) kód z₂ (bez jednotky)
Kódy 200 testovacích číslic (k = 2); čárkovaně kružnice o poloměru 1 a 2 kolem počátku

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.

autoenkodér, střed ± 2 sm. odchylky kód z₁ (bez jednotky) kód z₂ (bez jednotky) VAE, souřadnice od −2,2 do 2,2 kód z₁ (bez jednotky) kód z₂ (bez jednotky)
Dekodér na mřížce 10 × 10 bodů latentního prostoru

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

00,050,10,15 k = 2 k = 8 k = 16 velikost kódu k (počet čísel) vzdálenost k číslici (MSE)
Vzdálenost vylosovaných obrázků k nejbližší trénovací číslici (menší = věrohodnější) autoenkodér VAE skutečné číslice náhodný šum
velikost kódu krekonstrukce AE (MSE)rekonstrukce VAE (MSE)vzorky AEvzorky VAE
20,0510,0630,0420,044
80,0250,0360,0900,054
160,0170,0390,1120,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í.

autoenkodér VAE
Prvních deset vylosovaných obrázků, kód s 8 rozměry

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,18,180,0530,044
0,54,710,0570,044
13,420,0630,044
22,070,0760,052
50,050,1310,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éž.

β = 0,1 β = 1 β = 5
Vylosované obrázky VAE (k = 2) při různém β

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.

AE: 1 → 7 VAE: 1 → 7 AE: 0 → 6 VAE: 0 → 6
Interpolace v latentním prostoru (k = 8)

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.

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