Python/Deep Learning

생성적 적대 신경망(GAN)이란? 개념 및 원리

임베디드 친구 2026. 2. 20. 09:41
728x90
반응형

생성적 적대 신경망(GAN)이란? 개념 및 원리

1. GAN이란?

생성적 적대 신경망(Generative Adversarial Network, GAN)은 2014년 Ian Goodfellow와 그의 동료들에 의해 제안된 신경망 모델로, 데이터를 생성하는 능력을 갖춘 딥러닝 모델입니다. GAN은 이미지 생성, 스타일 변환, 초해상도 이미지 생성, 데이터 증강 등 다양한 분야에서 활용됩니다.

GAN은 두 개의 신경망, 즉 생성자(Generator)판별자(Discriminator)가 서로 경쟁하면서 학습하는 구조를 가지고 있습니다. 이 두 신경망이 경쟁하며 발전함으로써, 점점 더 실제 데이터와 유사한 데이터를 생성할 수 있도록 학습됩니다.


2. GAN의 동작 원리

GAN의 핵심 개념은 생성자판별자 간의 적대적 학습(adversarial learning)입니다. 아래의 과정을 통해 GAN이 학습됩니다.

  1. 생성자(Generator, G): 랜덤한 노이즈 벡터(잠재 변수, Latent Vector)를 입력받아 가짜 데이터를 생성합니다.
  2. 판별자(Discriminator, D): 입력된 데이터가 실제(real) 데이터인지 가짜(fake) 데이터인지 판별합니다.
  3. 손실 함수 계산: 판별자가 진짜 데이터를 정확히 판별하고, 가짜 데이터를 가짜라고 판별할수록 손실이 줄어듭니다. 반대로, 생성자가 판별자를 속여 가짜 데이터를 진짜로 인식하도록 만들수록 손실이 줄어듭니다.
  4. 경쟁적 학습(Adversarial Learning): 생성자는 판별자를 속이기 위해 더 정교한 데이터를 생성하려 하며, 판별자는 더욱 정교하게 가짜 데이터를 구별하려 합니다. 이 과정을 반복하면서 GAN이 점차 발전하게 됩니다.

이를 수식으로 표현하면 다음과 같은 최적화 문제(Optimization Problem)가 됩니다.

$$ \min_G \max_D V(D, G) = E_{x \sim p_{data}(x)} [\log D(x)] + E_{z \sim p_z(z)} [\log (1 - D(G(z)))] $$

위 식에서,

  • $G$는 생성자 신경망, $D$는 판별자 신경망입니다.
  • $p_{data}(x)$는 실제 데이터의 분포, $p_z(z)$는 생성자가 입력받는 노이즈 분포입니다.
  • $G(z)$는 생성자가 만든 가짜 데이터이며, $D(x)$는 입력된 데이터가 진짜일 확률입니다.

GAN의 목표는 생성자는 판별자를 속일 수 있도록 데이터의 질을 높이는 것, 판별자는 가짜 데이터를 올바르게 판별할 수 있도록 구별 능력을 키우는 것입니다.


3. GAN의 학습 과정

GAN의 학습 과정은 다음과 같습니다.

3.1. 초기화 단계

  • 생성자와 판별자의 가중치를 초기화합니다.
  • 생성자는 랜덤 노이즈로부터 데이터를 생성합니다.
  • 판별자는 실제 데이터와 가짜 데이터를 입력받아 학습을 시작합니다.

3.2. 판별자 학습

  1. 실제 데이터와 가짜 데이터를 입력받아 확률값(진짜일 확률)을 출력합니다.
  2. 손실 함수(이진 교차 엔트로피)를 사용해 판별자가 실제 데이터를 1로, 가짜 데이터를 0으로 분류하도록 학습합니다.

3.3. 생성자 학습

  1. 랜덤 노이즈를 입력받아 가짜 데이터를 생성합니다.
  2. 생성된 데이터를 판별자에 입력하여 진짜라고 판단하도록 유도합니다.
  3. 판별자의 출력을 바탕으로 생성자의 손실을 계산하고 가중치를 업데이트합니다.

3.4. 반복 학습

위의 과정을 여러 번 반복하면서 GAN 모델을 점진적으로 개선합니다.


4. GAN 구현 예제 (TensorFlow & Keras)

GAN의 기본적인 구조를 이해하기 위해, TensorFlow와 Keras를 활용하여 간단한 GAN을 구현해보겠습니다.

4.1. 라이브러리 불러오기

import tensorflow as tf
from tensorflow.keras.layers import Dense, LeakyReLU, BatchNormalization, Reshape, Flatten, Conv2DTranspose, Conv2D
from tensorflow.keras.models import Sequential
import numpy as np
import matplotlib.pyplot as plt

4.2. 생성자 정의

def build_generator():
    model = Sequential()
    model.add(Dense(128, input_dim=100))  # 잠재 벡터 크기: 100
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization())
    model.add(Dense(784, activation='tanh'))  # MNIST 데이터셋 크기
    model.add(Reshape((28, 28, 1)))
    return model

4.3. 판별자 정의

def build_discriminator():
    model = Sequential()
    model.add(Flatten(input_shape=(28, 28, 1)))
    model.add(Dense(128))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dense(1, activation='sigmoid'))
    return model

4.4. GAN 모델 생성 및 학습

def train_gan(generator, discriminator, epochs=10000, batch_size=128):
    for epoch in range(epochs):
        noise = np.random.normal(0, 1, (batch_size, 100))
        fake_images = generator.predict(noise)
        real_images = np.random.rand(batch_size, 28, 28, 1)

        x = np.concatenate([real_images, fake_images])
        y = np.array([1] * batch_size + [0] * batch_size)

        discriminator.trainable = True
        discriminator.train_on_batch(x, y)

        noise = np.random.normal(0, 1, (batch_size, 100))
        y_fake = np.array([1] * batch_size)

        discriminator.trainable = False
        gan.train_on_batch(noise, y_fake)

        if epoch % 1000 == 0:
            print(f"Epoch {epoch}: Training GAN...")

5. GAN의 응용 분야

GAN은 다양한 분야에서 활용되고 있습니다.

  • 이미지 생성: 새로운 얼굴 이미지, 예술 작품 생성
  • 스타일 변환: 사진을 특정 화풍으로 변환
  • 초해상도 이미지 생성: 저해상도 이미지를 고해상도로 변환
  • 데이터 증강: 훈련 데이터를 증가시키기 위한 생성 모델
  • 의료 영상 분석: GAN을 이용한 의료 영상 데이터 보완 및 생성

6. 마무리

GAN은 생성자와 판별자가 경쟁하는 구조를 통해 고품질의 데이터를 생성하는 강력한 기술입니다. 현재도 연구가 활발히 진행 중이며, 다양한 변형 모델(WGAN, DCGAN, CycleGAN 등)이 등장하면서 GAN의 성능과 응용 범위가 더욱 확대되고 있습니다. GAN의 기본 개념과 원리를 이해하고, 직접 구현해보면서 실전 활용 능력을 키우는 것이 중요합니다.

반응형