07 · Architektury · 5 min czytania · aktualizacja
Czym jest autoenkoder wariacyjny (VAE) i czym różni się od zwykłego autoenkodera?
W skrócie
VAE koduje dane jako rozkład w małej przestrzeni ukrytej i odtwarza z niego wejście. Kara KL porządkuje tę przestrzeń, więc można z niej losować próbki.
Co to jest
Autoenkoder wariacyjny (VAE, variational autoencoder) to model generatywny złożony z kodera i dekodera. Koder zamienia wejście (np. obraz) nie na jeden punkt, lecz na rozkład w małej przestrzeni ukrytej — podaje średnią μ i odchylenie σ. Z tego rozkładu losuje się punkt z, a dekoder próbuje z niego odtworzyć wejście. Trening dba jednocześnie o dobrą rekonstrukcję i o to, by rozkłady kodera przypominały standardowy rozkład normalny. Model zaproponowali Kingma i Welling (2014), niezależnie od nich podobny Rezende, Mohamed i Wierstra (2014).
Intuicja: zwykły autoenkoder to archiwista, który każdemu dokumentowi przypisuje dokładny adres na półce i rozstawia je, jak chce — z wielkimi pustymi przerwami. Jeśli sięgniesz w przerwę, nie znajdziesz nic sensownego. VAE każe archiwiście opisywać położenie trochę nieprecyzyjnie („gdzieś w tym rejonie”) i trzymać całą kolekcję blisko środka magazynu. Rejony się zazębiają, przerw nie ma — i z dowolnego miejsca w okolicy środka da się wyjąć coś, co wygląda jak dokument.
VAE służy do generowania danych, uczenia zwartych reprezentacji, wykrywania anomalii i interpolacji między przykładami. Wariant VAE stanowi też kluczowy element modeli dyfuzyjnych typu Stable Diffusion, które działają w przestrzeni ukrytej autoenkodera, a nie na pikselach.
Mechanizm — dlaczego tak działa
VAE maksymalizuje dolne ograniczenie wiarygodności danych (ELBO): ELBO = E_q[log p(x | z)] − KL(q(z | x) ‖ p(z)). Pierwszy składnik to jakość rekonstrukcji: jak dobrze dekoder odtwarza x z wylosowanego z. Drugi to dywergencja Kullbacka–Leiblera między rozkładem kodera q(z | x) = N(μ, σ²) a rozkładem a priori p(z) = N(0, 1). Dla rozkładów normalnych ma prosty wzór: KL = ½ · (μ² + σ² − 1 − ln σ²) dla każdego wymiaru.
Dwa składniki ciągną w przeciwne strony, i właśnie z tego bierze się porządek. Rekonstrukcja chciałaby, żeby każdy przykład miał własne, maleńkie σ i dowolnie odległe μ — wtedy dekoder zawsze wie, co odtworzyć. KL karze za oddalanie μ od zera i za zbyt małe σ. Kompromis: podobne przykłady lądują blisko siebie, ich rozkłady się nakładają, a cała przestrzeń jest wypełniona. Dlatego losując z ∼ N(0, 1) i podając do dekodera, dostajemy sensowne nowe próbki.
Problem techniczny: losowanie nie jest różniczkowalne, a trzeba przez nie przepuścić gradient do kodera. Rozwiązaniem jest sztuczka reparametryzacji: zamiast losować z wprost z N(μ, σ²), losuje się ε ∼ N(0, 1) i liczy z = μ + σ · ε. Losowość jest teraz w ε, które nie zależy od parametrów, a z jest zwykłą, różniczkowalną funkcją μ i σ.
Słabości: VAE często generuje rozmyte obrazy. Wynika to m.in. z prostego modelu szumu w dekoderze (np. gaussowskiego, co odpowiada stracie średniokwadratowej) — przy niepewności dekoder „uśrednia” możliwe odpowiedzi. Drugi problem to zapadanie się rozkładu a posteriori (posterior collapse): przy silnym dekoderze model ignoruje z, a KL spada do zera. Wariant β-VAE mnoży KL przez β > 1, co sprzyja rozplątanym, bardziej interpretowalnym wymiarom kosztem rekonstrukcji.
Na przykładzie
Kara KL dla jednego wymiaru: kod μ = 1, σ = 0,5 kosztuje ½ · (1 + 0,25 − 1 − ln 0,25) ≈ 0,82 nata. Kod „precyzyjny” μ = 0, σ = 0,1 kosztuje aż 1,81 — mimo że leży w środku — bo zbyt małe σ też jest karane. Kod μ = 2, σ = 1 kosztuje 2,0. Reparametryzacja: przy μ = 1, σ = 0,5 i wylosowanym ε = −1,2 dostajemy z = 1 + 0,5 · (−1,2) = 0,4.
Wytrenowaliśmy na całym zbiorze Digits (1797 obrazów 8×8) dwa modele o identycznej budowie (koder 64→128→2, dekoder 2→128→64, 200 epok, 3 ziarna): zwykły autoenkoder i VAE. Potem losowaliśmy 2000 punktów z N(0, 1), dekodowaliśmy je i sprawdzaliśmy regresją logistyczną wytrenowaną na Digits, jaką cyfrę przypominają. W autoenkoderze kody rozkładały się z odchyleniem 3,2–3,9, a wylosowane punkty dawały tylko 6–7 różnych cyfr, przy czym jedna stanowiła 39–51% próbek. W VAE odchylenie kodów wynosiło około 1,0, a próbki obejmowały wszystkie 10 cyfr; najczęstsza stanowiła 14–20%. Cena: nieco gorsza rekonstrukcja (entropia krzyżowa 20,7–21,1 nata na obraz wobec 20,1 w autoenkoderze) i kara KL około 2,4–2,7 nata.
Dane: Digits (ręcznie pisane cyfry 8×8)
W praktyce
- W PyTorch koder zwraca dwa wektory:
muilogvar(log σ² jest stabilniejszy niż σ); próbka:z = mu + torch.exp(0.5 logvar) torch.randn_like(mu). - Strata KL w kodzie:
-0.5 torch.sum(1 + logvar - mu*2 - logvar.exp(), dim=1).mean(). - Dla obrazów binarnych lub w [0, 1] rekonstrukcję liczy się
F.binary_cross_entropy_with_logits(..., reduction="sum")— sumą po pikselach, inaczej KL zdominuje stratę. - Gdy KL spada do zera (posterior collapse), pomaga stopniowe włączanie KL (KL annealing) od wagi 0 do 1.
- Typowy wymiar przestrzeni ukrytej: 2 do wizualizacji, 16–512 do generowania i reprezentacji.
Najczęstsze pytania
- Czym VAE różni się od zwykłego autoenkodera?
- Zwykły autoenkoder koduje każde wejście jako jeden punkt i nie dba o kształt przestrzeni ukrytej, więc losowe punkty dekodują się w bezsensowne obrazy. VAE koduje rozkład i dodaje karę KL, która wypełnia przestrzeń wokół zera — dzięki temu można z niej generować.
- Dlaczego obrazy z VAE są rozmyte?
- Bo dekoder z prostym modelem szumu przy niepewności zwraca średnią możliwych obrazów, a średnia wielu ostrych obrazów jest rozmyta. Lepsze dekodery, przestrzeń ukryta z dodatkową stratą przeciwstawną lub połączenie z dyfuzją znacznie to poprawiają.
- Do czego dziś używa się VAE?
- Jako kompresora w modelach dyfuzyjnych w przestrzeni ukrytej, do wykrywania anomalii (słaba rekonstrukcja = nietypowy przykład), w chemii do generowania cząsteczek i wszędzie tam, gdzie potrzebna jest gładka, interpretowalna przestrzeń reprezentacji.
Źródła
- Kingma, Welling „Auto-Encoding Variational Bayes”, ICLR 2014, arXiv:1312.6114.
- Rezende, Mohamed, Wierstra „Stochastic Backpropagation and Approximate Inference in Deep Generative Models”, ICML 2014.
- Higgins i in. „beta-VAE: Learning Basic Visual Concepts with a Constrained Variational Framework”, ICLR 2017.
- Goodfellow, Bengio, Courville „Deep Learning”, MIT Press, 2016, rozdz. 20.10.3.
- Murphy „Probabilistic Machine Learning: An Introduction”, MIT Press, 2022, rozdz. 20 („Dimensionality Reduction”), część o autoenkoderach wariacyjnych.