Přeskočit na obsah
coden

Autoenkodéry: síť, která se učí data stlačit a zase rozbalit

Autoenkodér s úzkým hrdlem proti PCA, latentní prostor jako mapa dat, odšumovací autoenkodér a hledání podivností podle chyby rekonstrukce — na síti napsané od nuly a ručně psaných číslicích.

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

Série Základy AI Díl 67 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
  • Co je autoenkodér a proč je PCA jeho lineární případ.
  • Proč z dobré komprese vzniká užitečná reprezentace dat.
  • Jak se autoenkodérem odšumuje a hledají anomálie — a kam ta myšlenka vede.

Co se hodí znát předem: Shlukování a snížení dimenze: k-means, PCA a t-SNE, Neuronová síť od nuly: zpětné šíření chyby krok za krokem

Zatím se naše sítě vždycky učily odpovídat na otázku: jaká je to číslice, kolik stojí byt, jaké přijde další slovo. Autoenkodér se učí něco zdánlivě nesmyslného — zopakovat přesně to, co dostal na vstupu. Háček je v tom, že informace musí projít úzkým hrdlem: síť ji nejdřív stlačí do pár čísel a pak z nich obrázek zase poskládá. Aby to dokázala, musí přijít na to, co je na datech podstatné. A ta pár čísel v hrdle — reprezentace — se ukážou užitečná na spoustu věcí: kompresi, mapu dat, odšumování i hledání podivností.

Navazuje na díly Shlukování a snížení dimenze a Neuronová síť od nuly.

1. Síť s úzkým hrdlem

Definice — autoenkodér

Nechť n, k ≥ 1 jsou celá čísla, obvykle k < n, a x1, …, xN ∈ ℝn (N ≥ 1) jsou trénovací data. Autoenkodér je dvojice zobrazení

e : ℝn → ℝk (kodér),   d : ℝk → ℝn (dekodér),

obvykle neuronových sítí s parametry θe, θd, které se učí společně tak, aby minimalizovaly chybu rekonstrukce

L(θe, θd) = 1/N ∑i=1N ‖xi − d(e(xi))‖2.

Vektor z = e(x) ∈ ℝk je kód vstupu x a x̂ = d(z) ∈ ℝn jeho rekonstrukce. Slovy: kodér stlačí vstup do k čísel, dekodér z nich vstup obnoví, a protože správnou odpovědí je vstup sám, jde o učení bez učitele.

Laicky řečeno

Hra na tichou poštu přes telegram s omezeným počtem slov. Jeden hráč vidí obrázek a smí poslat jen dvě čísla, druhý podle nich obrázek nakreslí. Kdyby čísla vybírali náhodně, nic by z toho nebylo. Když spolu ale hrají dlouho, domluví si kód: první číslo třeba „jak moc je to kulaté“, druhé „jak moc je to nakloněné“. Nikdo jim ten kód neřekl — vymysleli si ho sami, aby se trefovali.

Data jsou syntetické ručně psané číslice 8 × 8 z dílu o shlukování, 600 na učení a 200 na test, každá jako 64 čísel. Autoenkodér má vrstvy 64 → 32 → k → 32 → 64 (tanh ve skrytých vrstvách, sigmoida na výstupu) a pro k = 2 celkem 4 354 vah. Učíme ho stejným zpětným šířením jako v dílu o síti od nuly.

Definice — kodér a dekodér naší sítě

Nechť k ≥ 1 je velikost kódu (v tomto dílu k ∈ {2, 4, 8, 16}) a nechť jsou dány parametry

  • W1 ∈ ℝ32×64, b1 ∈ ℝ32 a W2 ∈ ℝk×32, b2 ∈ ℝk (kodér),
  • W3 ∈ ℝ32×k, b3 ∈ ℝ32 a W4 ∈ ℝ64×32, b4 ∈ ℝ64 (dekodér).

Nechť tanh a sigmoida σ(u) = 1/1 + e−u působí na vektory po složkách. Vstup x ∈ [0, 1]64 je 64 jasů pixelů. Kodér e : [0, 1]64 → ℝk a dekodér d : ℝk → (0, 1)64 naší sítě jsou

e(x) = W2 · tanh(W1x + b1) + b2,

