2019년 5월 13일 월요일

카카오 리포트 (Part I)

이전에 카카오 리포트에 기고한 글을 개인 블로그에도 올린다. 두 파트로 나뉘어 글을 기고하였는데, 둘이 합쳐 GAN에 대한 전체적인 조망이 되기 때문에, 개별 GAN 논문을 리뷰하는 것에 비해 개괄적인 정보를 알 수 있을 것이다.

파트 I은 GAN에 대한 소개로 이전 초짜 대학원생 시리즈에서 대부분 다룬 내용이지만 첫 글 이후로 GAN에 대해 이해가 더 깊어진 후 정리한 글이기에 내용적 측면에서 낫다는 장점도 있겠다. 파트 II는 GAN 연구에 대해 좀 더 개괄적으로 다루고 있으므로 연구 방향이나 흐름을 빠르게 알고 싶은 사람들에게 도움이 되리라 생각한다.

** 이 글을 기고할 당시만 해도 대학원생으로 박사 졸업을 언제 할 수 있을지 불분명 하였을뿐 아니라, GAN이 참 재미있으면서도 내 연구 주제에 머신러닝을 적용하는 것이 가능할지도 잘 모르던 때였는데, 지금은 네이버에서 본격적으로 generative model들을 연구하고 있으니 시간이 참 빠르다. 열심히 살아야지. 
2019.05.13



오늘 소개드릴 주제는 Generatvie Adversarial Network (GAN)입니다. GAN은 이름 그대로 뉴럴넷을 이용한 생성 모델입니다. 흔하게는 이미지를 생성하는 것에부터 음성, 문자에 이르기까지 다양한 분야에 적용되고 있습니다. 2014년에 Ian Goodfellow가 GAN [1]을 처음 선보였을 때부터 이미 대박의 낌새가 보였지만, NIPS 2016 이후부터는 GAN에 대한 관심이 더욱 폭발적으로 늘어나고 있습니다. 원래도 핫한 기계학습 분야에서도 GAN에 대한 연구는 유독 빠르게 발전하고 있는데요 일주일이 멀다하고 새로운 아이디어를 사용한 논문이 나오는 한 편, 재미있는 뱡향의 어플리케이션들이 속속들이 나오면서 기세를 더해가고 있습니다. 페이스북의 Yann Lecun 교수님도 최근 10-20년 간에 기계학습 나온 아이디어 중 최고라고 찬사할만큼 그 열기가 쉽게 식지는 않을 것 같습니다.

이 글에서는 이렇게 사람들이 열광하는 GAN이 무엇인지, 어떤 원리로 그림을 생성하는지에 대해 먼저 소개하겠습니다. 그리고 글을 읽으신 분들이 GAN의 개념과 그 밑에 깔려 있는 기본적인 수학적 배경을 이해하고, 이후 새로운 GAN 연구를 봤을 때 흐름을 따라갈 수 있는 기초적인 배경을 제공하는 것을 목표로 합니다.

Generative Adversarial Networks


GAN 이전에도 생성 모델(Generative Model)은 매우 다양하게 있었는데 왜 하필 GAN만 유독 이렇게 난리일까요?
"잘 되니까."

아래 [그림 1]은 구글에서 올해 3월에 발표한 BEGAN 모델로 생성한 이미지들입니다.
[그림 1] BEGAN 결과 [2]

즉, 이 사진들은 모두 실존하는 인물의 것이 아니란 것이죠. 상당히 그럴듯 하지 않나요? 꽤나 자세히 뜯어봐도 실제 사람의 사진인 것으로 보일 정도입니다. 워낙 잘 되다보니 우리나라로 치면 디시인사이드와 같은 Reddit의 Machine Learning 게시판에서는 한 때 다음과 같은 게시물이 눈길을 끌기도 했습니다.


[그림 2] Reddit 게시글 [3]

"BEGAN으로 학습시키던 중 16만8천 번째쯤 귀여운 그녀를 보았습니다. 그리고...다시는 보지 못했어요 :(" (여러분의 이상형이 데이터 분포 저기 어디엔가 분명히 존재합니다! 그러니 모든 솔로들은 GAN 연구를! 글쓴이에게는 심심한 위로를... weight 저장을 꼭 생활화 합시다!)

사실 GAN이란 모델을 이렇게 잘 학습시키는 것은 매우 쉬운 일이 아닙니다만, 그 이유에 대해서는 나중에 차차 설명하도록 하고 GAN의 원리에 대해 먼저 소개해드리도록 하겠습니다.

