Preskočiť na obsah
coden

Variačné autoenkodéry (VAE): nové obrázky zo spojitého latentného priestoru

Generatívny model s latentnou premennou, VAE napísaný od nuly s reparametrizačným trikom, usporiadaný latentný priestor, generovanie číslic zo šumu oproti obyčajnému autoenkodéru, vplyv β a kolaps, interpolácia a kde sa VAE používajú.

12 minút Matěj Žalmánek 2026-10-16

Séria Základy AI Diel 44 z 52
  1. Mapa umelej inteligencie: čo je čo a ako to do seba zapadá
  2. Stručná história umelej inteligencie: od Turinga po jazykové modely
  3. Dáta, model, tréning, inferencia: základné pojmy na jednom príklade
  4. Ako čítať matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relácie: stavebnica, z ktorej sa skladajú definície v AI
  6. Funkcie a zobrazenia: prečo je každý model v AI funkcia
  7. Logika a dôkazy: pravidlá, podľa ktorých sa v AI uvažuje
  8. Grafy a stromy: štruktúra, na ktorej stojí hľadanie aj neurónové siete
  9. Lineárna algebra pre strojové učenie: vektory, matice a prečo AI hlavne násobí
  10. Derivácie, gradient a reťazové pravidlo: ako model zistí, ktorým smerom sa učiť
  11. Gradientný zostup: ako sa model učí
  12. Čo je pravdepodobnosť: od hodu kockou ku Kolmogorovovým axiómam
  13. Podmienená pravdepodobnosť a Bayesova veta: ako zmeniť odhad, keď sa dozviete niečo nové
  14. Náhodná premenná a distribučná funkcia: jedna funkcia, ktorá o rozdelení povie všetko
  15. Funkcia hustoty a pravdepodobnostná funkcia: prečo má spojitá premenná v bode pravdepodobnosť nula
  16. Stredná hodnota, rozptyl a kovariancia: kde rozdelenie leží, aké je široké a čo s čím súvisí
  17. Prehľad pravdepodobnostných rozdelení: Bernoulliho, binomické, Poissonovo, rovnomerné, normálne a exponenciálne
  18. Zákon veľkých čísel a centrálna limitná veta: prečo sa priemery správajú tak predvídateľne
  19. Štatistika a odhady parametrov: maximálna vierohodnosť, MAP a intervaly spoľahlivosti
  20. Teória informácie: entropia, krížová entropia a KL divergencia — odkiaľ sa berú stratové funkcie
  21. Prehľadávanie stavového priestoru: BFS, DFS, UCS a A* s animáciami
  22. Hry a protivník: minimax, alfa-beta orezávanie a Monte Carlo tree search
  23. Splňovanie obmedzujúcich podmienok: backtracking, propagácia obmedzení a AC-3 na sudoku a mape krajov
  24. Logika a znalostné systémy: dopredné a spätné reťazenie, rezolúcia a expertné systémy
  25. Plánovanie: STRIPS, svet kociek, heuristiky z relaxácie a plánovanie v AI agentoch
  26. Lokálne hľadanie a simulované žíhanie: obchodný cestujúci cez krajské mestá
  27. Genetické algoritmy: populácia, kríženie, mutácia a výber na batohu na výlet
  28. Evolučné stratégie a genetické programovanie: od pravidla jednej pätiny po Keplerov zákon
  29. Optimalizácia mravčou kolóniou: ako feromónová stopa nájde krátku cestu
  30. Optimalizácia rojom častíc: zotrvačnosť, vlastná skúsenosť a skúsenosť roja
  31. Neuroevolúcia: evolúcia váh aj tvaru neurónových sietí a algoritmus NEAT
  32. Fuzzy množiny a funkcie príslušnosti: ako zapísať „trochu teplo“
  33. Fuzzy logika a pravdepodobnosť: prečo „trochu teplo“ neznamená „pravdepodobne teplo“
  34. Fuzzy logika: t-normy, implikácie a pravidlá AK–TAK
  35. Fuzzy riadenie: Mamdani a Sugeno od ventilátora po kyvadlo na vozíku
  36. Fuzzy zhlukovanie: algoritmus fuzzy c-means a body medzi zhlukmi
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidlá, ktoré sa učia z dát
  38. Markovove reťazce: prechodová matica, stacionárne rozdelenie a PageRank
  39. Skryté Markovove modely: Viterbiho algoritmus a nepoctivé kasíno
  40. Bayesovské siete: prečo je tráva mokrá a čo z toho vyplýva pre postrekovač
  41. Kalmanov filter: ako z nepresných meraní odhadnúť, kde auto je a ako rýchlo ide
  42. Druhy strojového učenia: s učiteľom, bez učiteľa, s čiastočným učiteľom a ďalšie
  43. Prompty, kontext a RAG: ako modelu dať správne informácie
  44. Variačné autoenkodéry (VAE): nové obrázky zo spojitého latentného priestoru
  45. Generatívne adversariálne siete (GAN): falšovateľ proti detektívovi
  46. Difúzne modely: ako sa z čistého šumu stane obrázok
  47. Markovove rozhodovacie procesy: stavy, akcie, odmeny a Bellmanove rovnice
  48. Q-learning a DQN: učenie hodnoty akcií od tabuľky po neurónovú sieť
  49. Policy gradient a PPO: učenie priamo stratégie
  50. Ako funguje AI agent: jazykový model v slučke s nástrojmi
  51. Programovanie s AI agentmi: zadanie, testy a kontrola
  52. Vyhodnocovanie a bezpečnosť AI systémov: ako merať a ako strážiť

