..

First GAN

GAN이란?

GAN은 Generative Adversarial Nets를 가르키는 말입니다. 2014년 Ian J. Goodfellow의 논문에서 처음 소개되었고 Facebook의 Yann Lecun이 최근 나온 기계학습 아이디어 중 최고라고 말할 정도로 최근에 주목받고 있습니다.

Before GAN

기존의 딥러닝 모델은 Discriminative model에 초점을 맞추고 있었습니다. Discriminative model? 복잡하게 생각할 필요가 전혀 없습니다. Discriminative model은 Classifier를 생각하면 됩니다. 이미지를 여러 class로 분류해야된다고 생각해봅시다. Classifier는 3차원의 데이터-픽셀의 RGB값을 input으로 받고, 일련의 연산을 통해 이미지가 어떤 class에 속하는지를 output으로 만들어냅니다. 즉 고차원적이고 복잡한 input(이 경우에는 3차원)을 class의 label로 매핑하는 것이 가능해지는 것이죠. 이러한 Classifier가 성공한 발판에는 ReLU나, backpropagation, dropout 등이 있습니다.

하지만 Generative model, 무언가를 만들어내는 모델은 딥러닝과 거리가 멀었습니다. 이는

  • Generative model에서 필요한 확률 계산의 어려움과
  • Generative model에서 ReLU를 적용하는데 어려움

때문이었죠.

Adversarial Nets

Ian Goodfellow는 다층신경망(Multilayer Perceptron, 이하 MLP), 즉 딥러닝을 Generative model에 적용할 수 있다고 주장합니다. 무작위로 만들어낸 noise를 Generative model에 전달하고, 이 값이 신경망을 거치면서, 샘플을 만들어낸다는 것이죠. 또한 위에서 언급했듯, 이미 성공적인 Deep Discriminative model을 함께 적용했습니다. 이렇게하면, 두 모델을 기본적인 딥러닝과 backpropagation 그리고 dropout만으로 효율적으로 학습시킬 수 있게 됩니다.

이렇게 Discriminative model과 Generative model을 함께 사용하는 관계를 adversarial nets라고 부릅니다.

How to Train

Goodfellow는 Generative model과 Discriminative model의 adversary, 경쟁하는 관계에서 두 모델이 성장할 수 있다고 주장합니다.

  • Generative model ${G}$는 실제 데이터의 분포를 파악하고 이를 모방하는 가짜를 만들어냅니다.
  • Discriminative model ${D}$는 어떠한 샘플을 보고 실제 데이터에서 그것이 나왔을 확률, 즉 ${G}$가 만들지 않았을 확률, 가짜가 아닌 확률을 추정합니다.

Goodfellow는 둘의 관계를 이러한 비유를 통해 설명합니다.

  • Generative model은 위조지폐범입니다. 위조지폐를 만들고 들키지 않게 사용하는 것이 목적이 되구요.
  • Discriminative model은 경찰입니다. 지폐를 보고 진짜인지 가짜인지 판단하기 위해 노력합니다.

이 둘이 경쟁하며 서로 학습과 발전을 하게 되고, 결국 어느 순간 위조지폐와 진짜를 구분할 수 없게 됩니다. 이때 ${G}$를 학습시키려면 어떻게 해야할까요? ${D}$가 실수할 확률, 즉 ${G}$가 만들었지만 실제 데이터라고 추정할 확률을 최대화하면 됩니다. Goodfellow는 이를 minimax two-player game과 같다고 설명합니다.

What is MINIMAX?

위에서 Minimax for two-player games를 최소화한다고 했습니다. 이때 minimax는

추정되는 최대의 손실을 최소화하는 기법

을 가리킵니다.

구체적인 예시를 들어서 더 자세히 알아봅시다.

1943년 연합국은 일본 수송대가 병력을 실고 이동하고 있다는 정보를 입수했다. 수송대는 두가지 - 북쪽과 남쪽 루트를 선택할 수 있다. 가능한 빨리 수송대를 찾기 위해 연합국은 정찰기를 북쪽으로 보낼지 남쪽으로 보낼지를 선택해야만 한다.

다음 표는 일본군과 연합국이 내릴 수 있는 결정과 각 경우에 따른 폭격의 지속시간을 나타낸 것입니다.

일본군의 경로

북쪽

남쪽

연합군 정찰기

북쪽

2

2

남쪽

1

3

이 표에 따르면 일본군이 남쪽으로 가고, 연합군이 북쪽으로 정찰기를 보낼 경우, 수송대가 2일 동안 폭격을 받을 것임을 의미합니다. 연합군에게 최고의 결과는 정찰기를 남쪽으로 보냈을 때, 일본군 또한 남쪽으로 이동하는 경우이며, 일본군에게 최고의 결과는 수송대가 북쪽으로 이동했을 때, 정찰기가 남쪽으로 이동하는 경우겠죠.

