2017년 3월 15일 수요일

초짜 대학원생의 입장에서 이해하는 InfoGAN (1)

* InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets Xi Chen et al. 2016을 바탕으로 작성한 리뷰

오늘은 InfoGAN이라는 논문을 소개하고자 합니다. 정보 이론(information-theoretic)에서 아이디어를 가져와 GAN에 붙여 확장한 것인데, 어려워 보이는 수식어가 붙는 것에 비해 아이디어가 상당히 간단하고 매우 흥미로운 결과를 보여줍니다. 더불어 original GAN을 다른 관점으로 분석하는 길을 열어주기 때문에 GAN을 더 깊히 이해하는데 도움이 될 것이라 생각합니다.

기본적인 아이디어는 다음과 같습니다. 기존의 GAN은 생성 모델의 input이 $z$ 하나인 것에 비해 InfoGAN은 ($z,c$)로 input에 code라는 latent variable $c$가 추가됩니다. 그리고 GAN objective에 애드온(add-on)을 하나 붙여서 생성 모델이 학습을 할 때, latent 공간($z$-space)에서 추가로 넣어준 코드 $c$와 생성된 샘플(generated sample) 사이의 Mutual Information (MI)가 높아지도록 도와줍니다.

흠...code? Mutual Information? 뭔가 와닿지 않을 때는 결과를 보는게 최고죠. 일단 이렇게 추가된 부분이 어떤 일을 해주는지 보겠습니다:



혹시 지난 DCGAN 글 가장 마지막 부분에서 "회전에 대해 이해하기"라는 결과를 보여드렸던 것 기억하시는지요. DCGAN 학습을 마친 후, 왼쪽으로 보는 얼굴을 생성하는 latent variable $z_{left}$와 오른쪽을 보는 얼굴에 대응하는 latent variable $z_{right}$를 가져와서 두 벡터의 차를 구하여 나오는 벡터의 방향으로 latent space에서 조금씩 변화를 주면, 그에 대응하여 생성되는 이미지가 마치 왼쪽에서 오른쪽으로 조금씩 고개를 돌리듯이 회전하는 것을 볼 수 있었습니다.

이렇게 "회전"이란 의미를 지니는 벡터를 코드(code)라고 해보겠습니다. 굳이 의도하지는 않았더라도 DCGAN에서도 나름 code를 잘 학습하였지만, InfoGAN은 같은 일을 좀 더 명확한 목적을 가지고 "잘" 하도록 해줍니다.

위 그림에서 (a), (c), (d)가 InfoGAN, (b)가 일반 GAN 결과입니다. InfoGAN으로 학습시킨 code에 약간씩 변화를 주면 결과가 어떤 식으로 바뀌는지 볼 수 있습니다. 같은 code를 바꿔서 input으로 넣어줄 때, 일반 GAN은 별다른 의미를 찾기 어려운 반면, InfoGAN은 위 그림의 (a) 결과와 같이 0~9 각각의 digit type을 나누는 categorical code 외에도 (c)와 (d)처럼  글자의 기울기 혹은 회전이나 너비를 학습한 continuous code 등을 잘 뽑아낸 것을 보실 수 있습니다.

즉, InfoGAN에서는 생성 모델이 "회전"과 같은 의미를 이해하고 이에 해당하는 code를 좀 더 잘 뽑아낼 수 있도록 기존 GAN objective에 앞서 소개한 MI을 이용한 애드온을 덧붙여 학습시킵니다. 그럼 이제 구체적으로 어떻게 "잘" 하게 해주는지 차근차근 살펴보겠습니다.



Mutual Information for Inducing Latent Codes


일반 GAN에서는 아래와 같은 minimax 문제를 풀려고 하죠
$$\min_G \max_D V(D,G) = \mathbb{E}_{x\sim p_{data}~(x)}[log D(x)] + \mathbb{E}_{z\sim p_x(z)}[log(1-D(G(z)))]$$
일반 GAN은 여기서 생성 모델(generator $G$)의 input으로 들어가는 continuous noise vector $z$에 아무런 제약을 주지 않기 때문에 생성 모델이 매우 꼬인(highly entangled) 방식으로 representation을 학습할 여지가 있습니다. 따라서 $z$의 individual dimensions가 데이터의 어떤 주요한 의미와 굳이 대응될 이유가 없지요.

하지만 대부분의 데이터들은 사람이 보기에 의미적으로 중요한 특징들로 표현할 수 있습니다. 예를 들어 앞서 보여드린 MNIST 데이터의 경우만 해도 0~9의 숫자들을 각각 나타내는 digit type이라든가 글자의 기울기, 너비 등의 특징들을 가지고 있습니다.

다만 데이터가 고차원으로 갈수록 이런 특징들을 학습하기가 매우 어려워지고 어쩌다 되더라도 representation이 "복잡하지 않은" 혹은 "꼬이지 않은" 방식으로 학습될 가능성은 낮아집니다. 비지도적 방식으로 보다 복잡한 데이터에 대해 이러한 특징들을 학습 모델이 자연스럽게 집어서 보여줄 수 있다면 매우 이상적이겠죠.

이에 관한 설명을 아주 잘 보여주는 슬라이드가 있어 아래에 소개합니다. 
(원 저자는 오사카 대학 박사과정인 Takato Horii씨이고 항공우주연구원의 김홍배 박사님이 주석을 달아주셨습니다. 슬라이드 링크)

그림을 보며 한 번 더 부연해보겠습니다. 위에 슬라이드에서 보실 수 있듯이 "꼬여 있는" representation space의 경우 각 basis의 방향 즉 x축 혹은 y축 방향으로 움직일 때 만나는 색이 뜬금없이 무작위로 바뀌는 것을 볼 수 있습니다. 이렇게 만나는 색이 각각 데이터에서 어떤 의미를 지닌다고 할 때, 이런 representation space에서 유의미한 코드를 찾기는 매우 어렵습니다.

