Skip to Content
독학사독학사 3단계딥러닝15. 오토인코더(AE)와 변분 오토인코더(VAE)

이번 문서의 목표: 오토인코더의 인코더·디코더·잠재공간 구조와 재구성 손실을 설명하고, VAE가 오토인코더에 확률 분포를 도입한 이유와 KL 발산, ELBO의 의미를 계산 과정과 함께 설명할 수 있다.

왜 오토인코더가 필요한가

지금까지 다룬 신경망(MLP, CNN, RNN 등)은 대부분 지도 학습(supervised learning), 즉 정답 레이블 yy가 있는 데이터로 학습했다. 하지만 실제 데이터의 상당수는 레이블이 없다. “이 이미지에서 중요한 특징만 압축해서 뽑아내고 싶다”, “정상 데이터의 패턴만 배워서 이상한 데이터를 걸러내고 싶다”처럼 레이블 없이 데이터 자체의 구조를 배우는 비지도 학습(unsupervised learning) 과제가 존재한다.

오토인코더(AE, Autoencoder)는 이런 문제에 쓰이는 대표적인 신경망 구조로, “입력을 압축했다가 다시 원래대로 복원하도록 학습시키면, 압축 과정에서 데이터의 핵심 특징만 남는다”는 아이디어에 기반한다.

쉽게 말하면: 오토인코더는 사진을 아주 작은 메모(잠재 벡터)로 요약했다가, 그 메모만 보고 원래 사진을 최대한 비슷하게 다시 그려내도록 훈련시키는 신경망이다.

오토인코더의 구조: 인코더·잠재공간·디코더

오토인코더는 두 개의 신경망으로 이루어진다.

  • 인코더(encoder) ff: 입력 xx(예: 이미지 벡터)를 받아, 그보다 훨씬 낮은 차원의 벡터 zz로 압축한다. 이 zz가 놓이는 공간을 잠재공간(latent space)이라 부르고, zz 자체를 잠재 벡터(latent vector) 또는 코드(code)라 부른다.
  • 디코더(decoder) gg: 잠재 벡터 zz를 받아, 원래 입력과 같은 차원의 벡터 x^\hat{x}(엑스 햇, 재구성된 입력)로 복원한다.
z=f(x),x^=g(z)z = f(x), \qquad \hat{x} = g(z)
  • xx: 원본 입력 벡터.
  • zz: 인코더가 만든 잠재 벡터. 차원이 xx보다 훨씬 작다(예: 784784차원 이미지를 22차원 zz로 압축).
  • x^\hat{x}: 디코더가 zz로부터 복원한 벡터. xx와 같은 차원을 가지며, 학습이 잘 되었다면 xx와 매우 비슷한 값이 된다.

인코더와 디코더는 흔히 대칭적인 구조로 설계한다. 예를 들어 인코더가 784128322784 \to 128 \to 32 \to 2 차원으로 층을 줄여 나간다면, 디코더는 2321287842 \to 32 \to 128 \to 784로 다시 늘려 나가는 식이다. 중간의 가장 좁은 층(여기서는 22차원)을 병목층(bottleneck layer)이라 부르며, 바로 이 병목이 “정말 중요한 정보만 남기도록” 강제하는 역할을 한다.

재구성 손실

오토인코더는 레이블이 필요 없다 — 입력 자체가 곧 정답이기 때문이다. 학습 목표는 복원된 x^\hat{x}가 원본 xx와 최대한 같아지도록 만드는 것이며, 이 차이를 재구성 손실(reconstruction loss)로 측정한다. 06편에서 다룬 평균제곱오차(MSE, Mean Squared Error)를 자주 사용한다.

Lrecon=1nj=1n(xjx^j)2\mathcal{L}_{\text{recon}} = \frac{1}{n} \sum_{j=1}^{n} (x_j - \hat{x}_j)^2
  • nn: 입력 벡터의 차원 수(예: 이미지 픽셀 수).
  • xj,x^jx_j, \hat{x}_j: 원본과 재구성 벡터의 jj번째 원소.
  • Lrecon\mathcal{L}_{\text{recon}}: 재구성 손실. 이 값을 최소화하도록 인코더·디코더의 가중치를 07편에서 다룬 역전파로 함께 학습한다.