GAN에 대한 개념적 소개


GAN은 이름만 뜯어봐도 큰 줄기를 알 수 있습니다:
  • "Generative" 모델입니다. CNN을 이용한 이미지 분류기(Classifier)와 같이 이미지의 종류를 구분하는 것이 아닌 이미지를 만들어내는 방법을 배우는 모델이라는 것을 알 수 있습니다. 
  • "Adversarial"이란 단어의 사전적 의미는 "대립하는, 적대하는" 입니다. 대립하려면 상대가 있어야하니 GAN은 크게 두 부분으로 나뉘어 있다는 것을 직관적으로 알 수 있죠.
  • "Network", 즉 뉴럴넷을 사용해서 모델이 구성되어있습니다. 

정리하자면, GAN은 이미지를 만들어내는 네트워크(Generator)와 이렇게 만들어진 이미지를 평가하는 네트워크(Discriminator)가 있어서 서로 대립(Adversarial)하며 서로의 성능을 점차 개선할 수 있는 구조로 만들어져있습니다.

좀 더 직관적으로 이해하고 싶다면, Generator를 지폐위조범, Discriminator를 경찰로 생각해보시면 됩니다.
지폐위조범(Generator)은 위조 지폐를 최대한 진짜와 같이 만들어 경찰을 속이기 위해 노력하고, 경찰(Discriminator)은 이렇게 위조된 지폐를 진짜와 감별하려고(Classify) 노력한다. 이런 과정을 반복하면서 두 그룹이 각각 서로를 속이고 구별하는 능력이 발전하게 되고, 궁극적으로는 지폐위조범의 솜씨가 매우 좋아져서 경찰이 더이상 진짜 지폐와 위조 지폐를 구별할 수 없을 정도(구별할 확률 $p=0.5$)가 된다는 것.

이런 예시를 좀 더 수학적 용어를 섞어 표현하면 다음과 같습니다. Generative 모델 $G$는 우리가 갖고 있는 실제 이미지 $x$의 분포(data distribution)를 알아내려고 노력합니다. 만약 $G$가 정확히 데이터 분포를 모사할 수 있다면 이 분포로부터 뽑은 (혹은 생성한) 샘플 이미지는 진짜 이미지와 전혀 구별할 수 없겠죠. 즉, $G$는 $z\sim p_z$일 때 가짜 이미지 샘플 $G(z)$의 분포 $p_g$를 정의하는 모델로 생각하실 수 있습니다. 여기서 $z$는 $G$라는 샘플링 모델에 들어갈 input 값이라고 생각하시면 됩니다. 보통 $z$의 분포 $p_z$는 Gaussian 분포를 사용하는데 이 부분은 차차 설명드리겠습니다.

한편, discriminator 모델 $D$는 현재 자기가 보고 있는 샘플이 진짜 이미지 $x$인 지 혹은 $G$로부터 만들어진 가짜 이미지 $G(z)$인 지 구별하여 샘플이 진짜일 확률을 계산합니다. 앞서 예를 든 것처럼 $p_g=p_{data}$가 된다면 각각의 분포로부터 뽑힌 샘플만을 가지고 어느 쪽에서 왔는지 구별할 방법이 없기 때문에 $D$가 할 수 있는 최선은 동전 던지기입니다. 즉, 임의의 샘플 $x$에 대해 $D(x)=\frac{1}{2}$이 되는 것이죠.


[그림3] 지폐위조범 VS 경찰

최소최대 문제 (minimax problem)


우리의 목적은 Generator는 점점 더 실제 이미지와 닮은 샘플을 생성하게 하고 Discriminator는 샘플을 점점 더 잘 구별하는 모델을 만드는 것입니다. 따라서 [그림 3]을 보면 알 수 있듯이 $D$의 입장에서는 data로부터 뽑은 샘플 $x$는 $D(x)=1$이 되고, $G$에 임의의 input $z$ 넣고 만들어진 샘플에 대해서는 $D(G(z))=0$가 되도록 노력합니다. 즉, $D$는 실수할 확률을 낮추기(mini) 위해 노력하고 반대로 $G$는 $D$가 실수할 확률을 높이기(max) 위해 노력하는데, 따라서 둘을 같이 놓고보면 "minimax two-player game or minimax problem"이라 할 수 있겠습니다.

