Information
Title: Auto-Encoding Variational Bayes (ICLR 2014)
Reference
Author: Sangwoo Jo
Editor: Changhwan Lee
Last updated on Apr. 26, 2024
VAE#
Introduction#
논문의 Introduction 에 다음과 같은 문구가 적혀있는데요.
“Variational Bayesian (VB) approach involves the optimization of an approximation to the intractable posterior”
이처럼 Variational Autoencoder 는 논문에서 제시하는 Auto-Encoding Variational Bayes(AEVB) 알고리즘 중 하나로, intractable 한 posterior 분포를 다루기 쉬운 뉴럴 네트워크로 근사함으로써 Variational Inference 를 하게 됩니다.
이가 의미하는 바가 무엇인지 한번 살펴보도록 하겠습니다.
Intractability#
Variational Autoencoder(VAE) 는 크게 Encoder 와 Decoder 부분으로 이루어져 있습니다. 더 자세하게는, Encoder는 입력 데이터

Fig. 1 Variational Autoencoder(VAE) Architecture#
Variational Autoencoder (VAE) 는 AutoEncoder 와 달리 확률 분포를 이용해 어떤 새로운 데이터를 생성하는 Decoder 부분에 초점을 둡니다. 이때 논문에서 다음과 같은 assumption 들을 내립니다. 첫번째로

Fig. 2 Overview of Bernoulli(left) and Gaussian(right) Decoder#
이를 기반으로 우리는 ML/MAP estimation 을 통해 marginal likelihood
여기서

Fig. 3 Overview of Gaussian Encoder and Decoder#
해당 implementation code 도 확인해보겠습니다.
Encoder 구현 code
class Encoder(nn.Module): def __init__(self): super(Encoder,self).__init__() self.fc1_1 = nn.Linear(784, hidden_size) self.fc1_2 = nn.Linear(784, hidden_size) self.relu = nn.ReLU() def encode(self,x): x = x.view(batch_size,-1) mu = self.relu(self.fc1_1(x)) log_var = self.relu(self.fc1_2(x)) return mu,log_var def reparametrize(self, mu, logvar): std = logvar.mul(0.5).exp_() eps = torch.FloatTensor(std.size()).normal_() eps = Variable(eps).cuda() return eps.mul(std).add_(mu) def forward(self,x): mu, logvar = self.encode(x) reparam = self.reparametrize(mu,logvar) return mu,logvar,reparam
Decoder 구현 code
class Decoder(nn.Module): def __init__(self): super(Decoder,self).__init__() self.fc1 = nn.Linear(hidden_size, 784) self.sigmoid = nn.Sigmoid() def forward(self,x): out = self.fc1(x) out = self.sigmoid(out) out = out.view(batch_size,28,28,1) return out
SGVB(Stochastic Gradient Variational Bayes)#
이로써 우리는 marginal likelihood
Reconstruction Error 는 Decoder 에서 생성하는 데이터가 최대한 원본 데이터와 유사하도록 하는 term 이고, Regularization 은 Encoder 에서 만드는 잠재변수의 분포가 저희가 부여한 prior distribution 이랑 가깝도록 설정하는 term 입니다. 이때, Reconstruction Error 는 다음과 같은 Monte Carlo Estimator
Lower bound 에 대한 수식을 변환하여 수식 전체에 대한 Monte Carlo Estimator
Reparameterization Trick#
논문에서는 모델 학습 시 backpropagation 을 원활히 사용할 수 있도록 reparameterization trick 을 소개합니다. 잠재변수
하단에는 Gaussian 분포에 대한 reparameterization trick 를 도식화한 그림입니다. 왼쪽에는 reparameterization trick이 적용되지 않은 경우로

Fig. 4 Overview of Reparameterization Trick#
Training Algorithm#
모델을 학습하는 전체적인 과정은 아래와 같습니다.

Fig. 5 Overview of Training Algorithm#
Experiments#
논문에서는 MNIST 와 Frey Face 데이터셋에 대해 AEVB(Auto-Encoder variational Bayesian)와 wake-sleep 알고리즘를 적용해서 비교합니다. 여기서 Frey Face 데이터셋은 continuous 하므로 Gaussian Decoder 를 사용합니다. 실험결과는 아래 그림과 같습니다.

Fig. 6 Experimental Results - Likelihood lower bound#
해당 그림처럼 lower bound 를 최적화하는데 AEVB 알고리즘이 더 빠르게 수렴하며 모든 실험에서 성능적으로도 더 나은 부분을 확인할 수 있습니다.

Fig. 7 Experimental Results - Marginal likelihood#
또한, latent variable
Summary#
AutoEncoder 는 latent space 에 하나의 값으로 지정해줬다면, VAE 는 평균 그리고 분산 파라미터들과 Gaussian 분포를 가진 샘플을 통해 잠재변수를 생성합니다. 그리고 VAE 를 실제로 사용해보면 생성된 데이터 image quality 가 낮다는 단점을 가지고 있다고 합니다.