이때 가능한 최악의 결과를 최소화하기 위해, 연합군은 정찰기를 북쪽으로 보내야만 합니다. 이렇게 될 경우

  • 최소한 2일의 폭격은 보장
  • 또한 남쪽에 정찰기를 보냈을 때보다 하루 밖에 손해를 안본다

는 이점이 존재합니다.

일본군 또한 비슷한 전략을 사용합니다. 최악의 결과는 남쪽으로 갔을 때 3일간의 폭격이므로, 일본군 또한 북쪽으로 갈 것입니다. 그리고 실제 역사에서도 그랬다고 합니다. 이렇게 최악의 결과를 최소화하는 것이 minimax인 것입니다.

Reference

Into Deep

조금 더 자세히 알아볼까요? ${G}$는 데이터의 분포를 모방하는 것이 목표라고 했습니다. 어떤 데이터 ${x}$가 주어졌을 때 이 데이터 ${x}$는 어떠한 분포, ${p_x}$를 따를 것입니다. ${G}$는 이를 모방해야하는 것이죠.

우선 우리가 임의로 뽑아내는 noise variable ${z}$를 정의합시다. 이때 ${z}$ 또한 어떠한 확률 분포 ${p_z}$를 따를 것입니다. 이렇게 noise variable을 추출하는 것을 ${p_z(z)}$라고 할 수 있습니다. 이렇게 추출한 ${z}$를 Generative model이 따르는 확률분포 ${p_g}$로 대응시킬 수 있게 됩니다. 이 과정을 GAN에서는 MLP로 구현합니다. ${G(z;\theta_d)}$ ( ${\theta_d}$는 MLP ${G}$의 parameter )는 ${z}$를 샘플로 만드는 신경망이 되는 것이죠.즉 ${G}$는 우리가 임의로 뽑아낸 noise를 샘플로 만들어내는 신경망이 되는 것입니다. (보통 ${p_z}$는 uniform distribution이나 정규분포가 됩니다)

또 Discriminative model도 MLP로 만들 수 있겠죠? 이는 ${D(x;\theta_d)}$라고 표현할 수 있습니다. 아까 위에서 말했듯, ${D}$는 어떠한 sample이 실제 데이터에서 나왔을 확률을 추정한다고 했으므로 ${D}$의 output은 한개의 값, 즉 확률이 됩니다. 다시 말하자면 ${D(x)}$는 ${x}$가 ${p_g}$, 곧 ${G}$가 만들어낸 것이 아니라 실제 데이터에서 추출되었다고 판단할 확률을 의미하게 됩니다.

${G}$와 ${D}$에 대해 정의했으니 학습과정에 대해 조금 더 자세히 알아봅시다. 학습과정에서 ${D}$는 실제 데이터와 ${G}$가 만든 가짜 데이터를 잘 구분하게 학습합니다. 이와 동시에 $\log(1-{D(G(z))})$를 최소화하도록 학습시키죠. 즉 Loss가 $\log(1-{D(G(z))})$가 되는 것인데요, 이는 잘 생각해보면 당연합니다. ${D}$는 어떤 샘플이 진짜인지 가짜인지 판단하는 역할을 하며, 진짜일 확률을 출력합니다. ${D(G(z))}$는 ${G}$가 만들어낸 샘플을 ${D}$가 보고, 얼마나 진짜같은지 표현한 확률값을 의미합니다. ${D}$의 입장에서는 당연히 이를 최소화해야하겠죠.

이를 다르게 표현하자면 ${D}$와 ${G}$는 value function ${V(G, D)}$로 표현되는 two-player minimax game을 하는 것과 같아집니다:

\[\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)))]\]

이죠.

이를 하나하나 뜯어서 더 자세히 알아봅시다.

$\mathbb{E}{x \sim p{data} (x) }[\log (D(x))]$는 실제 데이터 ${x}$를 ${D}$가 보고 실제 데이터라고 판단할 확률을 의미합니다. ${D}$의 입장에서 보자면 당연히 실제 데이터를 실제 데이터라고 판단할 확률을 최대화해야하죠. 반대로 ${G}$의 입장에서는 ${D}$가 실수를 하도록 해야하므로 저 확률을 최소화해야하는 것입니다.

$\mathbb{E}_{z\sim p_z(z)}[\log(1-D(G(z)))]$은 ${G}$가 만들어낸 데이터를 ${D}$가 가짜라고 판단할 확률을 의미합니다. 당연히 ${D}$의 입장에서는 이 값을 최대화해야하며 ${G}$의 입장에서는 이 값을 최소화해야합니다.

