VAE(Variational Autoencoder)는 2013년 Kingma와 Welling이 제안한 생성 모델로, 오토인코더와 베이지안 추론을 결합한다. 잠재 공간을 확률 분포로 모델링해 새로운 샘플을 생성할 수 있다.
핵심 아이디어
기존 오토인코더는 결정론적 잠재 벡터를 사용하지만, VAE는 잠재 변수 z를 정규 분포로 모델링한다.
인코더 → μ, σ (평균과 표준편차)
z = μ + ε·σ (재매개변수화 트릭, ε ~ N(0,1))
디코더 → 재구성 x̂
손실 함수
ELBO = 복원 손실 + KL 발산 규제
L = E[log p(x|z)] - KL(q(z|x) || p(z))
KL 발산이 잠재 공간을 표준 정규 분포에 가깝게 유지한다.
python
import torch
import torch.nn as nn
import torch.nn.functional as F
class VAE(nn.Module):
def __init__(self, input_dim=784, latent_dim=20):
super().__init__()
self.fc1 = nn.Linear(input_dim, 400)
self.fc_mu = nn.Linear(400, latent_dim)
self.fc_logvar = nn.Linear(400, latent_dim)
self.fc2 = nn.Linear(latent_dim, 400)
self.fc3 = nn.Linear(400, input_dim)
def encode(self, x):
h = F.relu(self.fc1(x))
return self.fc_mu(h), self.fc_logvar(h)
def reparameterize(self, mu, logvar):
std = torch.exp(0.5 * logvar)
eps = torch.randn_like(std)
return mu + eps * std
def decode(self, z):
h = F.relu(self.fc2(z))
return torch.sigmoid(self.fc3(h))
def forward(self, x):
mu, logvar = self.encode(x)
z = self.reparameterize(mu, logvar)
return self.decode(z), mu, logvar
def vae_loss(recon_x, x, mu, logvar):
recon = F.binary_cross_entropy(recon_x, x, reduction='sum')
kld = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
return recon + kld
VAE vs GAN
| 항목 | VAE | GAN |
|---|
| 학습 안정성 | 안정적 | 불안정 (모드 붕괴) |
| 출력 품질 | 다소 흐림 | 선명 |
| 잠재 공간 | 연속적, 보간 용이 | 불연속적 |
| 확률론적 해석 | 명확 | 없음 |
관련 개념