검색
← 모듈 로드맵

오토인코더에서 VAE까지: 병목 · 잠재 공간 · ELBO 손계산

강의 · 입문자 · KAITABASE 정리

원제 · From Autoencoders to VAEs (Stanford CS236 VAE 노트 참고)

오토인코더 병목에서 ELBO 유도 · 정규분포 KL · β-VAE · VQ-VAE까지 손계산으로 잇는 수업

먼저 알아야 할 것

생성 모델 총론KL 발산정규분포역전파와 MLP

다루는 내용

오토인코더의 병목과 잡음 제거 오토인코더에서 출발해, 보통 오토인코더로 생성이 어려운 이유를 설명합니다. 로그 가능도 = ELBO + KL 간극을 유도하고 이산 2칸 예로 세 값을 계산하며, 정규분포 KL 닫힌 식과 재매개변수화를 정리합니다. β-VAE와 VQ-VAE(코드북 · straight-through)가 ELBO를 어떻게 바꿔 쓰는지 다룹니다.

해설

오토인코더에서 VAE까지: 병목 · 잠재 공간 · ELBO 손계산

오토인코더(autoencoder) 는 입력을 작은 벡터로 줄였다가 다시 펼쳐 원래대로 되돌리도록 배우는 신경망입니다. 이것을 확률 모델로 바꾸면 새 데이터를 뽑을 수 있는 변분 오토인코더(VAE) 가 됩니다. 이 수업은 그 사이를 한 걸음씩 잇습니다 — 병목, 잡음 제거, 잠재 공간, ELBO 유도(이산 2칸짜리 예로 손계산), 정규분포 KL, β-VAE, VQ-VAE.

항목내용
참고 출처스탠퍼드 CS236 강의 노트 Variational Autoencoders, 원 논문 Kingma · Welling(2013), Vincent 외(ICML 2008), Higgins 외(ICLR 2017), van den Oord 외(2017)
트랙 · 수준생성 모델 · 기초
이 수업이 다루는 범위오토인코더와 병목, 잡음 제거 오토인코더, 잠재 공간의 구멍 문제, ELBO 유도와 간극, 정규분포 KL 닫힌 식, 재매개변수화 요약, β-VAE, VQ-VAE

들어가기 전에

한눈에 보기

  • 오토인코더가 "압축 → 복원" 오차로 학습한다는 것과, 병목이 왜 필요한지 압니다.
  • 보통 오토인코더로는 새 표본을 뽑기 어려운 이유(잠재 공간의 구멍)를 이해합니다.
  • log⁡p(x)=ELBO+KL\log p(x) = \text{ELBO} + \text{KL} 을 유도하고, 2칸짜리 이산 예로 세 값을 직접 계산합니다.
  • 정규분포 KL의 닫힌 식 12(μ2+σ2−1−ln⁡σ2)\tfrac12(\mu^2+\sigma^2-1-\ln\sigma^2) 에 숫자를 넣어 봅니다.
  • β-VAE와 VQ-VAE가 ELBO를 어떻게 바꿔 쓰는지, 그리고 이후 모델(Stable Diffusion, Genie)과 어떻게 이어지는지 압니다.

1. 오토인코더: 좁은 문을 통과시키기

직관(해설용 비유). 긴 회의록을 세 줄 요약으로 줄였다가 다시 회의록으로 풀어 쓰는 연습을 한다고 해 봅시다. 세 줄에 담을 수 있는 것은 핵심뿐이라서, 이 연습을 반복하면 "무엇이 핵심인지"를 저절로 배웁니다.

단계.

  1. 인코더 ff 가 입력 xx 를 작은 벡터 z=f(x)z=f(x) 로 줄입니다(병목, bottleneck).
  2. 디코더 gg 가 zz 를 다시 x^=g(z)\hat x=g(z) 로 펼칩니다.
  3. 복원 오차 ∥x−x^∥2\|x-\hat x\|^2 를 줄이도록 둘을 함께 학습합니다.
LAE=1N∑i=1N∥xi−g(f(xi))∥2\mathcal{L}_{\text{AE}} = \frac1N\sum_{i=1}^{N}\big\|x_i - g(f(x_i))\big\|^2
기호뜻
ff인코더 신경망(입력 → 잠재 벡터)
gg디코더 신경망(잠재 벡터 → 복원)
z=f(x)z=f(x)잠재 벡터(코드). 입력보다 차원이 작음
NN학습 데이터 개수

