2017년 3월 19일 일요일

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

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

지난 글에 이어 오늘은 InfoGAN의 이론적인 부분을 중점적으로 살펴보도록 하겠습니다. 저번에 얘기했던 내용을 짧게 정리해보면 다음과 같습니다

기존의 GAN과는 달리 InfoGAN은 생성 모델에 들어갈 Input에 latent code $c$를 추가하여 학습합니다. 이 때, 무의미한(trivial) code가 학습되는 것을 막기 위해 생성 모델의 분포 $G(z,c)$와 상호 정보량(Mutual Information, MI)이 높도록 제약을 부여합니다. 즉, $I(c;G(z,c)$가 높게 유지시킵니다.

"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이 사용됩니다. 즉, $P(c|x)$를 직접 구하기는 어려우니 $Q(c|x)$라는 auxiliary distribution을 사용하여 $P(c|x)$를 근사하는 방식으로 좀 더 계산이 편한 하한(lower bound)을 구합니다.

$$\begin{align} I(c;G(z,c)) &=H(c)-H(c|G(z,c)) \\
&= \mathbb{E}_{x\sim G(z,c)}[\mathbb{E}_{c'\sim P(c|x)}[log P(c'|x)]] + H(c) \\ &=\mathbb{E}_{x\sim G(z,c)}[\underbrace{D_{KL}(P(\cdot|x)||Q(\cdot|x)}_{\geq 0})+\mathbb{E}_{c'\sim P(c|x)}[log Q(c'|x)]]+H(c)\\
&\geq \mathbb{E}_{x\sim G(z,c)}[\mathbb{E}_{c'\sim P(c|x)}[log Q(c'|x)]]+H(c) \\
&= L_I(G,Q).
\end{align}$$
여기서 $Q\rightarrow P$이면 Kullback Leibler(KL)-divergence의 기대값이 0에 가까워지는 것은 당연합니다($\mathbb{E}[D_{KL}(\cdot)]\rightarrow0$). 두번째에서 세번째 등호로 넘어가는 것이 어렵게 느껴진다면 직관적인 의미로 먼저 이해해볼 수 있습니다. 두번째 등호에 있는 식안에 $log P(c'|x)$를 $Q(c'|x)$로 근사하면 $P$와 $Q$ 분포가 다르기 때문에 괴리가 생기는데 이를 정량적으로 나타낸 것이 KL-divergence입니다. 즉, $$\begin{align}P&={\rm (P와~Q~사이의~괴리)+(Q)} \\&=D_{KL}(P|Q)+Q\end{align}$$
이기 때문입니다. 사실 KL-divergence의 정의를 찾아서 수식을 그대로 전개하기만 하셔도 같은 결과를 얻을 수 있습니다.

그런데 $Q(c|x)$를 사용하여 $P(c|x)$ 계산 직접하는 것은 우회할 수 있었지만 안 쪽에 $\mathbb{E}(\cdot)$을 보시면 여전히 $P(c|x)$로부터 sampling 해야하는 $c'\sim P(c|x)$ 부분이 남아있는 것을 보실 수 있습니다. 다행히도 이는 law of total expectation이라는 확률론에서 잘 알려진 proposition을 사용하면 쉽게 해결할 수 있습니다. 논문에서는 Lemma로 넣어 좀 더 복잡한 상황에서 증명까지 해주었습니다만 사실 아주 간단한 내용입니다:
$$\mathbb{E}(X)=\mathbb{E}(\mathbb{E}(X|Y)).$$
위키피디아의 링크에서도 증명을 해주고 있으니 보시면 그리 어렵지 않게 이해가 되시리라 생각됩니다.

이 법칙을 사용해서 variational lower bound $L_I(G,Q)$를 다음과 같이 바꿀 수 있습니다:
$$\begin{align} L_I(G,Q) &=\mathbb{E}_{x\sim G(z,c)}[\mathbb{E}_{c'\sim P(c|x)}[log Q(c'|x)]]+H(c) \\ &= \mathbb{E}_{c\sim P(c),~x\sim G(z,c)}[log Q(c|x)]+H(c) \\ &\leq  I(c;G(z,c)) \end{align}.$$
이제 $L_I(G,Q)$ 계산이 Monte Carlo simulation으로 근사하기가 상당히 쉬워진 것을 보실 수 있습니다. $L_I$가 더이상 $P(c|x)$와 관련이 없고 우리가 다룰 수 있는 $G$에 대해서 $Q$를 최대화하는 문제가 되었기 때문에 기존의 GAN 학습 과정에 아무런 무리가 없이 잘 껴맞춰 들어가집니다. 게다가 $Q\rightarrow P$일 때, $L_I(G,Q)$가 $H(c)$로 최대값을 갖기 때문에 하한이 타이트해지고 최대 상호 정보량(maximal mutual information)을 갖게 할 수 있습니다.