Celá osnova série Hotovo: 52 z 83 tém

Čo si odnesiete
  • Prečo sa z obyčajného autoenkodéra nedá dobre generovať.
  • Ako VAE funguje: rozdelenie namiesto bodu, trest KL a reparametrizačný trik.
  • Čo stojí β, prečo sú obrázky VAE rozmazané a kde sa VAE dnes používajú.

Čo sa hodí vedieť vopred: Teória informácie: entropia, krížová entropia a KL divergencia — odkiaľ sa berú stratové funkcie

Autoenkodér z dielu o reprezentáciách vie obrázok stlačiť do pár čísel a znova ho z nich poskladať. Ponúka sa otázka: keď dekodér vie z kódu urobiť číslicu, nemohli by sme mu dať kód, ktorý sme si vymysleli, a dostať novú číslicu, ktorú nikto nenakreslil? Pri obyčajnom autoenkodéri to takmer nefunguje. Variačný autoenkodér je jeho úprava, ktorá presne toto umožní — a je to prvý z generatívnych modelov, ktorým sa v tejto časti série budeme venovať.

Nadväzuje na diely Autoenkodéry a reprezentácie a Teória informácie (KL divergencia).

1. Od kompresie ku generovaniu

Definícia — generatívny model

Nech 𝒳 je množina možných dát (u nás obrázky 8 × 8 s jasmi pixelov v [0, 1], teda 𝒳 = [0, 1]64), n ≥ 1 a x1, …, xn ∈ 𝒳 sú trénovacie dáta, o ktorých predpokladáme, že sú nezávislými vzorkami z neznámeho rozdelenia pdata na 𝒳. Nech Θ je množina prípustných parametrov a pre každé θ ∈ Θ je pθ rozdelenie na 𝒳. Generatívny model je sústava rozdelení (pθ)θ ∈ Θ spolu s postupom, ako z rozdelenia pθ vzorkovať (vyrábať nové x ~ pθ). Učenie vyberie θ tak, aby pθ bolo čo najbližšie k pdata, typicky ako odhad maximálnej vierohodnosti

θ̂ = argmaxθ ∈ Θ ∑i=1n log pθ(xi).

Model s latentnou premennou navyše zavedie latentný priestor 𝒵 = ℝk (k ≥ 1), na ňom pevnú hustotu p(z) (prior) a pre každý kód z ∈ 𝒵 rozdelenie pθ(x | z) na 𝒳 (dekodér). Rozdelenie dát je potom

pθ(x) = ∫𝒵 pθ(x | z) p(z) dz,