위의 위조지폐범과 경찰 얘기에서 말했듯이, ${G}$와 ${D}$를 충분한 시간동안 학습시킨다면, ${G}$가 실제 데이터의 분포를 따르게 할 수 있습니다. ${G}$가 실제 데이터를 완벽하게 모방할 수 있게 되는 것이죠. 이렇게 된다면 ${D(x)}$는 어떠한 데이터를 보든, 이게 진짜인지 가짜인지 찍을 수 밖에 없게 됩니다. 즉 ${D}$는 $\frac{1}{2}$의 확률로 맞거나 틀리게 될 것입니다.

training

Discriminative distribution(${D}$, 파란 점선)을 data generating distribution(검정) ${p_x}$와 generative distribution ${p_g}$(초록)에서 만들어지는 가짜를 구분하도록 학습시킵니다.

밑의 직선은 ${z}$가 sampling되는 분포의 영역을 나타냅니다. 위의 직선은 ${x}$, 실제 데이터의 정의역의 일부이고요. ${z}$에서 ${x}$로 가는 화살표는 noise ${z}$를 ${G}$에 넣어 샘플을 만드는 과정이라고 생각할 수 있습니다. 이때 ${G}$가 확률분포 non-uniform ${p_g}$ 초록색 곡선을 따른다는 것에 주의합시다. ${G}$는 실제 데이터의 분포, 검정 점선(${p_x}$)을 향해 ${p_g}$가 큰 값을 가지는 영역에서 수축하고, 작은 값을 가지는 영역에서 팽창하도록 학습을 진행합니다.

(a) 수렴하기 직전의 adversarial pair, ${p_g}$와 ${p_d}$를 생각해봅시다. ${p_g}$는 ${p_{data}}$와 거의 유사하며, ${D}$는 거의 정확한 classifier입니다.

(b) k번 동안 ${D}$는 sample과 실제 데이터를 구분하도록 학습합니다. 이때 이상적인 경우 ${D^\star(x)}$ = $\frac {p_{data}(x)}{p_{data}(x) + p_g(x)}$로 수렴하게 됩니다. 즉 어떠한 데이터를 봤을때, 이것이 진짜일 조건부확률과 같습니다. 분모 ${p_{data}(x) + p_g(x)}$는 어떠한 ${x}$를 볼 확률을 의미하며 분자의 경우 ${x}$가 진짜인 확률과 같습니다. 즉 $p( true | x)$입니다.

이에 대한 증명은 논문에 나와있습니다. 위의 목적함수 식을 쭉 풀어써보면

\[\begin{eqnarray} \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)))] \\ &=& \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{eqnarray}\]

와 동일합니다. 이때 $a\log(y) + b\log(1-y)$라는 식은 0~1사이의 범위에서 $\frac{a}{a+b}$에서 최대값을 가짐이 자명합니다. 따라서 위의 목적함수식을 최대화해야하는 Discriminator의 경우, 저 값을 갖게 되는 것입니다.

이때 또 주목할만한 부분은 위의 식은 결국 Cross Entropy 식과 동일하다는 것입니다. $p_{data}$인 경우 y = 1, $p_g$인 경우 y = 0이라고 한다면 위의 식은 Pytorch에서 BCE - Binary Cross Entropy 식과 다를게 없습니다.

이를 통해 위의 식을 다시 풀어써보면

\[\begin{eqnarray} C(G) &=& \max_D V(G, D) \\ &=& \mathbb{E}_{x \sim p_{data}}[logD^\star_G(x)] + \mathbb{E}_{z\sim p_z}[\log(1 - D^\star_G(G(z)))] \\ &=& \mathbb{E}_{x \sim p_{data}}[\log D^\star_G(x)] + \mathbb{E}_{x \sim p_g}[log(1 - D^\star_G(x))] \\ &=& \mathbb{E}_{x\sim p_{data}} [\log \frac{p_{data}(x)}{p_{data}(x) + p_g(x)}] + \mathbb{E}_{x \sim p_g}[\log \frac{p_g(x)}{p_{data}(x) + p_g(x)}] \end{eqnarray}\]

라고 쓸 수 있습니다.

(c) ${G}$를 학습시킨 다음, ${D}$의 gradient를 이용해 ${G(z)}$, 가짜 데이터를 실제 데이터라고 분류되도록 ${G}$를 학습시킵니다.

(d) 충분한 학습이 진행된다면, ${p_g = p_{data}}$이므로 더이상 학습이 진행될 수 없는 상태에 도달합니다. 즉 가짜와 진짜가 완전히 똑같아지게 되는 것이죠. 이후 discriminative model은 두 분포를 구분할 수 없게 됩니다. 따라서 ${D(x)} = \frac{1}{2}$입니다.