작은 예시로 계산해 보기

3차원 벡터 하나를 오토인코더에 넣어 복원한 결과가 다음과 같다고 하자.

x=(1.0, 0.0, 0.5),x^=(0.9, 0.2, 0.4)x = (1.0,\ 0.0,\ 0.5), \qquad \hat{x} = (0.9,\ 0.2,\ 0.4)

원소별 오차의 제곱을 구한다.

(1.00.9)2=0.01,(0.00.2)2=0.04,(0.50.4)2=0.01(1.0 - 0.9)^2 = 0.01, \quad (0.0 - 0.2)^2 = 0.04, \quad (0.5 - 0.4)^2 = 0.01

세 값을 더해 평균을 낸다.

Lrecon=0.01+0.04+0.0130.02\mathcal{L}_{\text{recon}} = \frac{0.01 + 0.04 + 0.01}{3} \approx 0.02

이 값이 작을수록 재구성이 원본에 가깝다는 뜻이며, 학습이 진행될수록 이 손실이 줄어드는 방향으로 인코더·디코더의 가중치가 갱신된다.

대표 응용

  • 차원 축소(dimensionality reduction): 잠재 벡터 zz는 원본 데이터를 압축한 저차원 표현이므로, 시각화나 후속 분석에 사용할 수 있다.
  • 잡음 제거(denoising): 입력에 일부러 노이즈를 섞어 넣고, 디코더가 노이즈 없는 원본을 복원하도록 학습시키면 잡음 제거 오토인코더(denoising autoencoder)가 된다.
  • 이상 탐지(anomaly detection): 정상 데이터로만 학습시키면, 정상 데이터는 재구성 손실이 작지만 비정상(이상) 데이터는 병목을 통과하며 잘 복원되지 않아 재구성 손실이 크게 나타난다. 이 손실 크기로 이상 여부를 판단할 수 있다.

VAE: 잠재공간에 확률을 도입한다

기본 오토인코더의 잠재공간에는 한 가지 약점이 있다. 인코더가 각 입력을 잠재공간의 정확히 한 점으로만 대응시키기 때문에, 학습 데이터에 없던 임의의 zz를 골라 디코더에 넣으면 이상하거나 의미 없는 출력이 나오기 쉽다. 즉 “새로운 그럴듯한 데이터를 생성”하는 용도로는 적합하지 않다.

변분 오토인코더(VAE, Variational Autoencoder)는 이 문제를 “인코더가 하나의 점 대신, 확률 분포를 출력하게 하자”는 아이디어로 해결한다.

쉽게 말하면: VAE는 “이 입력은 잠재공간의 정확히 여기다”라고 콕 찍는 대신, “이 입력은 대략 이 근처 어딘가에서 나왔을 가능성이 높다”는 확률 구름을 만든다.

구체적으로 VAE의 인코더는 잠재 변수 zz가 따르는 정규분포(가우시안 분포)의 두 파라미터, 평균 μ\mu(뮤)와 분산과 관련된 σ\sigma(시그마, 표준편차)를 출력한다.

μ=fμ(x),σ=fσ(x)\mu = f_\mu(x), \qquad \sigma = f_\sigma(x)

그 다음 이 분포에서 실제로 샘플링(sampling)해 잠재 벡터 zz를 뽑는다.

z=μ+σϵ,ϵN(0,1)z = \mu + \sigma \odot \epsilon, \qquad \epsilon \sim \mathcal{N}(0, 1)
  • ϵ\epsilon (엡실론): 평균 0, 분산 1인 표준정규분포에서 뽑은 무작위 값.
  • \odot: 13편에서 다룬 원소별 곱(아다마르 곱).
  • 이렇게 ϵ\epsilon을 밖에서 곱해 더하는 방식을 재매개변수화 트릭(reparameterization trick)이라 부른다. zz를 직접 확률분포에서 샘플링하면 그 과정이 역전파를 통과할 수 없는데(무작위 추출은 미분이 불가능하므로), 무작위성을 ϵ\epsilon이라는 별도의 상수 취급 값으로 분리해 두면 μ,σ\mu, \sigma에 대한 기울기를 정상적으로 계산할 수 있다.

