home..

Auto-Encoding Variational Bayes

논문 링크

VAE (Variational Auto Encoder)

generation with Neural Networks

inputs: Pixel level. -> 원하는 인풋 픽셀이 특정 이미지를 만들 수 있도록 Generative Neural Networks 설계. -/

Generative Neural Networks

따라서

_ input data 를 잘 나타낼 수 있는 latent variable를 어떻게 잘 찾을건가?_

gan 이이랑 vae 차이. diffusion dms vae 랑 거의 똑같ㅇㅁ .vae는 한 스텝만에 찾는데 디퓨전은 이걸 1000번을 함 -> 우리가 알고있는 gaussian 으로 함. 각 프로세슷를 이해할떄 latent var을 어떻게 찾는지.

in terms of Encoder AutoEncoder: explore the latent variable as deterministic (일대일로 매핑) code . variational autoencoder: explore the latent variable as stochastic (확률적으로 매핑) code.확률저그로 샘플링 된 형태로 만들어진다. 왜 autoencoder가 생성형이 아니지 ? . 차이점은decoder 가 아니라 encoder에 있음 . for building the generative neral networks based on autoencoder

  1. we define the latent var
  1. we embed the input data into the latent space
  2. we generate output data from explored latent space

in terms of decoder

AutoEncoder

Autoencoder = Encoder + Decoder

구성

Autoencoder는 다음과 같이 구성된다:
- $Encoder Q(x)$ : 입력 x를 잠재 변수 z로 인코딩
- $Decoder P(z)$: 잠재 변수 z를 원래 입력과 비슷한 y로 디코딩
- $Loss$: 입출력의 차이를 최소화하는 재구성 손실 사용

$x \in \mathbb{R}^n \quad \text{(입력 데이터)}$ $z = Q(x) \in \mathbb{R}^d \quad \text{(잠재 표현, \( d < n \))}$ $y = P(z) = P(Q(x)) \quad \text{(복원된 출력)}$


손실함수: $\mathcal{L}_{AE} = \sum_{x \in D} \mathcal{L}(x, y) = \sum_{x \in D} \mathcal{L}(x, P(Q(x)))$
가장 일반적으로 사용하는 손실 함수는 -> MSE이다. $\mathcal{L}_{\text{reconstruction}}(x, y) = \|x - y\|^2$

encoder

decoder: (z를 받아서 원래의 x처럼 보이게) 원래 이미지로 복원하는 네트워크 . 학습이 잘 되면, P(z)가 x랑 거의 똑같아지도록 RECONSTRUCT 가능

x (256x256x3) ─▶ Encoder ─▶ z (1x2) ─▶ Decoder ─▶ y (복원된 이미지)

Autoencoder is not a generative model. WHY?

픽셀 대응이 1:1 레벨일때 단점 고해상도일수록 학습도 어렵고, 생성도 어렵다 컨트롤이 어렵다. 매핑이 어렵다 . 위 두 단점을 latent var 을 ㅇㅇ 함으로써 해결. goal of generative neural networks

  1. latent variable 이 input data 를 잘 나타내도록 탐색해야 한다.
  2. train the generative neural networks to synthesize the output data. 원래 데이터 잘 찾기.

입력 데이터 없이 latent variable z를 정의할 수 없기 때문.즉, z는 반드시 입력 데이터 x를 통해서만 얻을 수 있음.

z는 입력 x에서 항상 같은 값으로 압축된다. → 즉, z는 고정된 값 (deterministic) → 그래서 출력 y는 항상 입력 x와 같음 (그저 복원하는 것뿐)

Autoencoder는 주로 차원 축소(compression) 용도 → 예: PCA와 유사한 역할

**But VAE (Variational Autoencoder)는 다르다**

수학적으로 데이터를 보지 않고는 의미 있는 z를 정의할 수 없음. → 그래서 인코더가 필요함: 입력 데이터 분포를 보고 z가 어떤 분포를 따라야 할지 학습함. 즉, 데이터와 latent variable 간의 연관성을 만들어 주는 게 인코더의 역할

