콘텐츠로 이동

변분추론은 "정확한 posterior를 바로 구하지 못할 때, 계산 가능한 근사 posterior를 두고 그 근사를 최대한 좋게 만들자"는 생각입니다. VAE는 이 생각을 신경망으로 구현한 대표적인 생성모델입니다. 이 강의에서는 잠재변수를 왜 두는지부터 시작해서, posterior가 왜 어려운지, ELBO가 왜 필요한지, 그리고 VAE가 그 식을 어떻게 실제 모델로 바꾸는지를 순서대로 설명합니다.

먼저 알아둘 말

  • 잠재변수: 직접 보이지는 않지만 데이터를 만든 원인이라고 가정하는 숨은 변수다.
  • prior: 데이터를 보기 전에 잠재변수에 대해 미리 두는 기본 분포다.
  • posterior: 데이터를 본 뒤 잠재변수가 어떨지에 대한 분포다.
  • 근사 posterior: 진짜 posterior 대신 계산하기 쉬운 형태로 둔 분포다.
  • 변분추론: 진짜 posterior를 직접 계산하지 않고, 근사 posterior를 학습하는 방법이다.
  • ELBO: 로그우도를 직접 키우기 어려울 때 대신 키우는 하한식이다.
  • 인코더: 데이터를 보고 잠재변수의 분포를 추정하는 부분이다.
  • 디코더: 잠재변수에서 다시 데이터를 만들어 내는 부분이다.
  • 재구성: 잠재변수에서 원래 입력과 비슷한 데이터를 복원하는 일이다.

이 강의에서 답할 질문

  • 데이터를 설명할 때 잠재변수를 두면 무엇이 좋아지는가?
  • posterior는 왜 직접 구하기 어려운가?
  • ELBO의 재구성 항과 KL 항은 각각 무엇을 조절하는가?
  • VAE에서 인코더와 디코더는 왜 동시에 필요한가?

먼저 떠올릴 장면

  • 손글씨 숫자 이미지를 볼 때, 우리는 픽셀 전체를 하나씩 기억하기보다 "이건 3에 가깝다", "기울기가 조금 있다", "두께가 진하다" 같은 숨은 특징을 먼저 떠올립니다.
  • 즉 보이는 데이터 뒤에는 더 단순한 설명 변수들이 있다고 생각하면 데이터를 더 잘 이해할 수 있습니다.
  • 문제는 그 숨은 설명 변수를 정확히 거꾸로 추론하는 계산이 보통 어렵다는 점입니다.

생각의 순서

  1. 먼저 잠재변수 생성모델이 어떤 가정을 두는지 봅니다.
  2. 그다음 데이터를 보고 잠재변수를 알고 싶어지는 이유를 봅니다.
  3. 이어서 posterior 계산이 왜 어려운지 확인합니다.
  4. 그래서 근사 posterior와 ELBO가 어떻게 등장하는지 설명합니다.
  5. 마지막으로 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는 단순한 생성기라기보다 "구조화된 잠재공간을 학습하는 생성모델"로 이해하는 편이 더 정확합니다.

예제

  1. 근사 posterior가 필요한 이유 문제: 진짜 posterior를 직접 쓰지 않고 근사 posterior를 두는 이유는 무엇인가? 풀이: posterior 계산에는 분모의 적분이 들어가며, 실제 모델에서는 이를 정확히 계산하기 어렵기 때문이다. 해설: 변분추론은 정확한 posterior를 포기하는 대신, 계산 가능한 근사를 두고 그 근사를 잘 만드는 방향으로 문제를 바꾼다.

  2. ELBO의 두 항 읽기 문제: ELBO의 재구성 항과 KL 항은 각각 무엇을 조절하는가? 풀이: 재구성 항은 입력을 잘 복원하도록 만들고, KL 항은 잠재분포가 prior에서 너무 멀어지지 않게 만든다. 해설: 복원만 강조하면 잠재공간이 무질서해지고, KL만 강조하면 복원이 약해질 수 있으므로 둘을 함께 봐야 한다.

  3. 인코더와 디코더의 역할 문제: VAE에서 인코더와 디코더는 각각 무엇을 맡는가? 풀이: 인코더는 데이터를 보고 잠재분포를 추정하고, 디코더는 그 잠재변수로부터 데이터를 다시 생성한다. 해설: 하나는 추론을, 다른 하나는 생성을 맡기 때문에 둘이 함께 있어야 잠재변수 모델을 end-to-end로 학습할 수 있다.

스스로 점검

연습 문제

  1. 잠재변수를 도입하면 데이터를 어떤 식으로 더 단순하게 설명할 수 있는지 설명하라.
  2. posterior 계산이 왜 어려운지 베이즈 공식과 함께 설명하라.
  3. ELBO의 두 항이 각각 무엇을 의미하는지 설명하라.
  4. reparameterization trick이 왜 필요한지 설명하라.

복습 질문

  1. VAE에서 근사하고 있는 분포는 무엇인가?
  2. ELBO는 어떤 두 목표를 동시에 잡는가?
  3. 인코더와 디코더는 각각 어느 방향의 문제를 푸는가?

체크포인트

  1. 잠재변수 생성모델의 기본 구조를 읽을 수 있다.
  2. posterior와 근사 posterior의 차이를 설명할 수 있다.
  3. ELBO가 왜 필요한지 말할 수 있다.
  4. VAE가 잠재공간 학습과 연결되는 이유를 설명할 수 있다.