a vzorkuje sa v dvoch krokoch:

  1. vylosuj z ~ p(z);
  2. vylosuj x ~ pθ(x | z) — v praxi (aj u nás) sa často berie rovno výstup dekodéra, t. j. pravdepodobnosti pixelov.

Nové x teda vyzerajú ako dáta, ale nie sú ich kópiou. V ďalšom texte index θ vynechávame a píšeme p(x | z), p(x).

Laicky povedané

Klasifikátor odpovedá „čo to je“. Generatívny model vie odpovedať „ukáž mi niečo, čo by mohlo byť v dátach“. Recept: hoďte kockou pár čísel, odovzdajte ich maliarovi (dekodéru) a ten podľa nich namaľuje obrázok.

p(x) = ∫ p(x | z) · p(z) dz

p(z)
rozdelenie kódu (prior) — volíme ho sami a jednoduché, u nás N(0, I), pretože z neho potom pri generovaní vieme losovať
p(x | z)
dekodér — aký pravdepodobný je obrázok x, keď dostaneme kód z; u nás sieť, ktorá pre každý pixel vráti pravdepodobnosť, že svieti
∫ … dz
súčet cez všetky možné kódy — obrázok mohol vzniknúť z ktoréhokoľvek kódu; integrál cez celý latentný priestor však nevieme vypočítať, a preto ho VAE nahradí odhadom (nižšie)
Generovanie je ľahké (vylosuj z, dekóduj), učenie potrebuje p(x) — a to je ten ťažký integrál.

Háčik pri obyčajnom autoenkodéri: nevieme, odkiaľ kód losovať. Enkodér umiestni číslice do latentného priestoru, kam sa mu zachce. Pri našej sieti s dvojrozmerným kódom ležia kódy testovacích číslic okolo bodu (-3,9; -0,9) so smerodajnou odchýlkou 4,3 a 6,0, a medzi skupinami sú diery, v ktorých dekodér nikdy nič nevidel.

2. Variačný autoenkodér

Definícia — variačný autoenkodér (VAE)

Nech 𝒳 = [0, 1]64 je množina obrázkov, k ≥ 1 rozmer kódu, I jednotková matica k × k a β > 0. Všetky logaritmy v tomto diele sú prirodzené (log = ln). Variačný autoenkodér (VAE; Diederik Kingma a Max Welling, 2013) sa skladá z troch častí:

  1. enkodér — neurónová sieť, ktorá obrázku x ∈ 𝒳 priradí vektory μ(x) ∈ ℝk a log σ²(x) ∈ ℝk (logaritmus po zložkách); tie určujú rozdelenie kódu q(z | x) = N(μ(x), diag σ²(x)), t. j. súradnice z1, …, zk sú nezávislé a zj ~ N(μj(x), σj²(x)) (normálne rozdelenie);
  2. dekodér — neurónová sieť, ktorá kódu z ∈ ℝk priradí rozdelenie p(x | z) na 𝒳 (u nás vektorom pravdepodobností pixelov y(z) ∈ (0, 1)64);
  3. prior p(z) = N(0, I), normované normálne rozdelenie na ℝk.

Parametre oboch sietí sa učia minimalizáciou priemeru cez trénovacie obrázky zo straty

L(x) = −Ez ~ q(z | x)[log p(x | z)] + β · DKL(q(z | x) ‖ N(0, I)),

kde pre hustoty q, p na ℝk je DKL(q ‖ p) = ∫ q(z) log q(z)/p(z) dz spojitá obdoba KL divergencie z dielu o teórii informácie (s prirodzeným logaritmom, v natoch). Prvý člen straty je chyba rekonštrukcie (u nás binárna krížová entropia pixelov, pozri nižšie), druhý trest za to, ako veľmi sa rozdelenie kódu líši od prioru. Pre q = N(μ, diag σ²) vychádza

DKL(q ‖ N(0, I)) = ½ ∑j=1k (μj² + σj² − log σj² − 1).

VAE teda kóduje obrázok do rozdelenia, nie do bodu, a trestá ho za odchýlku od rozdelenia, z ktorého sa potom generuje. S β = 1 je −L(x) dolná hranica log p(x) (ELBO, veta nižšie).

Laicky povedané

