IT·개발

GAN과 DCGAN 구현 경험 — MNIST 학습의 도전 과제 (2020년 메모 재정리)

5월 16, 2026 1 min read

2020년 4월, GAN을 처음으로 직접 구현해보면서 정리해두었던 학습 메모를 6년 만에 다시 꺼냈습니다. 당시에는 “두 개의 신경망이 서로 경쟁한다”는 개념이 신선해서 MNIST 데이터셋에 직접 적용해봤는데, 결과는 기대만큼 깔끔하지 않았습니다. 이 글은 딥러닝 기초는 알지만 GAN을 처음 구현해보려는 분을 대상으로 합니다. 성능 수치 분석보다는, 당시 부딪혔던 균형 문제와 학습 불안정성을 있는 그대로 정리한 회고입니다.


1. GAN의 기본 개념 — 경찰과 도둑 비유

GAN(Generative Adversarial Network)은 2014년 Ian Goodfellow가 제안한 생성 모델로, 두 개의 신경망이 서로 경쟁하며 학습하는 구조를 가집니다.

핵심은 판별자(Discriminator, 경찰)생성자(Generator, 도둑) 간의 적대적 관계에 있습니다. 마치 도둑이 위조 지폐를 만들어 경찰을 속이려는 것과 같은 구도입니다.

  • 생성자(Generator): 실제 데이터와 구분하기 어려운 가짜 데이터를 생성합니다. 판별자를 속이는 것이 목표입니다.
  • 판별자(Discriminator): 입력 데이터가 진짜인지 가짜인지 구분하는 이진 분류에 가까운 역할을 합니다. 진짜 이미지에는 1에 가까운 값을, 가짜 이미지에는 0에 가까운 값을 출력하도록 학습됩니다.

두 모델은 상호 경쟁적으로 학습하며, 서로의 성능을 향상시키는 방향으로 발전합니다. 생성자는 판별자를 속이기 위해 더 정교한 가짜를 만들어내고, 판별자는 그 가짜를 더 정확하게 걸러내려 합니다.

[2026 메모] 이 글은 2020년 4월에 작성된 학습 기록임을 전제로 읽어주시기 바랍니다. 2026년 시점에는 Diffusion Models·Transformer 기반 생성 모델(Stable Diffusion·DALL·E 계열 등)이 등장하면서 생성 모델 지형이 크게 바뀌었습니다. 본 글은 GAN을 개념 학습용으로 살펴본 회고입니다.


2. DCGAN 구현 환경

DCGAN(Deep Convolutional GAN)은 GAN에 컨볼루션 레이어를 도입한 모델입니다. MNIST 공개 데이터셋을 사용해 직접 구현해봤습니다.

실험 환경을 정리하면 아래와 같습니다.

항목
데이터셋MNIST 훈련 데이터 60,000개
배치 크기100
에포크30 (총 18,000회 학습)
손실 함수binary_crossentropy

GAN은 이진 분류 문제에 가깝기 때문에 손실 함수로 binary_crossentropy를 사용했습니다. 판별자는 진짜 이미지에 대해서는 1에 가까운 값을, 가짜 이미지에 대해서는 0에 가까운 값을 출력하도록 학습됩니다.

[분석] 당시 메모에 프레임워크를 따로 기록해두지 않아서, 지금에서야 정확히 어느 환경이었는지 확인하기 어렵습니다. 직접 구현해보실 때는 Keras·TensorFlow·PyTorch 중 본인에게 익숙한 환경을 선택하시면 됩니다. 라이브러리 버전은 실제 환경의 pip list로 확인하시기 바랍니다.


3. 학습 결과 분석 — 손실 그래프와 판별자 평가

손실 그래프

아래 그래프는 에포크별 판별자·생성자 손실 변화를 나타냅니다.

DCGAN MNIST 학습 진행에 따른 손실 그래프