d(z) = σ(W4 · tanh(W3z + b3) + b4).

Kodér i dekodér mají tedy každý jednu skrytou vrstvu o 32 neuronech; b1 až b4 jsou posuny. Kód z = e(x) je lineární (bez aktivace), aby jeho složky mohly nabývat libovolných hodnot; sigmoida σ na výstupu drží jasy mezi 0 a 1 jako u skutečných pixelů. Bez tanh ve skrytých vrstvách by se celá síť složila do násobení maticemi — a to umí i PCA (viz další oddíl).

Příklad — odkud je 4 354 vah

Každá vrstva z nin do nout neuronů má nout · nin vah a nout posunů:

64 → 32:   32 · 64 + 32 = 2 080

32 → 2:   2 · 32 + 2 = 66

2 → 32:   32 · 2 + 32 = 96

32 → 64:   64 · 32 + 64 = 2 112

celkem:   2 080 + 66 + 96 + 2 112 = 4 354   (pro k = 8 je to 4 744, pro k = 16 pak 5 264)

Definice — chyba rekonstrukce (MSE)

Nechť n ≥ 1 (u obrázků 8 × 8 je n = 64) a x, x̂ ∈ ℝn. Střední kvadratická chyba (MSE, mean squared error) vektoru x̂ vůči x je číslo

MSE(x, x̂) = 1/n ∑j=1n (x̂j − xj)2 = 1/n ‖x̂ − x‖2,

tj. průměr druhých mocnin rozdílů přes všechny pixely. Pro testovací obrázky x1, …, xM a autoenkodér (e, d) je chyba rekonstrukce průměr 1/M ∑i=1M MSE(xi, d(e(xi))); všechna čísla „chyby“ v tomto dílu jsou takto zprůměrovaná MSE. Protože jasy leží mezi 0 a 1, odpovídá chyba 0,01 typické odchylce asi √0,01 = 0,1 jasu na pixel.

L = 1/N · 64 ∑n=1N ∑j=164 ( x̂nj − xnj )2

x̂nj
j-tý pixel rekonstrukce d(e(xn)) — obrázek, který prošel hrdlem; jen přes něj se do ztráty dostanou váhy kodéru i dekodéru
xnj
tentýž pixel originálu. Vstup je zároveň správnou odpovědí — proto autoenkodér nepotřebuje žádné štítky
1/N · 64 ∑ ∑
průměr přes všech N obrázků dávky a jejich 64 pixelů; díky průměru nezávisí velikost ztráty (a tedy kroku učení) na tom, kolik obrázků zrovna počítáme
Druhá mocnina rozdílu nedbá na znaménko a velké chyby trestá víc než malé: jeden pixel vedle o 0,5 stojí stejně jako 25 pixelů vedle o 0,1.
Algoritmus — učení autoenkodéru
  • Vstup: trénovací obrázky X = (x1, …, x600), xi ∈ [0, 1]64; velikost kódu k ≥ 1; počet epoch (80), krok učení η = 0,003 a síla šumu σ ≥ 0 (0 = obyčejný autoenkodér).
  • Výstup: parametry W1, …, W4, b1, …, b4 kodéru a dekodéru z definice výše.
  • Kroky: (1) váhy náhodně z N(0, 1/nin), posuny 0; (2) v každé epoše data zamíchat a rozdělit na dávky po 20; (3) pro každou dávku sečíst gradient chyby MSE(x, d(e(x̃))) přes její obrázky (x̃ = x, nebo zašuměné x u odšumovací varianty), vydělit 20 a udělat krok Adam.
  • Zastavení: po pevném počtu epoch.
def uc_autoenkoder(X, k, epoch=80, eta=0.003, sum=0):
    sit = [64, 32, k, 32, 64], váhy náhodně ~ N(0, 1/n_in), posuny 0
    for e in range(epoch):
        zamíchej X
        for davka in po_20(X):
            G = 0
            for x in davka:
                vstup = x if sum == 0 else orez(x + sum · N(0, 1), 0, 1)   # odšumovací varianta
                x̂ = d(e(vstup))                       # dopředu
                G += gradient (1/64) ∑ (x̂ − x)²        # zpětné šíření; cílem je čisté x
            krok Adam s G / 20 (β1 = 0,9, β2 = 0,999)
    return sit

