Przejdź do treści
coden

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.

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

Seria Podstawy AI Część 44 z 52
  1. Mapa sztucznej inteligencji: co jest czym i jak to do siebie pasuje
  2. Krótka historia sztucznej inteligencji: od Turinga do modeli językowych
  3. Dane, model, trening, inferencja: podstawowe pojęcia na jednym przykładzie
  4. Jak czytać zapis matematyczny: symbole, indeksy, sumy i kwantyfikatory
  5. Zbiory i relacje: klocki, z których składają się definicje w AI
  6. Funkcje i odwzorowania: dlaczego każdy model AI jest funkcją
  7. Logika i dowody: reguły, według których rozumuje AI
  8. Grafy i drzewa: struktura, na której opierają się przeszukiwanie i sieci neuronowe
  9. Algebra liniowa dla uczenia maszynowego: wektory, macierze i dlaczego AI głównie mnoży
  10. Pochodne, gradient i reguła łańcuchowa: jak model ustala, w którą stronę się uczyć
  11. Spadek gradientu: jak uczy się model
  12. Czym jest prawdopodobieństwo: od rzutu kostką do aksjomatów Kołmogorowa
  13. Prawdopodobieństwo warunkowe i twierdzenie Bayesa: jak zmienić ocenę, gdy dowiesz się czegoś nowego
  14. Zmienna losowa i dystrybuanta: jedna funkcja, która mówi o rozkładzie wszystko
  15. Funkcja gęstości i funkcja prawdopodobieństwa: dlaczego zmienna ciągła ma w punkcie prawdopodobieństwo zero
  16. Wartość oczekiwana, wariancja i kowariancja: gdzie leży rozkład, jak jest szeroki i co z czym się wiąże
  17. Przegląd rozkładów prawdopodobieństwa: Bernoulliego, dwumianowy, Poissona, jednostajny, normalny i wykładniczy
  18. Prawo wielkich liczb i centralne twierdzenie graniczne: dlaczego średnie zachowują się tak przewidywalnie
  19. Statystyka i estymacja parametrów: największa wiarygodność, MAP i przedziały ufności
  20. Teoria informacji: entropia, entropia krzyżowa i dywergencja KL — skąd się biorą funkcje straty
  21. Przeszukiwanie przestrzeni stanów: BFS, DFS, UCS i A* z animacjami
  22. Gry i przeciwnik: minimax, przycinanie alfa-beta i Monte Carlo tree search
  23. Spełnianie ograniczeń: backtracking, propagacja ograniczeń i AC-3 na sudoku i mapie czeskich krajów
  24. Logika i systemy z bazą wiedzy: wnioskowanie w przód i wstecz, rezolucja i systemy ekspertowe
  25. Planowanie: STRIPS, świat klocków, heurystyki z relaksacji i planowanie w agentach AI
  26. Przeszukiwanie lokalne i symulowane wyżarzanie: komiwojażer przez czeskie miasta wojewódzkie
  27. Algorytmy genetyczne: populacja, krzyżowanie, mutacja i selekcja na plecaku na wycieczkę
  28. Strategie ewolucyjne i programowanie genetyczne: od reguły jednej piątej do prawa Keplera
  29. Optymalizacja kolonią mrówek: jak ślad feromonowy znajduje krótką drogę
  30. Optymalizacja rojem cząstek: bezwładność, własne doświadczenie i doświadczenie roju
  31. Neuroewolucja: ewolucja wag i kształtu sieci neuronowych oraz algorytm NEAT
  32. Zbiory rozmyte i funkcje przynależności: jak zapisać „trochę ciepło”
  33. Logika rozmyta a prawdopodobieństwo: dlaczego „trochę ciepło” nie znaczy „prawdopodobnie ciepło”
  34. Logika rozmyta: t-normy, implikacje i reguły JEŻELI–TO
  35. Sterowanie rozmyte: Mamdani i Sugeno od wentylatora po wahadło na wózku
  36. Klasteryzacja rozmyta: algorytm fuzzy c-means i punkty między skupieniami
  37. Systemy neuro-rozmyte (ANFIS): reguły rozmyte, które uczą się z danych
  38. Łańcuchy Markowa: macierz przejścia, rozkład stacjonarny i PageRank
  39. Ukryte modele Markowa: algorytm Viterbiego i nieuczciwe kasyno
  40. Sieci bayesowskie: dlaczego trawa jest mokra i co z tego wynika dla zraszacza
  41. Filtr Kalmana: jak z niedokładnych pomiarów oszacować, gdzie jest samochód i jak szybko jedzie
  42. Rodzaje uczenia maszynowego: nadzorowane, nienadzorowane, półnadzorowane i inne
  43. Prompty, kontekst i RAG: jak dać modelowi właściwe informacje
  44. Wariacyjne autoenkodery (VAE): nowe obrazki z ciągłej przestrzeni latentnej
  45. Generatywne sieci przeciwstawne (GAN): fałszerz kontra detektyw
  46. Modele dyfuzyjne: jak z czystego szumu powstaje obraz
  47. Procesy decyzyjne Markowa: stany, akcje, nagrody i równania Bellmana
  48. Q-learning i DQN: uczenie się wartości akcji od tabeli po sieć neuronową
  49. Policy gradient i PPO: uczenie się bezpośrednio polityki
  50. Jak działa agent AI: model językowy w pętli z narzędziami
  51. Programowanie z agentami AI: zadanie, testy i kontrola
  52. Ocena i bezpieczeństwo systemów AI: jak mierzyć i jak pilnować