학습이 진행되면서 손실이 감소하는 경향을 보였습니다. 그런데 당시 강의에서 강사님께서도 언급하셨듯, GAN에서 손실 그래프는 큰 의미가 없습니다. 일반 분류 모델처럼 손실 값이 낮아진다고 해서 GAN이 잘 학습되고 있다고 단정할 수 없는 구조입니다.

판별자 예측 결과

판별자의 성능을 평가하기 위해 두 가지 데이터셋을 활용했습니다.

  • 훼손된 MNIST 이미지 1,000개 — 가짜로 간주
  • 정상 MNIST 이미지 1,000개 — 진짜로 간주

[분석] 여기서 ‘훼손된 이미지’는 원문 표현 그대로이며, 판별자 성능 평가를 위해 가짜(비정상) 데이터로 활용된 변형 이미지입니다. 구체적인 변형 방식은 원문에 명시되어 있지 않습니다.

판별자 예측 결과 분포 그래프 — 훼손 이미지와 정상 이미지 비교

훼손 이미지(가짜)에 대해서는 판별자가 대부분 0에 가까운 값을 출력해 ‘가짜’ 분류는 양호하게 이루어졌습니다. 반면 정상 이미지(진짜)에 대해서는 0.5에 가까운 애매한 값을 출력하는 경향이 확인됐습니다.

[분석] 정상 이미지에 대해 판별자가 0.5 부근 값을 출력한다는 것은, 판별자가 충분히 학습되지 않았거나 생성자가 만들어낸 가짜 패턴에 지나치게 익숙해진 신호로 볼 수 있습니다. 다만 이는 회고적 해석이며 단정하기는 어렵습니다.


4. 실험 결과 — 30 에포크 학습 후 생성된 이미지

판별자가 정상 이미지를 제대로 인식하지 못했다는 신호는 실제 생성 이미지에서도 나타납니다.

30 에포크 학습 후 DCGAN이 생성한 MNIST 손글씨 숫자 이미지
30 에포크 DCGAN MNIST 생성 이미지 추가 샘플

30 에포크(총 18,000회 학습) 후 생성된 이미지를 보면 어느 정도 MNIST 숫자와 유사한 형태가 나왔지만, 완벽하지는 않습니다. 판별자 예측 결과에서 확인했듯이 학습이 완전히 수렴하지 않은 상태로 보입니다. 이 결과는 다음 절에서 다루는 도전 과제들과 직결됩니다.


5. 학습의 도전 과제

GAN은 이론적으로는 단순해 보이지만, 실제 구현과 학습에서는 여러 도전 과제가 있습니다. 당시 실험에서 체감한 내용을 정리합니다.

5-1. 균형 잡힌 학습의 어려움

GAN 학습에서 가장 까다로운 부분 중 하나는 판별자와 생성자 간의 균형 유지입니다. 한쪽이 지나치게 강해지면 다른 쪽이 학습 방향을 잡지 못하게 됩니다.

  • 판별자가 너무 강해지면: 생성자가 만든 이미지는 항상 ‘가짜’로 분류되어, 생성자가 학습 신호를 얻기 어렵습니다.
  • 생성자가 너무 강해지면: 판별자가 진짜와 가짜를 더 이상 구분하지 못하게 됩니다.

어느 쪽이든 한쪽이 압도하는 순간 경쟁 구도가 무너지고, 두 모델 모두 의미 있는 학습이 일어나지 않습니다.

5-2. 학습 불안정성

당시엔 학습 횟수를 늘리면 균형 문제가 해결될 것 같아서, 에포크를 300까지 늘려봤습니다 (총 180,000회 학습). 그런데 오히려 판별자 포화 현상으로 학습이 불안정해지면서, 판별자가 진짜와 가짜 모두에 대해 0.5에 가까운 값을 출력하기 시작했습니다. 더 오래 학습시킨다고 해서 결과가 나아지지 않는다는 점을 이 실험에서 직접 확인했습니다.

