GAN과 DCGAN 구현 경험: 적대적 생성 신경망의 학습 과정과 도전 과제
🔍 TL;DR: GAN(Generative Adversarial Network)을 MNIST 데이터셋으로 구현해 보면서 겪은 학습 과정과 어려움을 공유합니다. 판별자(Discriminator)와 생성자(Generator)의 균형 잡힌 학습이 얼마나 까다로운지, 그리고 실제 구현 시 마주치는 여러 도전 과제를 실험 결과와 함께 설명합니다.
GAN의 기본 개념
GAN(Generative Adversarial Network)은 2014년 Ian Goodfellow가 제안한 생성 모델로, 두 개의 신경망이 서로 경쟁하며 학습하는 구조를 가집니다.
경찰과 도둑의 대결 - GAN의 핵심 아이디어
GAN의 핵심은 판별자(Discriminator, 경찰) 와 생성자(Generator, 도둑) 간의 적대적 관계에 있습니다:
- 생성자(Generator): 실제 데이터와 구분하기 어려운 가짜 데이터를 생성하는 것이 목표입니다. 마치 도둑이 위조 지폐를 만들어 경찰을 속이려는 것과 같습니다.
- 판별자(Discriminator): 입력 데이터가 실제인지 생성자가 만든 가짜인지 구분하는 것이 목표입니다. 마치 경찰이 진짜 지폐와 위조 지폐를 구분하려는 것과 같습니다.
이 두 모델은 서로의 성능을 향상시키는 방향으로 경쟁적으로 학습합니다. 생성자는 판별자를 속이기 위해 더 정교한 가짜를 만들고, 판별자는 더 정확하게 진짜와 가짜를 구분하려고 노력합니다.
DCGAN 구현 경험
DCGAN(Deep Convolutional GAN)은 GAN에 컨볼루션 레이어를 도입한 모델입니다. 저는 MNIST 데이터셋을 사용하여 DCGAN을 구현해보았습니다.
손실 함수 선택
GAN은 이진 분류 문제에 가깝기 때문에 binary_crossentropy를 손실 함수로 사용했습니다. 판별자는 진짜 이미지에 대해서는 1에 가까운 값을, 가짜 이미지에 대해서는 0에 가까운 값을 출력하도록 학습됩니다.
🤔 생각해볼 점: GAN이 정말 비지도 학습일까요? 판별자를 학습시킬 때 '진짜'와 '가짜'라는 레이블을 사용하므로, 어떤 면에서는 지도 학습의 특성도 가지고 있습니다. 다만 MNIST의 0~9와 같은 세부 클래스 레이블은 사용하지 않습니다.
학습 과정
- 데이터셋: MNIST 훈련 데이터 60,000개
- 배치 크기: 100
- 에포크: 30 (총 18,000회 학습)
- 손실 함수: binary_crossentropy
학습 결과 분석
1. 손실(Loss) 그래프

손실 그래프를 보면 학습이 진행되면서 감소하는 경향을 보입니다. 그러나 단순히 손실 값이 감소한다고 해서 GAN이 잘 학습되고 있다고 단정하기는 어렵습니다. 강사님께서도 GAN에서 손실 그래프는 큰 의미가 없다고 하셨습니다.
2. 판별자(Discriminator)의 예측 결과
판별자의 성능을 평가하기 위해, 다음 두 가지 데이터셋을 사용했습니다:
- 훼손된 MNIST 이미지 1,000개 (가짜로 간주)
- 정상 MNIST 이미지 1,000개 (진짜로 간주)

분석 결과:
- 훼손된 이미지(가짜): 판별자는 대부분 0에 가까운 값을 출력하여 '가짜'로 잘 분류했습니다.
- 정상 이미지(진짜): 판별자는 약간 애매한 결과를 보였습니다. 정상 이미지임에도 0.5에 가까운 값을 출력하는 경향이 있었습니다.
학습 관련 도전 과제
1. 균형 잡힌 학습의 어려움
GAN 학습에서 가장 큰 도전 중 하나는 판별자와 생성자 간의 균형을 유지하는 것입니다. 한쪽이 너무 강해지면 다른 쪽이 학습하기 어려워집니다.
- 판별자가 너무 강해지면: 생성자는 항상 '가짜'로 분류되어 학습 신호를 얻기 어려움
- 생성자가 너무 강해지면: 판별자가 진짜와 가짜를 구분하지 못함
2. 학습 불안정성
GAN은 학습 과정이 불안정한 경우가 많습니다. 제 경험에서도 에포크를 300까지 늘렸을 때(총 18만 회 학습), 과적합(overfitting) 현상이 발생하여 진짜와 가짜 모두 0.5에 가까운 값을 출력하게 되었습니다.
3. 모드 붕괴(Mode Collapse)
비록 제 실험에서는 확인하지 않았지만, GAN의 또 다른 일반적인 문제는 모드 붕괴입니다. 이는 생성자가 다양한 출력을 생성하지 않고 판별자를 속이는 특정 유형의 출력만 반복적으로 생성하는 현상입니다.
실험 결과와 생성된 이미지


30 에포크 학습 후 생성된 이미지를 보면, 어느 정도 MNIST 숫자와 유사한 이미지가 생성되었지만, 완벽하지는 않습니다. 이는 판별자의 예측 결과에서 본 것처럼 학습이 완전히 수렴하지 않았기 때문으로 보입니다.
결론 및 향후 개선 방향
GAN, 특히 DCGAN을 구현하면서 실제 학습이 생각보다 어렵다는 것을 깨달았습니다. 강사님께서도 언급하셨듯이, 제 실험 결과는 학습이 충분히 이루어지지 않은 상태로 보입니다.
향후 개선할 수 있는 방향은 다음과 같습니다:
- 학습률 조정: 판별자와 생성자의 학습률을 다르게 설정하여 균형을 맞추기
- 모델 구조 개선: 더 깊거나 넓은 네트워크 구조 시도
- 다양한 GAN 변형 시도: WGAN, LSGAN 등 학습 안정성을 개선한 GAN 변형 모델 적용
- 배치 정규화(Batch Normalization) 조정: 학습 안정성을 높이기 위한 배치 정규화 파라미터 튜닝
GAN은 이론적으로는 단순해 보이지만, 실제 구현과 학습에서는 여러 도전 과제가 있습니다. 이런 어려움을 극복하고 성능을 향상시키는 방법을 계속 탐구해 나갈 계획입니다.
이 글이 GAN 구현에 도전하시는 분들께 도움이 되길 바랍니다. 질문이나 의견은 댓글로 남겨주세요!
'AI > Deep Learning' 카테고리의 다른 글
딥러닝 GPU 성능 비교: GTX 1060부터 1080 Ti SLI까지 (0) | 2020.05.28 |
---|---|
[DL] MNIST 데이터셋으로 U-Net 구현하기: 이미지 노이즈 제거 실험 (1) | 2020.05.07 |
[DL] 딥러닝 서버 구축 3편: 포트포워딩으로 외부에서 서버에 접속하기 (0) | 2020.04.08 |
[DL] 딥러닝 서버 구축 2편: TensorFlow와 CUDA 버전 충돌 해결하기 (0) | 2020.04.06 |
[DL] 게임용 PC를 딥러닝 서버로 전환하기: CUDA 10.0 & TensorFlow 설정 가이드 (0) | 2020.04.06 |