Krok Adam je popsaný v dílu o gradientním sestupu. Proti učení klasifikátoru se změnil jediný řádek: cílem není štítek, ale obrázek x.

2. Komprese: autoenkodér proti PCA

Snížení dimenze už známe: PCA najde k směrů s největším rozptylem a data do nich promítne. Je to vlastně taky autoenkodér — jen lineární: kódování je násobení maticí a dekódování násobení maticí zpátky. Neuronový autoenkodér smí stlačovat i ohýbat.

z = WT(x − μ),   x̂PCA = μ + W z

x
obrázek, 64 jasů
μ
průměrný obrázek tréninkových číslic. Odečítá se, aby kód popisoval jen to, čím se číslice od průměru liší, a při dekódování se zase přičte
W
matice 64 × k, jejíž sloupce jsou k hlavních komponent — navzájem kolmé jednotkové směry s největším rozptylem. Kódování i dekódování používá tutéž matici (jednou transponovanou)
z
kód: k souřadnic obrázku podél hlavních směrů, tedy totéž co hrdlo autoenkodéru
x̂PCA
rekonstrukce — kolmý průmět obrázku do k-rozměrné roviny; její chybu ukazují modré sloupce v grafu
PCA jako autoenkodér: kodér i dekodér jsou jen násobení maticí a posun. Nic tu neumí ohnout.
Věta — lineární autoenkodér nepřekoná PCA

Nechť x1, …, xN ∈ ℝn jsou data, μ = 1/N ∑i=1N xi jejich průměr, 1 ≤ k ≤ n a nechť W ∈ ℝn×k má za sloupce k hlavních komponent dat (ortonormální vlastní vektory výběrové kovarianční matice k k největším vlastním číslům, viz díl Shlukování a snížení dimenze). Pro matice E ∈ ℝk×n a D ∈ ℝn×k označme

J(D, E) = 1/N ∑i=1N ‖xi − μ − DE(xi − μ)‖2

průměrnou kvadratickou chybu lineárního autoenkodéru x ↦ μ + DE(x − μ). Pak pro všechny takové D, E platí J(D, E) ≥ J(W, WT), tj. žádný lineární autoenkodér s kódem velikosti k nemá menší chybu než PCA s k komponentami.

Důkaz (náčrt). Plyne to z Eckartovy–Youngovy věty (1936) o nejlepší aproximaci matice maticí hodnosti k: součin DE má hodnost nejvýš k, takže matice rekonstrukcí centrovaných dat má hodnost nejvýš k, a nejlepší taková aproximace (ve smyslu součtu čtverců) je průmět do k hlavních směrů, tj. WWT. ∎

Pierre Baldi a Kurt Hornik (1989) navíc ukázali, že ztráta lineárního autoenkodéru nemá jiná lokální minima než to globální, takže gradientní sestup najde tentýž podprostor jako PCA (jen v něm může zvolit jiné, ne nutně kolmé souřadnice).

Lineární autoenkodér by proto v grafu nikdy nebyl pod modrým sloupcem. Že je ten náš (zelený) pod ním, je zásluha nelinearit tanh a sigmoidy.

Definice — „stejně šedý obrázek“ v grafu

Nechť x1, …, xN ∈ [0, 1]64 jsou tréninkové obrázky (N = 600) a xij jas j-tého pixelu i-tého obrázku. Označme

p̄ = 1/64N ∑i=1N ∑j=164 xij   (u nás 0,351)

průměrný jas všech tréninkových pixelů. Stejně šedý obrázek je konstantní rekonstrukce x̂ = (p̄, …, p̄) ∈ ℝ64, stejná pro každý vstup — pro každou číslici stejný šedý čtverec. Čárkovaná čára v grafu je jeho chyba rekonstrukce na testovacích číslicích, 0,143; je to zhruba rozptyl jasu pixelů. Kdo by místo šedého čtverce kreslil skutečný průměrný obrázek μ = 1/N ∑i=1N xi ∈ [0, 1]64 (každý pixel zvlášť zprůměrovaný; PCA s k = 0), dostal by 0,135.