이렇게 된 경우, 위에서 $D^\star_G = \frac{1}{2}$임을 보였습니다. 이 값을 위에서 다시 쓴 $C(G)$에 대입하게 되면 $C(G) = \log\frac{1}{2} + \log\frac{1}{2} = -\log 4$가 됩니다.

\[\begin{eqnarray} C(G) &=& V(G, D) + \log 4 - \log4 \\ &=&-\log4 + \mathbb{E}_{x\sim p_{data}}[\log\frac{p_{data}(x)}{p_{data}(x) + p_g(x)} + \log2] + \mathbb{E}_{x\sim p_g}[\log\frac{p_g(x)}{p_{data}(x) + p_g(x)} + \log2] \\ &=& -\log4 + \mathbb{E}_{x \sim p_{data}}[\log \frac{p_{data}(x)}{\frac{p_{data}(x)+p_g(x)}{2}}] + \mathbb{E}_{x \sim p_{data}}[\log \frac{p_g(x)}{\frac{p_{data}(x)+p_g(x)}{2}}] \\ &=& -\log4 + KL(p_{data} \| \frac{p_{data}(x) + p_g(x)}{2}) + KL(p_g \| \frac{p_{data}(x) + p_g(x)}{2}) \\ &=& -\log4 + 2JSD(p_{data} \| p_g) \end{eqnarray}\]

이고, 이때 JSD는 항상 0이상의 값을 가지며, 두 확률분포가 같을 때에만 0의 값을 가질 수 있으므로 위 식의 최솟값은 $p_{data} = p_g$일 때 $-\log4$가 됩니다.

Algorithm

algorithm

이때 ${D}$는 식을 최대화하도록, ${G}$는 식을 최소화하도록 훈련한다는 것에 주의합시다

  1. m개의 가짜 데이터를 ${p_z}$에서 뽑아낸다.
  2. m개의 진짜 데이터를 ${p_{data}}$에서 뽑아낸다.
  3. ${D}$를 학습시킨다.
  4. 위 과정을 k번 반복한다.
  5. m개의 가짜 데이터를 ${p_z}$에서 뽑아낸다.
  6. ${G}$를 학습시킨다.
  7. 1로 돌아간다

학습과정에서 ${k}$번동안 ${D}$를 최적화하고, 이후 ${G}$를 최적화하는 과정을 한 번 시행하는 것을 반복합니다. 이로 인해 ${G}$가 천천히 변화하는 동안 ${D}$가 최적의 상태를 유지하도록 할 수 있죠. (이 논문에서는 k=1입니다)

이때 식을 다시봅시다.

\[\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}$를 적절히 학습시킬 수 있는 gradient를 주지 못합니다. 초기에 ${G}$는 당연히 실제 데이터와 많은 차이가 있게 되고, ${D}$는 쉽게 sample을 구분할 수 있게 됩니다. 이러한 경우 $\log(1-D(G(z)))$은 saturate하게 되죠.

이때 saturate란 무엇일까요? 활성화 함수로 sigmoid를 가지는 아주 깊은 MLP의 경우를 생각해봅시다. 학습을 거치며 값들은 0이나 1에 가까워지게 될 것입니다. 이렇게 되면 backpropagation과정에서 vanishing gradient문제가 발생하죠. 따라서 더이상 학습이 진행되지 않거나, 아주 느리게 진행됩니다. 이러한 경우를 neuron이 saturate되었다고 한답니다.

즉 $\log(1-D(G(z)))$을 사용하면 학습이 잘 안될 수도 있습니다. 따라서 ${G}$의 경우 $\log(1-D(G(z)))$를 최소화하는 대신, $\log{D(G(z))}$를 최대화하도록 학습시킵니다. 두 식 모두 동일한 의미입니다. $D$가 $G(z)$를 봤을 때, 진짜라고 판단하게 하는게 $G$의 목적이니까요.

정리

GAN은 딥러닝을 통해 실제 데이터를 모방하는 generative model을 만들어내는 것을 목적으로 합니다. 이때 학습을 돕기 위해 discriminative model 또한 함께 학습을 시킵니다. 이러한 관계를 한 마디로 정의하자면, 실제 지폐를 보고 위조지폐를 만드는 사람(${G}$)과 실제 지폐와 위조 지폐를 구분하는 사람(${D}$)에 비유할 수 있습니다. 이 둘이 서로 경쟁하면서 학습하게 되고 결국에는 위조지폐와 진짜를 구분할 수 없게 되는 것입니다. 이때 특이한 점은 $G$는 진짜 지폐를 전혀 보지 않습니다. 대신 $D$의 반응만을 보고 학습을 하게 되는 것이죠.