5-3. 모드 붕괴(Mode Collapse) — 참고: 직접 실험하지 않은 내용

모드 붕괴는 생성자가 다양한 출력을 만들어내지 않고, 판별자를 속이는 데 유리한 특정 패턴만 반복적으로 생성하는 현상입니다. 이 현상은 본 실험에서 직접 확인하지 않은 일반론입니다. GAN 관련 학습 자료에서 자주 언급되는 대표적인 문제 사례로, 다른 실험 맥락에서 빈번히 보고됩니다.


6. 향후 개선 방향

당시 메모에 남겨뒀던 개선 아이디어들입니다. 지금 돌아보면 학습률 조정과 WGAN부터 먼저 시도했어야 했다는 생각이 드네요.

방향핵심 내용
학습률 조정판별자와 생성자의 학습률을 분리 설정해 균형 도모
모델 구조 개선더 깊거나 넓은 네트워크 구조 시도
GAN 변형 적용WGAN, LSGAN 등 학습 안정성을 개선한 변형 모델 활용
배치 정규화 튜닝Batch Normalization 파라미터로 학습 안정성 향상

[분석] DCGAN을 처음 구현해보신다면, 위 4가지 개선 방향 중 학습률 조정과 배치 정규화 튜닝부터 순서대로 적용해보시기를 권합니다. 학습이 어느 정도 안정된 다음, 모델 구조 개선과 WGAN·LSGAN 같은 변형 구조를 시도하는 순서가 현실적입니다. WGAN·LSGAN의 구체 구조와 손실 함수 차이는 이 회고의 범위 밖이므로, 각 원논문을 별도로 참고하시기 바랍니다.

같은 MNIST 데이터셋에서 노이즈 이미지를 복원하는 접근 방식이 궁금하신 분은 MNIST 노이즈 제거 실험기 — U-Net 직접 구현과 노이즈 일반화 비교도 참고해보시기 바랍니다.


마무리 — 6년 뒤에 다시 보는 회고

당시에는 매 에포크마다 생성된 이미지를 저장해두고 하나씩 비교하면서, 숫자 형태가 조금이라도 선명해지는지 확인하던 기억이 납니다. 손실 그래프보다 직접 눈으로 생성 이미지를 비교하는 과정이 GAN의 특성을 몸으로 익히는 데 더 도움이 됐던 것 같습니다.

[2026 메모] 2026년 시점에는 Diffusion 기반 모델이 이미지 생성 분야에서 다양하게 활용되고 있습니다. 그럼에도 GAN은 적대적 학습이라는 개념의 출발점으로서 여전히 학습 가치가 있습니다. 두 신경망이 서로를 밀어붙이며 발전한다는 아이디어는, 생성 모델의 역사를 이해하는 데 중요한 맥락을 제공합니다.

“GAN은 이론적으로는 단순해 보이지만, 실제 구현과 학습에서는 여러 도전 과제가 있습니다” — 6년 전 원문에 썼던 이 한 줄이, 다시 읽어봐도 가장 정확한 요약입니다.

GAN을 처음 구현해보실 때, 손실 그래프보다 생성 이미지를 직접 눈으로 비교하는 것부터 시작해보세요. 숫자 형태가 조금씩 선명해지는 과정을 직접 확인하는 것이 이 구조를 이해하는 가장 빠른 방법이었습니다.


이 글은 2020-04-29 작성된 GAN/DCGAN 학습 회고(티스토리 blog-8)를 기반으로 재정리되었습니다.

[안내] 본문에 등장하는 [분석][2026 메모] 표기는 원문 팩트와 분리된 회고적 해석 또는 2026년 시점 맥락 보충입니다.

참고 자료 (외부 1차 출처)

  • Ian Goodfellow (2014), GAN 원논문 “Generative Adversarial Nets”: <https://arxiv.org/abs/1406.2661>