숫자로 해 보기(해설용). 28×28 흑백 이미지(784차원)를 32차원으로 줄이면 784/32=24.5784/32=24.5 배 압축입니다. 병목이 없으면(잠재 차원 ≥ 입력 차원) 신경망은 그냥 입력을 그대로 베껴 오차 0을 만들 수 있어 아무것도 배우지 않습니다. 그래서 병목이 필요합니다.

잡음 제거 오토인코더(denoising autoencoder). Vincent 외(ICML 2008)는 입력 일부를 일부러 망가뜨린 x~\tilde x 를 넣고 원래 xx 를 복원하게 했습니다. 베끼기만으로는 풀 수 없으니 데이터의 구조를 배웁니다. "망가진 것에서 원래를 되찾기"라는 아이디어는 훗날 확산 모델의 잡음 제거와 같은 뿌리입니다.

2. 왜 보통 오토인코더로는 생성이 어렵나

새 이미지를 만들려면 잠재 공간에서 아무 zz 를 골라 디코더에 넣으면 될 것 같습니다. 하지만 보통 오토인코더는 학습 데이터의 코드가 잠재 공간 여기저기 띄엄띄엄 놓이도록 배웁니다. 코드 사이의 빈 곳(구멍)을 디코더에 넣으면 이상한 결과가 나옵니다.

해결 방향. 두 가지를 요구하면 됩니다.

  1. 코드들이 미리 정한 단순한 분포(예: 표준 정규분포 N(0,I)\mathcal N(0,I)) 근처에 모이게 한다.
  2. 각 입력을 점 하나가 아니라 작은 구름(분포) 으로 보내, 이웃 구름끼리 겹치며 빈틈을 메우게 한다.

이 두 요구를 확률적으로 정확히 표현한 것이 VAE의 목표 함수 ELBO입니다.

3. ELBO 유도: 로그 가능도 = 하한 + 간극

설정. 사전 분포 p(z)p(z), 디코더 pθ(x∣z)p_\theta(x\mid z), 그리고 진짜 사후분포 pθ(z∣x)p_\theta(z\mid x) 를 흉내 내는 인코더 qϕ(z∣x)q_\phi(z\mid x) 를 둡니다.

단계.

  1. log⁡p(x)\log p(x) 는 zz 와 무관하므로 qq 로 평균을 내도 그대로입니다: log⁡p(x)=Eq[log⁡p(x)]\log p(x)=\mathbb E_{q}[\log p(x)].
  2. 베이즈 정리로 p(x)=p(x,z)p(z∣x)p(x)=\dfrac{p(x,z)}{p(z\mid x)} 를 넣고, 분자 · 분모에 q(z∣x)q(z\mid x) 를 곱하고 나눕니다.
  3. 로그를 두 덩어리로 나눕니다.
log⁡pθ(x)=Eqϕ(z∣x) ⁣[log⁡pθ(x,z)qϕ(z∣x)]⏟ELBO  +  DKL(qϕ(z∣x) ∥ pθ(z∣x))⏟≥0 (간극)\log p_\theta(x) = \underbrace{\mathbb{E}_{q_\phi(z\mid x)}\!\left[\log\frac{p_\theta(x,z)}{q_\phi(z\mid x)}\right]}_{\text{ELBO}} \;+\; \underbrace{D_{\mathrm{KL}}\big(q_\phi(z\mid x)\,\|\,p_\theta(z\mid x)\big)}_{\ge 0\ \text{(간극)}}

KL은 항상 0 이상이므로 ELBO는 log⁡p(x)\log p(x) 의 하한 입니다. ELBO를 다시 정리하면 학습에 쓰는 꼴이 나옵니다.

ELBO=Eq[log⁡pθ(x∣z)]⏟복원 항−DKL(qϕ(z∣x) ∥ p(z))⏟사전 분포와의 거리\text{ELBO} = \underbrace{\mathbb{E}_{q}[\log p_\theta(x\mid z)]}_{\text{복원 항}} - \underbrace{D_{\mathrm{KL}}\big(q_\phi(z\mid x)\,\|\,p(z)\big)}_{\text{사전 분포와의 거리}}
기호뜻
qϕ(z∣x)q_\phi(z\mid x)인코더가 내는 잠재 변수 분포(입력마다 다른 구름)
pθ(x∣z)p_\theta(x\mid z)디코더가 내는 복원 분포
p(z)p(z)사전 분포(보통 N(0,I)\mathcal N(0,I))
복원 항구름에서 뽑은 zz 로 xx 를 잘 복원하는가
KL 항구름이 사전 분포에서 너무 멀어지지 않았는가(2절의 요구 1)

