지난 글에 이어 오늘은 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을 적용해보는 것을 설명과 함께 올려볼까합니다.
그럼 좋은 밤 되세요~ :)
다음 읽을거리
- 초짜 대학원생 입장에서 이해하는 Generative Adversarial Nets (1)
- 초짜 대학원생의 입장에서 이해하는 Domain-Adversarial Training of Neural Networks (DANN) (1)
- 초짜 대학원생의 입장에서 이해하는 Deep Convolutional Generative Adversarial Network (DCGAN) (1)
- 초짜 대학원생의 입장에서 이해하는 Unrolled Generative Adversarial Networks (1)
참고문헌:
[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에 대한 다른 리뷰 포스트
"이제 LI(G,G) 계산이 Monte Carlo simulation으로 근사하기가 상당히 쉬워진 것을 보실 수 있습니다"에서 오타요~ LI(G,Q)로!!! ^^
답글삭제댓글 감사합니다! ㅎㅎ 오타 수정했습니다.
삭제매번 올려주신 글 감사히 잘 보고 있습니다. 궁금한게 있는데요,
답글삭제MNIST에서 c1=0~9, c2=rotation, c3=width라고 적혀있는데요, 그러면 training 할 때 이 순서에 맞게 하나씩 training을 한 것인가요?
감사합니다.
확률분포에 따라 그에 맞게 가장 주된 특징이 추출됩니다. c1은 categorical이니 class속성이 학습이 되고, c2, c3는 mnist에서 class 제외하고 가장 큰 특징들인 rotation, width가 학습되는 경향이 있는거죠. 학습해보시면, c1도 element별로 class가 하나 할당 되긴 하지만, 매번 같은 element가 같은 class는 아니구요, c2, c3도 그 의미가 서로 바뀌기도 합니다.
삭제작성자가 댓글을 삭제했습니다.
답글삭제안녕하세요 :) 8번 식에서 9번 식으로 넘어가는 과정이 이해가 안 되서 질문드립니다.
답글삭제law of total expectation 식과 다르게 8번 식의 inner expectation 은 샘플링 확률분포와 기댓값을 구하려는 안의 확률분포가 다른데 적용이 되나요?
그리고 같다고 가정하고 적용한다고 해도 결과가 9번 식처럼 나오는 게 아니라 E_{c'~Q(c)}[log Q(c')] 이 되는 거 아닌가요?
미리 감사드립니다 :)
2017년 6월 12일 오후 12:49
여기 댓글은 수정이 안 되고 삭제를 하면 삭제기록이 남는군요!
답글삭제좋은 정보 감사합니다! 언제나 도움 많이 받고 있어요
답글삭제posterior distribution P(c|x)를 계산해야하고 이 부분은 보통 p(x)가 계산이 불가능(intractable)하다고 하는데 왜 어째서 불가능한지 궁금합니다.
답글삭제