00,050,10,15 2 4 8 16 velikost kódu k (počet čísel) chyba rekonstrukce (MSE)
Chyba rekonstrukce testovacích číslic podle počtu čísel v kódu PCA autoenkodér stejně šedý obrázek
Velikost kódu24816
PCA0,1020,0840,0600,034
autoenkodér0,0610,0390,0280,019

Kdo by kreslil každé číslici stejný šedý obrázek s průměrným jasem, měl by chybu 0,143. PCA se dvěma čísly ji sníží jen na 0,102, autoenkodér na 0,061 — se dvěma čísly obnoví číslice skoro tak dobře jako PCA s osmi. Rozdíl dělá nelinearita: číslice neleží na rovině, ale na zakřivené ploše v 64rozměrném prostoru, a ohnutý kód ji sleduje lépe.

Příklad — kolik chyby kód odstraní

Za základ vezmeme šedý čtverec (0,143) a spočítáme, jakou část jeho chyby rekonstrukce se dvěma čísly odstraní:

PCA:   1 − 0,102/0,143 = 0,29   (odstraní 29 % chyby)

autoenkodér:   1 − 0,061/0,143 = 0,57   (odstraní 57 % chyby, dvakrát tolik)

S přesnými, nezaokrouhlenými hodnotami vyjde 28,5 % a 57,5 %.

3. Kód jako mapa dat

Definice — reprezentace a latentní prostor

Nechť X ⊆ ℝn je množina možných dat (u nás obrázků). Reprezentace dat je zobrazení r : X → ℝk, které každému x ∈ X přiřadí jiný popis r(x) — soubor k čísel. Zavádí se proto, aby z r(x) šlo podstatné vyčíst snáz než z původních hodnot x; tahle vlastnost se formálně nedefinuje, ale měří úlohou, ke které reprezentaci použijeme (dál třeba čistotou sousedů).

Nechť (e, d) je autoenkodér s kodérem e : ℝn → ℝk. Jeho reprezentací je r = e a prostor kódů ℝk, do kterého kodér zobrazuje, se nazývá latentní prostor; kód e(x) je bod latentního prostoru.

Laicky řečeno

Když má kód jen dvě čísla, dá se nakreslit: každá číslice je bod v rovině. Autoenkodér se nikdy nedozvěděl, která číslice je která — a přesto ve dvou číslech, která si vymyslel, leží podobné číslice u sebe.

00000000000000000000111111111111111111112222222222222222222233333333333333333333444444444444444444445555555555555555555566666666666666666666777777777777777777778888888888888888888899999999999999999999 PCA (2 komponenty) 1. hlavní komponenta (bez jednotky) 2. hlavní komponenta (bez jednotky) 00000000000000000000111111111111111111112222222222222222222233333333333333333333444444444444444444445555555555555555555566666666666666666666777777777777777777778888888888888888888899999999999999999999 kód autoenkodéru (k = 2) kód z₁ (bez jednotky) kód z₂ (bez jednotky)
200 testovacích číslic ve dvou číslech; každý bod je nakreslený jako svá číslice

Stejné měřítko jako v dílu o shlukování: z pěti nejbližších sousedů každého bodu je stejná číslice v mapě PCA u 44,8 %, v mapě autoenkodéru u 56,0 %. Autoenkodér tedy číslice v rovině odděluje lépe, i když se o číslicích nic neučil — jen se snažil je co nejlépe zrekonstruovat. Tohle je hlavní myšlenka „učení reprezentací“: dobrá komprese nutí síť najít popis, který je užitečný i na jiné věci.

Definice — čistota sousedů

Nechť N ≥ 6, z1, …, zN ∈ ℝk jsou body mapy (kódy obrázků) a y1, …, yN ∈ {0, 1, …, 9} skutečné číslice, které obrázky zobrazují. Pro každé i ∈ {1, …, N} nechť S5(i) ⊆ {1, …, N} ∖ {i} je množina indexů pěti bodů nejbližších k zi, tj. |S5(i)| = 5 a ‖zj − zi‖ ≤ ‖zl − zi‖ pro všechna j ∈ S5(i) a l ∉ S5(i) ∪ {i} (‖·‖ je eukleidovská norma; při shodných vzdálenostech se vybere kterýkoli z nich). Čistota sousedů je číslo

