1. GAN이란
- GAN은 현실에 존재할법한 그런 데이터(원 논문에서는 이미지)를 생성해내는 생성모델입니다.
- 기존의 생성모델중 VAE도 training DB에 있을법한 데이터를 생성하는데, VAE와 다른점은 VAE는 분포를 추정(학습)해서 추정된 분포에서 샘플링하여 생성을 하지만
- GAN은 직접적으로 분포를 추정하지 않습니다.
2. GAN의 핵심 아이디어
a. Generator & Discriminator

- 많은 자료에서 보셨듯이, 또는 이미 아시다싶이. GAN은 생성자와 감별자가 존재합니다.
- 생성자는 현실에 존재할법한(진짜같은 이미지를) 생성하여 감별자를 속이는게 목적이고
- 감별자는 생성자가 생성한 이미지를 가짜라고 구별하는 것이 목적입니다.
- 결국엔 Generator가 정말 진짜같은 이미지를 만들어서 Discriminator의 정확도가 0.5가 됩니다.(이상적이라면)
b. 학습 진행개요
학습은 아래그림처럼 진행됩니다
- 검은색 점은 원본 데이터의 분포입니다.
- 초록색 선은 생성 모델의 분포입니다.
- 파란색 점은 판별 모델의 분포입니다.
학습이 지남에 따라 생성모델의 분포가 학습모델의 분포와 비슷해지는 것을 확인할 수 있습니다.
- z는 latent vector이고 latent vector가 generator를 통해 x와 같은 차원에 mapping 된다고 이해했습니다.

c. 학습 방법
- 먼저 pseudo-code는 다음과 같습니다.

- 특이한 사항은 학습 한번을 진행할 때 discriminator는 k번 학습하지만 generator는 1번만 학습하는 것 입니다.
- 이는 discriminator를 먼저 잘 학습시켜 generator가 더 수준높은 이미지를 만들게 하기 위함입니다.
3. GAN의 loss function
그렇다면 수학적으로 어떻게 Generator와 Discriminator를 잘 학습시킬수 있을까요?
먼저 식부터 보겠습니다.
a. 노테이션
- pz : latent vector(noise input)의 분포, 일반적으로 uniform distribution
- pg : generator가 생성한 데이터의 분포
- pr : real data의 분포
b. Discriminator관점
- Discriminator는 확률값을 return해줍니다. [0,1]
- 진짜 이미지가 들어오면 1, generator가 생성한 이미지가 들어오면 0을 return하는게 목표입니다.
- 진짜 이미지가 들어왔을 때 Ex∼pr(x)[logD(x)]를 maximize함으로써 최대한 1에 가까운 값을 return하도록 학습시키고자 합니다.
- 반대로 가짜 이미지가 들어오면 Ez∼pz(z)[log(1−D(G(z)))] 를 최소화시켜서 최대한 0에 가까운 값을 return하도록 학습시키고자 합니다.
c. Generator의 관점
- Generator는 Discriminator를 속이는게 목적입니다. D(g(z))=1이 나오게 하는게 목적입니다.
- Ez∼pz(z)[log(1−D(G(z)))]를 minimize하게 학습시키면 위와 같은 목적을 달성할 수 있습니다.
(참고) y=log(x) 그래프
- 0일때 −∞
- 1일때 0

