변분추론은 "정확한 posterior를 바로 구하지 못할 때, 계산 가능한 근사 posterior를 두고 그 근사를 최대한 좋게 만들자"는 생각입니다. VAE는 이 생각을 신경망으로 구현한 대표적인 생성모델입니다. 이 강의에서는 잠재변수를 왜 두는지부터 시작해서, posterior가 왜 어려운지, ELBO가 왜 필요한지, 그리고 VAE가 그 식을 어떻게 실제 모델로 바꾸는지를 순서대로 설명합니다.
먼저 알아둘 말
- 잠재변수: 직접 보이지는 않지만 데이터를 만든 원인이라고 가정하는 숨은 변수다.
- prior: 데이터를 보기 전에 잠재변수에 대해 미리 두는 기본 분포다.
- posterior: 데이터를 본 뒤 잠재변수가 어떨지에 대한 분포다.
- 근사 posterior: 진짜 posterior 대신 계산하기 쉬운 형태로 둔 분포다.
- 변분추론: 진짜 posterior를 직접 계산하지 않고, 근사 posterior를 학습하는 방법이다.
- ELBO: 로그우도를 직접 키우기 어려울 때 대신 키우는 하한식이다.
- 인코더: 데이터를 보고 잠재변수의 분포를 추정하는 부분이다.
- 디코더: 잠재변수에서 다시 데이터를 만들어 내는 부분이다.
- 재구성: 잠재변수에서 원래 입력과 비슷한 데이터를 복원하는 일이다.
이 강의에서 답할 질문
- 데이터를 설명할 때 잠재변수를 두면 무엇이 좋아지는가?
- posterior는 왜 직접 구하기 어려운가?
- ELBO의 재구성 항과 KL 항은 각각 무엇을 조절하는가?
- VAE에서 인코더와 디코더는 왜 동시에 필요한가?
먼저 떠올릴 장면
- 손글씨 숫자 이미지를 볼 때, 우리는 픽셀 전체를 하나씩 기억하기보다 "이건 3에 가깝다", "기울기가 조금 있다", "두께가 진하다" 같은 숨은 특징을 먼저 떠올립니다.
- 즉 보이는 데이터 뒤에는 더 단순한 설명 변수들이 있다고 생각하면 데이터를 더 잘 이해할 수 있습니다.
- 문제는 그 숨은 설명 변수를 정확히 거꾸로 추론하는 계산이 보통 어렵다는 점입니다.
생각의 순서
- 먼저 잠재변수 생성모델이 어떤 가정을 두는지 봅니다.
- 그다음 데이터를 보고 잠재변수를 알고 싶어지는 이유를 봅니다.
- 이어서 posterior 계산이 왜 어려운지 확인합니다.
- 그래서 근사 posterior와 ELBO가 어떻게 등장하는지 설명합니다.
- 마지막으로 VAE가 이 생각을 인코더와 디코더로 어떻게 구현하는지 연결합니다.
본문
생성모델은 데이터를 그냥 관측값으로만 보지 않습니다. "보이는 데이터는 어떤 숨은 원인에서 나왔다"라고 가정합니다. 이 숨은 원인을 잠재변수라고 하고
$$ z $$
로 적겠습니다. 그러면 관측 데이터
$$ x $$
는 보통 다음처럼 표현합니다.
$$ p_\theta(x, z) = p_\theta(x \mid z)p(z) $$
여기서
$$ p(z) $$
는 잠재변수의 기본 분포인 prior이고,
$$ p_\theta(x \mid z) $$
는 잠재변수에서 실제 데이터를 생성하는 규칙입니다. 이 식은 "먼저 숨은 원인
$$ z $$
를 뽑고, 그다음 그 원인으로부터 데이터
$$ x $$
를 만든다"는 생성 과정을 뜻합니다.
이제 데이터
$$ x $$
를 하나 보았다고 합시다. 우리는 자연스럽게 "이 데이터를 만들었을 법한
$$ z $$
는 무엇일까?"를 묻게 됩니다. 이 질문의 답이 posterior입니다.
$$ p_\theta(z \mid x) $$
는 데이터를 본 뒤 잠재변수가 어떻게 분포하는지를 말해 줍니다. 즉 생성 과정을 거꾸로 읽는 분포라고 생각할 수 있습니다.
문제는 이 posterior를 직접 계산하기가 어렵다는 점입니다. 베이즈 공식으로 쓰면
$$ p_\theta(z \mid x) = \frac{p_\theta(x \mid z)p(z)}{p_\theta(x)} $$
가 됩니다. 그런데 분모
$$ p_\theta(x) = \int p_\theta(x \mid z)p(z)\,dz $$
는 가능한 모든
$$ z $$
를 다 적분해서 더해야 하므로, 실제 모델에서는 계산이 매우 어렵거나 아예 닫힌형태가 없습니다. 바로 여기서 변분추론이 필요해집니다.
변분추론은 진짜 posterior 대신 계산 가능한 근사 posterior
$$ q_\phi(z \mid x) $$
를 하나 둡니다. 그리고 이 분포가 진짜 posterior와 최대한 비슷해지도록 학습합니다. 즉 "정확한 역문제"를 푸는 대신, "계산 가능한 좋은 근사 역문제"를 푼다고 보면 됩니다.
이 과정을 학습하기 위해 등장하는 식이 ELBO입니다.
$$ \log p_\theta(x) \ge \mathbb{E}{q\phi(z \mid x)}[\log p_\theta(x \mid z)] - D_{\mathrm{KL}}!\bigl(q_\phi(z \mid x)\,|\,p(z)\bigr) $$
이 식은 두 부분으로 읽어야 합니다. 첫 번째 항
$$ \mathbb{E}{q\phi(z \mid x)}[\log p_\theta(x \mid z)] $$
은 잠재변수
$$ z $$
로부터 원래 데이터
$$ x $$
를 잘 복원하라는 뜻입니다. 그래서 재구성 항이라고 부릅니다.
두 번째 항
$$ D_{\mathrm{KL}}!\bigl(q_\phi(z \mid x)\,|\,p(z)\bigr) $$
은 근사 posterior가 prior에서 너무 멀리 벗어나지 않게 만드는 항입니다. 이 항이 없으면 각 데이터마다 잠재공간이 제멋대로 흩어질 수 있습니다. 반대로 이 항만 너무 강하면 복원이 나빠집니다. 즉 ELBO는 "복원은 잘하되, 잠재공간은 질서 있게 유지하라"는 균형을 잡는 식입니다.
VAE는 이 식을 신경망으로 구현합니다. 인코더는 입력
$$ x $$
를 받아
$$ q_\phi(z \mid x) $$
의 평균과 분산 같은 모수를 출력합니다. 디코더는 그렇게 얻은 잠재변수
$$ z $$
를 받아 원래 데이터
$$ x $$
를 다시 복원합니다. 인코더는 "관측값에서 잠재변수로 가는 추론기"이고, 디코더는 "잠재변수에서 관측값으로 가는 생성기"입니다.
여기서 한 가지 계산 문제가 더 있습니다. 잠재변수는 분포에서 샘플링해야 하는데, 샘플링이 끼면 gradient를 흘리기 어렵습니다. 그래서 VAE는 reparameterization trick을 씁니다.
$$ z = \mu(x) + \sigma(x) \odot \varepsilon, \qquad \varepsilon \sim \mathcal{N}(0, I) $$
이렇게 쓰면 무작위성은
$$ \varepsilon $$
쪽으로 분리되고,
$$ \mu(x), \sigma(x) $$
는 미분 가능한 경로 안에 남습니다. 그래서 샘플링이 있어도 인코더 파라미터까지 gradient를 보낼 수 있습니다.
결국 VAE는 데이터를 잠재공간으로 압축하고, 그 잠재공간이 너무 흐트러지지 않도록 정리하면서, 다시 원래 데이터를 복원하는 모델입니다. 그래서 VAE는 단순한 생성기라기보다 "구조화된 잠재공간을 학습하는 생성모델"로 이해하는 편이 더 정확합니다.
예제
-
근사 posterior가 필요한 이유 문제: 진짜 posterior를 직접 쓰지 않고 근사 posterior를 두는 이유는 무엇인가? 풀이: posterior 계산에는 분모의 적분이 들어가며, 실제 모델에서는 이를 정확히 계산하기 어렵기 때문이다. 해설: 변분추론은 정확한 posterior를 포기하는 대신, 계산 가능한 근사를 두고 그 근사를 잘 만드는 방향으로 문제를 바꾼다.
-
ELBO의 두 항 읽기 문제: ELBO의 재구성 항과 KL 항은 각각 무엇을 조절하는가? 풀이: 재구성 항은 입력을 잘 복원하도록 만들고, KL 항은 잠재분포가 prior에서 너무 멀어지지 않게 만든다. 해설: 복원만 강조하면 잠재공간이 무질서해지고, KL만 강조하면 복원이 약해질 수 있으므로 둘을 함께 봐야 한다.
-
인코더와 디코더의 역할 문제: VAE에서 인코더와 디코더는 각각 무엇을 맡는가? 풀이: 인코더는 데이터를 보고 잠재분포를 추정하고, 디코더는 그 잠재변수로부터 데이터를 다시 생성한다. 해설: 하나는 추론을, 다른 하나는 생성을 맡기 때문에 둘이 함께 있어야 잠재변수 모델을 end-to-end로 학습할 수 있다.
스스로 점검
연습 문제
- 잠재변수를 도입하면 데이터를 어떤 식으로 더 단순하게 설명할 수 있는지 설명하라.
- posterior 계산이 왜 어려운지 베이즈 공식과 함께 설명하라.
- ELBO의 두 항이 각각 무엇을 의미하는지 설명하라.
- reparameterization trick이 왜 필요한지 설명하라.
복습 질문
- VAE에서 근사하고 있는 분포는 무엇인가?
- ELBO는 어떤 두 목표를 동시에 잡는가?
- 인코더와 디코더는 각각 어느 방향의 문제를 푸는가?
체크포인트
- 잠재변수 생성모델의 기본 구조를 읽을 수 있다.
- posterior와 근사 posterior의 차이를 설명할 수 있다.
- ELBO가 왜 필요한지 말할 수 있다.
- VAE가 잠재공간 학습과 연결되는 이유를 설명할 수 있다.