숫자로 해 보기(해설용, 이산 2칸 예). 잠재 변수가 z∈{0,1}z\in\{0,1\} 두 값뿐이라고 합시다. p(z=0)=p(z=1)=0.5p(z{=}0)=p(z{=}1)=0.5, 관측한 xx 에 대해 p(x∣z=0)=0.2p(x\mid z{=}0)=0.2, p(x∣z=1)=0.6p(x\mid z{=}1)=0.6 입니다.

  • 진짜 가능도: p(x)=0.5(0.2)+0.5(0.6)=0.4p(x)=0.5(0.2)+0.5(0.6)=0.4, log⁡p(x)=ln⁡0.4≈−0.916\log p(x)=\ln0.4\approx-0.916
  • 진짜 사후분포: p(z=1∣x)=0.3/0.4=0.75p(z{=}1\mid x)=0.3/0.4=0.75

인코더 qq 를 바꿔 가며 ELBO를 계산하면 다음과 같습니다.

인코더 q(z=0),q(z=1)q(z{=}0),q(z{=}1)복원 항KL(q‖사전)ELBO간극 KL(q‖사후)
(0.5, 0.5)−1.0600−1.0600.144
(0.1, 0.9)−0.6210.368−0.9890.072
(0.25, 0.75) = 사후분포−0.7850.131−0.9160

세 줄 모두 "ELBO + 간극 = −0.916" 이 맞습니다. 인코더가 진짜 사후분포와 같아지면 간극이 0이 되고 ELBO가 로그 가능도와 같아집니다. 둘째 줄처럼 복원만 욕심내 z=1z{=}1 쪽으로 쏠리면 KL 항 벌점이 커져 오히려 손해입니다.

왜 이렇게 하나. log⁡p(x)\log p(x) 를 직접 키우려면 적분이 필요하지만, ELBO는 qq 에서 zz 를 몇 개 뽑아 평균을 내면 계산됩니다. 그래서 ELBO를 키우면 (1) 가능도가 올라가거나 (2) 인코더가 사후분포에 가까워지는, 둘 다 좋은 일이 일어납니다.

4. 정규분포 KL과 재매개변수화

실제 VAE는 인코더가 평균 μ\mu 와 표준편차 σ\sigma 를 내는 정규분포 q=N(μ,σ2)q=\mathcal N(\mu,\sigma^2) 를 쓰고, 사전 분포는 N(0,1)\mathcal N(0,1) 입니다. 이때 KL 항은 닫힌 식으로 계산됩니다(차원마다 더함).

DKL(N(μ,σ2) ∥ N(0,1))=12(μ2+σ2−1−ln⁡σ2)D_{\mathrm{KL}}\big(\mathcal N(\mu,\sigma^2)\,\|\,\mathcal N(0,1)\big) = \tfrac12\left(\mu^2+\sigma^2-1-\ln\sigma^2\right)

숫자로 해 보기(해설용).

  • μ=1, σ=0.5\mu=1,\ \sigma=0.5: 12(1+0.25−1−ln⁡0.25)=12(0.25+1.386)≈0.818\tfrac12(1+0.25-1-\ln0.25)=\tfrac12(0.25+1.386)\approx0.818
  • μ=0, σ=1\mu=0,\ \sigma=1: 00 (사전 분포와 똑같음)
  • μ=0, σ=0.1\mu=0,\ \sigma=0.1: ≈1.808\approx1.808 — 구름을 점처럼 좁히면 벌점이 큽니다. 2절의 "점이 아니라 구름으로"를 이 항이 강제합니다.
  • μ=2, σ=1\mu=2,\ \sigma=1: 2.02.0 — 원점에서 멀리 가도 벌점입니다.