d. Objective function
GminDmaxV(D,G)=Ex∼pr(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](1)=Ex∼pr(x)[logD(x)]+Ex∼pg(x)[log(1−D(x)](2)
1번식을 바탕으로 이야기 하겠습니다.
- G(Generator)는 다음 loss function을 minimze 시키는게 목적입니다.
G가 정말 진짜같은 이미지를 생성한다면 두번째 term은 log(1−1)=−∞로 최소화됩니다.
첫번째 term은 G에 대해 영향을 받지 않기 때문에 G를 학습시키는 단계에서 영향을 받지 않습니다.
- D(Discriminator)는 다음 loss function을 maximize 시키는게 목적입니다.
D가 정말 진짜 이미지와 가짜 이미지를 잘 판별할수 있다면,
첫번째 term은 0이 될 것이고 두번째 term도 0이 되어서
loss function은 0으로 최대값을 가질것 입니다.
- 따라서 Generator와 Discriminator가 minimax 게임을 한다고도 설명됩니다.
e. Discriminator의 위 식에대한 optimal value는?
- 이때 D∗(x)=pr(x)+pg(x)pr(x)∈[0,1] 이고 generator가 잘 학습되서 pr과 같아진다면 D∗(x)=1/2가 될 것입니다.
f. Optimal D에대한 G의 학습
- optimal D에 대해 G는 원본 데이터의 분포와 자신이 생성한 데이터의 분포가 가까워지는 방향으로 학습하며 목적함수를 최소화 하려고 합니다.
4. 요약
- GAN은 생성모델입니다.
- 확률분포를 원본 확률분포와 근사시킴으로, 실제 존재할법한 데이터를 생성하는게 목적이고
이때 VAE처럼 확률분포를 추론하지는 않습니다.
- 학습은 Objective function을 generator와 discriminator가 각각 min, max시키는 방향으로 진행됩니다.
- generator가 생성한 데이터들의 분포가 실제 데이터의 분포와 같아지는 것이 이상적입니다.
5. GAN의 단점들
a. Nash equilibrium 달성의 어려움
- GAN모델의 Generator와 Discriminator는 two-player의 non-cooperative game의 Nash equilibrium을 찾기 위해 훈련됩니다.
Nash equilibrium(내시 균형)은 게임이론에서 경쟁자 대응에 따라 최선의 선택을 하면 서로가 자신의 선택을 바꾸지 않는 균형상태입니다.
- 간단한 예를 들어보겠습니다.
f1(x)=xy,f2(y)=−xy 일때 한명은 x를 f1(x)를 최소화 하기위해 업데이트하고, 다른 한명은 y를 f2(y)를 최소화 하기위해 y를 업데이트 한다고 가정하겠습니다.(xy를 최대화 하는것과 같음)
이는 GAN의 min-max게임과 같은 상황입니다.
- ∂x∂f1=y,∂y∂f2=−x이기 때문에 x를 x−η⋅y를 통해 업데이트하고, y를 y+η⋅x를 통해 업데이트합니다. η는 learning rate입니다. 업데이트 진행중에 x와 y의 부호가 달라지는순간 진동이 발생하게 됩니다. 그리고 이는 학습횟수가 늘어날수록 더 커집니다.

- 실제 우리가 최적화 하려는 함수는 xy보다 복잡하기 때문에 최적지점까지 도달이 어려울수 있습니다.
b. Low dimensional supports
https://arxiv.org/pdf/1701.04862.pdf
위 논문의 저자인 Arjovsky and Bottou는 pr,pg의 support(지지집합?)가 저차원 manifolds에 있고 GAN의 학습에 영향을 미친다고 했습니다.
- pr(진짜 이미지의 분포)는 그냥 생각하면 예를들어 256*256의 이미지일 경우 엄청난 고차원에 존재한다고 보이지만 사실 이미지의 주제(또는 대상)가 정해지는 순간 많은 제약들이 있습니다. 예를들어 개의 이미지라면 두개의 귀가 있어야하고 꼬리도 있어야 하고, 사람이라면 눈, 코, 입 등이 있어야하고....
이런 제약들이 이미지를 고차원이 아닌 저차원의 manifold에 존재하게 합니다.(이는 manifold learning의 기본 아이디어 같기도 합니다...)
- pg도 마찬가지로 저차원 manifold에 있습니다. 예를들어 100차원 latent variable로 256*256 이미지를 만드는 generator가 있다고 하면, 65536 픽셀을 100차원의 latent variable로 만들기에는 한계가 있습니다.
(제가 참고한 글에서는 100차원의 랜덤한 노이즈로 고차원의 공간을 거의 채울수 없다... 라고 쓰여있습니다)
- pg,pr 모두 저차원 manifold에 존재하기 때문에, 아마 두 분포는 높은 확률로 disjoint 할 것이고, disjoint supports을 가질 경우 항상 두 분포를 구분하는 discriminator를 찾을 수 있습니다. 이 경우에는 바로 뒤에 설명할 vanishing gradient문제가 발생합니다.

- 저차원 manifold는 고차원 공간에서 거의 겹치지 않습니다. 왼쪽은 3차원 공간에서의 직선, 오른쪽은 3차원 공간에서 평면.
c. gradient vanishing(기울기 소실)
바로 위의 경우이거나, 어떠한 이유에서든 Discriminator가 완벽히 진짜와, Generator가 만들어낸 샘플을 구별할 수 있다면 다음과 같게 됩니다.
- D(x)=1,∀x∈pr
- D(x)=0,∀x∈pg
이렇게 되면 목적함수(loss function)의 값이 0이 되어 gradient를 업데이트 할 수 없습니다.
GminDmaxV(D,G)=Ex∼pr(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](1)=Ex∼pr(x)[logD(x)]+Ex∼pg(x)[log(1−D(x)](2)
결과적으로 GAN의 학습에서 다음과 같은 딜레마에 빠지게 됩니다.
- 만약에 Discriminator가 제대로 학습이 안되면(멍청하면) Generator가 제대로된 피드백을 못받고 목적함수(loss function)가 현실을 제대로 반영하지 못합니다.
(거지같은 이미지를 만들어도 D가 진짜라고 판단하면, 그런 이미지는 존재하지 않는데 현실과는 다르게 판단한거라고 이해했습니다.)
- 만약 Discriminator가 너무 구별을 잘하면, 목적함수(loss function)의 값이 거의 0이 되서 기울기 소실이 발생할꺼고 그렇게되면 학습이 매우 느려지거나, 잘 이뤄지지 않을것 입니다.
- 이런 이슈를 완전히 해결하진 못하지만 어느정도 해결하기 위해 구현된 GAN을 보면 목적함수의 두번째 term을
GminEz∼pz(z)[log(1−D(G(z)))] 가 아닌
GmaxEz∼pz(z)[log(D(G(z)))] 로 바꾸기도 합니다.
두 식의 목적은 모두 D(g(z))=1이 나오도록 학습하는 것인데, 사실 학습 초기에 Generator가 만드는 이미지는 형편없고, Discriminator 입장에서 이를 판단하는건 너무 쉽습니다. 따라서 D(g(z))=0에 가까운 값이 나오는데 0주변에서 첫번째 식의 gradient가 너무 작아 이를 gradient가 더 큰 두번째 식으로 바꾼 것 입니다.
d. Mode Collapse
- 이는 Generator가 Discriminator의 약점을 찾았다고 볼수 있습니다.
- Generator가 형편없는 이미지들을 생성했는데 Discriminator가 진짜라고 하니, Generator는 그런 비슷한 이미지만 만드는 것 입니다. 이는 Discriminator를 속이는건 성공했지만 현실의 데이터를 표현하지 않습니다.

e. 평가 기준의 부족
- 사실 목적함수는 학습을 위해 설계되었습니다.
- 하지만 언제 학습을 멈춰야할지, GAN들의 성능을 비교할 지표 등이 부족합니다.
6.참고자료
https://lilianweng.github.io/lil-log/2017/08/20/from-GAN-to-WGAN.html#kullbackleibler-and-jensenshannon-divergence
(가장 많이 참고하였습니다. 위 블로그의 내용을 번역한 부분이 상당히 많습니다.)
https://www.youtube.com/watch?v=AVvlDmhHgC4&t=2296s
(나동빈님 GAN: Generative Adversarial Networks (꼼꼼한 딥러닝 논문 리뷰와 코드 실습))
https://www.youtube.com/watch?v=odpjk7_tGY0
1시간만에 GAN(Generative Adversarial Network) 완전 정복하기
가장 먼저 1시간만에 GAN 완전 정복하기를 보고, 그다음 첫번째 블로그를 참고하였고, 추가적인 설명이 필요한 경우 나동빈님의 영상을 참고하여 정리하였습니다.