AI Study/생성모델

[생성모델] 세상에 없던 무언가, AI 생성모델 1편 VAE부터GAN까지

MNC 2022. 8. 12. 15:58

안녕하세요, 마인즈앤컴퍼니입니다.

 

AI 생성모델과 관련한 내용을 3편에 걸쳐 소개해드리려 합니다.

오늘은 그 첫번째 편 '세상에 없던 무언가, AI 생성모델 1편 VAE부터 GAN까지'입니다.


AI가 만드는 세상

물체를 탐지하고, 영어를 한글로 번역하는 AI를 넘어, 우리는 AI가 그림을 그리고 작곡을 하는 시대에 살고 있습니다. 놀랍게도 아래의 얼굴 사진은 세상에 존재하는 사람이 아닌 AI 만들어낸 가상의 인물입니다! 세상에 없던 무언가를 만들어내는 AI 생성 모델에 대해 총 2편의 글에 걸쳐 소개하고자 합니다. 오늘은 그 첫번째 시간입니다.

Alias-Free Generative Adversarial Networks (StyleGAN3)

 

판별모델과 생성모델의 차이

판별 모델(Discriminative Model)은 개와 고양이를 분류하듯, 데이터가 주어젔을 때, 주어진 정보를 고려하여 이를 특정 기준에 따라 분류하는 모델을 의미합니다. 데이터를 특성에 따라 잘 구분할 수 있는 최적의 결정 경계(Decision Boundary)를 찾는 과정이기도 합니다.

 

반면 우리가 오늘 이야기할 생성모델은(Generative Model) 데이터를 입력 받아, 입력 받은 데이터와 유사한 분포를 따르는 새로운 데이터를 생성하는 모델을 의미합니다. 모델의 학습 역시 모델이 주어진 '데이터의 분포' 를 얼마나 잘 학습하는지를 고려하며 이루어집니다.

 

Generative Model의 정의 (출처 - Naver D2 이활석님의 강의, 미술관에서 GAN 딥러닝 실전 프로젝트)

'데이터의 분포'를 학습한다는 말에 대한 쉬운 이해를 위해 이기창님의 블로그에서 다음과 같은 설명을 가져왔습니다.

 

우리가 가진 데이터가 사람 얼굴 사진이라고 칩시다. 이미지 크기가 64×64×3이라면 우리의 데이터(𝑥)는 이만한 크기의 벡터들일 것입니다. 이 사진(벡터)들을 어떤 기준에 따라 일렬로 세웠다고 가정해 보겠습니다.우리가 가지고 있는 사진 데이터셋이 동양인들 중심이라면 검은 머리색을 하고 있는 사진이 나타날 확률은 꽤 높을 수 있습니다. 바꿔 말해 검은 머리색을 하고 있는 사진들을 𝑥축에 표시하면 $x_3$ 언저리에 위치하고 $p_{data}(x_3)$은 가장 높은 값을 가지게 될 것이라는 얘기입니다. 반대로 머리색이 금발인 사진들이 $x_4$ 쯤에 위치하고 $p_{data}(x_4)$는 낮은 값을 가집니다. 더 나아가, 처음 보는 이상한 사진들이라면 발생확률이 0에 가까울 것입니다.

 

 

생성모델의 발전

생성모델은 무궁무진한 가능성을 가지고 있는 만큼 많은 사람들에 의해 활발하게 연구되는 분야입니다. Variational AutoEncoder 부터 우리가 흔히 GAN 으로 알고있는 Generative Adversarial Network 뿐아니라 Flow Model, Diffusion Model 등, 생성모델을 위한 다양한 연구가 여러 방면에서 이뤄지고 있습니다.

 