Enkodér nesmie povedať „táto sedmička býva presne tu“, ale len „niekde v tomto obláčiku“. Dekodér potom musí vedieť nakresliť sedmičku z ktoréhokoľvek miesta obláčika. A trest KL tlačí všetky obláčiky k začiatku a nedovolí im byť príliš malé — takže sa prekrývajú, vyplnia priestor a medzi nimi nezostanú diery.

L(x) = −Ez ~ q(z | x)[ log p(x | z) ] + β · DKL( q(z | x) ‖ N(0, I) )

−Ez ~ q[log p(x | z)]
chyba rekonštrukcie — ako zle dekodér nakreslí x z kódu vylosovaného z obláčika. Stredná hodnota cez celý obláčik (nie len jeho stred) núti dekodér kresliť správne v celom okolí kódu; mínus preto, že logaritmus pravdepodobnosti chceme čo najväčší a stratu čo najmenšiu
β
váha trestu — nastavuje kompromis medzi presnosťou a poriadkom v priestore; β = 1 je presne ELBO, iné hodnoty skúšame v oddiele o β
DKL(q(z | x) ‖ N(0, I))
vzdialenosť obláčika od rozdelenia, z ktorého budeme losovať — bez nej by enkodér obláčiky zmenšil na body a rozhádzal ich ďaleko od seba (rekonštrukcia by bola lepšia) a máme späť obyčajný autoenkodér
Strata pre jeden obrázok; učí sa priemer cez dávku. Oba členy sa merajú v natoch (prirodzený logaritmus).

DKL(q(z | x) ‖ N(0, I)) = ½ ∑j=1k ( μj² + σj² − log σj² − 1 )

DKL
trest z predchádzajúceho vzorca, pre normálne rozdelenie vypočítaný presne; súradnice kódu sú nezávislé, preto je to súčet cez j
μj²
posun stredu obláčika od začiatku — rastie kvadraticky, takže vzdialené kódy stoja veľa a enkodér ich sťahuje k nule, kde budeme losovať
σj² − log σj²
šírka obláčika — funkcia s − log s má minimum 1 práve v s = 1; trestá príliš široký obláčik, ale hlavne príliš úzky (−log σ² → ∞ pre σ → 0), aby sa z obláčika nestal bod
„− 1“ len posunie minimum na nulu: DKL = 0 práve vtedy, keď μ = 0 a σ = 1, teda keď q je samo N(0, I). Derivácie, ktoré program pripočítava ku gradientu: ∂DKL/∂μj = μj a ∂DKL/∂(log σj²) = 1/2(σj² − 1).
Veta — ELBO je dolná hranica log-vierohodnosti

Nech p(z) je hustota na ℝk (prior), pre každé z ∈ ℝk je p(x | z) rozdelenie na 𝒳 (dekodér), x ∈ 𝒳 je obrázok s p(x) = ∫ p(x | z) p(z) dz > 0 a

p(z | x) = p(x | z) p(z)/p(x)

je aposteriórna hustota kódu (Bayesova veta). Nech q(z | x) je ľubovoľná hustota na ℝk, ktorá je kladná len tam, kde je kladná p(z | x), a pre ktorú nižšie uvedené stredné hodnoty Eq = Ez ~ q(z | x) existujú a sú konečné. Potom

log p(x) = Eq[log p(x | z)] − DKL(q(z | x) ‖ p(z)) + DKL(q(z | x) ‖ p(z | x)),

a preto

log p(x) ≥ Eq[log p(x | z)] − DKL(q(z | x) ‖ p(z)),

s rovnosťou práve vtedy, keď q(· | x) = p(· | x).

Dôkaz. log p(x) nezávisí od z, takže sa rovná svojej strednej hodnote cez q. Podľa Bayesovej vety je pre 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 sme zlomok rozšírili q(z | x). Zlogaritmujeme a vezmeme strednú hodnotu cez 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 podľa definície −DKL(q(z | x) ‖ p(z)), tretí DKL(q(z | x) ‖ p(z | x)). KL divergencia je vždy nezáporná a rovná nule práve pre zhodné rozdelenia (Gibbsova nerovnosť z dielu o teórii informácie, pre hustoty platí rovnako), takže vynechaním tretieho člena dostaneme nerovnosť aj podmienku rovnosti. ∎