Č = 1/N ∑i=1N |{ j ∈ S5(i) : yj = yi }|/5 ∈ [0, 1],

tedy průměrný podíl sousedů se stejnou číslicí. Štítky y se tu použijí jen k hodnocení mapy, autoenkodér ani PCA je nikdy neviděly.

Příklad — kolik by dala náhoda

V testu je každá číslice 20krát. Kdyby mapa body rozházela náhodně, byl by každý soused náhodný z ostatních 199 bodů a stejnou číslici by měl s pravděpodobností

19/199 = 0,095   (9,5 %)

PCA (44,8 %) i autoenkodér (56,0 %) jsou tedy daleko nad náhodou; autoenkodér má mezi sousedy o 11,2 procentního bodu víc správných číslic.

4. Odšumovací autoenkodér

Definice — odšumovací autoenkodér

Nechť x1, …, xN ∈ ℝn jsou trénovací data a nechť je dán náhodný poškozovací proces, který z každého x ∈ ℝn vyrobí náhodný vektor x̃ ∈ ℝn (přičtený šum, zakryté části). Odšumovací autoenkodér (Pascal Vincent a kol., 2008) je autoenkodér (e, d), jehož parametry minimalizují očekávanou chybu

L = 1/N ∑i=1N Ex̃i ‖xi − d(e(x̃i))‖2,

kde Ex̃i je střední hodnota přes poškození x̃i vstupu xi (při učení se nahrazuje novým losem šumu v každé epoše). Slovy: síť vidí jen poškozený vstup x̃, ale porovnává se s čistým x. U nás je poškození x̃ = ořež[0, 1](x + σε) s ε ~ N(0, I64), kde ořež[0, 1] nahradí každou složku uj číslem min(1, max(0, uj)).

Laicky řečeno

Restaurátor, který se učí na fotkách, kam někdo schválně nasypal prach, a vždycky vidí i čistý originál. Časem pochopí, jak vypadají skutečné tahy, a prach umí odlišit. Šum je náhodný a do kódu se nevejde; tvar číslice ano.

x̃ = ořež[0, 1](x + σ ε),   L = 1/64 ‖x − d(e(x̃))‖2

x
čistá číslice. Je ve vzorci dvakrát: jednou ji poškodíme, podruhé je to cíl, který má síť vrátit
σ ε
šum: ε je pro každý pixel nové nezávislé číslo z normálního rozdělení N(0, 1), σ = 0,3 určuje jeho sílu. Při učení se losuje znovu v každé epoše, takže síť nikdy neuvidí stejný šum dvakrát a nemůže si ho zapamatovat
ořež[0, 1]
hodnoty pod 0 nahradí nulou a nad 1 jedničkou — zašuměný obrázek je pořád obrázek s platnými jasy
x̃
poškozený vstup; jedině ten síť vidí
d(e(x̃))
rekonstrukce z poškozeného vstupu. Porovnává se s čistým x, ne s x̃: kdyby se porovnávala s x̃, síť by se učila šum věrně opisovat
Proti obyčejnému autoenkodéru se změnil jen vstup; cíl zůstal čistý.
originál se šumem obnoveno
Odšumování: čistá číslice, se šumem σ = 0,3 a po odšumovacím autoenkodéru

Zašuměné číslice se od originálu liší v průměru o 0,051. PCA se 16 komponentami je vyčistí jen nepatrně (0,050), obyčejný autoenkodér s kódem 16 trochu víc (0,044) a autoenkodér, který se odšumovat učil, nejvíc: 0,033. Stejná myšlenka — naučit síť obnovit poškozená data — stojí na pozadí dnešních difuzních modelů, které generují obrázky tak, že postupně odšumují náhodný šum.

Příklad — proč šum σ = 0,3 dává chybu jen 0,051

Bez ořezání by šum přidal ke každému pixelu chybu se střední hodnotou σ2 = 0,32 = 0,09. Jenže asi pětina pixelů je přesně 0 (pozadí) a další jsou blízko 0 nebo 1:

pixel s jasem 0:   záporný šum ořez smaže, zůstane jen kladná polovina   →   σ2/2 = 0,045