KL 발산: 잠재공간을 정돈된 모양으로 강제한다

VAE는 재구성 손실 외에 한 가지 항을 손실 함수에 추가한다. 바로 쿨백-라이블러 발산(KL Divergence, Kullback-Leibler Divergence)으로, 인코더가 만든 분포 q(zx)q(z|x)(뮤·시그마로 정의된 정규분포)가 표준정규분포 p(z)=N(0,1)p(z) = \mathcal{N}(0, 1)과 얼마나 다른지를 측정하는 값이다.

두 정규분포 사이의 KL 발산은 다음과 같은 닫힌 형태(closed form)의 식으로 계산할 수 있다.

DKL=12k=1d(1+log(σk2)μk2σk2)D_{KL} = -\frac{1}{2} \sum_{k=1}^{d} \left(1 + \log(\sigma_k^2) - \mu_k^2 - \sigma_k^2 \right)
  • dd: 잠재 벡터 zz의 차원 수.
  • μk,σk\mu_k, \sigma_k: 잠재 벡터의 kk번째 차원에 대한 평균과 표준편차.
  • DKLD_{KL}: 두 분포의 차이를 나타내는 값. 두 분포가 완전히 같으면 00이 되고, 다를수록 커진다.

왜 표준정규분포에 가깝게 만들려고 할까? 인코더가 각 입력마다 완전히 제멋대로인 평균·분산을 만들면, 잠재공간 여기저기에 서로 동떨어진 확률 구름들이 생겨 그 사이 빈 공간에서 샘플링하면 여전히 의미 없는 출력이 나온다. KL 발산 항은 모든 입력의 확률 구름을 원점 근처의 표준정규분포 쪽으로 끌어당겨, 잠재공간이 빈틈없이 연속적이고 정돈된 모양을 갖도록 강제한다. 그 결과 학습 데이터에 없던 zz를 무작위로 뽑아도 그럴듯한 데이터를 생성할 수 있게 된다.

작은 숫자로 검산하기

잠재 벡터가 1차원이고, 어떤 입력에 대해 인코더가 μ=0.5\mu = 0.5, σ=1.2\sigma = 1.2를 출력했다고 하자.

σ2=1.22=1.44\sigma^2 = 1.2^2 = 1.44 log(σ2)=log(1.44)0.3646\log(\sigma^2) = \log(1.44) \approx 0.3646

식에 대입한다.

1+log(σ2)μ2σ2=1+0.36460.251.44=0.32541 + \log(\sigma^2) - \mu^2 - \sigma^2 = 1 + 0.3646 - 0.25 - 1.44 = -0.3254 DKL=12×(0.3254)0.163D_{KL} = -\frac{1}{2} \times (-0.3254) \approx 0.163

만약 인코더가 μ=0\mu = 0, σ=1\sigma = 1(즉 표준정규분포 그 자체)을 출력했다면 DKL=12(1+001)=0D_{KL} = -\frac{1}{2}(1 + 0 - 0 - 1) = 0이 되어, 표준정규분포와 완전히 같을 때 KL 발산이 정확히 00이 됨을 확인할 수 있다. 위 예시의 0.1630.163은 인코더가 만든 분포가 표준정규분포에서 약간 벗어나 있다는 뜻이다.

ELBO: 두 목표를 하나의 손실로 묶는다

VAE의 전체 손실 함수는 재구성 손실과 KL 발산의 합으로 구성되며, 이를 최대화하려는 목적함수의 하한(lower bound)이라는 의미에서 ELBO(Evidence Lower BOund, 증거 하한)라 부른다. 손실을 최소화하는 형태로 쓰면 다음과 같다.