이를 수식으로 정리하면 우리가 하고자 하는 것은 다음과 같은 가치 함수(value function) $V(G,D)$에 대한 minimax problem을 푸는 것과 같아집니다:
$$\min_G \max_D V(D,G) = \mathbb{E}_{x\sim p_{data}~(x)}[log D(x)] + \mathbb{E}_{z\sim p_z(z)}[log(1-D(G(z)))]$$
뭐든지 간에 이런 수식이 있으면 극단적인 예시를 넣어 이해하는 것이 빠릅니다. 먼저 $G$ 입장에서 가장 이상적인 상황을 생각해보겠습니다. $G$가 진짜 이미지와 완벽히 닮은 샘플을 만들어서 $D$가 $G(z)$가 만들어낸 이미지가 진짜일 확률이 1이라고 잘못 결론을 내린다면, $D(G(z))=1$이므로 두 번째 항의 값이 $-\infty$가 되는 것을 보실 수 있습니다. 이 때가 $G$의 입장에서 $V$의 "최소값"이라는 것은 자명합니다.

반면에 $D$가 진짜 이미지와 가짜 이미지를 완벽하게 잘 구별을 하는 경우, 현재 보고있는 샘플 $x$가 실제로 data distribution으로부터 온 녀석일 경우 $D(x) =1$, 샘플이 $G(z)$가 만들어낸 녀석이라면 $D(G(z))=0$가 되므로 위에 식 첫 번째 항과 두 번째 항이 모두 0으로 사라지죠. 이 때 $D$의 입장에서 $V$의 "최대값"을 얻을 수 있다는 것 역시 자명합니다.

이제 드디어 우리가 풀 문제를 수식으로 명확히 정의하였습니다. 그런데 보시다시피 이 문제는 변수 $G$와 $D$ 두 개가 서로 엮여 있습니다. 이런 관계 덕분에 서로에게 피드백을 줘서 성능이 각각 좋아지기도 하지만 한편으로는 한 쪽 모델에 대해 문제를 풀면 다른 한 쪽은 손해를 보기 때문에 둘 모두를 만족시키는 평형점을 찾기가 쉽지 않습니다.