pixel s jasem 1:   totéž zrcadlově   →   0,045

pixel s jasem 0,5:   ořez skoro nic neubere (0,5 = 1,67 σ)   →   0,075

průměr této očekávané chyby přes všech 200 · 64 testovacích pixelů:   0,052   (naměřeno na jednom vylosovaném šumu 0,051)

5. Hledání podivností

Autoenkodér se naučil rekonstruovat číslice. Co udělá s obrázkem, který číslice není? Neví, jak ho zakódovat, a rekonstrukce dopadne špatně. Chyba rekonstrukce je tak přirozené skóre „podivnosti“.

vstup rekonstrukce
Cizí obrázky (pruhy, šachovnice, skvrny) a jak je autoenkodér přepíše

Autoenkodér s kódem 8 má na testovacích číslicích typickou chybu 0,023, na cizích obrázcích 0,231 — desetkrát víc. Když práh nastavíme tak, aby za podivné označil jen 5 % skutečných číslic, odhalí všech 200 cizích obrázků (AUC 1,000). To je ale snadná zkouška. Těžší: číslice otočené vzhůru nohama. AUC klesne na 0,887 a odhaleno je 69,5 %. A stojí za to podívat se, které otočené číslice prošly bez povšimnutí: otočená nula (chyba 0,036), otočená šestka (0,038) a otočená devítka (0,031). Nula je souměrná, z otočené šestky je devítka a z otočené devítky šestka — autoenkodér má pravdu, že tyhle obrázky nejsou podivné. Ostatní otočené číslice mají chybu 0,084 až 0,144.

Definice — skóre podivnosti a práh

Nechť (e, d) je naučený autoenkodér a x ∈ [0, 1]64 obrázek. Skóre podivnosti obrázku x je jeho chyba rekonstrukce

s(x) = MSE(x, d(e(x))).

Nechť τ ∈ ℝ je práh. Obrázek x označíme za podivný, právě když s(x) > τ.

Práh volíme podle normálních dat: nechť c1, …, cM jsou testovací číslice (M = 200) a s(1) ≤ s(2) ≤ … ≤ s(M) jejich skóre seřazená vzestupně. Bereme τ = s(191), u nás 0,059; nad ním leží 9 číslic (4,5 %) — to je zhruba těch „5 % skutečných číslic“, které jsme ochotni označit omylem.

Nechť A je konečná neprázdná množina podivných obrázků a C konečná neprázdná množina skutečných číslic. Pro výrok V označme [V] = 1, pokud V platí, a [V] = 0 jinak (Iversonova závorka). AUC skóre s na množinách A, C je číslo

AUC = 1/|A| · |C| ∑a ∈ A ∑c ∈ C ( [s(a) > s(c)] + 1/2 · [s(a) = s(c)] ) ∈ [0, 1],

tj. podíl dvojic (a, c), ve kterých dostal podivný obrázek vyšší skóre než číslice, s remízami za polovinu (rozbor níže).

AUC = 1/|A| · |C| ∑a ∈ A ∑c ∈ C ( [s(a) > s(c)] + 1/2 · [s(a) = s(c)] )

1/|A| · |C| ∑ ∑
projde všechny dvojice (podivný obrázek a, skutečná číslice c) — u nás 200 · 200 = 40 000 dvojic — a vezme podíl. Na prahu tu nezáleží: AUC hodnotí skóre jako takové, pro všechny prahy najednou
[s(a) > s(c)]
bod za dvojici, kterou skóre seřadí správně: podivný obrázek dostal vyšší skóre než číslice. Hranatá závorka je 1, když tvrzení platí, jinak 0
1/2 · [s(a) = s(c)]
remíza za půl bodu — skóre tu dvojici nerozlišilo, a tak dostane tolik, kolik by v průměru dala hozená mince
AUC je pravděpodobnost, že náhodně vybraný podivný obrázek dostane vyšší skóre než náhodně vybraná číslice. 0,5 je hádání, 1 dokonalé oddělení.
Příklad — AUC jako počet dvojic

cizí obrázky:   39 997 ze 40 000 dvojic ve správném pořadí   →   AUC = 39 997/40 000 = 0,99993 ≈ 1,000