Overview of different types of generative models (출처 - Lil'log Blog)

 

Variational Auto-Encoder (VAE)

첫번째로 소개할 딥러닝 생성 모델은2013년 Kingma의 논문 Auto-Encoding Variational Bayes 에서 제안된 Variational Auto-encoder 입니다. Variational Autoencoder 는 우리가 쉽게 알기 어려운 사후확률(Posterior)분포 $p(z|x)$ 를 다루기 쉬운 분포로 근사(Approximation)하는 변분법적 추론(Variatinal Inference)을 활용한 딥러닝 생성모델의 하나입니다. 위의 그림에서 보이는 바와 같이 VAE는 Encoder 와 Decoder 두 부분으로 구성되었습니다.Encoder는 입력 데이터 $x$를 요약하여 잠재변수(Latent Variable) $z$를 만들어내는 역할을 합니다. 반면 Decoder는 잠재변수 $z$ 를 다시 최대한 유사하게 $x$로 복원하는 역할을 합니다. 

 

'꿩대신 닭이다'라는 표현처럼 $P(z|x)$를 정확하게 알 수 없다면, 이미 우리가 잘 알고 있으면서, 다루기 쉬운 분포중 최대한 비슷한 분포를(e.g Normal Distribution) 찾아내어 이를 활용하는 방식을 택한것이 VAE의 핵심 아이디어라 할 수 있겠습니다. 이를 보다 수학적으로 접근해 보도록 하겠습니다.

 

 

$z^{(i)} \sim \mathbb{P}(Z\vert X=x^{(i)})$ 

 

$\mathbb{Q}(Z\vert X; \phi)$   

 

$\mathbb{P}(Z\vert X)$ $\mathbb{Q}(Z\vert X; \phi)$ 를 구하게 됩니다. 여기서 $\phi$는 VAE 모델이 학습을 통해 얻는 최적의 파라미터 값입니다. 그렇다면 이제 우리의 관심사는  $\mathbb{Q}$ 잘 학습시키는 일입니다. 이는 어떤 과정을 통해 이루어지는지 다음을 통해 알아봅시다.

 

$\mathbb{Q}^*(Z{\vert X}) = arg\min_{\phi}\ \mathbb{K}\mathbb{L}[\mathbb{Q}(Z{\vert X};\phi)\ ||\ \mathbb{P}(Z|X)]$

 

망망대해에서 올바른 방향으로 항해를 하기 위해 나침반이 필요하듯, 딥러닝 모델 역시 원활한 방대한 데이터의 세계속에서 학습을 위한 나침반이 필요합니다.분류(Classification) 문제에서의 (Cross Entropy)가  '분류' 라는 목적에 맞는 학습 방향을 알려주는 역할을 하였다면, 생성 모델에서는 '생성' 이라는 목적에 적합한 학습 방향을 알려주는 장치가 필요합니다. 앞서 생성 모델의 목적은 데이터의 분포를 학습하는 것이라고 하였습니다. 생성모델에서 사용되는 KL(Kullback–Leibler) Divergence 는 모델이 얼마나 잘 데이터의 분포를 학습하고 있는지를 알려주는 중요한 장치입니다. 

 

Cross Entropy, KL Divergence와 같은 손실 함수(Loss Function)는 모델의 학습을 위한 나침반 역할을 합니다

 

정말 뛰어난 모델이 있어 데이터의 분포를 완벽하게 학습하였다면 KL Divergence는 0이 됩니다. 이에 반해 모델이 목표로 하는 데이터의 분포를 잘 학습하지 못한다면 KL Divergence는 점점 커지게 됩니다. 변화하는 KL Divergence의 값을 일종의 나침반 삼아 생성모델은 KL Divergence가 0이 되는 방향으로 최적의 값을 찾아 나아가는 것입니다!

 

$\mathbb{K}\mathbb{L}[\mathbb{Q}(Z{\vert X};\phi)\ \vert\vert \ \mathbb{P}(Z\vert X)]$

 

$\let\sb_ = \mathbb{E}_{\mathbb{Q}} [\log \mathbb{Q}(Z{\vert X};\phi)] - \mathbb{E}\sb{\mathbb{Q}} [\log \mathbb{P}(X, Z)] \triangleq - ELBO(\mathbb{Q})$

 

$ELBO(\mathbb{Q}) = \mathbb{E}\sb{\mathbb{Q}} [\log \mathbb{P}(X\vert Z; \theta)] - \mathbb{K}\mathbb{L}[\mathbb{Q}(Z{\vert X};\phi)\ ||\ \mathbb{P}(Z)]$

 

KL Divergence와 ELBO(Evidence Lower Bound) 사이에는 위의 수과 같은 관계가 성립합니다. 해당 식에 대한 자세한 전개 과정은 Lil'log Blog 를 참고해주시기 바랍니다. 우리는 여기서 음의 관계를 나타내는 음수 부호에 주목할 필요가 있습니다.KL Divergence 와 ELBO는 음의 관계를 가지고 있기에 KL Divergence를 작게 만든다는 의미는 반대로 ELBO를 가장 크게 만든다는 것으로 생각할 수 있습니다. 이제 ELBO의 관점에서 바라보도록 하겠습니다.

 

ELBO의 첫번째 항은 Sampling된 $Z$ 에 대한 MLE (Maximum Log Likelihood)를 구하는 과정으로 생각할 수 있습니다. 또한 $x$를 Encoder로 인코딩 하여 얻은 $z$ 를 Decoder로 다시 복원시키는 관점에서 Reconstruction Error 라고 부르기도 합니다. 그리고 $z$에 대해 주변화(marginalize)를 한다면 첫번째 항은 결국 다음과 같이 표현됩니다.

 

$\mathbb{E}\sb{\mathbb{Q}}[\log \mathbb{P}(X\vert Z;\theta)] = \log \mathbb{P}_\theta(\mathbf{x})$

 

앞서 VAE 의 핵심 아이디어로 '잘 알고', '다루기 쉬운' 분포를 활용하는것을 이야기했습니다. 이러한 조건을 만족하는 가장 대표적인 분포로 바로 정규분포 (Normal Distribution)을 꼽을 수 있습니다. 우리는 이제 $\mathbb{Q}(Z{\vert X};\phi)$ 가 정규분포를 따른다고 '가정' 할 것입니다. 이제 우리의 문제가 입력 데이터를 가장 잘 설명하는 최적의 정규분포를 찾는 문제로 많이 단순화 되었습니다. 정규분포는 평균과 분산이라는 2개의 파라미터에 의해 결정됩니다. 

 

$\mathbb{Q}(Z\vert X; [ \phi_1, \phi_2 ]) = \mathcal{N}(Z; \mu (X; \phi_1), \sigma (X; \phi_2))$

 

추가로 $\mathbb{P}(Z)$의 평균을 0으로 가정한다면 ELBO의 두번째 항은 아래와 같이 정리 할 수 있습니다. 또한 Reparametrization Trick을 통하여 미분이 가능한 부분과 가능하지 않은 부분으로 $z$ 를 분해함에 따라 딥러닝의 학습에 핵심이라고 할 수 있는 미분을 통한 역전파(Backpropagation)를 가능하게 합니다. 정규분포로 부터 임의로 Sampling 되는 $\epsilon$ 과 Deterministic한 $\mu$ 를 구분지어 생각하는것이 핵심입니다.

 

$\mathbb{K}\mathbb{L}\bigl[\mathcal{N}(\mu (X; \phi_1), \sigma (X; \phi_2))\ ||\ \mathcal{N}(0, I)\bigr]$

 

$z^{(i)} \sim \mathcal{N}(Z\vert \mu (X; \phi_1), \sigma (X; \phi_2))$

 

$z^{(i)} = \mu^{(i)} + \epsilon^{(i)} * \sigma^{(i)}\text{ , where } \epsilon^{(i)} \sim \mathcal{N}(0, I)$

 

VAE는 탄탄한 수학적 배경을 가지고 있기에 안정적인 학습이 가능합니다. 그러나 다양한 가정을 바탕으로 생성이 이루어지는 만큼 그 결과물이 매우 흐릿한(Blurry)하다는 단점을 가지고 있습니다.

 

 

Multi-Stage Variational Auto-Encoders for Coarse-to-Fine Image Generation

 

Generative Adversarial Networks (GAN)

VAE는 많은 관심을 받았으며 어느정도 성공적인 결과물을 만들어 내었지만 위의 예시와 같이 생성된 이미지가 흐릿하다는 단점을 가지고 있었습니다. 이에 2014년 Ian Goodfellow Generative adversarial nets 가 발표되었으며, 이렇게 세상에 알려진 GAN은 지금까지도 딥러닝 생성모델 하면 가장 먼저 떠오르는 대표적인 방법으로 자리잡았습니다. 현재까지도 많은 생성모델이 GAN을 활용하여 만들어지고 있습니다.

Navel Clova AI의 대표적 생성모델인 StarGAN Version 2

 

Generative 모델의 구분

위의 그림에서 GAN을 찾아본다면 앞서 설명한 Variational Autoencoder가 Explicit density의 가지에서 뻗어나온것에 반해 GAN은 Implicite density 가지에서 뻗어나온것을 알 수 있습니다. 이러한 차이에 대하여 유재준 교수님의 블로그 에서는 다음과 같이 표현하고 있습니다.

 

간접적인(Implicit) 방식이라 함은 보통 우리가 어떤 모델에 대해 틀을 명확히 정의하는 대신 확률 분포를 알기 위해 Sample 을 뽑는 방법을 얘기합니다...중략...
GAN이 강력한 이유는 어떤 확률 모델(Density)을 굳이 명확히 정의하지 않아도 모델(Generator) 자체가 만드는 분포로 부터 Sample을 생성할 수 있다는 점입니다...중략...
왼쪽 가지에 해당하는 학습 방법들은 $\mathbb{P}(x;θ)$ 와 같이 model을 명확히 정의하여 이를 최대화하는 전략을 택합니다. 우리가 model을 정의했기 때문에 다루기가 비교적 편하고 어느 정도 모델의 움직임이 예측가능한 반면 당연히 우리가 아는 것 이상으로는 결과를 낼 수 없다는 한계가 있습니다.

출처 - 투빅스 생성모델 세미나 (https://velog.io/@tobigs-gm1/basicofgan)

 

GAN은 VAE 의 Normal Distribution과 같은 가정이 포함되지 않고 이에 따라 보다 유연하게 데이터의 분포를 학습할 수 있습니다. VAE에게 Encoder와 Decoder가 있었다면 GAN에게는 생성자 (Generator) G와 식별자(Discriminator) D가 있습니다. GAN은 이 생성자  G와 식별자D가 서로 경쟁하는 방식으로 학습이 이루어집니다. 딥러닝 모델이 서로 경쟁을 벌이는 흥미로운 방식을 알아봅시다.

 

GAN을 처음 설명할때 빠지지 않고 등장하는 것이 위조지폐범 이야기입니다. 위조지폐범(Generator)는 경찰(Discriminator)를 속이기 위한 위조지폐를 만들고자 합니다. 처음 위조지폐범이 만드는 위조지폐는 그 수준이 매우 떨어져 경찰이 쉽게 가짜임을 구분할 수 있을 것입니다. 위조지폐범은 경찰을 속이기 위해 더욱 노력할 것이고 점차 그 수준이 올라가며 정교한 지폐를 만들어 냅니다. 경찰 역시 점점 정교해지는 위조지폐범의 위조지폐를 구분해내기 위해 함께 노력할 것이고 경찰의 위조지폐 구분 능력 역시 상승할 것입니다.

 

이처럼 생성자와 식별자는 서로가 경쟁을 벌이며 생성자는 더 그럴듯한 결과물, 식별자는 생성자가 만들어낸 결과물과 실제 데이터를 구분하기 위한 능력을 키우는 방식으로 모델의 학습이 이루어집니다. 이를 수학적으로 표현하면 다음과 같습니다.

 

$\begin{aligned} \min_G \max_D L(D, G) & = \mathbb{E}_{x \sim p_{r}(x)} [\log D(x)] + \mathbb{E}_{z \sim p_z(z)} [\log(1 - D(G(z)))] \\ & = \mathbb{E}_{x \sim p_{r}(x)} [\log D(x)] + \mathbb{E}_{x \sim p_g(x)} [\log(1 - D(x)] \end{aligned}$

 

위의 식에서 $x$는 원본 데이터(진짜 지폐) $z$는 Generator에 대한 Input으로 위조 지폐를 만들기 위한 '일종의 재료' 라고 이해하시면 됩니다. 먼저 D(경찰)의 입장에서 해당 식을 살펴보도록 하겠습니다. 실제 데이터$x$를 입력하면 높은 확률이 나오도록 하고($D(x)$를 높임), 가짜 데이터$G(z)$를 입력하면 확률이 낮아지도록($1−D(G(z))$를 낮춤 즉 $D(G(z))$를 높임) 학습됩니다. 다음은 G가 고정된 상황에서 $M$개의 데이터에 대해 D의 식별 능력을 최대화 하는것에만 초점을 맞춘 식입니다.

 

\begin{align*} \max _{ D }{ V\left( D \right)  } =&\mathbb{ E }_{ x\sim { p }_{ data }\left( x \right)  }\left[ \log { D\left( x \right)  }  \right] +\mathbb{ E }_{ z\sim { p }_{ z }\left( z \right)  }\left[ \log { \left\{ 1-D\left( z \right)  \right\}  }  \right] \\ =&\frac { 1 }{ m } \sum _{ i=1 }^{ m }{ \log { D\left( { x }^{ i } \right)  }  } +\frac { 1 }{ m } \sum _{ i=1 }^{ m }{ \log { \left\{ 1-D\left( G\left( { z }^{ i } \right)  \right)  \right\}  }  } \end{align*}

 

이번엔 G(위조지폐범) 입장에서 살펴보겠습니다. 가짜를 만들기 위한 재료인 $z$를 받아 생성된 가짜 데이터 $G(z)$를 $D$에 넣었을 때, 실제 데이터처럼 확률이 높게 나오도록$1−D(G(z))$를 높임, 즉 $D(G(z))$를 낮추는 방향으로 학습됩니다. 다시 말해 $G$$D$가 잘 구분하지 못하는 데이터를 생성하도록 조금씩 업데이트됩니다. 따라서 Generator의 입장에서 $M$개의 데이터가 입력된다면 학습 방향은 다음 식을 최소화 하는 방향이 됩니다.

 

\begin{align*} \min _{ G }{ V\left( G \right)  } =&\mathbb{ E }_{ z\sim { p }_{ z }\left( z \right)  }\left[ \log { \left\{ 1-D\left( G\left( z \right)  \right)  \right\}  }  \right] \\ =&\frac { 1 }{ m } \sum _{ j=1 }^{ m }{ \log { \left\{ 1-D\left( G\left( { z }^{ j } \right)  \right)  \right\}  }  } \end{align*}

 

이러한 방식을 통해 학습되는 GAN 은 무엇이든 만들어 낼 수 있을것같아 보입니다. 그러나 많은 GAN의 생성 결과물이 만족스러운 수준을 가지고 있는것은 아닙니다. 오히려 만족스럽지 않은 결과물을 생성해 낼 때가 훨씬 많습니다. Generator 와 Discriminator의 균형있는 학습이 매우 어려울 뿐 아니라 G 다양한 생성물을 만드는것이 아니라 D를 잘 속일수 있는 한가지 생성물만 반복적으로 만들어 내기도 하는등 GAN을 잘 학습시키는것은 매우 어려운 일로 악명이 높습니다. 이를 WGAN(Wasserstein-GAN) 과 같이 Wasserstein Distance라는 새로운 개념을 바탕으로 개선된 Loss Function을 만들어내는 등 GAN 의 안정적인 학습을 위한 연구가 지금까지도 끊임없이 이어지고 있습니다.

 

모델 붕괴(Mode Collapse) - 출처 (Arjovsky, Chintala, & Bottou, 2017.)

To be Continued

오늘은 생성 모델에 대한 첫번째 시간으로 VAE와 GAN에 대하여 알아보는 시간을 가졌습니다. 다음시간에는 생성 모델의 또다른 방법론인 Normalizing Flow와 Diffusion Model에 대해 알아보도록 하겠습니다. 오늘 말씀드린 내용을 모두 다 이해하지 못하셔도 괜찮습니다.

단 딥러닝 생성모델이 주어진 '데이터의 분포' 를 학습하는 모델이라는 점을 잊지 말고 꼭 기억해주세요. 감사합니다.

 

참고자료

Kingma, D. P., & Welling, M. (2013). Auto-encoding variational bayes. 
arXiv preprint arXiv:1312.6114.

Goodfellow, I., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozair, S., ... & Bengio, Y. (2014). Generative adversarial nets. Advances in neural information processing systems, 27

Goodfellow, I. (2016). Nips 2016 tutorial: Generative adversarial networks. 
arXiv preprint arXiv:1701.00160.

https://ayandas.me/blog-tut/2020/01/01/variational-autoencoder.html
https://blog.evjang.com/2016/08/variational-bayes.html
https://jaejunyoo.blogspot.com/2017/01/generative-adversarial-nets-1.html
https://lilianweng.github.io/posts/2017-08-20-gan/
https://ratsgo.github.io/generative%20model/2017/12/20/gan/
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=laonple&logNo=221195944242