조건부 생성부터 스타일 제어까지, GAN 변형 모델의 선택 기준
Conditional GAN, CycleGAN, StyleGAN의 구조와 손실 함수, 훈련 안정화 기법, 활용 영역을 실무 관점에서 비교한다.
2026-08-14 · 최초 발행 2024-04-29
생성 목표에 따라 갈리는 GAN의 설계
GAN은 생성자 G와 판별자 D가 적대적으로 학습하는 구조다. 생성자 G는 실제와 유사한 샘플을 만들고, 판별자 D는 입력이 실제인지 생성물인지 구분한다. 목적함수는 min_G max_D V(D, G)로 표현되며, 학습을 안정적으로 유지하는 일이 핵심 과제다.
Conditional GAN, CycleGAN, StyleGAN은 이 기본 구조를 서로 다른 생성 문제에 맞게 확장한다. cGAN은 레이블·속성·텍스트 같은 조건 벡터 y로 출력을 제어한다. CycleGAN은 짝지어지지 않은 데이터만으로 도메인 사이의 변환을 학습한다. StyleGAN은 스타일 공간 W를 통해 고해상도 결과와 편집 가능성을 다룬다.
조건을 출력에 반영하는 cGAN
cGAN은 노이즈 z와 조건 y를 함께 사용한다. 생성자는 G(z, y), 판별자는 D(x, y) 형태가 되며, 생성 결과가 조건과 맞는지까지 판별 과정에 포함한다.
레이블 임베딩 또는 One-hot을 z와 결합해 생성자 입력을 확장하고, 판별자에는 x와 y를 동시에 넣는다. 프로젝션 판별자(Projection Discriminator)는 조건과 특징의 내적을 이용해 조건-특징 정합성을 판별한다.
손실 함수로는 BCE, LSGAN, hinge loss를 선택할 수 있으며 조건 불일치 페널티를 강화할 수 있다. 판별자에는 스펙트럴 정규화를 적용해 리프시츠 제약을 부여하고 모드 붕괴를 완화한다.
조건의 종류가 늘어날수록 클래스별 균형과 라벨 품질이 중요해진다. 클래스 조건은 물론 속성 조건과 텍스트 조건으로 확장할 수 있고, 이미지와 텍스트를 함께 쓰는 멀티모달 조건에서는 late-fusion, concat, FiLM을 적용한다.
비페어 데이터를 오가는 CycleGAN
CycleGAN은 대응 쌍이 없는 두 도메인 X와 Y를 대상으로 한다. G:X→Y와 F:Y→X를 학습하고, 각 도메인에는 D_X와 D_Y를 둔다. ResNet 또는 UNet 기반 생성자를 사용하며, 스타일 안정화를 위해 인스턴스 정규화를 적용한다.
핵심은 사이클 일관성이다. X의 샘플을 G로 Y에 보낸 뒤 F를 거친 결과 F(G(x))가 x에 가까워지도록 하고, Y에서도 G(F(y))가 y에 가까워지도록 강제한다. 적대적 손실에 사이클 일관성 L1 손실과 색감 보존을 위한 아이덴티티 손실을 조합한다.
λ_cyc와 λ_id의 설정은 트레이드오프를 만든다. λ_cyc가 과도하면 결과가 과평활화될 위험이 있다. 판별자 학습에는 이미지 버퍼(Replay Buffer)를 사용하고, 학습률 스케줄러로 후반 수렴을 유도할 수 있다. 패치GAN 판별자는 지역 텍스처 품질을 높이는 데 사용된다.
스타일 공간으로 해상도와 편집성을 다루는 StyleGAN
StyleGAN은 z를 w로 옮기는 매핑 네트워크 f: z→w와 합성 네트워크 S(w, noise)를 분리한다. 이 구조는 분포의 해석성을 높이고, 레이어별 w_i를 통해 스타일을 주입할 수 있게 한다. per-layer 노이즈 주입은 주름이나 모공 같은 미세 디테일 제어에 쓰인다.
채널별 스케일을 변조하고 정규화하는 모듈레이션-디모듈레이션은 스타일 혼합을 안정화한다. Truncation trick(ψ)은 품질과 다양성 사이의 균형을 조절한다.
StyleGAN은 Progressive growing에서 StyleGAN2-ADA로 발전했으며, 데이터 적응형 증강으로 소량 데이터에 대응한다. FID와 Precision-Recall 개선, 1024^2+ 고해상도 얼굴·오브젝트 합성에서 강점을 가진다.
입력부터 손실 계산까지의 흐름
cGAN의 입력은 z와 조건 y다. 조건 임베딩을 결합한 뒤 생성자가 합성하고, 판별자는 조건 정합성을 판별해 조건 일치 손실과 적대적 손실을 계산한다.
CycleGAN은 X와 Y의 비페어 이미지를 입력으로 받는다. X→G→Ŷ, Y→F→X̂ 경로를 만들고 사이클 손실과 아이덴티티 손실을 병행한다.
StyleGAN은 z 또는 w와 임의 노이즈를 사용한다. z를 w로 매핑한 다음 레이어별 스타일을 주입해 합성하며, ADA 증강과 손실 계산을 함께 수행한다.
모드 붕괴는 precision/recall, intra-FID 같은 다양성 지표로 모니터링한다. 그라디언트 폭주에는 스펙트럴 정규화, gradient penalty, clip을 적용할 수 있다. 도메인 시프트에는 ADA, 강건 증강, 데이터 버퍼, 학습률 스케줄링을 사용한다.
모델별 선택 관점
| 모델 | 성능(시각 품질) | 확장성(데이터/조건) | 일관성(조건·내용) | 안정성(훈련 난이도) | 운영 편의(배포/제어) |
|---|---|---|---|---|---|
| cGAN | 중~상: 조건 세분화 시 우수 | 중~상: 조건 공간 증가에 비례 비용 | 상: 조건-출력 정합성 확보 | 중: 라벨 품질 의존 | 상: 조건 입력으로 제어 용이 |
| CycleGAN | 중: 텍스처/스타일 전이에 강점 | 상: 비페어 데이터로 확장 용이 | 중: 구조 보존은 손실 가중치에 좌우 | 중: λ 튜닝 필요 | 중: 도메인별 모델 관리 필요 |
| StyleGAN | 상: 고해상도 SOTA 수준 | 중: 대용량 데이터/연산 필요 | 중: 스타일-내용 제어 분리 | 중~상: ADA로 개선 | 중~상: w-space 편집 툴 풍부 |
주: 성능 평가는 FID/LPIPS/Precision-Recall 관찰값 기준의 일반적 경향이며, 최신 데이터셋·설정에 따라 변동 가능하다.
생성 모델이 맡을 수 있는 작업
cGAN은 레이블별 데이터 증강과 불균형 클래스 보정에 사용할 수 있다. 색상, 각도, 도형 같은 속성을 조절하는 생성에도 맞으며, 간단한 텍스트 임베딩을 결합한 텍스트-이미지 프로토타입의 기반이 된다.
CycleGAN은 계절·날씨 변화, 위성↔지도, 스케치↔사진처럼 도메인을 전환하는 문제에 적용된다. 제조 비전에서는 정상 이미지를 결함 스타일로 이식해 이상 탐지 데이터를 만들 수 있다. 의료 이미지에서는 장비·기관 간 콘트라스트 정합과 라벨 없는 도메인 적응에 활용된다.
StyleGAN은 아바타, 캐릭터, 얼굴, 패션 콘텐츠 합성에 적합하다. 섬유·목재·금속 텍스처의 고해상도 생성에도 쓰이며, 합성 인물 데이터로 개인정보 노출을 최소화하는 용도도 있다.
데이터 증강에 따른 성능 향상으로 불균형 클래스 F1 +38%p, 소량 데이터 환경에서 mAP +25%p가 제시된다. ADA 적용과 도메인 적합 증강을 포함하면 FID 520% 개선을 기대할 수 있으며, 비페어·합성 데이터를 활용하면 라벨링 인건비를 2040% 절감할 수 있다. 제어 가능한 생성은 반복 실험 효율을 높이고, 도메인 전이는 라벨 부족을 완화하며, 스타일 분해는 편집·후처리 파이프라인을 단순화한다.
실행 코드와 전제 조건
전제조건:
- Python 3.10, PyTorch 2.2+, CUDA 11.8(Optional)
- torchvision 0.17+, pillow
cGAN 미니멀 훈련 스텝(Pytorch)
# pip install torch torchvision
import torch, torch.nn as nn, torch.nn.functional as F
nz, nclass, nc = 128, 10, 3
img_size = 32
class Gen(nn.Module):
def __init__(self):
super().__init__()
self.emb = nn.Embedding(nclass, nz)
self.fc = nn.Linear(nz*2, 256*4*4)
self.net = nn.Sequential(
nn.BatchNorm2d(256),
nn.Upsample(scale_factor=2), nn.Conv2d(256,128,3,1,1), nn.BatchNorm2d(128), nn.ReLU(),
nn.Upsample(scale_factor=2), nn.Conv2d(128,64,3,1,1), nn.BatchNorm2d(64), nn.ReLU(),
nn.Upsample(scale_factor=2), nn.Conv2d(64,nc,3,1,1), nn.Tanh()
)
def forward(self, z, y):
zy = torch.cat([z, self.emb(y)], dim=1)
x = self.fc(zy).view(-1,256,4,4)
return self.net(x)
class ProjDisc(nn.Module):
def __init__(self):
super().__init__()
self.emb = nn.Embedding(nclass, 128)
self.net = nn.Sequential(
nn.Conv2d(nc,64,4,2,1), nn.LeakyReLU(0.2),
nn.Conv2d(64,128,4,2,1), nn.LeakyReLU(0.2),
nn.Conv2d(128,256,4,2,1), nn.LeakyReLU(0.2),
)
self.conv_last = nn.Conv2d(256,1,4,1,0)
self.proj = nn.Linear(256,128)
def forward(self, x, y):
h = self.net(x)
feat = h.mean([2,3]) # GAP
out = self.conv_last(h).view(-1) # realness
proj = (self.proj(feat) * self.emb(y)).sum(dim=1)
return out + proj
G, D = Gen().cuda(), ProjDisc().cuda()
optG = torch.optim.Adam(G.parameters(), lr=2e-4, betas=(0.5,0.999))
optD = torch.optim.Adam(D.parameters(), lr=2e-4, betas=(0.5,0.999))
def train_step(real, y):
bs = real.size(0)
z = torch.randn(bs, nz, device=real.device)
# D step
fake = G(z, y).detach()
d_real = D(real, y)
d_fake = D(fake, y)
lossD = F.relu(1 - d_real).mean() + F.relu(1 + d_fake).mean() # hinge
optD.zero_grad(); lossD.backward(); optD.step()
# G step
fake = G(z, y)
dg_fake = D(fake, y)
lossG = -dg_fake.mean()
optG.zero_grad(); lossG.backward(); optG.step()
return lossD.item(), lossG.item()
클래스 불균형이 있으면 미니배치 샘플러로 레이블 균형을 유지하는 방식을 권장한다.
CycleGAN 핵심 손실 스니펫
# pip install torch torchvision
import torch, torch.nn as nn, torch.nn.functional as F
L1 = nn.L1Loss()
def cycle_identity_losses(G, F, D_X, D_Y, x, y, lambda_cyc=10.0, lambda_id=0.5):
y_hat = G(x)
x_hat = F(y)
# adversarial (hinge)
loss_adv = (F.relu(1 - D_Y(y_hat)).mean() + F.relu(1 - D_X(x_hat)).mean())
# cycle
x_cyc = F(y_hat)
y_cyc = G(x_hat)
loss_cyc = L1(x_cyc, x) + L1(y_cyc, y)
# identity
loss_id = L1(G(y), y) + L1(F(x), x)
return loss_adv + lambda_cyc * loss_cyc + lambda_id * loss_id
패치GAN 판별자(70×70)를 사용하고, 이미지 버퍼로 D 입력을 다양화하는 방식을 권장한다.
StyleGAN2-ADA 사전학습 모델 추론
# pip install ninja requests click tqdm
# 공식 구현: https://github.com/NVlabs/stylegan2-ada-pytorch
git clone https://github.com/NVlabs/stylegan2-ada-pytorch.git
cd stylegan2-ada-pytorch
python gen_images.py --network=https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/ffhq.pkl --seeds=0-7 --outdir=out
w-space 편집에서는 truncation ψ=0.7을 권장 시작점으로 두고, seed를 고정해 실험 재현성을 확보한다.
운영 환경에서 함께 관리할 항목
생성물에는 워터마크나 신원 검증 메타데이터를 삽입하고, 딥페이크 악용 모니터링 시스템과 연계한다. 민감 데이터 도메인에서는 개인정보 비식별 합성과 검증 파이프라인을 구축한다.
학습 데이터의 라이선스를 확인하고, 데이터셋 출처와 전처리 과정을 로깅하며 거버넌스를 갖춰야 한다. 상업 배포에서는 생성물 사용권을 명시해 모호성을 줄인다.
운영 단계에서는 FID, Precision/Recall, Inception Score, 다양성 지표를 상시 추적한다. 모델 카드와 데이터 카드를 문서화하고, DVC/MLflow 기반의 버전관리 및 재현성 파이프라인을 도입한다. 높은 용량·시간에 따른 품질과 추론 지연·비용의 트레이드오프를 고려해 필요한 해상도와 배치 규모를 기준으로 자원을 계획한다.
cGAN은 조건 정합성을 요구하는 생성 작업에, CycleGAN은 비페어 데이터 기반 전이에, StyleGAN은 고해상도 생성과 편집에 맞는다. 선택한 모델에 스펙트럴 정규화, ADA, 버퍼 같은 안정화 기법과 운영 지표 모니터링을 함께 적용한다.