VAE 이해: Latent Variable Model부터 ELBO, Reparameterization까지
일반 autoencoder는 입력을 압축했다가 복원하는 구조지만, 그 latent vector가 샘플링 가능한 확률공간이라는 보장은 없다. VAE는 latent를 확률변수로 두고, "보이지 않는 원인 변수 \(z\)가 데이터를 생성한다"는 생성 모델 관점으로 문제를 다시 세운다.
그래서 VAE는 단순 압축기가 아니라 확률 생성 모델이다. latent가 단순 숫자 배열이 아니라 분포 위의 변수라는 점이 핵심이고, 이 차이 때문에 ELBO, KL, reparameterization trick이 모두 등장한다.
그림으로 먼저 보기
1. Latent Variable Model이란 무엇인가
Latent Variable Model은 데이터 \(x\)를 직접 설명하는 대신, 그 뒤에 숨어 있는 잠재변수 \(z\)가 있다고 가정하는 모델이다.
이 관점이 중요한 이유는 복잡한 데이터를 더 작은 원인 구조로 설명하게 해주기 때문이다. 얼굴 이미지라면 표정, 조명, 시점 같은 잠재 요인이 있을 수 있고, VAE는 이런 숨은 요인을 확률적으로 다루는 틀을 제공한다.
이 식의 뜻은 "관측 데이터 \(x\)의 확률은, 모든 가능한 잠재변수 \(z\)를 고려해 합치거나 적분한 결과"라는 것이다.
예를 들어 얼굴 이미지 \(x\)가 있다고 하자. 이 이미지를 직접 설명하는 대신, 그 뒤에
- 표정
- 조명
- 시점
- 머리 모양
같은 잠재 요인 \(z\)가 있다고 생각하면, 데이터 구조를 훨씬 더 자연스럽게 설명할 수 있다.
2. 생성 모델 관점에서 VAE는 무엇을 배우나
VAE는 두 가지를 같이 배운다.
- Decoder \(p(x|z)\): 잠재변수 \(z\)가 주어졌을 때 데이터를 어떻게 생성할지
- Encoder \(q(z|x)\): 관측 데이터 \(x\)를 보고 어떤 잠재변수 \(z\)가 그럴듯한지
여기서 중요한 점은 decoder는 생성 모델이고, encoder는 추론 모델이라는 점이다. 즉 decoder는 "원인에서 결과로", encoder는 "결과에서 원인으로" 가는 방향이다.
3. 왜 직접 likelihood를 최대화하지 못하나
우리가 진짜로 최대화하고 싶은 것은 데이터 likelihood \(p(x)\) 또는 데이터셋 전체에 대한 \(\log p(x)\)다.
문제는 이 적분이 보통 닫힌 형태로 계산되지 않는다는 것이다. 잠재변수 공간이 고차원이고 신경망이 들어가면, 정확한 posterior \(p(z|x)\)도 계산하기 어렵다.
즉 VAE의 핵심 문제는 단순히 생성이 아니라, 잠재변수가 들어간 확률모델의 추론이 어렵다는 데 있다.
4. Variational Inference: 어려운 posterior를 근사하자
그래서 VAE는 진짜 posterior \(p(z|x)\)를 직접 구하려 하지 않고, 계산 가능한 근사 posterior \(q(z|x)\)를 따로 만든다. 이것이 variational inference 관점이다.
이 근사 분포가 보통 encoder 네트워크의 출력이다.
5. ELBO는 왜 등장하나
우리는 \(\log p(x)\)를 직접 최대화하기 어렵기 때문에, 대신 그 아래쪽 경계(lower bound)를 최대화한다. 그 하한이 바로 ELBO다.
즉 ELBO를 크게 만들면, 직접 다루기 어려운 \(\log p(x)\)도 같이 커지는 방향으로 간다.
6. ELBO 공식
이 식은 VAE를 이해하는 핵심이다. 두 항의 역할이 완전히 다르다.
- 재구성 항 \(\mathbb{E}_{q(z|x)}[\log p(x|z)]\): latent \(z\)만 보고 원래 데이터를 잘 복원하게 만든다.
- KL 항 \(D_{KL}(q(z|x)\parallel p(z))\): encoder가 만든 잠재분포가 prior에서 너무 멀어지지 않게 만든다.
즉 VAE는 "복원 잘하기"와 "잠재공간을 정돈하기"를 동시에 요구하는 모델이다.
7. ELBO를 loss로 보면 어떻게 되나
딥러닝에서는 보통 최소화 문제를 쓰므로, 실제 구현에서는 \(-ELBO\)를 loss로 사용한다.
그러면 해석은 더 익숙해진다.
- 재구성 loss는 작을수록 좋다.
- KL regularization도 적절히 제어되어야 한다.
즉 VAE loss는 "reconstruction loss + latent regularization"으로 읽으면 된다.
8. 왜 KL이 직접 loss에 들어가나
일반 분류 문제에서는 KL이 cross-entropy 안에 숨어 있는 경우가 많다. 하지만 VAE에서는 KL divergence가 수식 속 해석용 개념이 아니라, 실제 loss 함수 항으로 직접 들어간다.
그 이유는 latent posterior \(q(z|x)\)를 prior \(p(z)\) 근처로 유지해야 샘플링이 가능한 잠재공간이 만들어지기 때문이다. 만약 이 항이 없으면 latent space가 제멋대로 흩어져서, 학습 후 \(z \sim p(z)\)로 샘플링했을 때 그럴듯한 데이터가 잘 안 나올 수 있다.
9. Reparameterization Trick은 왜 필요한가
문제는 \(z \sim q(z|x)\)처럼 샘플링이 들어가면, gradient를 encoder 파라미터까지 바로 전달하기 어렵다는 점이다. 샘플링 연산이 미분 경로를 끊어 버리기 때문이다.
그래서 VAE는 샘플링을 다음처럼 다시 쓴다.
이 식의 의미는 "랜덤성은 \(\epsilon\)에서만 가져오고, \(\mu, \sigma\)는 신경망이 결정하게 하자"는 것이다. 이렇게 하면 샘플링을 포함한 전체 계산 그래프가 다시 미분 가능해진다.
10. Encoder는 실제로 무엇을 출력하나
보통 encoder는 latent vector 자체를 바로 내지 않고, 잠재분포의 평균 \(\mu(x)\)와 분산 또는 log-variance \(\log \sigma^2(x)\)를 출력한다.
- \(\mu\): latent 분포의 중심
- \(\sigma\): 불확실성 또는 퍼짐 정도
즉 VAE의 encoder는 deterministic code를 만드는 것이 아니라, "이 입력에 대해 latent가 어디쯤 있고 얼마나 퍼져 있어야 하는가"를 예측하는 네트워크다.
11. VAE와 일반 Autoencoder 차이
- Autoencoder: latent를 그냥 압축표현으로 사용
- VAE: latent를 확률분포로 모델링
그래서 일반 autoencoder는 표현 학습에는 좋을 수 있지만, latent 공간에서 임의 샘플을 뽑아 새로운 데이터를 생성하는 데는 약하다. 반면 VAE는 학습 과정에서 latent space를 정돈하므로, 샘플링 기반 생성이 자연스럽다.
12. VAE의 생성 과정
학습이 끝난 뒤에는 prior에서 latent를 샘플링하고 decoder에 넣으면 된다.
이게 VAE가 "생성 모델"인 이유다. 학습할 때부터 latent를 prior에 맞춰 두었기 때문에, 추론 시에도 prior에서 바로 샘플링할 수 있다.
13. VAE의 장점과 한계
- 장점: latent space가 해석 가능하고, 샘플링이 자연스럽고, 학습이 비교적 안정적이다.
- 한계: 생성 이미지가 GAN보다 흐리게 나오는 경우가 많고, ELBO 최적화가 항상 perceptual quality와 일치하지는 않는다.
14. 체크리스트
- Latent Variable Model이 무엇인지 설명할 수 있는가?
- 왜 \(\log p(x)\)를 직접 최대화하기 어려운가?
- ELBO의 두 항이 각각 무슨 역할을 하는가?
- 왜 KL이 VAE loss에 직접 들어가야 하는가?
- Reparameterization Trick이 gradient 문제를 어떻게 해결하는가?
- 일반 Autoencoder와 VAE의 핵심 차이를 설명할 수 있는가?