Pravá strana nerovnosti je ELBO (evidence lower bound) a s β = 1 je to presne −L(x). Minimalizáciou L teda zdvíhame dolnú hranicu log p(x) bez toho, aby sme museli počítať integrál. Hranica je tým tesnejšia, čím bližšie je q(z | x) k skutočnému aposteriórnemu rozdeleniu p(z | x).

Definícia — binárna krížová entropia pixelov

Nech x ∈ [0, 1]64 je obrázok (jasy pixelov xj, j = 1, …, 64) a y ∈ (0, 1)64 výstup dekodéra, kde yj chápeme ako pravdepodobnosť, že pixel j svieti. Binárna krížová entropia obrázka x voči predpovedi y je

BCE(x, y) = −∑j=164 [ xj log yj + (1 − xj) log(1 − yj) ].

Pre čiernobiely obrázok x ∈ {0, 1}64 a dekodér, podľa ktorého pixely svietia nezávisle, každý s pravdepodobnosťou yj(z), je presne BCE(x, y(z)) = −log p(x | z). Pri sivých jasoch xj ∈ (0, 1) sa rovnaký výraz používa ako chyba rekonštrukcie.

Príklad pre jeden pixel: svieti (x = 1) a dekodér povie 0,9 → −ln 0,9 ≈ 0,105; povie 0,5 → ln 2 ≈ 0,693; nesvieti (x = 0) a dekodér povie 0,9 → −ln 0,1 ≈ 2,303. Sebaistý omyl stojí najviac. Keďže výstup je sigmoida, yj = 1/1 + e−aj, je derivácia podľa jej vstupu aj jednoducho ∂BCE/∂aj = yj − xj — rovnako ako pri logistickej regresii.

Definícia — reparametrizačný trik (reparametrization trick)

Nech μ(x) ∈ ℝk a σ(x) ∈ (0, ∞)k sú výstupy enkodéra pre obrázok x. Reparametrizačný trik namiesto priameho losovania z ~ q(z | x) = N(μ(x), diag σ²(x)) postupuje takto:

  1. vylosuj ε = (ε1, …, εk) s nezávislými εj ~ N(0, 1) — šum, ktorého rozdelenie nezávisí od parametrov siete;
  2. polož pre j = 1, …, k zj = μj(x) + σj(x) · εj.

Takto získané z má rozdelenie presne q(z | x) (lineárna transformácia normálnej veličiny je normálna), a pritom je to diferencovateľná funkcia parametrov: ∂zj/∂μj = 1 a ∂zj/∂σj = εj. Gradient teda prejde spätným šírením až do enkodéra, čo pri samotnom losovaní z ~ N(μ, σ²) nejde.

Laicky povedané

Náhodu „vyberieme von“: namiesto „vylosuj bod z obláčika“ povieme „vylosuj všeobecný šum a posuň a roztiahni ho podľa enkodéra“. Posun a roztiahnutie sú obyčajné počty, a tie sa derivovať dajú.

zj = μj(x) + σj(x) · εj,   σj = exp(½ · log σj²),   εj ~ N(0, 1)

μj(x)
stred obláčika, výstup enkodéra — ∂zj/∂μj = 1, gradient dekodéra prejde do enkodéra bez zmeny
σj(x)
šírka obláčika — enkodér nevracia σ, ale log σ², ktoré smie byť akékoľvek reálne číslo; exponenciála z neho vždy urobí kladnú šírku, takže sieť nemusí strážiť žiadnu podmienku. ∂zj/∂σj = εj
εj ~ N(0, 1)
všetka náhoda — nezávisí od žiadneho parametra, takže cez ňu nič derivovať nemusíme; pri generovaní enkodér vynecháme a z losujeme rovno z N(0, I)
Posunutá a roztiahnutá normálna veličina je opäť normálna: zj ~ N(μj, σj²), teda presne vzorka z q(z | x).
Príklad — jedna testovacia číslica (0) v naučenom VAE s k = 2