따라서 실제로 문제를 풀기 위해서는 한 쪽을 상수로 고정하고 다른 변수에 대해 문제를 푸는 방식의 접근을 할 수밖에 없습니다. 예를 들자면, 먼저 현재 생성 모델을 $G'$으로 고정하고, $D$에 대해 $\max_D V(D,G')$ 문제를 먼저 풀어서 $D'$을 구합니다. 이렇게 얻은 $D'$를 넣고 $G$에 대해 $\min_G V(D',G)$ 문제를 번갈아 푸는 전략을 쉽게 생각해볼 수 있겠습니다.

이론적 근거 (Theoretical Results)


이제 방법도 알았고 문제를 열심히 잘 풀기만 하면 될 것 같지만! 그러기 전에 아직 해결해야할 것들이 몇 가지 남아있습니다. 먼저 우리가 정의한 이 문제가 실제로 정답이 있는지(existence), 만약 해가 존재한다면 유일한지(uniqueness) 확인할 필요가 있습니다. 그리고 제안한 방법이 실제로 원하는 해를 찾을 수 있는지(convergence) 확인해야합니다. 애초에 답이 없는 문제를 풀거나, 답이 있더라도 여러 개이거나, 풀 방법을 제안했는데 그 방법이 해로 수렴한다는 보장이 없으면 여러 모로 곤란하겠죠.

따라서 이제부터는 이 부분들을 하나씩 체크해보겠습니다. 이 장에서 중요한 내용은 크게 두 가지로 나눌 수 있을 것 같습니다.

  1. 앞서 소개한 minimax problem이 $p_g = p_{data}$에서 global optimum으로 unique solution을 갖는다는 것을 보인다. 
  2. 알고리즘이 global optimum로 수렴한다.

일단, 첫 번째 주제인 global optimality에 관한 얘기를 하기 위해서는 먼저 가져가야 할 도구가 하나 있습니다.
임의의 $G$에 대하여, 최적의 discriminator $D$는 다음과 같다: $$D^*_G(x) = \frac{p_{data}~(x)}{p_{data}~(x)+p_{g}(x)}.$$
위 수식을 증명하는 것은 크게 어렵지 않습니다. 먼저 $V(G,D)$를 다음과 같이 풀어쓸 수 있습니다: $$\begin{align*}V(G,D) &=\mathbb{E}_{x\sim p_{data}~(x)}[log D(x)] + \mathbb{E}_{z\sim p_z(z)}[log(1-D(G(z)))] \\&= \int_x p_{data}~(x)log(D(x))dx + \int_z p_z(z)log(1-D(G(z)))dz \\ &= \int_x p_{data}~(x)log(D(x)) + p_g(x)log(1-D(x))dx \end{align*}$$
마지막 식의 형태를 참고하면, $D^*$을 구하는 문제는 임의의 $(a,b) \in \mathbb{R}^2 \setminus \{0,0\}$에 대하여, $y \rightarrow {\rm a} log(y) + {\rm b} log(1-y)$라는 함수에서 최대값을 구하는 문제로 단순화할 수 있습니다. 이 함수는 $y^*=\frac{a}{a+b}$에서 최대값을 갖기 때문에 이 것으로 증명이 완료됩니다.

결국, 위 결과를 바탕으로 minimax problem을 다시 써보면 이제 변수가 $G$ 하나인 $C(G)$라는 문제로 나타낼 수 있습니다:
$$\begin{align*} C(G) & = \max_D V(G,D) \\
&= \mathbb{E}_{x \sim p_{data}} \left[ log D^*_G(x) \right] + \mathbb{E}_{z\sim p_z}\left[ log(1-D^*_G(G(z))) \right] \\
&= \mathbb{E}_{x \sim p_{data}} \left[ log D^*_G(x) \right] + \mathbb{E}_{x\sim p_g}\left[ log(1-D^*_G(x)) \right] \\
&= \mathbb{E}_{x \sim p_{data}} \left[ log \frac{p_{data}~(x)}{p_{data}~(x)+p_{g}(x)} \right] + \mathbb{E}_{x\sim p_g} \left[ log \frac{p_{g}(x)}{p_{data}~(x)+p_{g}(x)} \right] \end{align*}$$

전역해(Global optimum) 증명


이제 이 도구를 사용해서 main theorem을 증명해봅시다!
$C(G)$의 global minimum은 오직 $p_g=p_{data}$으로 유일하게 존재하며,  이 때 $C(G)$의 값은 $-log(4)$이다.
증명은 양방향으로 진행됩니다. 먼저 가장 이상적으로 $p_g = p_{data}$일 때 $C(G)$가 어떤 값을 갖는지 확인해보겠습니다. 앞서 구한 식에 의해 $D^*_G(x)=\frac{1}{2}$이고, 이를 대입하면 다음과 같이 나타낼 수 있습니다: $$C(G) = \mathbb{E}_{x \sim p_{data}} \left[ -log(2)\right] + \mathbb{E}_{x \sim p_{g}} \left[ -log(2)\right]=-log(4).$$
한편, $C(G)$ 수식을 바꿔 표현해서 $-log(4)$가 $C(G)$가 갖을 수 있는 유일한 최적값임을 알기 위해서는 다음과 같이 $C(G)$를 표현하는 것이 증명의 키 입니다:
 $$\begin{align*}C(G) &= C(G) + log(4) -log(4) \\ &= -log(4) + KL \left( p_{data} || \frac{p_{data}~+ p_g}{2}\right) + KL \left( p_g|| \frac{p_{data}~+ p_g}{2}\right) \\ &= -log(4) + 2\cdot JSD(p_{data}||p_g) \end{align*}$$ 
첫 번째 등호에서 두 번째 등호로 넘어가는 것은 Kullbeck-Leibler divergence에 대한 정의를 알아야합니다. Kullbeck-Leibler divergence는 $P$라는 확률 분포와 $Q$라는 확률 분포가 있을 때 두 분포가 얼마나 다른 지를 측정하는 값입니다: $$D_{KL}(P||Q) = \sum_i P(i) log\frac{P(i)}{Q(i)}.$$
$P$와 $Q$의 분포가 일치하면 $log$ 안의 값이 1이되어 divergence가 0이 되는 것을 알 수 있습니다. 따라서 첫 번째 수식의 $C(G)+log(4)$를 풀어서,
$$\mathbb{E}_{x \sim p_{data}} \left[ log \frac{p_{data}~(x)}{p_{data}~(x)+p_{g}(x)} \right] + \mathbb{E}_{z\sim p_x(z)} \left[ log \frac{p_{g}(x)}{p_{data}~(x)+p_{g}(x)} \right] + log(2) + log(2)$$
이와 같이 나타낸 후 각 expectation 안으로 $log(2)$를 넣어주면 두 번째 등호의 수식의 형태로 나오게 됩니다. 두 번째에서 세 번째 등호도 $JSD$의 정의를 알면 자연스럽게 따라옵니다:
$${\rm JSD}(P \parallel Q)= \frac{1}{2}D_{KL}(P \parallel M)+\frac{1}{2}D_{KL}(Q \parallel M).$$
여기서 $M=\frac{1}{2}(P+Q)$이므로 그대로 원 수식에 비교 대조해보면, 쉽게 유도할 수 있습니다. 결국 $JSD$는 분포 간의 차이를 나타내는 값으로 항상 양수이며, 비교하는 두 분포가 일치할 때만 값이 $0$이기 때문에 $C^*=-log(4)$가 $C(G)$의 global minimum이며 그 유일한 해가 $p_g = p_{data}$임을 알 수 있습니다.

따라서 앞서 정의한 minimax problem을 잘 풀기만 하면 (즉, global optimal을 찾으면), generator가 만드는 probability distribution $p_g$가 data distribution $p_{data}$와 정확히 일치하도록 할 수 있다는 것을 알았습니다. 결국, generator가 뽑은 샘플을 discriminator가 실제와 구별할 수 없게 된다는 것이죠.

수렴성(convergence) 증명


남은 것은 앞서 제시한 것과 같이 $G$와 $D$에 대해 번갈아가며 문제를 풀었을 때, $p_g = p_{data}$를 얻을 수 있는지 확인하는 것입니다. 여기서 증명을 용이하게 하기 위해 몇 가지 제약이 들어가는데요 먼저 $G$와 $D$라는 모델이 각각 우리가 원하는 데이터의 확률 분포를 표현하거나 구별할 수 있는 모델을 학습할 수 있을만큼 용량(capacity)이 충분하고, discriminator $D$가 주어진 $G$에 대해 최적값인 $D^*$으로 수렴한다고 가정합니다.
위 가정이 충족되었을 때, $$\mathbb{E}_{x \sim p_{data}} \left[ log D^*_G(x) \right] + \mathbb{E}_{x\sim p_g}\left[ log(1-D^*_G(x)) \right]$$에 대하여 $G$의 최적값을 구하면 $p_g$가 $p_{data}$로 수렴한다.
먼저 $D$가 고정일 때, $V(G,D)=U(p_g,D)$라 표현하겠습니다. 증명의 방향은 먼저 $U(p_g,D)$가 $p_g$에 대해서 볼록(convex) 함수임을 확인하는 것입니다. $U(p_g,D)$의 유일한 해가 $p_g = p_{data}$라는 것은 앞선 정리에서 확인하였기 때문에 이로써 증명이 끝나게 됩니다. 정의에 의해 $$U(p_g,D)=\int_x p_{data}~(x)log(D(x)) + p_g(x)log(1-D(x))dx $$이므로 $p_g$에 대해 미분을 하면 $log(1-D(x))$만 남게 되고 이는 $p_g$에 대해서 상수이기 때문에 $U(p_g,D)$가 선형 함수임을 알 수 있습니다. 그러므로 $\sup_D U(p_g,D)$가 $p_g$에 대해 볼록 함수*로 유일한 전역해(global optimum)를 갖고, 따라서 $p_g$에 대한 적은 업데이트만으로도 $p_g\rightarrow p_{data}$라 얘기할 수 있겠습니다.

이제 앞서 제안한 전략이 global optimal으로 해가 수렴한다는 것까지도 증명했습니다. 단! 지금까지 전개한 논리들에는 몇 가지 꼭 알고 넘어가야할 내용들이 있습니다.

첫째, 잘 보시면 아시겠지만 지금까지 논리를 전개하며 $G$와 $D$를 만들 모델에 대해 어떤 제약을 두지 않았습니다. 즉, 여기서 $G$와 $D$는 무한대의 표현 용량을 가진 (임의의 어떤 함수라도 표현할 수 있는) 모델로써 앞서 진행한 증명들은 모두 probability density function 공간에서 전개된 것입니다. 그러나 실제로 모델을 만들 때 위와 같은 non-parametric 모델을 만드는 것은 현실적으로 어려움이 많습니다.

그런데 뉴럴넷은 충분한 용량만 주어진다면 universal function approximator로써 역할을 잘 해준다는 것이 잘 알려져 있고 미분이 가능한 함수들로 표현되므로 backpropagation이라는 매우 직관적이고 효율적인 방식으로 학습을 할 수 있다는 장점이 있습니다. 또한 probability distribution을 학습하기 위해 Markov Chain Monte Carlo (MCMC)와 같은 무식한 방법을 사용하지 않아도 되기 때문에 여러 모로 빠르기도 하죠. 이런 여러 장점들 때문에 실용적인 측면에서 GAN에서는 뉴럴넷을 사용하여 모델을 완성합니다.

따라서 각각의 $G$와 $D$를 단순한 뉴럴넷인 multilayer perceptron(MLP)으로 모델을 만들면, $G$는 input $z$에 대해 output으로는 이미지 샘플을 뽑아주는 $G(z;\theta_g)$로 표현할 수 있습니다. 한편, $D$ 역시 $D(x;\theta_d)$로 나타내며 output으로 샘플 $x$가 $p_{data}$로부터 뽑혔을 확률값을 내보냅니다. 여기서 $\theta_g$와 $\theta_d$는 각 MLP의 parameter가 되겠습니다.

그러나 이렇게 함수 공간을 일반적인 공간에서 뉴럴넷이 표현할 수 있는 공간으로 바꾸게 되면, GAN이 표현할 수 있는 $p_g$가 $G(z;\theta_g)$ 함수로 나타낼 수 있는 종류로 제한이 됩니다. 뿐만 아니라 더이상 $p_g$에 대해 직접 최적화 문제를 푸는 것이 아닌 $\theta_g$에 대해 최적화 문제를 푸는 것으로 모든 구조가 바뀌기 때문에 앞서 증명들에서 사용한 가정들이 모두 깨지게 됩니다. 즉, MLP를 모델로 사용하면 $G$가 parameter space에서 multiple critical points를 가지기 때문에 완전히 증명한 바와 합치하지는 않다는 것이죠. 다만 실제로 학습을 해보면 성능이 잘 나오는 것으로 미루어봤을 때, MLP가 이론적 보장이 좀 부족할지라도 실용적으로 쓰기에는 합리적인 모델이라고 할 수 있겠습니다.

둘째, 수렴성 증명에 들어간 가정들을 보시면 생각보다 매우 강력한 제약임을 알 수 있습니다. 실제로는 계산량이나 학습 시간에 한계가 있기 때문에 $D^*$를 얻기 위해 $D$가 수렴할 때까지 학습시키는 것은 현실적으로 어렵습니다. 게다가 모델의 용량이 $p_{data}$를 학습하기에 충분한지에 대한 문제 역시 쉽게 다루기 어렵죠. 최대한 이론적 상황과 비슷하게 맞춰주기 위하여 $D$에 대한 학습을 $G$에 비해 보다 많이 수행해주는 등 기술적인 노하우를 사용하기는 하지만 근본적인 해결책이라 할 수는 없습니다. 따라서 어떤 면에서는 유명무실한 증명이라 할 수도 있겠습니다.

셋째, 심지어 구현시 사용하는 가치 함수 (value function)의 형태가 이론과 다릅니다. 실제로는 $\min_G log(1-D(G(z)))$ 대신 $\max_G log(D(G(z)))$로 모델을 바꾸어 학습시킵니다. 학습 초기에는 $G$가 매우 이상한 이미지를 생성하기 때문에 $D$가 너무도 쉽게 이를 진짜와 구별하고 $log(1-D(G(z)))$의 기울기가 아주 작아서 학습이 엄청 느립니다. 문제를 $G = \max_G log(D(G(z)))$로 바꾸면, 위와 같은 문제가 생기지 않기 때문에 쉬운 해결 방법입니다만, 더이상 다루는 형태가 이론적인 수식과 같지 않기 때문에 이 역시도 아쉬운 점이라 할 수 있습니다.

이로써 GAN에 대해 원 논문에서 나온 이론적 증명까지 모두 살펴보았습니다. 다음 호에서는 기존 생성 모델과 GAN의 차이점에 대해 살펴보고 GAN의 특징과 장단점에 대해 좀 더 소개하겠습니다.

다음 읽을 거리








댓글 1개:

  1. Ian Goodfellow의 논문을 읽다가 이 블로그에 오게 되었네요 한국어로 풀어서 설명해주시니까 훨씬 이해가 잘 됩니다ㅎㅎ 정말 감사하고 차근차근 읽어보겠습니다

    답글삭제