AI Paper/Generative Model

[논문 리뷰] GAN - Generative Adversarial Nets

준성(JunSeong) 2026. 6. 27. 17:12

위조지폐범과 경찰 - 아이디어의 탄생

2014년 Ian Goodfellow는 몬트리올의 한 술집에서 동료들과 이야기를 나누다가 아이디어 하나를 떠올렸다. 그날 밤 집에 돌아가 코드를 짰더니 첫 프로토타입이 바로 작동했다고 한다. 그렇게 탄생한 논문이 Generative Adversarial Nets다. 나중에 Yann LeCun이 "지난 10~20년 머신러닝에서 나온 아이디어 중 최고"라고 평했을 만큼, 이 논문이 열어젖힌 문은 생각보다 훨씬 컸다.

당시 딥러닝의 눈부신 성과는 거의 전부 판별 모델(discriminative model) 쪽에 집중돼 있었다. 이미지를 받아서 레이블을 맞히는 것 - backpropagation과 dropout, 그리고 ReLU 같은 선형 활성화 함수 덕분에 이쪽은 착착 잘 됐다. 문제는 생성 모델(generative model)이었다. 데이터 분포를 직접 모델링하려면 최대우도추정(MLE) 과정에서 다루기 힘든 확률 연산들이 속속 등장하고, Markov chain에 의존하는 방법들은 학습이 느리고 불안정했다. Goodfellow가 해결하고 싶었던 것은 바로 이 지점이었다.

그의 접근은 단순하면서도 영리했다. 생성 모델을 직접 확률 분포로 정의하지 말고, 두 네트워크를 서로 경쟁시키자는 것이다. 하나는 가짜를 만들고, 다른 하나는 진짜와 가짜를 구별한다. 논문에서는 이를 위조지폐범(generator)과 경찰(discriminator)의 경쟁에 비유했는데, 꽤 직관적인 표현이다.

프레임워크 - 두 네트워크의 게임

GAN의 구조는 단출하다. Generator G와 Discriminator D, 두 네트워크가 전부다.

G는 노이즈 벡터 z를 입력으로 받아 데이터 공간의 샘플을 출력한다. z는 단순한 균등분포나 가우시안 분포에서 뽑아오면 충분하다. G(z; θ_g)로 표기하며, 이 함수가 만들어내는 분포를 p_g라고 부른다. 목표는 p_g가 실제 데이터 분포 p_data에 가까워지도록 G를 학습시키는 것이다.

D는 샘플 x를 입력으로 받아 스칼라 하나를 출력한다. D(x)는 x가 실제 데이터에서 왔을 확률이다. 1에 가까우면 진짜, 0에 가까우면 가짜라고 판단하는 셈이다.

GAN 학습 구조 Noise z ~ p_z 균등/가우시안 Generator G(z; θ_g) MLP 위조지폐범 θ_g 업데이트 G(z) Real Data x ~ p_data real x Discriminator D(x; θ_d) MLP 경찰 θ_d 업데이트 D(x) 0 → 가짜 1 → 진짜 수렴 시 0.5 gradient → G 업데이트

GAN 아키텍처 구조도. 노이즈 z에서 시작한 G의 출력과 실제 데이터가 함께 D에 입력되고, D의 판단이 다시 G로 역전파된다.

이 둘이 플레이하는 게임의 목적함수는 다음과 같다.

목적함수 V(D, G) min max G D V(D,G) = E[log D(x)] + E[log(1 − D(G(z)))] x ~ p_data z ~ p_z

D 입장에서는 이 값을 최대화하고 싶다. 실제 데이터 x가 들어왔을 때 D(x)가 높아야 하고(첫 번째 항), 가짜 샘플 G(z)가 들어왔을 때 D(G(z))가 낮아야 한다(두 번째 항의 1 − D(G(z))가 커야 함). G 입장에서는 이 값을 최소화하고 싶다. D(G(z))가 높아져서 판별자가 헷갈리게 만들려면 1 − D(G(z))가 낮아야 하므로 두 번째 항을 줄이는 방향으로 학습한다.

이 구조가 영리한 이유는, G가 데이터 분포를 직접 모델링할 필요가 없다는 점이다. G는 그냥 D를 속일 수 있는 샘플을 만들면 그만이고, 그 과정에서 암묵적으로 p_data를 배우게 된다.

학습 과정의 시각화

Figure 1: GAN 학습 과정

Figure 1. 학습이 진행되면서 생성 분포(초록)가 실제 데이터 분포(검정 점)에 수렴하는 과정. 판별자(파란 점선)는 점점 평탄해진다.

논문의 Figure 1이 이 과정을 잘 보여준다. (a)에서는 판별자가 들쭉날쭉하고 생성 분포도 실제 분포와 많이 어긋나 있다. (b)에서는 D가 먼저 충분히 학습해서 두 분포를 잘 구분한다. (c)에서는 G가 업데이트되며 실제 분포 쪽으로 이동한다. (d)에서는 p_g = p_data가 되어 판별자가 어디서나 1/2을 출력하는 최적 상태에 수렴한다.

