Skip to main content

GAN 아키텍처 — DCGAN, StyleGAN, CycleGAN

학습 목표

  • DCGAN의 합성곱 기반 안정적 GAN 구조를 이해한다
  • StyleGAN의 스타일 기반 생성 방식을 설명할 수 있다
  • CycleGAN의 비쌍(Unpaired) 이미지 변환 원리를 안다
  • 각 아키텍처의 적합한 활용 사례를 구분할 수 있다

아키텍처 계보

DCGAN (2015)

Deep Convolutional GAN은 합성곱 신경망(CNN)을 GAN에 적용한 첫 성공적인 아키텍처입니다. 안정적인 학습을 위한 가이드라인을 제시했습니다.

핵심 가이드라인

가이드라인설명
풀링 제거Strided Convolution (판별자) / Transposed Convolution (생성자) 사용
BatchNorm 적용생성자와 판별자 모두 (마지막 레이어 제외)
FC 레이어 제거완전 합성곱 구조
생성자 활성화ReLU (출력: Tanh)
판별자 활성화LeakyReLU
import torch
import torch.nn as nn

class DCGANGenerator(nn.Module):
    """DCGAN 생성자 (64x64 이미지)"""
    def __init__(self, latent_dim=100, channels=3, feature_maps=64):
        super().__init__()
        fm = feature_maps
        self.net = nn.Sequential(
            # (latent_dim,) → (fm*8, 4, 4)
            nn.ConvTranspose2d(latent_dim, fm * 8, 4, 1, 0, bias=False),
            nn.BatchNorm2d(fm * 8),
            nn.ReLU(True),

            # (fm*8, 4, 4) → (fm*4, 8, 8)
            nn.ConvTranspose2d(fm * 8, fm * 4, 4, 2, 1, bias=False),
            nn.BatchNorm2d(fm * 4),
            nn.ReLU(True),

            # (fm*4, 8, 8) → (fm*2, 16, 16)
            nn.ConvTranspose2d(fm * 4, fm * 2, 4, 2, 1, bias=False),
            nn.BatchNorm2d(fm * 2),
            nn.ReLU(True),

            # (fm*2, 16, 16) → (fm, 32, 32)
            nn.ConvTranspose2d(fm * 2, fm, 4, 2, 1, bias=False),
            nn.BatchNorm2d(fm),
            nn.ReLU(True),

            # (fm, 32, 32) → (channels, 64, 64)
            nn.ConvTranspose2d(fm, channels, 4, 2, 1, bias=False),
            nn.Tanh(),
        )

    def forward(self, z):
        z = z.view(z.size(0), -1, 1, 1)  # (배치, latent_dim, 1, 1)
        return self.net(z)


class DCGANDiscriminator(nn.Module):
    """DCGAN 판별자 (64x64 이미지)"""
    def __init__(self, channels=3, feature_maps=64):
        super().__init__()
        fm = feature_maps
        self.net = nn.Sequential(
            # (channels, 64, 64) → (fm, 32, 32)
            nn.Conv2d(channels, fm, 4, 2, 1, bias=False),
            nn.LeakyReLU(0.2, inplace=True),

            # (fm, 32, 32) → (fm*2, 16, 16)
            nn.Conv2d(fm, fm * 2, 4, 2, 1, bias=False),
            nn.BatchNorm2d(fm * 2),
            nn.LeakyReLU(0.2, inplace=True),

            # (fm*2, 16, 16) → (fm*4, 8, 8)
            nn.Conv2d(fm * 2, fm * 4, 4, 2, 1, bias=False),
            nn.BatchNorm2d(fm * 4),
            nn.LeakyReLU(0.2, inplace=True),

            # (fm*4, 8, 8) → (fm*8, 4, 4)
            nn.Conv2d(fm * 4, fm * 8, 4, 2, 1, bias=False),
            nn.BatchNorm2d(fm * 8),
            nn.LeakyReLU(0.2, inplace=True),

            # (fm*8, 4, 4) → (1, 1, 1)
            nn.Conv2d(fm * 8, 1, 4, 1, 0, bias=False),
            nn.Sigmoid(),
        )

    def forward(self, x):
        return self.net(x).view(-1, 1)

StyleGAN (2018)

NVIDIA의 Karras et al.이 제안한 고해상도 이미지 생성 모델입니다. 스타일 기반 아키텍처로 생성 품질과 제어 가능성을 획기적으로 향상시켰습니다.

핵심 구조