따라서, InfoGAN 알고리즘이 실제로 푸는 minimax 문제는 다음과 같이 변형됩니다:
$$\min_{G,~Q} \max_D V_{InfoGAN}(D,G,Q) =V(D,G)-\lambda L_I(G,Q).$$
실제 implementation에서는 auxiliary distribution $Q$가 neural network를 이용하여 $Q(c|x;\theta)$ parameterize 되고 보통 $Q(c|x)$를 결과로 내야하는 마지막 fully connected (FC) layer를 제외하고는 모든 layer에서 $D$와 같은 weight를 공유하기 때문에 실제로 GAN 것에 비해 계산량 증가가 미미하다고 합니다. 게다가 $L_I(G,Q)$ 계산 역시도 GAN objective보다 매우 빨리 수렴하기 때문에 전반적으로 InfoGAN은 GAN을 학습할 때 거의 덤으로 학습이 가능하다고 하네요.

실험 결과


그럼 결과를 볼까요? 상당히 재미있는 코드들이 잘 학습되는 것을 보실 수 있습니다. 아래는 먼저 3D face 데이터에서 학습한 결과입니다: 


놀라운 것은 얼굴이 회전하는 것에 따라 음영이 지는 각도를 이해하고 잘 잡아낸다는 점입니다. 특히 아래와 같은 3D 의자 데이터로 학습시킨 경우 "회전"이라는 코드를 잘 학습했는데 데이터 안에 각도에 따라 항상 같은 의자가 있는 것이 아님에도 불구하고 한 가지 의자의 모양을 잘 유지하면서 회전시키는 것을 보여줍니다. 


뿐만 아니라 "너비"를 변화하며 의자를 보면, 아주 자연스럽고 부드럽게 의자의 너비가 바뀌다가 다른 종류의 의자로 바뀌는 것도 볼 수 있습니다 (예, 의자$\rightarrow$소파). 
SVHN 데이터에서 학습시킨 경우, 음영의 변화와 Plate의 내용을 이해하고 Categorical 코드를 학습한 것을 볼 수 있습니다: 


마지막으로 CelebA 데이터인데요. 3D face 데이터와 마찬가지로 얼굴의 포즈를 학습하기도 했지만 안경의 유무(categorical)나 헤어스타일 감정(입꼬리)의 차이를 보여주는 코드들도 학습된 것을 볼 수 있습니다.



다음편 예고


이로써 InfoGAN에 대한 대부분의 소개를 마쳤습니다. 다음 글에서는 간단히 jupyter notebook과 tensorflow 환경에서 MNIST 데이터에 대해 InfoGAN을 적용해보는 것을 설명과 함께 올려볼까합니다.
그럼 좋은 밤 되세요~ :)

다음 읽을거리



참고문헌:
[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에 대한 다른 리뷰 포스트 



댓글 9개:

  1. "이제 LI(G,G) 계산이 Monte Carlo simulation으로 근사하기가 상당히 쉬워진 것을 보실 수 있습니다"에서 오타요~ LI(G,Q)로!!! ^^

    답글삭제
    답글
    1. 댓글 감사합니다! ㅎㅎ 오타 수정했습니다.

      삭제
  2. 매번 올려주신 글 감사히 잘 보고 있습니다. 궁금한게 있는데요,
    MNIST에서 c1=0~9, c2=rotation, c3=width라고 적혀있는데요, 그러면 training 할 때 이 순서에 맞게 하나씩 training을 한 것인가요?
    감사합니다.

    답글삭제
    답글
    1. 확률분포에 따라 그에 맞게 가장 주된 특징이 추출됩니다. c1은 categorical이니 class속성이 학습이 되고, c2, c3는 mnist에서 class 제외하고 가장 큰 특징들인 rotation, width가 학습되는 경향이 있는거죠. 학습해보시면, c1도 element별로 class가 하나 할당 되긴 하지만, 매번 같은 element가 같은 class는 아니구요, c2, c3도 그 의미가 서로 바뀌기도 합니다.

      삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제
  4. 안녕하세요 :) 8번 식에서 9번 식으로 넘어가는 과정이 이해가 안 되서 질문드립니다.

    law of total expectation 식과 다르게 8번 식의 inner expectation 은 샘플링 확률분포와 기댓값을 구하려는 안의 확률분포가 다른데 적용이 되나요?

    그리고 같다고 가정하고 적용한다고 해도 결과가 9번 식처럼 나오는 게 아니라 E_{c'~Q(c)}[log Q(c')] 이 되는 거 아닌가요?

    미리 감사드립니다 :)

    2017년 6월 12일 오후 12:49

    답글삭제
  5. 여기 댓글은 수정이 안 되고 삭제를 하면 삭제기록이 남는군요!

    답글삭제
  6. 좋은 정보 감사합니다! 언제나 도움 많이 받고 있어요

    답글삭제
  7. posterior distribution P(c|x)를 계산해야하고 이 부분은 보통 p(x)가 계산이 불가능(intractable)하다고 하는데 왜 어째서 불가능한지 궁금합니다.

    답글삭제