Wariacyjne autoenkodery (VAE)
Strata ELBO, trik reparametryzacji, eksploracja przestrzeni ukrytej, generowanie obrazów za pomocą VAE.
Wariacyjne autoenkodery (VAE) to bezpłatna lekcja Learn AI with Python na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn AI with Python, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn AI with Python zawiera 4 lekcji w sumie.
Od autoenkodera do VAE
Zwykły autoenkoder uczy się rozproszonych punktów, więc próbkowanie nowych punktów daje bezwartościowe wyniki. Wariacyjny autoenkoder (VAE) uczy się gładkiej, ciągłej przestrzeni latentnej, z której można próbkować, przekształcając ją w prawdziwy model generatywny.
Kodowanie do rozkładu
Zamiast pojedynczego punktu enkoder VAE zwraca dla każdego wejścia rozkład: średnią mu i logarytm wariancji log_var. Każde wejście jest odwzorowywane na mały, rozmyty obszar przestrzeni latentnej, a nie na pojedynczą kropkę.
class Encoder(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(784, 256)
self.fc_mu = nn.Linear(256, 64)
self.fc_logvar = nn.Linear(256, 64)Dlaczego mu i log_var
Przewidujemy log_var zamiast bezpośredniej wariancji, ponieważ może przyjmować dowolną liczbę rzeczywistą, bez ograniczenia do wartości dodatnich, a ponadto zapewnia stabilność numeryczną. W razie potrzeby potęgowanie pozwala odzyskać wariancję.
def forward(self, x):
h = torch.relu(self.fc(x))
return self.fc_mu(h), self.fc_logvar(h)Próbkowanie zmiennej latentnej z
Aby dekodować dane, musimy próbkować z z przewidzianego rozkładu. Naiwne losowanie nie jest różniczkowalne, więc nie możemy propagować wstecz przez ten etap. Rozwiązaniem jest trik reparametryzacji.
Trik reparametryzacji
Przepisujemy próbkę jako z = mu + eps * exp(0.5 * log_var), gdzie eps jest losowym szumem. Losowość znajduje się teraz w eps (gradient nie jest tam potrzebny), a gradienty przepływają przez mu i log_var.
def reparameterize(mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * stdDekoder
Dekoder przyjmuje wylosowane z i rekonstruuje obraz, podobnie jak dekoder zwykłego autoenkodera, rozwijając 64 wymiary z powrotem do 784 pikseli za pomocą wyjścia Sigmoid.
decoder = nn.Sequential(
nn.Linear(64, 256),
nn.ReLU(),
nn.Linear(256, 784),
nn.Sigmoid()
)Składnik straty rekonstrukcji
Pierwsza część straty VAE dotyczy rekonstrukcji: tego, jak dobrze zdekodowany obraz odpowiada danym wejściowym. Dla pikseli stosuje się binarną entropię krzyżową (lub MSE).
recon_loss = nn.functional.binary_cross_entropy(
recon, x, reduction="sum"
)Składnik dywergencji KL
Drugą częścią jest dywergencja KL, która przyciąga każdy zakodowany rozkład do standardowego rozkładu normalnego. Reguluje to przestrzeń latentną, nadając jej gładkość i ciągłość niezbędną do generowania.
kl = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())Cel ELBO
Modele VAE maksymalizują ELBO (dolne ograniczenie wiarygodności, Evidence Lower Bound), co jest równoważne minimalizowaniu wyrażenia reconstruction + KL. Rekonstrukcja zapewnia wierność wyników, a KL utrzymuje odpowiedni kształt przestrzeni. Cała trudność polega na znalezieniu równowagi między tymi składnikami.
loss = recon_loss + kl
loss.backward()Generowanie nowych obrazów
Ponieważ przestrzeń latentna odpowiada standardowemu rozkładowi normalnemu, można generować zupełnie nowe obrazy, próbkować z z N(0,1) i dekodować je bez potrzeby podawania obrazu wejściowego.
with torch.no_grad():
z = torch.randn(16, 64)
new_images = decoder(z) # 16 generated samplesDlaczego VAE są ważne?
Modele VAE zapewniają uzasadnioną teoretycznie, gładką przestrzeń latentną, w której można interpolować i próbkować. Stanowią podstawę wielu technik generatywnych i uczą kluczowej idei modelowania rozkładów, a nie tylko punktów.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat VAE.
Podsumowanie: wariacyjne autoenkodery
Poznano model VAE: enkoder zwraca mu i log_var, a trik reparametryzacji z = mu + eps * exp(0.5 * log_var) sprawia, że próbkowanie pozostaje różniczkowalne. Strata ma postać ELBO = rekonstrukcja + KL. Próbkowanie z z N(0,1) i dekodowanie pozwala generować nowe obrazy.
Często zadawane pytania
Czy lekcja „Wariacyjne autoenkodery (VAE)” jest bezpłatna?
Tak — pełny tekst „Wariacyjne autoenkodery (VAE)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn AI with Python, przejdź na CoddyKit PRO. Kurs Learn AI with Python zawiera 4 lekcji w sumie.
Co nauczysz się w „Wariacyjne autoenkodery (VAE)”?
Strata ELBO, trik reparametryzacji, eksploracja przestrzeni ukrytej, generowanie obrazów za pomocą VAE. Ćwiczysz Learn AI with Python z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Learn AI with Python?
Nie wymagamy żadnego doświadczenia. Learn AI with Python w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wariacyjne autoenkodery (VAE)”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Learn AI with Python?
Tak. Każda lekcja Learn AI with Python zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Autoenkodery do uczenia reprezentacji
- Wariacyjne autoenkodery (VAE)
- GAN-y: generator i dyskryminator
- Warunkowe GAN-y i transfer stylu