Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

인공지능

Auto Encoder _2006, VAE _2013 본문

카테고리 없음

Auto Encoder _2006, VAE _2013

사람지은 2024. 6. 10. 05:31

본 포스트는 이화여자대학교 심재형 교수님의 강의를 기반으로 필자가 이해한 것을 추가하여 작성되었습니다.
 
generative model(생성형 모델) 에 대한 설명을 시작해보려고 합니다.
먼저 생성형 모델이란, 분류하는 기능을 가진 discriminative model 과 달리 이미지, 텍스트를 생성하는 모델을 의미합니다.
이미지를 생성한다고 했을 때.  training data 이미지가 필요합니다. 이때 이 이미지는 특정 data distribution을 따릅니다. 이를 $p_{data}(x)$ 라고 표현합니다. training data로 훈련시킨 모델이 배출하는 생성된 이미지가 있을텐데, 이 이미지의 data distribution 을 $p_{model}(x)$ 라고 한다면, $p_{data} (x)$, $p_{model}(x)$ 는 비슷해져야합니다. 이것이 생성 모델의 학습 목표입니다.
 
generative model 이 실생활에서 어떤 것을 할 수 있는지 소개해보고자 합니다.
 

저해상도 이미지를 고해상도 이미지로 바꿀 수 있고

비워진 부분을 채워넣을 수도 있고, 이를 inpainting 이라고 합니다.

특정 그림을 다른 style 의 그림으로 바꿀 수 있습니다. 이를 style transfer 라고 합니다.

색깔을 채워넣는 것도 가능합니다(colorization)

 
generative model 의 시초가 된 auto encoder 부터 설명해보겠습니다.
 

Auto Encoder

미리 말하자면, auto encoder 는 생성형 모델이 아닙니다. 왜 아닌지 천천히 따라가면서 설명하도록 하겠습니다.

auto encoder 는 encoder, decoder 두개로 이루어져 있습니다. encoder 를 통해 latent vector z를 생성합니다. z는 input vector 에 비해 낮은 차원을 가짐으로써 compact 한 feature 정보를 갖습니다.
decoder 는 encoder 를 통과시켜 얻은 z 를 reconstruct 하고 translate 하여 output 을 생성하는 역할을 합니다.