LVAE=Lrecon+DKL\mathcal{L}_{\text{VAE}} = \mathcal{L}_{\text{recon}} + D_{KL}

두 항은 서로 다른 방향으로 잡아당기는 힘이다. 재구성 손실은 “각 입력을 정확히 복원하려면 잠재 벡터가 입력마다 뚜렷하게 구분되어야 한다”고 요구하고, KL 발산은 “모든 잠재 벡터의 분포가 표준정규분포에 가깝게 뭉쳐 있어야 한다”고 요구한다. 이 둘의 균형 속에서 VAE는 “입력을 잘 구분해서 복원할 수 있으면서도, 전체적으로 매끈하고 연속적인” 잠재공간을 학습하게 된다.

비교 항목기본 오토인코더(AE)변분 오토인코더(VAE)
인코더 출력잠재공간의 한 점 zz확률분포의 파라미터 μ,σ\mu, \sigma
잠재 벡터 생성 방식결정적(deterministic) 변환재매개변수화 트릭으로 샘플링
손실 함수재구성 손실만재구성 손실 + KL 발산(ELBO)
잠재공간의 성질군데군데 구멍이 생길 수 있음표준정규분포에 가깝게 정돈되어 연속적
주된 용도압축, 차원 축소, 이상 탐지새로운 데이터 생성, 매끄러운 보간(interpolation)

자주 틀리는 점

  • 오토인코더를 “분류나 회귀를 위한 지도 학습 모델”로 착각하는 경우가 있다. 오토인코더는 레이블 없이 입력 자체를 정답으로 삼는 비지도 학습이다.
  • VAE의 인코더가 “잠재 벡터 zz를 직접 출력한다”고 오해하기 쉽다. 정확히는 분포의 파라미터인 μ,σ\mu, \sigma를 출력하고, 그 분포에서 zz를 샘플링한다.
  • KL 발산 항이 없어도 VAE가 잘 작동할 것이라고 생각하기 쉽지만, KL 발산이 없으면 사실상 기본 오토인코더와 다르지 않아 새로운 데이터를 생성하는 능력이 크게 떨어진다.
  • 재매개변수화 트릭을 “무작위성을 없애는 기법”으로 오해하는 경우가 있다. 실제로는 무작위성 자체는 유지하되, 그 무작위성을 역전파가 통과할 수 있는 형태로 분리하는 기법이다.

핵심 정리

  • 오토인코더는 인코더로 입력을 잠재 벡터로 압축하고 디코더로 복원하며, 재구성 손실을 최소화하도록 학습하는 비지도 학습 모델이다.
  • 병목층이 정보를 강제로 압축시켜, 잠재 벡터에 데이터의 핵심 특징만 남게 한다.
  • VAE는 인코더가 확률분포의 파라미터 μ,σ\mu, \sigma를 출력하고, 재매개변수화 트릭으로 잠재 벡터를 샘플링한다.
  • VAE의 손실(ELBO)은 재구성 손실과 KL 발산의 합으로, KL 발산은 잠재공간을 표준정규분포에 가깝게 정돈해 새로운 데이터 생성을 가능하게 한다.

마무리 복습

문제 14지선다
오토인코더의 학습 방식에 대한 설명으로 옳은 것은?
문제 24지선다
오토인코더 구조에서 병목층(bottleneck layer)의 역할로 가장 적절한 것은?
문제 34지선다
x = (1.0, 0.0, 0.5), x-hat = (0.9, 0.2, 0.4)일 때 평균제곱오차로 계산한 재구성 손실은?
문제 44지선다
기본 오토인코더와 비교했을 때 VAE 인코더의 출력 방식으로 옳은 것은?
문제 54지선다
mu = 0, sigma = 1일 때 KL 발산 D_KL의 값은 얼마인가?
문제 64지선다
VAE의 손실 함수(ELBO 기반)에서 KL 발산 항이 담당하는 역할은?
문제 74지선다
재매개변수화 트릭(reparameterization trick)을 사용하는 이유로 가장 적절한 것은?

참고 자료

Last updated on