otočené číslice:   35 487 ze 40 000   →   AUC = 35 487/40 000 = 0,887

Barvy podle vzorce výše: 40 000 = |A| · |C| = 200 · 200 dvojic, 39 997 a 35 487 jsou body za dvojice se s(a) > s(c); remízy (přesně shodné skóre dvou různých obrázků) u spojitých chyb rekonstrukce prakticky nenastávají, takže půlbody nic nepřidávají.

„AUC 1,000“ je tedy zaokrouhlené: tři dvojice jsou obráceně. Tři cizí obrázky mají nižší skóre než nejhůř rekonstruovaná testovací číslice (0,140) — ta ale leží nad prahem, a tak všech 200 cizích obrázků práh přesto překročí.

Takhle se v praxi hledají vadné výrobky na pásu, podvodné transakce nebo poruchy strojů z čidel: autoenkodér se naučí jen na „normálních“ datech, protože vadných příkladů je málo a každý je jiný.

6. Kam autoenkodéry vedou

  • Variační autoenkodér (Diederik Kingma a Max Welling, 2013) nutí kód, aby měl tvar normálního rozdělení. Pak se dá z latentního prostoru losovat a dekodér vyrobí nový, nikdy neviděný příklad — první krok ke generativním modelům.
  • Předtrénování. V letech 2006–2010 se hluboké sítě učily tak, že se vrstvy nejdřív jedna po druhé naučily jako autoenkodéry; to pomohlo před nástupem ReLU a dobré inicializace.
  • Maskované modely. BERT (2018) je v jádru odšumovací autoenkodér na textu: zakryje část slov a učí se je doplnit. Obrazový protějšek MAE (2021) zakrývá tři čtvrtiny obrázku.
  • Latentní difuze. Generátory obrázků jako Stable Diffusion pracují v latentním prostoru autoenkodéru — místo milionů pixelů s mnohem menším kódem.
Definice — co variační autoenkodér mění

Nechť k ≥ 1 je velikost kódu a x ∈ ℝn vstup. Kodér variačního autoenkodéru nevrací jeden bod, ale dvojici vektorů

μ(x) ∈ ℝk,   σ(x) ∈ (0, ∞)k

— střed a směrodatné odchylky normálního rozdělení N(μ(x), diag σ(x)2) v latentním prostoru ℝk. Kód se z něj losuje jako

z = μ(x) + σ(x) ⊙ ε,   ε ~ N(0, Ik)

(⊙ je násobení po složkách, Ik jednotková matice k × k). Ke ztrátě rekonstrukce ‖x − d(z)‖2 se přičte Kullbackova–Leiblerova divergence rozdělení kódu od standardního normálního rozdělení N(0, Ik), která pro μ = μ(x), σ = σ(x) vychází

KL = 1/2 ∑i=1k ( μi2 + σi2 − ln σi2 − 1 ),

a je nulová, právě když μi = 0 a σi = 1 pro všechna i = 1, …, k. Táhne tedy kódy všech příkladů k jednomu společnému rozdělení, ze kterého se pak dá losovat (Kingma a Welling, 2013; tady zjednodušeně, s kvadratickou chybou místo logaritmu věrohodnosti). Podrobně v dílu Variační autoenkodéry.

7. Shrnutí

  • Autoenkodér se učí zopakovat vstup přes úzké hrdlo; kód v hrdle je naučená reprezentace dat.
  • PCA je lineární autoenkodér; nelineární autoenkodér se dvěma čísly rekonstruoval číslice s chybou 0,061 proti 0,102 u PCA.
  • Dvourozměrný kód je mapa dat: stejná číslice mezi sousedy u 56,0 % bodů proti 44,8 % u PCA, bez jediného štítku.
  • Odšumovací autoenkodér snížil chybu zašuměných číslic z 0,051 na 0,033.
  • Chyba rekonstrukce je skóre podivnosti: cizí obrázky odhalil všechny, otočené číslice v 69,5 % — a otočené 0, 6 a 9 správně nepovažoval za podivné.

Chcete si to osahat? Nechte AI agenta natrénovat autoenkodér na datasetu Fashion-MNIST s kódem velikosti 2 a nakreslit mapu kódů — které druhy oblečení si síť sama seskupí k sobě?

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