Wariacyjne autoenkodery (VAE): nowe obrazki z ciągłej przestrzeni latentnej
Model generatywny ze zmienną ukrytą, VAE napisany od zera z trikiem reparametryzacji, uporządkowana przestrzeń latentna, generowanie cyfr z szumu w porównaniu ze zwykłym autoenkoderem, wpływ β i zapadnięcie się, interpolacja i gdzie stosuje się VAE.
Seria Podstawy AI Część 44 z 52
- Mapa sztucznej inteligencji: co jest czym i jak to do siebie pasuje
- Krótka historia sztucznej inteligencji: od Turinga do modeli językowych
- Dane, model, trening, inferencja: podstawowe pojęcia na jednym przykładzie
- Jak czytać zapis matematyczny: symbole, indeksy, sumy i kwantyfikatory
- Zbiory i relacje: klocki, z których składają się definicje w AI
- Funkcje i odwzorowania: dlaczego każdy model AI jest funkcją
- Logika i dowody: reguły, według których rozumuje AI
- Grafy i drzewa: struktura, na której opierają się przeszukiwanie i sieci neuronowe
- Algebra liniowa dla uczenia maszynowego: wektory, macierze i dlaczego AI głównie mnoży
- Pochodne, gradient i reguła łańcuchowa: jak model ustala, w którą stronę się uczyć
- Spadek gradientu: jak uczy się model
- Czym jest prawdopodobieństwo: od rzutu kostką do aksjomatów Kołmogorowa
- Prawdopodobieństwo warunkowe i twierdzenie Bayesa: jak zmienić ocenę, gdy dowiesz się czegoś nowego
- Zmienna losowa i dystrybuanta: jedna funkcja, która mówi o rozkładzie wszystko
- Funkcja gęstości i funkcja prawdopodobieństwa: dlaczego zmienna ciągła ma w punkcie prawdopodobieństwo zero
- Wartość oczekiwana, wariancja i kowariancja: gdzie leży rozkład, jak jest szeroki i co z czym się wiąże
- Przegląd rozkładów prawdopodobieństwa: Bernoulliego, dwumianowy, Poissona, jednostajny, normalny i wykładniczy
- Prawo wielkich liczb i centralne twierdzenie graniczne: dlaczego średnie zachowują się tak przewidywalnie
- Statystyka i estymacja parametrów: największa wiarygodność, MAP i przedziały ufności
- Teoria informacji: entropia, entropia krzyżowa i dywergencja KL — skąd się biorą funkcje straty
- Przeszukiwanie przestrzeni stanów: BFS, DFS, UCS i A* z animacjami
- Gry i przeciwnik: minimax, przycinanie alfa-beta i Monte Carlo tree search
- Spełnianie ograniczeń: backtracking, propagacja ograniczeń i AC-3 na sudoku i mapie czeskich krajów
- Logika i systemy z bazą wiedzy: wnioskowanie w przód i wstecz, rezolucja i systemy ekspertowe
- Planowanie: STRIPS, świat klocków, heurystyki z relaksacji i planowanie w agentach AI
- Przeszukiwanie lokalne i symulowane wyżarzanie: komiwojażer przez czeskie miasta wojewódzkie
- Algorytmy genetyczne: populacja, krzyżowanie, mutacja i selekcja na plecaku na wycieczkę
- Strategie ewolucyjne i programowanie genetyczne: od reguły jednej piątej do prawa Keplera
- Optymalizacja kolonią mrówek: jak ślad feromonowy znajduje krótką drogę
- Optymalizacja rojem cząstek: bezwładność, własne doświadczenie i doświadczenie roju
- Neuroewolucja: ewolucja wag i kształtu sieci neuronowych oraz algorytm NEAT
- Zbiory rozmyte i funkcje przynależności: jak zapisać „trochę ciepło”
- Logika rozmyta a prawdopodobieństwo: dlaczego „trochę ciepło” nie znaczy „prawdopodobnie ciepło”
- Logika rozmyta: t-normy, implikacje i reguły JEŻELI–TO
- Sterowanie rozmyte: Mamdani i Sugeno od wentylatora po wahadło na wózku
- Klasteryzacja rozmyta: algorytm fuzzy c-means i punkty między skupieniami
- Systemy neuro-rozmyte (ANFIS): reguły rozmyte, które uczą się z danych
- Łańcuchy Markowa: macierz przejścia, rozkład stacjonarny i PageRank
- Ukryte modele Markowa: algorytm Viterbiego i nieuczciwe kasyno
- Sieci bayesowskie: dlaczego trawa jest mokra i co z tego wynika dla zraszacza
- Filtr Kalmana: jak z niedokładnych pomiarów oszacować, gdzie jest samochód i jak szybko jedzie
- Rodzaje uczenia maszynowego: nadzorowane, nienadzorowane, półnadzorowane i inne
- Prompty, kontekst i RAG: jak dać modelowi właściwe informacje
- Wariacyjne autoenkodery (VAE): nowe obrazki z ciągłej przestrzeni latentnej
- Generatywne sieci przeciwstawne (GAN): fałszerz kontra detektyw
- Modele dyfuzyjne: jak z czystego szumu powstaje obraz
- Procesy decyzyjne Markowa: stany, akcje, nagrody i równania Bellmana
- Q-learning i DQN: uczenie się wartości akcji od tabeli po sieć neuronową
- Policy gradient i PPO: uczenie się bezpośrednio polityki
- Jak działa agent AI: model językowy w pętli z narzędziami
- Programowanie z agentami AI: zadanie, testy i kontrola
- Ocena i bezpieczeństwo systemów AI: jak mierzyć i jak pilnować
Pełny program serii Gotowe: 52 z 83 tematów
- Dlaczego ze zwykłego autoenkodera nie da się dobrze generować.
- Jak działa VAE: rozkład zamiast punktu, kara KL i trik reparametryzacji.
- Ile kosztuje β, dlaczego obrazki VAE są rozmyte i gdzie VAE stosuje się dziś.
Warto wiedzieć wcześniej: Teoria informacji: entropia, entropia krzyżowa i dywergencja KL — skąd się biorą funkcje straty
Autoenkoder z części o reprezentacjach potrafi ścisnąć obrazek do kilku liczb i z powrotem go z nich złożyć. Nasuwa się pytanie: skoro dekoder umie z kodu zrobić cyfrę, czy nie moglibyśmy dać mu kodu, który sami wymyśliliśmy, i dostać nową cyfrę, której nikt nie narysował? W zwykłym autoenkoderze to prawie nie działa. Wariacyjny autoenkoder to jego modyfikacja, która dokładnie to umożliwia — i pierwszy z modeli generatywnych, którymi zajmiemy się w tej części serii.
Nawiązuje do części Autoenkodery i reprezentacje oraz Teoria informacji (dywergencja KL).
1. Od kompresji do generowania
Definicja — model generatywny
Model generatywny uczy się z danych x1, …, xn rozkładu p(x) tak, aby dało się z niego próbkować — wytwarzać nowe x, które wyglądają jak dane, ale nie są ich kopią. Modele ze zmienną ukrytą (latentną) robią to w dwóch krokach: losują kod z z prostego rozkładu p(z) (na przykład normalnego), a dekoder oblicza z niego x.
Klasyfikator odpowiada „co to jest”. Model generatywny potrafi odpowiedzieć „pokaż mi coś, co mogłoby być w danych”. Przepis: rzuć kostką kilka liczb, przekaż je malarzowi (dekoderowi), a on namaluje według nich obrazek.
p(x) = ∫ p(x | z) · p(z) dz
- p(z)
- rozkład kodu (prior) — wybieramy go sami i prosty, u nas N(0, I), bo potem przy generowaniu umiemy z niego losować
- p(x | z)
- dekoder — jak prawdopodobny jest obrazek x, gdy dostaniemy kod z; u nas sieć, która dla każdego piksela zwraca prawdopodobieństwo, że jest zapalony
- ∫ … dz
- suma po wszystkich możliwych kodach — obrazek mógł powstać z dowolnego kodu; całki po całej przestrzeni latentnej nie umiemy jednak obliczyć, dlatego VAE zastępuje ją oszacowaniem (niżej)
Haczyk w zwykłym autoenkoderze: nie wiemy, skąd losować kod. Enkoder umieszcza cyfry w przestrzeni latentnej, gdzie mu się podoba. W naszej sieci z dwuwymiarowym kodem kody cyfr testowych leżą wokół punktu (-3,9; -0,9) z odchyleniem standardowym 4,3 i 6,0, a między grupami są dziury, w których dekoder nigdy niczego nie widział.
2. Wariacyjny autoenkoder
Definicja — wariacyjny autoenkoder (VAE)
VAE (Diederik Kingma i Max Welling, 2013) ma enkoder, który dla obrazka x nie zwraca jednego punktu, lecz rozkład normalny q(z | x) = N(μ(x), diag σ²(x)). Uczy się przez minimalizację straty
L = −Ez ~ q[log p(x | z)] + β · KL(q(z | x) ‖ N(0, I)),
gdzie pierwszy człon to błąd rekonstrukcji (u nas binarna entropia krzyżowa pikseli), a drugi to kara za to, jak bardzo rozkład kodu różni się od standardowego rozkładu normalnego. Dla rozkładu normalnego KL = ½ ∑j (μj² + σj² − log σj² − 1). Przy β = 1 −L jest dolnym ograniczeniem log-wiarygodności danych (ELBO).
Enkoder nie może powiedzieć „ta siódemka mieszka dokładnie tutaj”, tylko „gdzieś w tej chmurce”. Dekoder musi wtedy umieć narysować siódemkę z dowolnego miejsca chmurki. A kara KL ściąga wszystkie chmurki do początku układu i nie pozwala im być zbyt małymi — więc nakładają się, wypełniają przestrzeń i nie zostają między nimi dziury.
L(x) = −Ez ~ q(z | x)[ log p(x | z) ] + β · KL( q(z | x) ‖ N(0, I) )
- −Ez ~ q[log p(x | z)]
- błąd rekonstrukcji — jak źle dekoder narysuje x z kodu wylosowanego z chmurki. Wartość oczekiwana po całej chmurce (nie tylko jej środku) zmusza dekoder do poprawnego rysowania w całym otoczeniu kodu; minus dlatego, że logarytm prawdopodobieństwa chcemy jak największy, a stratę jak najmniejszą
- β
- waga kary — ustawia kompromis między dokładnością a porządkiem w przestrzeni; β = 1 to dokładnie ELBO, inne wartości sprawdzamy w podrozdziale o β
- KL(q(z | x) ‖ N(0, I))
- odległość chmurki od rozkładu, z którego będziemy losować — bez niej enkoder zmniejszyłby chmurki do punktów i rozrzucił je daleko od siebie (rekonstrukcja byłaby lepsza), i mamy z powrotem zwykły autoenkoder
KL = ½ ∑j=1k ( μj² + σj² − log σj² − 1 )
- KL
- kara z poprzedniego wzoru, dla rozkładu normalnego obliczona dokładnie; współrzędne kodu są niezależne, dlatego jest to suma po j
- μj²
- przesunięcie środka chmurki od początku układu — rośnie kwadratowo, więc odległe kody dużo kosztują i enkoder ściąga je do zera, gdzie będziemy losować
- σj² − log σj²
- szerokość chmurki — funkcja s − log s ma minimum 1 dokładnie w s = 1; karze zbyt szeroką chmurkę, ale przede wszystkim zbyt wąską (−log σ² → ∞ dla σ → 0), żeby chmurka nie stała się punktem
Twierdzenie — ELBO jest dolnym ograniczeniem log-wiarygodności
Dla dowolnego rozkładu q(z | x) zachodzi
log p(x) = Eq[log p(x | z)] − KL(q(z | x) ‖ p(z)) + KL(q(z | x) ‖ p(z | x)) ≥ Eq[log p(x | z)] − KL(q(z | x) ‖ p(z)).
Dowód. log p(x) nie zależy od z, więc jest równy swojej wartości oczekiwanej po q. Z twierdzenia Bayesa p(x) = p(x | z) p(z) / p(z | x); ułamek rozszerzamy przez q(z | x) / 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))].
Drugi człon to −KL(q ‖ p(z)), trzeci KL(q ‖ p(z | x)). Dywergencja KL jest zawsze nieujemna (nierówność Gibbsa z części o teorii informacji), więc pomijając trzeci człon, dostajemy nierówność. ∎
Prawa strona to ELBO (evidence lower bound), a przy β = 1 jest to dokładnie −L. Minimalizując L, podnosimy więc dolne ograniczenie log p(x), nie musząc liczyć całki. Równość zachodzi, gdy q(z | x) pokrywa się z prawdziwym rozkładem a posteriori p(z | x).
Definicja — binarna entropia krzyżowa pikseli
Dekoder zwraca dla każdego z 64 pikseli liczbę yj ∈ (0, 1) i traktuje ją jako prawdopodobieństwo, że piksel jest zapalony. Dla obrazka o jasnościach xj ∈ [0, 1] mamy
−log p(x | z) = −∑j=164 [ xj log yj + (1 − xj) log(1 − yj) ].
Przykład dla jednego piksela: jest zapalony (x = 1), a dekoder mówi 0,9 → −ln 0,9 ≈ 0,105; mówi 0,5 → ln 2 ≈ 0,693; jest zgaszony (x = 0), a dekoder mówi 0,9 → −ln 0,1 ≈ 2,303. Pewna siebie pomyłka kosztuje najwięcej. Ponieważ wyjściem jest sigmoida, pochodna względem wejścia sigmoidy to po prostu yj − xj — tak samo jak w regresji logistycznej.
Definicja — trik reparametryzacji (reparametrization trick)
Losowania z ~ N(μ, σ²) nie da się różniczkować względem μ i σ. Zapisuje się je więc jako z = μ + σ · ε, gdzie ε ~ N(0, 1) jest szumem niezależnym od parametrów. Wtedy ∂z/∂μ = 1 i ∂z/∂σ = ε, a gradient przechodzi przez propagację wsteczną aż do enkodera.
Losowość „wyciągamy na zewnątrz”: zamiast „wylosuj punkt z chmurki” mówimy „wylosuj ogólny szum, a potem przesuń go i rozciągnij według enkodera”. Przesunięcie i rozciągnięcie to zwykłe rachunki, a te da się różniczkować.
zj = μj(x) + σj(x) · εj, σj = exp(½ · log σj²), εj ~ N(0, 1)
- μj(x)
- środek chmurki, wyjście enkodera — ∂z/∂μ = 1, gradient dekodera przechodzi do enkodera bez zmian
- σj(x)
- szerokość chmurki — enkoder nie zwraca σ, lecz log σ², które może być dowolną liczbą rzeczywistą; funkcja wykładnicza zawsze zrobi z niego dodatnią szerokość, więc sieć nie musi pilnować żadnego warunku. ∂z/∂σ = ε
- εj ~ N(0, 1)
- cała losowość — nie zależy od żadnego parametru, więc przez nią niczego nie musimy różniczkować; przy generowaniu pomijamy enkoder i losujemy z wprost z N(0, I)
Przykład — jedna cyfra testowa (0) w nauczonym VAE z k = 2
enkoder: μ = (0,285; 1,587), log σ² = (−2,695; −1,931) → σ = (0,260; 0,381)
KL1 = ½ (0,081 + 0,068 + 2,695 − 1) ≈ 0,922
KL2 = ½ (2,518 + 0,145 + 1,931 − 1) ≈ 1,797 → KL ≈ 2,72 nata
reparametryzacja z ε = (0,5; −1,0): z = (0,285 + 0,260 · 0,5; 1,587 − 0,381 · 1,0) = (0,415; 1,206)
Większości kary nie daje tu odległość od początku układu, lecz wąskość chmurki: człon −log σ² wnosi 2,695 i 1,931. Enkoder chciałby kodu jak najdokładniejszego, KL utrzymuje go szerszym. Średnia KL po cyfrach testowych wynosi 3,42 nata. Błąd rekonstrukcji tej cyfry (ze środka μ) to 34,6 nata na 64 piksele.
def krok_vae(davka, beta=1.0):
for x in davka:
mu, logvar = koder(x) # k + k liczb
sigma = exp(0.5 * logvar)
eps = normal(0, 1, size=len(mu)) # losowość z zewnątrz
z = mu + sigma * eps # trik reparametryzacji
y = dekoder(z) # prawdopodobieństwa pikseli
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 przechodzi z → mu, sigma → enkoder
adam_krok() # średni gradient partii
Nasza sieć: 64 piksele → 32 neurony (tanh) → μ i log σ² (po k liczb) → 32 neurony → 64 piksele (sigmoida), uczona Adamem przez 150 epok na 600 syntetycznych cyfrach. Ta sama sieć, tylko bez szumu ε i bez kary KL, to zwykły autoenkoder — porównanie jest więc uczciwe.
3. Uporządkowana przestrzeń latentna
Obie sieci grupują takie same cyfry razem. Autoenkoder rozrzuca je jednak po dużej powierzchni — oba okręgi rozkładu normalnego są przy niej małe. Kody VAE leżą wokół początku układu z odchyleniem standardowym 1,14 i 1,04, czyli dokładnie tam, skąd będziemy losować.
Jak wygląda cała przestrzeń, pokaże siatka: regularnie rozmieszczone punkty przestrzeni latentnej, każdy przepuszczony przez dekoder.
W VAE cyfry płynnie przelewają się jedna w drugą i prawie każde pole to czytelna cyfra. Uczciwie mówiąc: na płaszczyźnie także dekoder autoenkodera jest dość gładki, a jego siatka również zawiera głównie cyfry. Różnicę w pełni pokaże dopiero kod o większej liczbie wymiarów.
4. Generowanie: nowe cyfry z szumu
Losujemy 200 kodów i każemy je zdekodować: w VAE z N(0, I), w autoenkoderze (żeby miał uczciwą szansę) z rozkładu normalnego dopasowanego do jego rzeczywistych kodów. Jakość mierzymy odległością (błędem średniokwadratowym) próbki od najbliższej cyfry treningowej. Prawdziwe cyfry testowe mają do najbliższej treningowej średnio 0,017, losowy szum 0,159.
Definicja — odległość od najbliższej cyfry treningowej i dopasowany rozkład
Dla próbki y ∈ [0, 1]64 i cyfr treningowych x(1), …, x(600)
d(y) = mini (1/64) ∑j=164 (yj − x(i)j)²,
czyli błąd średniokwadratowy (MSE) względem najbardziej podobnej cyfry; jakość generatora to średnia d po 200 próbkach. Małe d oznacza „wygląda jak któraś prawdziwa cyfra” — uwaga, zero dostałby też generator, który tylko kopiuje dane treningowe.
Autoenkoder losuje z zj = mj + sj · εj, gdzie mj i sj to średnia i odchylenie standardowe j-tej współrzędnej kodów cyfr testowych (dla k = 2: m = (−3,9; −0,9), s = (4,3; 6,0)). Współrzędne losuje się niezależnie — ewentualnej zależności między nimi dopasowany rozkład nie uchwyci.
| rozmiar kodu k | rekonstrukcja AE (MSE) | rekonstrukcja VAE (MSE) | próbki AE | próbki 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 |
Z dwuwymiarowym kodem obie sieci wypadają podobnie (0,042 wobec 0,044). Przy ośmiu wymiarach autoenkoder się rozpada: jego próbki mają odległość 0,090, ponad połowę drogi do szumu, podczas gdy VAE trzyma 0,054. Przy szesnastu jest to 0,112 wobec 0,055. Kody autoenkodera w wielu wymiarach leżą na cienkiej, powykrzywianej powierzchni, a losowy punkt z dopasowanego rozkładu normalnego praktycznie nigdy w nią nie trafia.
Cena: VAE rekonstruuje gorzej. Przy k = 16 jego błąd rekonstrukcji wynosi 0,039 wobec 0,017 w autoenkoderze, a jego obrazki są bardziej rozmyte. Kod jest zaszumiony, więc dekoder uczy się rysować „średnią” tego, co mogłoby być w otoczeniu kodu. Rozmycie to znana słabość VAE.
5. Rekonstrukcja kontra porządek: β
Waga β określa, jak mocno kara KL ściąga kody do rozkładu normalnego. Pięć VAE z kodem k = 2 i różnym β:
| β | KL (natów na obrazek) | rekonstrukcja (MSE) | próbki (odległość) |
|---|---|---|---|
| 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 |
Małe β zostawia kodom więcej swobody (KL 8,2), a rekonstrukcja jest dokładniejsza. Duże β ściska je do zera. Przy β = 5 KL spada do 0,05: enkoder przestał zapisywać w kodzie cokolwiek, a dekoder rysuje wciąż mniej więcej to samo, jakikolwiek kod dostanie. Nazywa się to zapadnięciem się rozkładu a posteriori (posterior collapse).
Definicja — nat i KL jako cena kodu
Nat to jednostka informacji z logarytmem naturalnym: 1 nat = 1 / ln 2 ≈ 1,443 bitu. Średnia KL po danych ogranicza z góry informację wzajemną między obrazkiem a kodem:
Ex KL(q(z | x) ‖ p(z)) = I(x; z) + KL(q(z) ‖ p(z)) ≥ I(x; z),
gdzie q(z) = Ex q(z | x) to rozkład kodów wszystkich obrazków razem. KL jest więc „ceną”, którą enkoder płaci za to, co zapisze w kodzie o obrazku.
Przy β = 0,1 to najwyżej 8,18 nata ≈ 11,8 bitu na obrazek, przy β = 5 tylko 0,05 nata ≈ 0,07 bitu — mniej niż jedna dziesiąta bitu, więc kod prawie nic nie mówi o obrazku, a dekoderowi nie pozostaje nic innego, jak rysować wciąż to samo.
Z kolei β większe niż 1 celowo stosuje β-VAE (Irina Higgins i in., 2017): silniejszy nacisk na niezależne współrzędne kodu sprawia, że poszczególne wymiary często odpowiadają zrozumiałym cechom (obrót, grubość kreski).
6. Płynne przejścia
Bierzemy kody dwóch cyfr testowych (sieci z ośmiowymiarowym kodem, z każdej cyfry obrazek, który VAE rekonstruuje najlepiej) i przechodzimy po prostej między nimi w ośmiu krokach: z(t) = (1 − t) · za + t · zb dla t = 0, 1/7, 2/7, …, 1, gdzie za, zb to środki μ obu cyfr. Każdy punkt pośredni dekodujemy.
Przejście jest w obu sieciach płynne: kroki pośrednie to wiarygodne kształty między obiema cyframi. Po prostej między dwoma prawdziwymi kodami nie oddalamy się zbytnio od danych, więc tu zwykły autoenkoder nie zostaje w tyle — jego słabością jest tylko losowanie na ślepo. Ta sama zasada w dużych modelach pozwala płynnie zmieniać na przykład wyraz twarzy albo styl obrazka.
7. Gdzie stosuje się VAE
- Kompresja dla innych generatorów. Stable Diffusion (dyfuzja latentna, Robin Rombach i in., 2022) nie pracuje na pikselach, lecz na kodzie autoenkodera z małą karą KL: obrazek 512 × 512 × 3 ściska do 64 × 64 × 4, a dyfuzja działa w tej mniejszej przestrzeni. Dyfuzji poświęcimy jedną z kolejnych części.
- Kody dyskretne. VQ-VAE (Aäron van den Oord i in., 2017) zamiast ciągłego kodu wybiera pozycje z nauczonego słownika. Obrazek staje się w ten sposób ciągiem „tokenów”, który potrafi generować transformer.
- Dane naukowe. Cząsteczki, dane komórkowe, dźwięk — wszędzie tam, gdzie przydaje się gładka przestrzeń, w której można szukać i interpolować.
Pod względem ostrości obrazków VAE przegrywają z GAN-ami i modelami dyfuzyjnymi. Mają jednak stabilne uczenie, prawdziwą interpretację probabilistyczną i enkoder w gratisie.
8. Podsumowanie
- Model generatywny uczy się rozkładu danych, aby dało się z niego próbkować; ze zmienną ukrytą losuje kod i go dekoduje.
- VAE koduje do rozkładu N(μ, σ²), a strata = rekonstrukcja + β · KL względem N(0, I). Trik z = μ + σε pozwala różniczkować przez losowanie.
- Kody VAE leżą wokół początku układu i wypełniają przestrzeń; kody autoenkodera są rozrzucone i z dziurami.
- Przy 8 wymiarach kodu: próbki autoenkodera 0,090, VAE 0,054 (prawdziwe cyfry 0,017, szum 0,159).
- Ceną jest gorsza rekonstrukcja i rozmycie; zbyt duże β prowadzi do zapadnięcia się (KL 0,05).
Chcesz to wypróbować w praktyce? Poproś agenta AI, żeby nauczył VAE z dwuwymiarowym kodem na zbiorze danych MNIST i narysował siatkę zdekodowanych obrazków — zobaczysz całą „mapę” odręcznie pisanych cyfr.
Masz inne zdanie? Napisz na support@coden-app.com.