input layer 가 5개의 neuron을 갖고 hidden layer(z) 는 2개의 neuron, output layer 는 input layer 와 똑같은 차원 수의 neurons 수를 갖는다고 해봅시다. input 층, hidden 층 사이는 encoder, hidden 층, output 층 사이는 decoder 를 의미합니다.
encoder 의 함수를 $f = \sigma(Wx)$ 라고 하고, $g=\sigma(W^{'}h)$ 라고 하겠습니다.
그러면 score function 은 $x^{'}=g(f(x))$ 이기 때문에, $L(x^{'},x)$ 가 됩니다. 이 때, f에 쓰이는 w와 g에 쓰이는 w' 는 같습니다.
이 수식을 잘 해석해보면 g 함수는 f의 역함수에 근사시킨다는 것을 알 수 있습니다. 여러 이미지 데이터 셋이 들어가면, encoder 에서 z를 만드는 함수가 만들어질 것이고, decoder 는 f 의 역함수를 근사하도록 신경망을 근사시킬 것입니다.
 
이게 auto encoder 의 원리입니다.
하지만 이름에서 알 수 있다싶이 auto encoder 에는 encoder 밖에 없습니다. decoder 는 encoder 가 데이터의 특징을 잘 담은 latent vector 를 생성하도록 쓰이는 도구에 불과합니다.

auto encoder 를 다 학습시키면, encoder 만 떼옵니다. 떼온 다음, 이미지를 classify 하는데 pre-trained 된 모델로 사용 됩니다. pre-trained 된 encoder 는 classifier 와 함께 fine-tuned 되어, 이미지 분류 태스크를 잘 수행하는데 사용됩니다. 왜 auto encoder 의 encoder 를 이미지 분류에 사용할까요? 전에 gpu 가 없던 시절, cpu 만 사용을 하여 모델을 학습시켜야 했던 때에 차원 축소로 메모리 효율성을 높이기 위해 auto encoder 가 많이 쓰였습니다. 또한 unsupervised 학습(label 이 따로 없음)이기 때문에, auto encoder 를 학습시킬 때 라벨이 필요하지 않다는 장점이 있습니다.
 
그렇다면, 왜 decoder 는 사용하지 않을까요? decoder 를 이용해서 이미지 생성을 할 수 있을 것 같은데 말이죠

우선 z 는 input vector 보단 작은 차원이지만 여전히 큰 차원을 가집니다. 의미있는 latent representation 을 가진 건 z vector 중 일부와 대응할 것입니다. 아래 그림을 보면 이해가 되실 겁니다.
 

위 그림의 차원을 256 차원 (z 의 차원) 이라고 생각해보겠습니다. 저기 찍힌 빨간 점은 고양이, 강아지, 사승, 비행기, 자동차 등등에 해당될 것입니다. 그러면 나머지 빈 공간에 해당하는 latent vector 값을 decoder 에 넣으면 어떻게 될까요? 랜덤한 noise 형태로 출력이 될 것입니다. 아까 auto encoder 는 decoder 함수가 encoder 의 역함수에 근사한다고 설명을 드렸었습니다. 따라서 입력받은 이미지에 따른 z 의 값은 빨간색 점으로 나타내어집니다. 
 
그러면, 나머지 공간에 위치하는 z 에서도 decoder를 통해 어떻게 하면 이미지를 생성하게 할 수 있을까요? 가장 쉬운 아이디어는 저 나머지 공간에 대해서도 모두 훈련을 시키면 됩니다. 하지만 이건 원칙적으론 가능하나 현실적으로 불가능한 일입니다. 이것이 intractable 문제입니다. 그러면 어떻게 할까요?
잠재 공간의 분포도를 학습하고, 의미 있는 z 를 샘플링하면 됩니다. 일반적인 오토인코더는 잠재 공간에서의 확률 분포를 학습하지 않기 때문에, 의미 있는 z를 샘플링하는 것이 어렵습니다. 하지만 확률 분포를 사용하면 $p(z|x)$ 를 통해, 어떤 z 값이 likelihood 가 높은지를 알 수 있기 때문에 의미 있는 z를 샘플링할 수 있습니다.
 

VAE

잠재 공간의 분포도를 확률적으로 표현하여 intractable 문제를 해결한 것이 vae 모델입니다.

$\theta$ 는 모델 parameter, z 는 latent vector, x 는 생성된 이미지 입니다. 여기서 $\theta$ 를 학습시키는게 목표입니다. $\theta^{'}$ 은 true parameter 입니다.
 
우선, p(z) 를 prior 가우시안 분포로 간주하고 시작합니다.  가우시안 분포로 z 를 가정하면, 위에서 언급한 auto encoder 의 z 공간의 sparsity 문제를 해결할 수 있을 것입니다. 그리고 조건부 확률인 $p(x|z)$ 는 신경망을 통하므로 매우 복잡할 것입니다.
 
생성된 이미지의 likelihood, 즉 $p(x)$ 를 maximize 하는 것이 목표입니다.

 위 식을 풀어보면 $\int p(x,z) dz$ 가 되므로 모든 $p(x)$ 가 나올 것입니다. 이 적분식은 모든 z 에 대해 적분을 해야하므로 이 또한 intractable 합니다. 그러면 posterior 를 사용해볼까 할 수 있지만, 

이 또한 intractable 합니다.
이 때, encoder 를 사용하여 $p(x|z)$ 를 모델링 할 수 있습니다. encoder(q_{phi}(z|x)) 로 $p_{\theta}(z|x)$ 를 근사시키면 되기 때문입니다.
 

 
vae 의 latent vector 는 가우시안 분포를 따른다고 가정을 했기 때문에, encoder 의 output 은 mean 과 covariance 가 될 것입니다. 그리고 decoder 를 통과한 output x 또한 mean 과  covariance 를 가질 것입니다.
그러면 얻은 mean 과 covariance 값으로부터 x|z 를 sampling 할 수 있을 것입니다.

 이전에서 $p(x)$ 을 높이는 것이 목표라고 하였습니다. 여기에 수학적 편리성을 위해 log 를 씌우고, 분모 분자에 베이지안 법칙을이용하여 $p_{\theta}(x^(i)|z) 를 곱하고  $p_{\theta}(z|x^i)$ 를 나누어 줍니다. 전개를 해보면 세 항으로 이루어 지는데 두세번째 항은 kl divergence 를 의미합니다. kl divergence 는 두 확률 분포 간에 차이가 얼마나 나는지를 나타내는 지표입니다. 0 이상 값을 가지며, 낮을수록 차이가 적다는 것을 의미합니다. 하지만 마지막 항을 보시면 $p_{\theta}(z|x^(i))$ 가 있는데 이를 구하는 것은 intractable 합니다. kl divergence 는 항상 양수이기 때문에, 앞의 두 항만 고려하면 됩니다.
따라서 앞의 두 항의 합은 $p_{\theta}(x)$ 의 lower bound 가 됩니다. 이를 ELBO 라고 부릅니다. 이 하한 값을 최대한 높이는 것이 최종 목표가 됩니다.
 

vae 를 학습시키고 난 뒤의 data manifold 는 위와 같습니다. auto encoder 때와 달리 이산적이지 않고 자연스럽게 형태가 변화하는 것을 알 수 있습니다. 이렇게 vae 까지 설명을 마치도록 하겠습니다.


본 포스팅에 대한 질문과 지적 환영합니다