구성 요소역할
매핑 네트워크zwz \to w: 잠재 공간의 얽힘(entanglement) 해소
AdaIN스타일 벡터 ww로 특성 맵의 통계량(평균, 분산) 조절
노이즈 주입확률적 변이(머리카락, 주근깨 등) 추가
상수 입력생성의 시작점을 학습 가능한 텐서로 설정

스타일 믹싱

서로 다른 해상도에 다른 스타일 벡터를 적용하여, 거친 속성(포즈, 얼굴형)과 세밀한 속성(색상, 질감)을 독립적으로 제어합니다.
# StyleGAN의 AdaIN (Adaptive Instance Normalization) 개념
class AdaIN(nn.Module):
    """Adaptive Instance Normalization"""
    def __init__(self, channels, style_dim):
        super().__init__()
        self.norm = nn.InstanceNorm2d(channels)
        self.style = nn.Linear(style_dim, channels * 2)  # γ와 β

    def forward(self, x, w):
        # 스타일 벡터에서 스케일(γ)과 바이어스(β) 생성
        style = self.style(w).unsqueeze(-1).unsqueeze(-1)
        gamma, beta = style.chunk(2, dim=1)

        # Instance Normalization 후 스타일 적용
        out = self.norm(x)
        return gamma * out + beta

CycleGAN (2017)

비쌍(Unpaired) 이미지 변환을 가능하게 한 모델입니다. 쌍을 이루는 학습 데이터 없이도 도메인 간 변환을 학습합니다.

핵심 아이디어: 순환 일관성(Cycle Consistency)

손실 함수

Ltotal=LGAN(G,DY,X,Y)+LGAN(F,DX,Y,X)+λLcyc(G,F)\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{GAN}}(G, D_Y, X, Y) + \mathcal{L}_{\text{GAN}}(F, D_X, Y, X) + \lambda \cdot \mathcal{L}_{\text{cyc}}(G, F)
손실 항의미
LGAN\mathcal{L}_{\text{GAN}}적대적 손실 (각 방향)
Lcyc\mathcal{L}_{\text{cyc}}순환 일관성 손실: F(G(x))x1+G(F(y))y1\|F(G(x)) - x\|_1 + \|G(F(y)) - y\|_1
λ\lambda순환 일관성 가중치 (보통 10)
# CycleGAN 손실 함수 (개념)
def cycle_consistency_loss(G_AB, G_BA, real_A, real_B, lambda_cyc=10.0):
    """순환 일관성 손실"""
    # A → B → A
    fake_B = G_AB(real_A)
    recovered_A = G_BA(fake_B)
    loss_A = torch.nn.functional.l1_loss(recovered_A, real_A)

    # B → A → B
    fake_A = G_BA(real_B)
    recovered_B = G_AB(fake_A)
    loss_B = torch.nn.functional.l1_loss(recovered_B, real_B)

    return lambda_cyc * (loss_A + loss_B)

활용 사례

변환예시
사진 → 화풍 변환풍경 사진 → 모네 스타일
동물 변환말 ↔ 얼룩말
계절 변환여름 풍경 → 겨울 풍경
의료 영상CT → MRI 합성

아키텍처 비교

모델해상도데이터 요구제어 가능성적합 태스크
DCGAN64×64쌍 불필요낮음기본 이미지 생성
StyleGAN1024×1024쌍 불필요높음고해상도 얼굴/예술 생성
Pix2Pix가변쌍 필요높음 (조건부)쌍 있는 이미지 변환
CycleGAN가변쌍 불필요보통비쌍 도메인 변환
2020년 이후 Diffusion 모델(DDPM, Stable Diffusion)이 GAN의 이미지 생성 품질을 넘어서면서, 이미지 생성의 주류가 GAN에서 Diffusion으로 이동했습니다. 하지만 GAN은 빠른 추론 속도실시간 응용(비디오, 게임 등)에서 여전히 우위를 가지며, Diffusion과 GAN을 결합하는 연구도 진행 중입니다.

참고 논문

논문학회/연도핵심 기여
Unsupervised Representation Learning with DCGANs (Radford et al.)ICLR 2016합성곱 GAN 아키텍처 가이드라인
A Style-Based Generator Architecture - StyleGAN (Karras et al.)CVPR 2019스타일 기반 생성자
Unpaired Image-to-Image Translation - CycleGAN (Zhu et al.)ICCV 2017비쌍 이미지 변환, 순환 일관성

체크리스트

  • DCGAN의 합성곱 기반 안정적 구조를 이해한다
  • StyleGAN의 매핑 네트워크와 AdaIN의 역할을 안다
  • CycleGAN의 순환 일관성 손실의 필요성을 설명할 수 있다
  • 각 GAN 아키텍처의 적합한 활용 사례를 구분할 수 있다

다음 문서