z 공간 아래쪽을 보면 화살표들이 나와 있는데, 이게 G의 역할을 잘 표현한다. 균등분포로 샘플링된 z가 G를 거쳐 x 공간에 비균등하게 매핑된다. 밀도가 높은 구간은 압축하고 낮은 구간은 펼쳐서, 결과적으로 데이터 분포와 비슷한 형태를 만들어낸다.

학습 알고리즘 - k번 돌리고 1번 돌리기

Algorithm 1: GAN 학습 알고리즘

Algorithm 1. D를 k번 업데이트한 뒤 G를 1번 업데이트하는 교대 학습 절차.

실제 학습은 교대(alternating) 방식으로 진행한다. D를 k 스텝 업데이트한 다음 G를 1 스텝 업데이트하는 식이다. 논문에서는 k=1을 쓴다고 했다. 이론적으로는 D를 완전히 최적화한 뒤 G를 업데이트하면 좋겠지만, 그렇게 하면 계산 비용도 크고 유한한 데이터셋에서 D가 과적합될 수 있다. 그래서 D를 최적점 근처에서 유지하면서 G가 천천히 바뀌게 하는 전략을 쓴다.

실무적으로 중요한 트릭이 하나 있다. 목적함수에서 G를 학습할 때 log(1 − D(G(z)))를 최소화하는 것이 원래 목표인데, 학습 초반에 G가 형편없을 때 이 값이 포화(saturate)돼 그래디언트가 거의 0이 된다. D가 가짜를 너무 자신 있게 걸러내면 1 − D(G(z)) ≈ 1이 되어 버리고, log(1) = 0이니 G 입장에서 배울 게 없어지는 것이다. 그래서 대신 log D(G(z))를 최대화하는 방향으로 G를 학습한다. 수학적 고정점(fixed point)은 같지만, 초반 학습에서 훨씬 강한 그래디언트를 제공해 G가 빠르게 성장할 수 있다.

이론적 근거 - 왜 이 게임이 동작하는가

최적 판별자 D*

G를 고정해두면, D에 대해 목적함수를 최적화하는 분석적인 해가 존재한다. V(G, D)를 D에 대해 미분해서 0으로 놓으면, 임의의 x에서 최적 판별자는 다음과 같다.

최적 판별자 D*(x) = p_data(x) / (p_data(x) + p_g(x))

직관적으로 이해하면 이렇다. x가 실제 데이터에서 왔을 확률과 G가 만들었을 확률의 비율이다. p_data가 클수록 1에 가까워지고, p_g가 클수록 0에 가까워진다. 학습이 완벽히 수렴하면 p_data = p_g이고, D*(x) = 1/2이 된다 - 판별자가 더 이상 둘을 구분할 수 없는 상태.

전역 최솟값과 Jensen-Shannon Divergence

D*를 목적함수 C(G)에 대입해서 정리하면 흥미로운 형태가 나온다. 중간 계산을 정리하면 결국 다음과 같이 쓸 수 있다.

C(G)와 Jensen-Shannon Divergence C(G) = −log(4) + 2 · JSD(p_data ‖ p_g)

JSD(Jensen-Shannon Divergence)는 두 분포 사이의 대칭적인 거리 척도인데, 항상 0 이상이고 두 분포가 같을 때만 0이 된다. 따라서 C(G)의 전역 최솟값은 p_g = p_data일 때 −log(4)이며, 이 점이 유일한 해다. GAN 학습이 잘 되면 생성 분포가 실제 데이터 분포에 정확히 수렴한다는 이론적 보장이 여기서 나온다.

단, 이 수렴 보장은 G와 D가 무한한 용량을 가진 비모수적(non-parametric) 설정을 가정한다. 실제로는 MLP로 파라미터화되어 있고, 파라미터 공간에는 수많은 critical point가 생긴다. 그래서 이론은 이론이고 실제 학습이 반드시 수렴하리라는 보장은 없다는 점도 논문이 솔직하게 인정하는 부분이다.

실험 결과

실험은 MNIST, Toronto Face Database(TFD), CIFAR-10 세 데이터셋에서 진행했다. G는 ReLU와 sigmoid를 섞어 쓰고, D는 maxout 활성화 함수를 사용했다. D 학습 시 dropout을 적용했다.

Table 1: 성능 비교

Table 1. Parzen window 기반 로그우도 추정. 높을수록 좋다.

성능 평가는 Parzen window 기반 log-likelihood 추정 방식을 썼다. G가 만든 샘플에 가우시안 분포를 피팅한 뒤 테스트 데이터의 우도를 계산하는 방식인데, 논문 자체도 인정하듯 분산이 크고 고차원에서는 그리 신뢰할 만하지 않다. 그럼에도 MNIST에서 225 ± 2로 당시 최고 성능을 냈고, TFD에서는 2057 ± 26으로 Deep GSN 다음이었다.