그런데 만약 그 아래에 있는 그림과 같이 "펴진" 것과 같은 representation space를 학습할 수 있다면 얘기가 달라지죠. 이 전과는 달리 각각의 basis dimension이 의미를 갖고 해석하기가 편해집니다. 예를 들어 이 공간에서 y축 방향으로 움직이면, 색이 규칙적으로 바뀝니다. 마치 MNIST 데이터로 따지면 category가 바뀌는 것으로 생각할 수 있겠네요. 만약 x축으로 움직인다면 x축의 값이 증가함에 따라 데이터에서 어떤 continuous한 형태의 특징이 변화하는 것을 생각해볼 수 있겠습니다. MNIST에서 기울기나 글짜의 너비 등과 대응되는 형태이죠.

이렇게 representation을 학습할 때, 좀 더 좋은 성질을 갖도록 제약을 줄 수 있다면 참 좋겠다...라는 문제를 나름의 방식으로 푼 것이 바로 InfoGAN입니다.

InfoGAN


InfoGAN은 생성 모델이 representation을 학습할 때 약간의 제약을 주어, 보다 풀린(disentangled) 방식으로 representation을 학습하도록 도와줍니다. 이를 위해서 input noise vector를
  1. 더이상 압축되지 않는 noise에 해당하는 $z$와
  2. data distribution의 semantic feature에 해당하는 latent code $c$
이렇게 두 부분으로 나누어 넣습니다. 

각각의 code $c_i$에 대한 distribution은 가장 간단하게 $P(c_1,c_2,\cdots,c_L)=\Pi_{i=1}^LP(c_i)$과 같은 factored distribution을 갖는다 가정하고 모든 $i$에 대해 concatenate한 code를 $c$라고 하겠습니다.

예를 들면, $c_1$은 각각의 0~9 digit type에 대응하도록 $c_1\sim Cat(K=10,p=0.1)$와 같이 categorical code를 갖게 하고 $c_2$와 $c_3$는 회전이나 두께와 같은 것에 대응되는 continuous code를 갖도록 $c_2,c_3 \sim Unif(-1,1)$ 분포를 주면 됩니다. 

기존의 GAN에서는 다른 제약이 없기 때문에 생성 모델이 $G(z,c)$이 되어도 $P_G(x|c) = P_G(x)$를 만족하는 solution을 찾는 것으로 $c$를 간단히 무시해버릴 수 있습니다. 이렇게 생성 모델이 trivial code를 학습하는 것을 막기 위해서 InfoGAN은 latent code $c$가 생성 모델의 분포 $G(z,c)$와 상호 정보량(Mutual Information, MI)이 높도록 제약을 부여합니다. 즉, $I(c;G(z,c))$가 높게 유지시킵니다.

정보 이론에서는 X와 Y 사이의 상호 정보량을 $I(X;Y)$라 나타내고 이는 $X$에서 $Y$로부터 설명될 수 있는 정보량("amount of information")을 의미합니다.
$$I(X;Y) = H(X) -H(X|Y)=H(Y)-H(Y|X)$$
다르게 설명하면 $I(X;Y)$는 Y가 관측되었을 때, X에서 사라지는 불확실성(uncertainty)의 양이라고 생각하시면 되겠습니다. 한 예로 X와 Y과 독립변수라면 하나를 안다해서 다른 하나에 대해 예측하거나 알 수 있는 것이 없기 때문에 $I(X;Y)=0$입니다.


우리가 해야할 것은 $x \sim P_G(x)$에 대해 $P_G(c|x)$가 작은 엔트로피를 갖도록 해주는 것 입니다. 저는 논문에서 다음 표현이 가장 마음에 들었는데요

"In other words, the information in the latent code $c$ should not be lost in the generation process."
이렇게 하므로써 $c$가 뭔가 중요한 정보를 계속 담고 있길 바라는 것입니다.

결과적으로 InfoGAN은 아래와 같은 information-regulaized minimax 문제를 풉니다: $$\min_G \max_D V_I(D,G) =V(D,G)-\lambda I(c;G(z,c)).$$

Variational Mutual Information Maximization


문제는 이 문제가 계산하기 쉽지 않다는 것입니다. 정확히 말하자면 $I(c;G(z,c))$를 최대화하기 위해서는 posterior distribution $P(c|x)$를 계산해야하고 이 부분은 보통 $p(x)$가 계산이 불가능(intractable)하기 때문에 직접적으로 값을 얻기가 어렵습니다.

이를 우회하기 위해 Varational Information Maximization이라는 lower bounding technique이 사용됩니다. 쉽게 말하자면 Mutual Information을 직접 구하기는 어려우니 좀 더 계산이 편한 하한(lower bound)을 구한 다음 이 하한에 해당하는 부분을 최대화하는 방식으로 우회하자는 것입니다.

이 부분은 조금 더 심화된 내용들과 같이 소개하는 것이 좋을 것 같아 다음 글에 이어서 같이 설명하도록 하겠습니다.

다음 읽을거리



참고문헌:
[1] InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets Xi Chen et al. 2016
[2] InfoGAN slideshare slide
[3] Generative Adversarial Nets - Ian Goodfellow et al. 2014 논문, 
[4] InfoGAN에 대한 다른 리뷰 포스트 



댓글 2개:

  1. 감사합니다 박사님~~~ 도움이 많이 되었어요

    답글삭제
    답글
    1. Unknown님 안녕하세요 ㅎ 도움이 되셨다니 다행입니다.

      삭제