이번 문서의 목표: 오토인코더의 인코더·디코더·잠재공간 구조와 재구성 손실을 설명하고, VAE가 오토인코더에 확률 분포를 도입한 이유와 KL 발산, ELBO의 의미를 계산 과정과 함께 설명할 수 있다.
왜 오토인코더가 필요한가
지금까지 다룬 신경망(MLP, CNN, RNN 등)은 대부분 지도 학습(supervised learning), 즉 정답 레이블 가 있는 데이터로 학습했다. 하지만 실제 데이터의 상당수는 레이블이 없다. “이 이미지에서 중요한 특징만 압축해서 뽑아내고 싶다”, “정상 데이터의 패턴만 배워서 이상한 데이터를 걸러내고 싶다”처럼 레이블 없이 데이터 자체의 구조를 배우는 비지도 학습(unsupervised learning) 과제가 존재한다.
오토인코더(AE, Autoencoder)는 이런 문제에 쓰이는 대표적인 신경망 구조로, “입력을 압축했다가 다시 원래대로 복원하도록 학습시키면, 압축 과정에서 데이터의 핵심 특징만 남는다”는 아이디어에 기반한다.
쉽게 말하면: 오토인코더는 사진을 아주 작은 메모(잠재 벡터)로 요약했다가, 그 메모만 보고 원래 사진을 최대한 비슷하게 다시 그려내도록 훈련시키는 신경망이다.
오토인코더의 구조: 인코더·잠재공간·디코더
오토인코더는 두 개의 신경망으로 이루어진다.
- 인코더(encoder) : 입력 (예: 이미지 벡터)를 받아, 그보다 훨씬 낮은 차원의 벡터 로 압축한다. 이 가 놓이는 공간을 잠재공간(latent space)이라 부르고, 자체를 잠재 벡터(latent vector) 또는 코드(code)라 부른다.
- 디코더(decoder) : 잠재 벡터 를 받아, 원래 입력과 같은 차원의 벡터 (엑스 햇, 재구성된 입력)로 복원한다.
- : 원본 입력 벡터.
- : 인코더가 만든 잠재 벡터. 차원이 보다 훨씬 작다(예: 차원 이미지를 차원 로 압축).
- : 디코더가 로부터 복원한 벡터. 와 같은 차원을 가지며, 학습이 잘 되었다면 와 매우 비슷한 값이 된다.
인코더와 디코더는 흔히 대칭적인 구조로 설계한다. 예를 들어 인코더가 차원으로 층을 줄여 나간다면, 디코더는 로 다시 늘려 나가는 식이다. 중간의 가장 좁은 층(여기서는 차원)을 병목층(bottleneck layer)이라 부르며, 바로 이 병목이 “정말 중요한 정보만 남기도록” 강제하는 역할을 한다.
재구성 손실
오토인코더는 레이블이 필요 없다 — 입력 자체가 곧 정답이기 때문이다. 학습 목표는 복원된 가 원본 와 최대한 같아지도록 만드는 것이며, 이 차이를 재구성 손실(reconstruction loss)로 측정한다. 06편에서 다룬 평균제곱오차(MSE, Mean Squared Error)를 자주 사용한다.
- : 입력 벡터의 차원 수(예: 이미지 픽셀 수).
- : 원본과 재구성 벡터의 번째 원소.
- : 재구성 손실. 이 값을 최소화하도록 인코더·디코더의 가중치를 07편에서 다룬 역전파로 함께 학습한다.
작은 예시로 계산해 보기
3차원 벡터 하나를 오토인코더에 넣어 복원한 결과가 다음과 같다고 하자.
원소별 오차의 제곱을 구한다.
세 값을 더해 평균을 낸다.
이 값이 작을수록 재구성이 원본에 가깝다는 뜻이며, 학습이 진행될수록 이 손실이 줄어드는 방향으로 인코더·디코더의 가중치가 갱신된다.
대표 응용
- 차원 축소(dimensionality reduction): 잠재 벡터 는 원본 데이터를 압축한 저차원 표현이므로, 시각화나 후속 분석에 사용할 수 있다.
- 잡음 제거(denoising): 입력에 일부러 노이즈를 섞어 넣고, 디코더가 노이즈 없는 원본을 복원하도록 학습시키면 잡음 제거 오토인코더(denoising autoencoder)가 된다.
- 이상 탐지(anomaly detection): 정상 데이터로만 학습시키면, 정상 데이터는 재구성 손실이 작지만 비정상(이상) 데이터는 병목을 통과하며 잘 복원되지 않아 재구성 손실이 크게 나타난다. 이 손실 크기로 이상 여부를 판단할 수 있다.
VAE: 잠재공간에 확률을 도입한다
기본 오토인코더의 잠재공간에는 한 가지 약점이 있다. 인코더가 각 입력을 잠재공간의 정확히 한 점으로만 대응시키기 때문에, 학습 데이터에 없던 임의의 를 골라 디코더에 넣으면 이상하거나 의미 없는 출력이 나오기 쉽다. 즉 “새로운 그럴듯한 데이터를 생성”하는 용도로는 적합하지 않다.
변분 오토인코더(VAE, Variational Autoencoder)는 이 문제를 “인코더가 하나의 점 대신, 확률 분포를 출력하게 하자”는 아이디어로 해결한다.
쉽게 말하면: VAE는 “이 입력은 잠재공간의 정확히 여기다”라고 콕 찍는 대신, “이 입력은 대략 이 근처 어딘가에서 나왔을 가능성이 높다”는 확률 구름을 만든다.
구체적으로 VAE의 인코더는 잠재 변수 가 따르는 정규분포(가우시안 분포)의 두 파라미터, 평균 (뮤)와 분산과 관련된 (시그마, 표준편차)를 출력한다.
그 다음 이 분포에서 실제로 샘플링(sampling)해 잠재 벡터 를 뽑는다.
- (엡실론): 평균 0, 분산 1인 표준정규분포에서 뽑은 무작위 값.
- : 13편에서 다룬 원소별 곱(아다마르 곱).
- 이렇게 을 밖에서 곱해 더하는 방식을 재매개변수화 트릭(reparameterization trick)이라 부른다. 를 직접 확률분포에서 샘플링하면 그 과정이 역전파를 통과할 수 없는데(무작위 추출은 미분이 불가능하므로), 무작위성을 이라는 별도의 상수 취급 값으로 분리해 두면 에 대한 기울기를 정상적으로 계산할 수 있다.
KL 발산: 잠재공간을 정돈된 모양으로 강제한다
VAE는 재구성 손실 외에 한 가지 항을 손실 함수에 추가한다. 바로 쿨백-라이블러 발산(KL Divergence, Kullback-Leibler Divergence)으로, 인코더가 만든 분포 (뮤·시그마로 정의된 정규분포)가 표준정규분포 과 얼마나 다른지를 측정하는 값이다.
두 정규분포 사이의 KL 발산은 다음과 같은 닫힌 형태(closed form)의 식으로 계산할 수 있다.
- : 잠재 벡터 의 차원 수.
- : 잠재 벡터의 번째 차원에 대한 평균과 표준편차.
- : 두 분포의 차이를 나타내는 값. 두 분포가 완전히 같으면 이 되고, 다를수록 커진다.
왜 표준정규분포에 가깝게 만들려고 할까? 인코더가 각 입력마다 완전히 제멋대로인 평균·분산을 만들면, 잠재공간 여기저기에 서로 동떨어진 확률 구름들이 생겨 그 사이 빈 공간에서 샘플링하면 여전히 의미 없는 출력이 나온다. KL 발산 항은 모든 입력의 확률 구름을 원점 근처의 표준정규분포 쪽으로 끌어당겨, 잠재공간이 빈틈없이 연속적이고 정돈된 모양을 갖도록 강제한다. 그 결과 학습 데이터에 없던 를 무작위로 뽑아도 그럴듯한 데이터를 생성할 수 있게 된다.
작은 숫자로 검산하기
잠재 벡터가 1차원이고, 어떤 입력에 대해 인코더가 , 를 출력했다고 하자.
식에 대입한다.
만약 인코더가 , (즉 표준정규분포 그 자체)을 출력했다면 이 되어, 표준정규분포와 완전히 같을 때 KL 발산이 정확히 이 됨을 확인할 수 있다. 위 예시의 은 인코더가 만든 분포가 표준정규분포에서 약간 벗어나 있다는 뜻이다.
ELBO: 두 목표를 하나의 손실로 묶는다
VAE의 전체 손실 함수는 재구성 손실과 KL 발산의 합으로 구성되며, 이를 최대화하려는 목적함수의 하한(lower bound)이라는 의미에서 ELBO(Evidence Lower BOund, 증거 하한)라 부른다. 손실을 최소화하는 형태로 쓰면 다음과 같다.
두 항은 서로 다른 방향으로 잡아당기는 힘이다. 재구성 손실은 “각 입력을 정확히 복원하려면 잠재 벡터가 입력마다 뚜렷하게 구분되어야 한다”고 요구하고, KL 발산은 “모든 잠재 벡터의 분포가 표준정규분포에 가깝게 뭉쳐 있어야 한다”고 요구한다. 이 둘의 균형 속에서 VAE는 “입력을 잘 구분해서 복원할 수 있으면서도, 전체적으로 매끈하고 연속적인” 잠재공간을 학습하게 된다.
| 비교 항목 | 기본 오토인코더(AE) | 변분 오토인코더(VAE) |
|---|---|---|
| 인코더 출력 | 잠재공간의 한 점 | 확률분포의 파라미터 |
| 잠재 벡터 생성 방식 | 결정적(deterministic) 변환 | 재매개변수화 트릭으로 샘플링 |
| 손실 함수 | 재구성 손실만 | 재구성 손실 + KL 발산(ELBO) |
| 잠재공간의 성질 | 군데군데 구멍이 생길 수 있음 | 표준정규분포에 가깝게 정돈되어 연속적 |
| 주된 용도 | 압축, 차원 축소, 이상 탐지 | 새로운 데이터 생성, 매끄러운 보간(interpolation) |
자주 틀리는 점
- 오토인코더를 “분류나 회귀를 위한 지도 학습 모델”로 착각하는 경우가 있다. 오토인코더는 레이블 없이 입력 자체를 정답으로 삼는 비지도 학습이다.
- VAE의 인코더가 “잠재 벡터 를 직접 출력한다”고 오해하기 쉽다. 정확히는 분포의 파라미터인 를 출력하고, 그 분포에서 를 샘플링한다.
- KL 발산 항이 없어도 VAE가 잘 작동할 것이라고 생각하기 쉽지만, KL 발산이 없으면 사실상 기본 오토인코더와 다르지 않아 새로운 데이터를 생성하는 능력이 크게 떨어진다.
- 재매개변수화 트릭을 “무작위성을 없애는 기법”으로 오해하는 경우가 있다. 실제로는 무작위성 자체는 유지하되, 그 무작위성을 역전파가 통과할 수 있는 형태로 분리하는 기법이다.
핵심 정리
- 오토인코더는 인코더로 입력을 잠재 벡터로 압축하고 디코더로 복원하며, 재구성 손실을 최소화하도록 학습하는 비지도 학습 모델이다.
- 병목층이 정보를 강제로 압축시켜, 잠재 벡터에 데이터의 핵심 특징만 남게 한다.
- VAE는 인코더가 확률분포의 파라미터 를 출력하고, 재매개변수화 트릭으로 잠재 벡터를 샘플링한다.
- VAE의 손실(ELBO)은 재구성 손실과 KL 발산의 합으로, KL 발산은 잠재공간을 표준정규분포에 가깝게 정돈해 새로운 데이터 생성을 가능하게 한다.
마무리 복습
참고 자료
- Autoencoder / VAE 관련 강의 노트 (대학 강의 자료) — https://www.deeplearningbook.org
- Stanford CS231n: Convolutional Neural Networks for Visual Recognition — https://cs231n.stanford.edu