재매개변수화(reparameterization) 요약. zz 를 qq 에서 "뽑는" 연산은 미분이 안 됩니다. 그래서 z=μ+σϵz=\mu+\sigma\epsilon, ϵ∼N(0,1)\epsilon\sim\mathcal N(0,1) 로 바꿔 쓰면 무작위성은 ϵ\epsilon 에만 남고 μ,σ\mu,\sigma 로 기울기가 흐릅니다. 예: μ=1,σ=0.5,ϵ=−0.4\mu=1,\sigma=0.5,\epsilon=-0.4 이면 z=0.8z=0.8. 유도와 원 논문 설정은 VAE 원 논문 해설 에 자세히 있습니다.

mermaid
flowchart LR
  X[입력 x] --> E[인코더 q φ]
  E --> MU[평균 μ]
  E --> SG[표준편차 σ]
  N[잡음 ε ~ N 0,1] --> Z[z = μ + σ·ε]
  MU --> Z
  SG --> Z
  Z --> DEC[디코더 p θ x given z]
  DEC --> R[복원 항]
  MU --> K[KL 항<br/>½ μ²+σ²−1−ln σ²]
  SG --> K
  R --> L[손실 = −복원 + β·KL]
  K --> L

5. β-VAE: KL 항의 무게 조절

Higgins 외(ICLR 2017)는 ELBO의 KL 항에 가중치 β\beta 를 붙였습니다.

Lβ=Eq[log⁡pθ(x∣z)]−β DKL(qϕ(z∣x) ∥ p(z))\mathcal L_\beta = \mathbb E_q[\log p_\theta(x\mid z)] - \beta\, D_{\mathrm{KL}}\big(q_\phi(z\mid x)\,\|\,p(z)\big)

β=1\beta=1 이면 보통 VAE입니다. 논문은 β>1\beta>1 로 사전 분포 쪽 압박을 키우면 잠재 차원 하나하나가 "회전 · 크기 · 위치" 같은 서로 독립적인 요인을 따로 맡는 분리된 표현(disentangled representation) 을 더 잘 배운다고 보고했습니다. 대가는 복원 품질입니다.

숫자로 해 보기(해설용). 복원 항이 −50, KL 항이 8인 표본에서 β=1\beta=1 손실은 50+8=5850+8=58, β=4\beta=4 이면 50+32=8250+32=82 입니다. 학습은 KL을 줄이는 쪽(잠재 정보를 덜 쓰는 쪽)에 더 힘을 쏟게 됩니다.

6. VQ-VAE: 잠재 공간을 사전(단어장)으로

van den Oord 외(2017)의 VQ-VAE 는 잠재 벡터를 연속값으로 두지 않고, 학습되는 코드북(codebook) 벡터 중 가장 가까운 것으로 바꿔(양자화) 씁니다. 그러면 이미지가 "코드 번호의 격자"가 되어, 그 위에서 자기회귀 모델(이미지는 PixelCNN, 음성은 WaveNet)로 사전 분포를 따로 배웁니다.

L=log⁡p(x∣zq(x))+∥sg[ze(x)]−e∥22+β ∥ze(x)−sg[e]∥22\mathcal L = \log p(x\mid z_q(x)) + \big\|\mathrm{sg}[z_e(x)]-e\big\|_2^2 + \beta\,\big\|z_e(x)-\mathrm{sg}[e]\big\|_2^2
기호뜻
ze(x)z_e(x)인코더 출력(양자화 전)
ee선택된 코드북 벡터, zq(x)=ez_q(x)=e
sg[⋅]\mathrm{sg}[\cdot]기울기 멈춤(앞으로는 그대로, 뒤로는 기울기 0)
둘째 항코드북을 인코더 출력 쪽으로 당김
셋째 항인코더가 고른 코드에서 멀어지지 않게 붙잡음(commitment), 논문은 β=0.25\beta=0.25

양자화는 미분이 안 되므로 디코더 입력의 기울기를 인코더 출력으로 그대로 복사합니다(straight-through). 손실 첫 항은 논문 표기 그대로 로그 가능도로 적었으며, 실제 최소화할 때는 부호를 바꿔 씁니다.

숫자로 해 보기(해설용). 인코더 출력 ze=(0.9, 0.2)z_e=(0.9,\ 0.2), 코드북 e1=(1,0)e_1=(1,0), e2=(0,1)e_2=(0,1), e3=(1,1)e_3=(1,1). 거리 제곱은 0.05, 1.45, 0.650.05,\ 1.45,\ 0.65 이므로 e1e_1 이 선택됩니다. commitment 항은 0.25×0.05=0.01250.25\times0.05=0.0125 입니다.

