변분 오토인코더(VAE)
ELBO 손실, 재매개변수화 트릭, 잠재 공간 탐색, VAE를 활용한 이미지 생성을 다룹니다.
변분 오토인코더(VAE)은(는) CoddyKit의 무료 Learn AI with Python 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn AI with Python 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.
오토인코더에서 VAE로
일반 오토인코더는 흩어진 점을 학습하므로 새로운 점을 샘플링하면 엉망인 결과가 나옵니다. 변분 오토인코더(VAE)는 샘플링할 수 있는 매끄럽고 연속적인 잠재 공간을 학습해, 이를 진정한 생성 모델로 바꿉니다.
분포로 인코딩
한 점 대신 VAE 인코더는 입력마다 하나의 분포를 출력합니다. 즉 mean mu와 로그 분산 log_var입니다. 각 입력은 하나의 점이 아니라 잠재 공간의 작고 퍼진 영역 하나에 대응합니다.
class Encoder(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(784, 256)
self.fc_mu = nn.Linear(256, 64)
self.fc_logvar = nn.Linear(256, 64)mu와 log_var를 사용하는 이유
분산을 직접 예측하는 대신 log_var를 예측하는 이유는 어떤 실수든 될 수 있어 양수 제약이 필요하지 않고 수치적으로 안정적이기 때문입니다. 필요할 때 지수화하면 분산을 얻을 수 있습니다.
def forward(self, x):
h = torch.relu(self.fc(x))
return self.fc_mu(h), self.fc_logvar(h)잠재 z 샘플링
디코딩하려면 예측된 분포에서 z를 sample해야 합니다. 단순히 무작위로 뽑는 과정은 미분할 수 없으므로, 이를 통과해 역전파할 수 없습니다. 재매개변수화 트릭이 이 문제를 해결합니다.
재매개변수화 트릭
샘플을 z = mu + eps * exp(0.5 * log_var)로 다시 작성합니다. 여기서 eps는 무작위 잡음입니다. 이제 무작위성은 eps에 들어 있으므로(그래디언트가 필요하지 않음) mu와 log_var를 통해 그래디언트가 흐를 수 있습니다.
def reparameterize(mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * std디코더
디코더는 샘플링된 z를 받아 이미지를 재구성합니다. 일반 오토인코더의 디코더와 마찬가지로 64차원을 다시 784개의 픽셀로 확장하고 Sigmoid를 출력에 적용합니다.
decoder = nn.Sequential(
nn.Linear(64, 256),
nn.ReLU(),
nn.Linear(256, 784),
nn.Sigmoid()
)재구성 손실 항
VAE 손실의 첫 번째 절반은 재구성 손실입니다. 디코딩된 이미지가 입력과 얼마나 잘 일치하는지를 나타냅니다. 픽셀 전체에 이진 교차 엔트로피(또는 MSE)를 사용합니다.
recon_loss = nn.functional.binary_cross_entropy(
recon, x, reduction="sum"
)KL 발산 항
두 번째 절반은 KL 발산입니다. 각 인코딩 분포를 표준 정규 분포에 가깝게 끌어당깁니다. 이렇게 잠재 공간을 정규화하면 공간이 매끄럽고 연속적으로 유지되어 이미지 생성이 가능해집니다.
kl = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())ELBO 목적 함수
VAE는 ELBO(증거 하한)를 최대화하며, 이는 reconstruction + KL을 최소화하는 것과 같습니다. 재구성 손실은 출력이 원본에 충실하도록 하고, KL은 공간의 형태를 잘 유지합니다. 두 항의 균형을 맞추는 것이 핵심입니다.
loss = recon_loss + kl
loss.backward()새로운 이미지 생성
잠재 공간이 표준 정규 분포와 일치하므로, 입력 이미지 없이도 N(0,1)에서 z를 샘플링하고 디코딩하여 새로운 이미지를 생성할 수 있습니다.
with torch.no_grad():
z = torch.randn(16, 64)
new_images = decoder(z) # 16 generated samplesVAE가 중요한 이유
VAE는 보간하고 sample할 수 있는 원칙적이고 매끄러운 잠재 공간을 제공합니다. VAE는 다양한 생성 기법의 기반이 되며, 단순히 점을 학습하는 것이 아니라 분포를 학습한다는 핵심 개념을 가르쳐 줍니다.
빠른 확인
VAE에 대한 이해도를 확인해 보세요.
요약: 변분 오토인코더
VAE를 학습했습니다. 인코더는 mu와 log_var를 출력하고, 재매개변수화 트릭인 z = mu + eps * exp(0.5 * log_var)은 샘플링을 미분 가능하게 유지합니다. 손실은 ELBO = reconstruction + KL입니다. N(0,1)에서 z를 샘플링하고 디코딩하면 새로운 이미지를 생성할 수 있습니다.
자주 묻는 질문
“변분 오토인코더(VAE)” 강의는 무료인가요?
네 — “변분 오토인코더(VAE)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn AI with Python 강의 전체를 잠금 해제할 수 있습니다. Learn AI with Python 강의에는 총 4개의 강의가 포함되어 있습니다.
“변분 오토인코더(VAE)”에서 뭘 배우나요?
ELBO 손실, 재매개변수화 트릭, 잠재 공간 탐색, VAE를 활용한 이미지 생성을 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 Learn AI with Python을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn AI with Python을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn AI with Python은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“변분 오토인코더(VAE)” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn AI with Python 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn AI with Python 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 표현 학습을 위한 오토인코더
- 변분 오토인코더(VAE)
- GAN: 생성자와 판별자
- 조건부 GAN과 스타일 전이