Variational Autoencoder

latent variable as stochastic code

autoencoder는 그냥 압축시킨 것으로, 차원을 정의할 수 없다. 반면 VAE의 latent space에서는 각 포인트가 하나의 Gaussian 분포로 표현된다. 이는 단순히 데이터를 압축하는 것을 넘어서, 새로운 데이터를 생성할 수 있게 해주는 기반이 된다.즉, VAE는 차원 축소를 하면서도 확률적 분포를 학습하여 생성 가능성을 확보한다.


For Building the generative neural networks based on Autoencoder

1. (stochastic) latent variable 정의

우리는 latent variable z정규분포(Gaussian distribution) 에서 샘플링된다고 가정할 수 있다.

2. embed the input data into the latent space

무작위 Gaussian 분포만으로는 실제 학습 데이터의 분포를 잘 표현할 수 없다.

3. generate output data from explored latent space

학습된 latent space에서 z ~ N(μ, σ)를 샘플링하고, 이를 Decoder에 입력하여 데이터를 생성한다. 새로운 데이터를 생성하거나, 기존 데이터를 복원하는 데 사용된다.

목표: log Pθ(x)의 최대화

$ [ P_\theta(x) = \int p_\theta(x \mid z) p(z) \, dz ] $

따라서, 이를 근사하기 위해 Variational Inference 기법을 적용하여 Evidence Lower Bound (ELBO) 를 도입한다.

ELBO 유도 과정

임의 분포 $( q_\phi(z \mid x) )$를 도입하여 다음과 같이 전개한다: 고양이

Variational Autoencoder with code

Model(Encoder,Decoder)

  1. 입력 → 잠재 공간 인코딩 $Encoder ( Q(x) )$

입력 벡터 x 는 Fully Connected Layer (MLP)와 ReLU를 거쳐 잠재 공간(latent space)으로 인코딩된다.

잠재 공간은 정규 분포를 따르며, Encoder는 평균 벡터 $( \mu )$와 로그 분산 벡터 $( \log(\sigma^2) )$를 출력한다.

샘플링된 z는 reparameterization trick을 통해 다음과 같이 계산된다: $ [ z = \mu + \sigma \cdot \epsilon, \quad \epsilon \sim \mathcal{N}(0, 1) ] $ 샘플링된 z는 다시 MLP와 ReLU를 거쳐 원래 입력과 유사한 y를 복원한다.

Decoder는 $( P(z) )$를 통해 $( x )$의 분포를 다음과 같이 재구성한다:

$ [ y \approx \hat{x} = P(z) ] $

import torch
import torch.nn as nn
import torch.nn.functional as F

class VAE(nn.Module):
    def __init__(self, input_dim=784, hidden_dim=400, latent_dim=20):
        super(VAE, self).__init__()

        # 🔷 Encoder
        self.fc1 = nn.Linear(input_dim, hidden_dim)             # 입력 x → 은닉 벡터 h
        self.fc_mu = nn.Linear(hidden_dim, latent_dim)          # 은닉 h → 평균 μ
        self.fc_logvar = nn.Linear(hidden_dim, latent_dim)      # 은닉 h → 로그 분산 log(σ²)

        # 🔶 Decoder
        self.fc2 = nn.Linear(latent_dim, hidden_dim)            # z → 은닉 h
        self.fc3 = nn.Linear(hidden_dim, input_dim)             # 은닉 h → 복원된 x

다음은 Variational Autoencoder의 학습 루프 일부이다.


# Reconstruction Loss

recon_loss = F.binary_cross_entropy(recon_x, x, reduction='sum')

# KL Divergence

kl_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())

# ELBO (Negative)

loss = recon_loss + kl_loss

이 코드에서 각각의 손실 항이 어떤 의미를 가지는지 설명하시오. 또한 이 손실의 수학적 최종 형태를 식으로 간단히 쓰시오.

© 2025 Jeewon Yoon   •  Powered by Soopr   •  Theme  Moonwalk