어디로 이어지나. "먼저 압축기(오토인코더)를 학습하고, 압축된 공간에서 생성 모델을 돌린다"는 2단계 구조는 잠재 확산(Stable Diffusion)과 Genie 의 동영상 토크나이저로 이어졌습니다. 로봇의 ACT 는 조건부 VAE(CVAE)로 시연의 다양성을 담습니다.

연습 문제

  1. q=N(0.5, 12)q=\mathcal N(0.5,\ 1^2) 의 KL(사전 N(0,1)\mathcal N(0,1))을 구하세요.
    • 풀이: 12(0.25+1−1−ln⁡1)=0.125\tfrac12(0.25+1-1-\ln1)=0.125 입니다.
  2. 3절 예에서 인코더가 (0.5,0.5)(0.5,0.5) 일 때 KL(q‖사전)이 0인데도 ELBO가 로그 가능도보다 낮은 이유는?
    • 풀이: 간극 DKL(q∥p(z∣x))=0.144D_{\mathrm{KL}}(q\|p(z\mid x))=0.144 때문입니다. 사전 분포와는 같지만 진짜 사후분포 (0.25,0.75)(0.25,0.75) 와는 달라서입니다.
  3. 잠재 차원이 입력 차원보다 큰 오토인코더를 학습하면 어떤 문제가 생기나요?
    • 풀이: 입력을 그대로 베끼는 항등 함수로 오차를 0으로 만들 수 있어, 유용한 구조를 배우지 않습니다.
  4. 코드북 크기 512, 잠재 격자 32×32인 VQ-VAE는 이미지 한 장을 몇 개의 코드 번호로 나타내나요? 번호 하나는 몇 비트인가요?
    • 풀이: 32×32=102432\times32=1024 개, log⁡2512=9\log_2 512=9 비트입니다(해설용 설정).

스스로 점검

  1. ELBO가 로그 가능도의 하한인 이유는?
    • 답: log⁡p(x)=ELBO+DKL(q∥p(z∣x))\log p(x)=\text{ELBO}+D_{\mathrm{KL}}(q\|p(z\mid x)) 이고 KL은 항상 0 이상이기 때문입니다.
  2. KL 항이 없으면 VAE는 어떻게 되나요?
    • 답: 인코더가 구름을 점처럼 좁히고 코드를 아무 데나 놓아 보통 오토인코더처럼 되며, 사전 분포에서 뽑은 zz 로는 좋은 표본이 나오지 않습니다.
  3. VQ-VAE에서 straight-through가 필요한 이유는?
    • 답: 가장 가까운 코드 고르기는 미분할 수 없어서, 디코더 쪽 기울기를 인코더 출력으로 그대로 복사해 인코더를 학습합니다.

용어 정리

용어쉬운 뜻
오토인코더줄였다가 다시 펼쳐 원래대로 복원하도록 배우는 신경망
병목인코더 출력의 차원을 작게 만든 좁은 통로
잡음 제거 오토인코더망가진 입력에서 원래 입력을 복원하도록 배우는 오토인코더
잠재 공간잠재 벡터들이 놓이는 공간
사후분포관측 xx 를 본 뒤 잠재 변수 zz 의 분포 p(z∣x)p(z\mid x)
ELBO로그 가능도의 하한(복원 항 − KL 항)
재매개변수화z=μ+σϵz=\mu+\sigma\epsilon 로 바꿔 무작위 추출을 미분 가능하게 하는 기법
β-VAEKL 항에 가중치 β를 곱한 VAE
분리된 표현잠재 차원마다 서로 다른 요인을 따로 담은 표현
VQ-VAE잠재 벡터를 코드북의 가장 가까운 벡터로 바꿔 쓰는 VAE

더 깊이 보려면

다음에 볼 것

라이선스

본문은 KAITABASE 자체 해설입니다. 참고 자료 CS236 노트는 별도 라이선스 표기가 없어 구성만 참고했고, 각 논문은 요약 · 인용만 했습니다. 이산 2칸 예, KL 숫자, 코드북 숫자는 이 수업을 위해 만든 해설용 예입니다.

출처

AI 원리부터 이해하기 · 생성 모델 모듈

생성 모델 모듈 학습

이 글은 생성 모델 모듈의 학습 자료입니다. 전체 10개 자료 중 2번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 Stanford CS236 강의 노트(라이선스 표기 없음)