Pełny program serii Gotowe: 52 z 83 tematów

Czego się dowiesz
  • 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.

Mówiąc prościej

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)
Generowanie jest łatwe (wylosuj z, zdekoduj), uczenie potrzebuje p(x) — a to jest ta trudna całka.

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

Mówiąc prościej

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
Strata dla jednego obrazka; uczy się średnią po partii (batch). Oba człony mierzy się w natach (logarytm naturalny).

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
„− 1” tylko przesuwa minimum do zera: KL = 0 wtedy i tylko wtedy, gdy μ = 0 i σ = 1, czyli gdy q samo jest N(0, I). Pochodne, które program dodaje do gradientu: ∂KL/∂μj = μj oraz ∂KL/∂(log σj²) = ½(σj² − 1).
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.

Mówiąc prościej

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)
Przesunięta i rozciągnięta zmienna normalna jest znów normalna: zj ~ N(μj, σj²), czyli dokładnie próbka z q(z | x).
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

00000000000000000000111111111111111111112222222222222222222233333333333333333333444444444444444444445555555555555555555566666666666666666666777777777777777777778888888888888888888899999999999999999999 zwykły autoenkoder kod z₁ (bez jednostki) kod z₂ (bez jednostki) 00000000000000000000111111111111111111112222222222222222222233333333333333333333444444444444444444445555555555555555555566666666666666666666777777777777777777778888888888888888888899999999999999999999 VAE kod z₁ (bez jednostki) kod z₂ (bez jednostki)
Kody 200 cyfr testowych (k = 2); przerywane okręgi o promieniu 1 i 2 wokół początku układu

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.

autoenkoder, środek ± 2 odch. std. kod z₁ (bez jednostki) kod z₂ (bez jednostki) VAE, współrzędne od −2,2 do 2,2 kod z₁ (bez jednostki) kod z₂ (bez jednostki)
Dekoder na siatce 10 × 10 punktów przestrzeni latentnej

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.

00,050,10,15 k = 2 k = 8 k = 16 rozmiar kodu k (liczba liczb) odległość od cyfry (MSE)
Odległość wylosowanych obrazków od najbliższej cyfry treningowej (mniejsza = wiarygodniejsza) autoenkoder VAE prawdziwe cyfry losowy szum
rozmiar kodu krekonstrukcja AE (MSE)rekonstrukcja VAE (MSE)próbki AEpróbki VAE
20,0510,0630,0420,044
80,0250,0360,0900,054
160,0170,0390,1120,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.

autoenkoder VAE
Pierwsze dziesięć wylosowanych obrazków, kod o 8 wymiarach

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

β = 0,1 β = 1 β = 5
Wylosowane obrazki VAE (k = 2) przy różnym β

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.

AE: 1 → 7 VAE: 1 → 7 AE: 0 → 6 VAE: 0 → 6
Interpolacja w przestrzeni latentnej (k = 8)

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.

Agent na twoim komputerze, sterowany z telefonu