enkodé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

reparametrizácia s ε = (0,5; −1,0): z = (0,285 + 0,260 · 0,5; 1,587 − 0,381 · 1,0) = (0,415; 1,206)

(farby podľa vzorcov pre DKL a reparametrizáciu vyššie)

Väčšinu trestu tu nerobí vzdialenosť od začiatku, ale úzkosť obláčika: člen −log σ² prispieva 2,695 a 1,931. Enkodér by chcel kód čo najpresnejší, DKL ho drží širší. Priemerná DKL cez testovacie číslice je 3,42 natu. Chyba rekonštrukcie tejto číslice (zo stredu μ) je 34,6 natu na 64 pixelov.

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 zvonku
        z = mu + sigma * eps                   # reparametrizačný trik
        y = dekoder(z)                         # pravdepodobnosti pixelov
        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 prejde z → mu, sigma → enkodér
    adam_krok()                                # priemerný gradient dávky

Naša sieť: 64 pixelov → 32 neurónov (tanh) → μ a log σ² (k čísel každé) → 32 neurónov → 64 pixelov (sigmoida), učená Adamom 150 epoch na 600 syntetických číslicach. Rovnaká sieť, len bez šumu ε a bez trestu KL, je obyčajný autoenkodér — porovnanie je teda férové.

3. Usporiadaný latentný priestor

00000000000000000000111111111111111111112222222222222222222233333333333333333333444444444444444444445555555555555555555566666666666666666666777777777777777777778888888888888888888899999999999999999999 obyčajný 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); čiarkovane kružnice s polomerom 1 a 2 okolo začiatku

Obe siete zoskupia rovnaké číslice k sebe. Autoenkodér ich však rozhádže po veľkej ploche — obe kružnice normálneho rozdelenia sú oproti nej malé. Kódy VAE ležia okolo začiatku so smerodajnou odchýlkou 1,14 a 1,04, teda presne tam, odkiaľ budeme losovať.

Ako vyzerá celý priestor, ukáže mriežka: pravidelne rozmiestnené body latentného priestoru, každý prejdený dekodérom.

autoenkodér, stred ± 2 smer. odch. kód z₁ (bez jednotky) kód z₂ (bez jednotky) VAE, súradnice od −2,2 do 2,2 kód z₁ (bez jednotky) kód z₂ (bez jednotky)
Dekodér na mriežke 10 × 10 bodov latentného priestoru

Pri VAE sa číslice plynulo prelievajú jedna do druhej a takmer každé políčko je čitateľná číslica. Úprimne: v rovine je aj dekodér autoenkodéra celkom hladký a jeho mriežka tiež obsahuje hlavne číslice. Rozdiel naplno ukáže až kód s viacerými rozmermi.

4. Generovanie: nové číslice zo šumu

Vylosujeme 200 kódov a necháme ich dekódovať: pri VAE z N(0, I), pri autoenkodéri (aby mal férovú šancu) z normálneho rozdelenia napasovaného na jeho skutočné kódy. Kvalitu meriame vzdialenosťou (strednou kvadratickou chybou) vzorky k najbližšej trénovacej číslici. Skutočné testovacie číslice majú k najbližšej trénovacej priemerne 0,017, náhodný šum 0,159.

Definícia — vzdialenosť k najbližšej trénovacej číslici a napasované rozdelenie

Nech x(1), …, x(600) ∈ [0, 1]64 sú trénovacie číslice. Vzdialenosť obrázka y ∈ [0, 1]64 k najbližšej trénovacej číslici je

d(y) = mini ∈ {1, …, 600} 1/64 ∑j=164 (yj − x(i)j)²,

teda stredná kvadratická chyba (MSE) k najpodobnejšej číslici. Pre vylosované obrázky y(1), …, y(200) je kvalita generátora priemer

d̄ = 1/200 ∑s=1200 d(y(s)).

Malé d̄ znamená „vzorky vyzerajú ako niektoré skutočné číslice“ — pozor, nulu by dostal aj generátor, ktorý len kopíruje trénovacie dáta.

