대부분의 생성기(generator)는 z를 모든 레이어(layer)에 한꺼번에 섞습니다. StyleGAN은 이를 분리했습니다. 먼저 z를 중간 잠재 표현(intermediate) w로 매핑(mapping)하고, AdaIN을 통해 각 해상도 단계(resolution level)에 w를 주입(inject) 합니다. 이 한 가지 변화가 잠재 공간(latent space)을 풀어내어, 사진처럼 사실적인 얼굴(photorealistic face) 생성을 7년 넘게 사실상 풀린 문제처럼 만들었습니다.
DCGAN은 전치 합성곱(transposed convolution) 층을 쌓아 z를 이미지로 매핑합니다. 문제는 z가 자세(pose), 조명(lighting), 정체성(identity), 배경(background)을 모두 얽힌(entangled) 상태로 동시에 제어한다는 점입니다. z의 한 축(axis)을 따라 움직이면 이 네 가지가 함께 바뀝니다. 표현(representation)이 그렇게 분해(factorize)되어 있지 않기 때문에, 모델에게 "같은 사람, 다른 자세"를 요청할 수 없습니다.
Karras et al. (2019, NVIDIA)은 합성곱 층에 z를 직접 넣지 말자고 제안했습니다. 네트워크 입력으로는 상수(constant) 4×4×512 텐서(tensor)를 넣습니다. 그리고 8층 MLP가 z ∈ Z → w ∈ W를 매핑하도록 학습합니다. 각 해상도에서 적응적 인스턴스 정규화(adaptive instance normalization; AdaIN)로 w를 주입합니다. 각 합성곱 특징 맵(feature map)을 정규화한 뒤, w의 아핀 사영(affine projection)으로 스케일(scale)과 시프트(shift)를 적용합니다. 피부 모공(skin pore)이나 머리카락 가닥(hair strand) 같은 확률적 디테일(stochastic detail)을 위해 층별 노이즈도 더합니다.
그 결과 W는 자세, 정체성 같은 고수준 스타일(high-level style)과 조명, 색상 같은 미세 스타일(fine style)이 비교적 직교한 축을 갖게 됩니다. 이미지 A의 w를 저해상도 단계에 쓰고, 이미지 B의 w를 고해상도 단계에 쓰면 두 이미지 사이의 스타일을 교환(style mixing)할 수 있습니다. 이것이 편집(editing), 도메인 간 스타일화(cross-domain stylization), 그리고 "StyleGAN 역변환(StyleGAN-inversion)"이라는 연구 흐름 전체를 열었습니다.
사전 테스트
2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요
1.DCGAN에서 z의 한 축을 따라 움직이면 자세, 조명, 정체성, 배경이 동시에 바뀝니다. 이것이 잠재 공간(latent space)에 대해 드러내는 핵심 문제는 무엇인가요?
2.StyleGAN 아키텍처에서 매핑 네트워크(mapping network) f: Z -> W의 역할은 무엇인가요?
0/2 답변 완료
개념
매핑 네트워크(Mapping network).f: Z → W인 8층 MLP입니다. Z = N(0, I)^512입니다. W는 가우시안(Gaussian)으로 강제되지 않고, 데이터에 적응한(data-adapted) 분포 형태를 학습합니다.
합성 네트워크(Synthesis network). 학습된 상수(learned constant) 4×4×512에서 시작합니다. 각 해상도 블록은 업샘플링(upsample) → 합성곱(conv) → AdaIN(w_i) → 노이즈(noise) → 합성곱(conv) → AdaIN(w_i) → 노이즈(noise) 순서로 동작합니다. 해상도는 4, 8, 16, 32, 64, 128, 256, 512, 1024로 두 배씩 커집니다.
여기서 y_scale과 y_bias는 w의 아핀 사영(affine projection)으로부터 나옵니다. 특징 맵별로 정규화한 뒤, 다시 스타일을 입히는 셈입니다. 여기서 말하는 "스타일"이란 특징 맵의 1차·2차 통계량(first-order, second-order statistics)을 뜻합니다.
층별 노이즈(Per-layer noise). 각 특징 맵에 단일 채널 가우시안 노이즈(single-channel Gaussian noise)를 더하고, 학습된 채널별 계수(learned per-channel factor)로 크기를 조절합니다. 전역 구조(global structure)는 바꾸지 않으면서 확률적 디테일만 제어합니다.
절단 요령(Truncation trick). 추론(inference) 단계에서 z를 표본(sample)으로 뽑고 w = mapping(z)를 계산한 뒤, w' = ŵ + ψ·(w - ŵ)를 사용합니다. 여기서 ŵ는 많은 표본에서 구한 w의 평균(mean)입니다. ψ < 1이면 다양성(diversity)을 줄이는 대신 품질(quality)을 끌어올립니다. 거의 모든 StyleGAN 데모가 ψ ≈ 0.7 부근을 사용합니다.
StyleGAN 1 → 2 → 3
버전
연도
핵심 혁신
StyleGAN
2019
매핑 네트워크 + AdaIN + 노이즈 + 점진적 성장(progressive growing).
StyleGAN2
2020
가중치 복조(weight demodulation)로 AdaIN을 대체해 물방울 아티팩트(droplet artifact)를 해결. 스킵/잔차(skip/residual) 구조와 경로 길이 정규화(path-length regularization) 도입.
StyleGAN3
2021
앨리어싱 없는 합성곱(alias-free convolution)과 등변(equivariant) 커널로 텍스처 고착(texture sticking) 제거.
StyleGAN-XL
2022
클래스 조건부(class-conditional), 1024², ImageNet.
R3GAN
2024
더 강한 정규화로 FFHQ-1024에서 디퓨전(diffusion)과의 격차를 좁힌, 20배 적은 파라미터의 현대적 미니멀 GAN 레시피.
2026년 현재 StyleGAN3는 (a) 좁은 도메인(narrow-domain)에서 높은 FPS의 포토리얼리즘이 필요한 경우, (b) 100장 수준의 적은 데이터로 미세 조정하는 퓨샷 도메인 적응(few-shot domain adaptation, 매핑 네트워크는 동결), (c) 실제 사진을 재구성하는 w를 찾아 편집하는 역변환 기반 편집(inversion-based editing)에서 기본 선택지로 남아 있습니다. 개방형 도메인(open-domain)의 텍스트→이미지(text-to-image)에는 적합하지 않습니다. 그 영역은 디퓨전이 담당합니다.
직접 만들기
code/main.py는 1차원(1-D) 토이 "style-GAN lite"를 구현합니다. 매핑 MLP, 학습된 상수 벡터를 받아 w에서 유도한 스케일·바이어스로 변조(modulation)하는 합성 함수, 그리고 층별 노이즈로 구성됩니다. w를 아핀 변조로 주입하는 방식이, 생성기 입력에 z를 단순히 결합(concatenate)하는 방식과 같거나 더 낫다는 점을 보여줍니다.
Step 1: 매핑 네트워크
defmapping(z, M):
h = z
for i inrange(num_layers):
h = leaky_relu(add(matmul(M[f"W{i}"], h), M[f"b{i}"]))
return h
Step 2: 적응적 인스턴스 정규화(AdaIN)
defadain(x, w_scale, w_bias):
mu = mean(x)
sd = std(x)
x_norm = [(xi - mu) / (sd + 1e-8) for xi in x]
return [w_scale * xi + w_bias for xi in x_norm]
각 특징 맵의 스케일과 바이어스는 w의 선형 사영(linear projection)에서 나옵니다.
Step 3: 층별 노이즈
defadd_noise(x, sigma, rng):
return [xi + sigma * rng.gauss(0, 1) for xi in x]
sigma는 채널별로 학습 가능(learnable)합니다.
흔히 빠지는 함정(Pitfalls)
물방울 아티팩트(Droplet artifacts). StyleGAN 1에서는 AdaIN이 평균을 0으로 만들기 때문에 특징 맵에 둥근 물방울 모양의 아티팩트가 생겼습니다. StyleGAN 2의 가중치 복조(weight demodulation)는 활성값(activation) 대신 합성곱 가중치(weight)를 스케일해 이 문제를 해결합니다.
텍스처 고착(Texture sticking). StyleGAN 1·2에서는 텍스처가 객체 좌표(object coordinate)가 아니라 픽셀 좌표(pixel coordinate)를 따라갔습니다. 보간(interpolation)할 때 특히 잘 보입니다. StyleGAN 3의 앨리어싱 없는 합성곱은 윈도잉된 sinc 필터(windowed sinc filter)로 이를 고칩니다.
역변환은 손실이 있다(Inversion is lossy). 실제 사진을 W로 역변환하는 작업은 보통 최적화(optimization)나 인코더(e4e, ReStyle, HyperStyle)를 통해 이루어집니다. 반복(iteration)이 많아질수록 결과가 점차 어긋(drift)납니다.
상용 수준(product-grade) 데모에서 정답이 "사람 얼굴 사진"이라면, StyleGAN은 같은 품질 기준에서 디퓨전보다 추론 비용(단일 순방향 패스, 4090 기준 10ms 미만)과 선명도(sharpness) 모두에서 유리합니다.
산출물 만들기
outputs/skill-stylegan-inversion.md를 봅니다. 이 스킬(skill)은 실제 사진을 받아 다음을 출력합니다. 역변환 방법(e4e / ReStyle / HyperStyle), 예상 잠재 손실(expected latent loss), 편집 예산(editing budget; 아티팩트가 생기기 전까지 W에서 얼마나 움직일 수 있는지), 그리고 알려진 좋은 편집 방향들(나이, 표정, 자세)의 목록입니다.
연습문제
쉬움.code/main.py를 adain_on=True와 adain_on=False로 각각 실행합니다. 잠재값을 고정했을 때와 흔들었을 때의 출력 분포가 어떻게 달라지는지 비교합니다.
중간. 믹싱 정규화(mixing regularization)를 구현합니다. 학습 배치에서 w_a, w_b를 만들고, 합성의 앞 절반에는 w_a를, 뒤 절반에는 w_b를 적용합니다. 디코더가 분리된(disentangled) 스타일을 학습하는지 확인합니다.
어려움. 사전 학습된 StyleGAN3 FFHQ 모델(ffhq-1024.pkl)을 가져옵니다. 레이블이 달린 표본에 SVM을 학습시켜 "미소(smile)"를 제어하는 w 방향을 찾고, 정체성이 어긋나기 전까지 얼마나 멀리 밀어붙일 수 있는지 보고합니다.
핵심 용어
용어
흔한 설명
실제 의미
매핑 네트워크(Mapping network)
"그냥 MLP"
f: Z → W, 8개 층. 잠재 공간의 기하 구조를 데이터 통계와 분리한다.
W 공간(W space)
"스타일 공간(The style space)"
매핑 네트워크의 출력. 비교적 분리된(disentangled) 표현이다.
AdaIN
"적응적 인스턴스 정규화(Adaptive instance norm)"
특징 맵을 정규화한 뒤 w의 사영(projection)으로 스케일·시프트를 적용한다.
절단 요령(Truncation trick)
"프시(Psi)"
w = mean + ψ·(w - mean). ψ<1이면 다양성과 품질을 맞바꾼다.
경로 길이 정규화(Path-length regularization)
"PL reg"
w의 단위 변화당 이미지가 크게 변하는 것을 벌점으로 막아 W를 더 매끄럽게 만든다.
가중치 복조(Weight demodulation)
"StyleGAN2의 해법"
활성값이 아니라 합성곱 가중치를 정규화해 물방울 아티팩트를 제거한다.
앨리어싱 없음(Alias-free)
"StyleGAN3의 비법"
윈도잉된 sinc 필터로 텍스처가 픽셀 격자에 들러붙는 현상을 제거한다.
역변환(Inversion)
"실제 이미지의 w 찾기"
G(w) ≈ x가 되도록 x → w를 최적화하거나 인코딩한다.
운영 노트: 2026년에도 StyleGAN이 여전히 배포되는 이유
StyleGAN3는 4090 GPU에서 1024² FFHQ 얼굴을 10ms 미만에 생성합니다. num_steps = 1이고, VAE 디코드(decode)도 교차 어텐션(cross-attention) 패스도 없습니다. 운영(production) 관점에서 이는 어떤 이미지 생성기든 도달할 수 있는 지연(latency)의 사실상 바닥값입니다. 같은 해상도의 50스텝 SDXL + VAE 디코드 파이프라인은 약 3초가 걸립니다. 약 300배 차이이며, 아바타 서비스, 신분증 문서 파이프라인, 스톡 얼굴 생성 같은 좁은 도메인 제품에서는 총소유비용(TCO) 면에서 이깁니다.
운영상의 결과는 두 가지로 정리됩니다.
스케줄러(scheduler)도 배처(batcher)도 필요 없습니다. 모든 요청이 같은 양의 FLOPs를 사용하므로, 목표 점유율(target occupancy)에 맞춘 정적 배치(static batch)가 최적입니다. LLM과 디퓨전에는 필수인 연속 배칭(continuous batching)이 여기서는 전혀 이득이 없습니다.
절단 ψ가 안전 다이얼(safety knob)입니다.ψ < 0.7은 매핑 네트워크 범위 중에서도 좁은 원뿔에서 표본을 뽑게 만듭니다. 서빙 레이어(serving layer)가 표본 분산을 조절할 수 있는 사실상 유일한 손잡이입니다. 부하가 몰릴 때는 ψ를 낮추고, 프리미엄 사용자에게는 높일 수 있습니다.