Figure 2: 생성 샘플

Figure 2. a) MNIST, b) TFD, c) CIFAR-10 fully connected, d) CIFAR-10 conv. 노란 박스는 가장 비슷한 훈련 데이터로, 단순 암기가 아님을 보여준다.

정량적 지표보다 눈길을 끄는 건 Figure 2다. 생성 샘플 바로 오른쪽에 훈련 데이터에서 가장 유사한 이미지를 나란히 배치했는데, 둘이 확연히 다르다. G가 특정 훈련 샘플을 외워서 복사하는 게 아니라 진짜로 새로운 이미지를 만들고 있다는 증거다. CIFAR-10은 아직 흐릿하지만 MNIST와 얼굴 데이터에서는 상당히 그럴듯한 샘플이 나왔다.

Figure 3: z space interpolation

Figure 3. z 공간에서 두 점 사이를 선형 보간하면 이미지가 자연스럽게 변환된다.

Figure 3은 잠재 공간(latent space)의 의미 있는 구조를 보여준다. z 벡터를 두 점 사이에서 선형 보간하면 생성되는 숫자가 서서히 바뀐다. 1이 5로, 7이 1로 자연스럽게 흘러가는 것이다. G가 단순히 데이터를 외운 게 아니라 데이터의 연속적인 잠재 구조를 파악하고 있다는 뜻이다.

다른 생성 모델과의 비교

Table 2: 생성 모델 비교

Table 2. 생성 모델 유형별 특성 비교.

Table 2는 당시 주요 생성 모델들을 여러 축에서 비교한다. GAN의 강점은 sampling 단계에서 Markov chain이 필요 없고, 모델 설계에 미분 가능한 함수라면 무엇이든 쓸 수 있다는 점이다. 반면 p(x)를 명시적으로 표현하지 못한다는 한계도 있다.

당시 주류였던 deep undirected graphical model(DBM 등)은 partition function이 다루기 어려워 MCMC로 근사해야 했고, 이게 학습 속도와 안정성에 걸림돌이 됐다. GAN은 이 문제를 완전히 우회한다. p_g를 명시적으로 정의하지 않고 G라는 함수 자체가 분포를 암묵적으로 정의하기 때문에, 분배함수니 inference니 하는 것들이 처음부터 필요가 없다.

장단점과 이후의 문제들

논문이 직접 정리한 장점은 크게 세 가지다. Markov chain이 필요 없고, 학습 시 inference가 불필요하며, 미분 가능한 어떤 함수든 G와 D에 쓸 수 있다. 거기에 하나 더 - Markov chain 기반 방법들은 분포가 어느 정도 부드러워야 체인이 잘 섞이는데, GAN은 그 제약이 없어서 아주 뾰족하고 날카로운 분포도 표현할 수 있다.

단점도 솔직하게 밝혔다. 첫째, p_g(x)를 직접 알 수 없다. 생성 품질은 평가할 수 있지만 우도 자체는 명시적으로 얻기 어렵다. 둘째, D와 G를 잘 동기화해야 한다. G를 D 업데이트 없이 너무 많이 학습시키면 "Helvetica Scenario"가 발생한다 - G가 수많은 z 값을 같은 x에 몰아버리는 현상, 즉 다양성이 완전히 무너지는 mode collapse다. 논문 이름이 붙은 건 웃기지만, 이 문제는 이후 GAN 연구의 핵심 난제가 된다.

이론적으로도 균열이 있었다. 수렴 증명은 JSD를 최소화한다는 것인데, 실제로 학습 초반에 p_data와 p_g가 겹치는 구간이 거의 없으면 JSD가 포화(saturate)돼 그래디언트가 사실상 0이 된다. 그래서 non-saturating loss trick이 필요했던 거고, 이 근본적인 문제는 나중에 Wasserstein GAN이 Wasserstein 거리를 쓰면서 본격적으로 해결을 시도하게 된다.

마무리

논문 자체가 9페이지짜리 짧은 글이고 실험도 지금 기준으로는 초라하다. CIFAR-10 샘플은 흐릿하고 성능 지표는 신뢰도가 낮다고 논문 스스로 인정한다. 그런데도 이게 폭발적인 반응을 불러온 건, 아이디어 자체가 가진 범용성 때문이다. 생성 문제를 판별 문제로 바꾸는 이 발상은 이미지 생성에만 그치지 않고, 이후 cGAN, DCGAN, CycleGAN, StyleGAN, 더 나아가 지금의 Diffusion 모델과 대형 생성 모델까지 이어지는 패러다임의 출발점이 됐다.

모델 구조는 단순한데 문제는 복잡하다 - 균형 잡기, mode collapse, 평가 지표 부재. 그 긴장이 이후 10년 GAN 연구를 이끌었다고 해도 과언이 아니다.

#GAN #GenerativeAdversarialNets #Goodfellow #생성모델 #딥러닝 #논문리뷰 #NIPS2014 #minimax #JensenShannonDivergence #ModeCollapse