Nech c(1), …, c(N) ∈ ℝk sú kódy, ktoré enkodér autoenkodéra priradí N = 200 testovacím číslicam. Napasované rozdelenie je N(m, diag s²), kde pre j = 1, …, k

mj = 1/N ∑i=1N c(i)j,   sj = √1/N ∑i=1N (c(i)j − mj)².

Autoenkodér teda losuje zj = mj + sj · εj s nezávislými εj ~ N(0, 1), t. j. každú súradnicu z normálneho rozdelenia s rovnakým priemerom a smerodajnou odchýlkou, aké majú jeho skutočné kódy (pre k = 2: m = (−3,9; −0,9), s = (4,3; 6,0)). Súradnice sa losujú nezávisle — prípadnú závislosť medzi nimi napasované rozdelenie nezachytí.

00,050,10,15 k = 2 k = 8 k = 16 veľkosť kódu k (počet čísel) vzdialenosť k číslici (MSE)
Vzdialenosť vylosovaných obrázkov k najbližšej trénovacej číslici (menšia = vierohodnejšia) autoenkodér VAE skutočné číslice náhodný šum
veľkosť kódu krekonštrukcia AE (MSE)rekonštrukcia VAE (MSE)vzorky AEvzorky VAE
20,0510,0630,0420,044
80,0250,0360,0900,054
160,0170,0390,1120,055

S dvojrozmerným kódom sú na tom obe siete podobne (0,042 oproti 0,044). S ôsmimi rozmermi sa autoenkodér rozpadne: jeho vzorky majú vzdialenosť 0,090, viac než v polovici cesty k šumu, zatiaľ čo VAE drží 0,054. So šestnástimi je to 0,112 oproti 0,055. Kódy autoenkodéra v mnohých rozmeroch ležia na tenkej, pokrivenej ploche a náhodný bod z napasovaného normálneho rozdelenia sa na ňu prakticky nikdy netrafí.

autoenkodér VAE
Prvých desať vylosovaných obrázkov, kód s 8 rozmermi

Cena: VAE rekonštruuje horšie. S k = 16 je jeho chyba rekonštrukcie 0,039 oproti 0,017 pri autoenkodéri, a jeho obrázky sú rozmazanejšie. Kód je zašumený, takže dekodér sa naučí kresliť „priemer“ toho, čo by mohlo v okolí kódu byť. Rozmazanosť je známa slabina VAE.

5. Rekonštrukcia proti poriadku: β

Váha β určuje, ako silno trest KL tlačí kódy k normálnemu rozdeleniu. Päť VAE s kódom k = 2 a rôznym β:

βKL (natov na obrázok)rekonštrukcia (MSE)vzorky (vzdialenosť)
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 voľnejšie (KL 8,2) a rekonštrukcia je presnejšia. Veľké β ich stlačí k nule. Pri β = 5 klesne KL na 0,05: enkodér prestal do kódu čokoľvek ukladať a dekodér kreslí stále zhruba to isté, nech dostane akýkoľvek kód. Tomu sa hovorí kolaps aposteriórneho rozdelenia (posterior collapse).

Definícia — nat a KL ako cena kódu

Nat je jednotka informácie zodpovedajúca prirodzenému logaritmu: jav s pravdepodobnosťou p ∈ (0, 1] nesie −ln p natov (namiesto −log2 p bitov). Keďže ln p = ln 2 · log2 p, je

1 nat = 1/ln 2 bitu ≈ 1,443 bitu.

Nech x je náhodný obrázok s rozdelením dát pdata (u nás rovnomerne vybraná testovacia číslica), kód z má pri danom x rozdelenie q(z | x) enkodéra a p(z) = N(0, I) je prior. Označme

q(z) = Ex ~ pdata[q(z | x)]

rozdelenie kódov všetkých obrázkov dohromady a I(x; z) vzájomnú informáciu obrázka a kódu (spojitá obdoba definície z dielu o teórii informácie). Potom platí

Ex ~ pdata[DKL(q(z | x) ‖ p(z))] = I(x; z) + DKL(q(z) ‖ p(z)) ≥ I(x; z),

teda priemerná KL divergencia cez dáta zhora ohraničuje informáciu, ktorú kód nesie o obrázku. Je to „cena“, ktorú enkodér platí za to, čo do kódu o obrázku uloží.

Pri β = 0,1 je to najviac 8,18 natu ≈ 11,8 bitu na obrázok, pri β = 5 len 0,05 natu ≈ 0,07 bitu — menej než jedna desatina bitu, kód teda o obrázku takmer nič nehovorí a dekodéru nezostáva nič iné, než kresliť stále to isté.

β = 0,1 β = 1 β = 5
Vylosované obrázky VAE (k = 2) pri rôznom β

Naopak β väčšie než 1 zámerne používa β-VAE (Irina Higgins a kol., 2017): silnejší tlak na nezávislé súradnice kódu vedie k tomu, že jednotlivé rozmery často zodpovedajú zrozumiteľným vlastnostiam (natočenie, hrúbka ťahu).

6. Plynulé prechody

Vezmeme kódy dvoch testovacích číslic (siete s osemrozmerným kódom, z každej cifry obrázok, ktorý VAE rekonštruuje najlepšie) a prejdeme po priamke medzi nimi v ôsmich krokoch: z(t) = (1 − t) · za + t · zb pre t = 0, 1/7, 2/7, …, 1, kde za, zb sú stredy μ oboch číslic. Každý medzibod dekódujeme.

AE: 1 → 7 VAE: 1 → 7 AE: 0 → 6 VAE: 0 → 6
Interpolácia v latentnom priestore (k = 8)

Prechod je pri oboch sieťach plynulý: medzikroky sú vierohodné tvary medzi oboma číslicami. Po priamke medzi dvoma skutočnými kódmi sa od dát ďaleko nedostaneme, takže tu obyčajný autoenkodér nezaostáva — jeho slabinou je len losovanie naslepo. Rovnaký princíp pri veľkých modeloch umožňuje plynulo meniť napríklad výraz tváre alebo štýl obrázka.

7. Kde sa VAE používajú

  • Kompresia pre iné generátory. Stable Diffusion (latentná difúzia, Robin Rombach a kol., 2022) nepracuje s pixelmi, ale s kódom autoenkodéra s malým trestom KL: obrázok 512 × 512 × 3 stlačí na 64 × 64 × 4 a difúzia beží v tom menšom priestore. O difúzii bude jeden z ďalších dielov.
  • Diskrétne kódy. VQ-VAE (Aäron van den Oord a kol., 2017) namiesto spojitého kódu vyberá položky z naučeného slovníka. Obrázok sa tak stane postupnosťou „tokenov“, ktorú vie generovať transformer.
  • Vedecké dáta. Molekuly, bunkové dáta, zvuk — všade, kde je užitočný hladký priestor, v ktorom sa dá hľadať a interpolovať.

Ostrosťou obrázkov VAE prehrávajú s GAN a s difúznymi modelmi. Majú však stabilné učenie, skutočnú pravdepodobnostnú interpretáciu a enkodér zadarmo.

8. Zhrnutie

  • Generatívny model sa učí rozdelenie dát, aby z neho bolo možné vzorkovať; s latentnou premennou losuje kód a dekóduje ho.
  • VAE kóduje do rozdelenia N(μ, σ²) a strata = rekonštrukcia + β · KL k N(0, I). Trik z = μ + σε umožní derivovať cez losovanie.
  • Kódy VAE ležia okolo začiatku a vyplnia priestor; kódy autoenkodéra sú rozhádzané a s dierami.
  • S 8 rozmermi kódu: vzorky autoenkodéra 0,090, VAE 0,054 (skutočné číslice 0,017, šum 0,159).
  • Cenou je horšia rekonštrukcia a rozmazanosť; príliš veľké β vedie ku kolapsu (KL 0,05).

Chcete si to vyskúšať na vlastnej koži? Nechajte AI agenta naučiť VAE s dvojrozmerným kódom na dátovej sade MNIST a vykresliť mriežku dekódovaných obrázkov — uvidíte celú „mapu“ ručne písaných číslic.

Máte na to iný názor? Napíšte na support@coden-app.com.

Agent na vašom počítači, ovládaný z telefónu