Phase 08 - Lesson 05
StyleGAN
La mayoría de los generadores mezclan
zen todas las capas al mismo tiempo. StyleGAN lo separó: primero mapeaza unwintermedio, luego inyectawen cada nivel de resolución a través de AdaIN. Ese único cambio desenredó el espacio latente e hizo que los rostros fotorrealistas fueran un problema resuelto durante siete años consecutivos.
Tipo: Build Idiomas: Python Prerrequisitos: Phase 8 · 03 (GANs), Phase 4 · 08 (Normalization), Phase 3 · 07 (CNNs) Tiempo: ~45 minutos
El Problema
Una DCGAN mapea z a una imagen a través de una pila de convoluções transpuestas. El problema: z controla todo (pose, iluminación, identidad, fondo) de manera entrelazada. Si te mueves a lo largo de un eje de z, los cuatro cambian. No puedes pedirle al modelo "la misma persona, diferente pose" porque la representación no se descompone de esa manera.
Karras et al. (2019, NVIDIA) propusieron: dejar de introducir z directamente en las capas convolucionales. Alimentar un tensor constante de 4×4×512 como entrada de la red. Entrenar un MLP de 8 capas que mapea z ∈ Z → w ∈ W. Inyectar w en cada resolución a través de normalización de instancia adaptativa (AdaIN): normalizar cada mapa de características convolucionales, luego escalar y desplazar mediante proyecciones afines de w. Agregar ruido por capa para detalles estocásticos (poros de la piel, hebras de cabello).
El resultado: W tiene ejes aproximadamente ortogonales para "estilo de alto nivel" (pose, identidad) frente a "estilo fino" (iluminación, color). Puedes intercambiar estilos entre dos imágenes usando el w de la imagen A para los niveles de baja resolución y el w de la imagen B para los de alta resolución. Esto abrió las puertas a la edición, la estilización entre dominios y a toda la línea de investigación de "inversión de StyleGAN" (StyleGAN-inversion).
El Concepto
Red de mapeo. f: Z → W, un MLP de 8 capas. Z = N(0, I)^512. W no está forzado a ser gaussiano; aprende una forma adaptada a los datos.
Red de síntesis. Comienza desde una constante aprendida de 4×4×512. Cada bloque de resolución: upsample → conv → AdaIN(w_i) → noise → conv → AdaIN(w_i) → noise. Las resoluciones se duplican: 4, 8, 16, 32, 64, 128, 256, 512, 1024.
AdaIN.
AdaIN(x, y) = y_scale · (x - mean(x)) / std(x) + y_bias
donde y_scale y y_bias provienen de proyecciones afines de w. Normaliza por mapa de características y luego reestiliza. El "estilo" aquí son las estadísticas de primer y segundo orden del mapa de características.
Ruido por capa. Ruido gaussiano de un solo canal agregado a cada mapa de características, escalado por un factor aprendido por canal. Controla el detalle estocástico sin afectar la estructura global.
Truque de truncamiento. En la inferencia, se muestrea z, se calcula w = mapping(z), luego w' = ŵ + ψ·(w - ŵ) donde ŵ es el w promedio de muchas muestras. ψ < 1 intercambia diversidad por calidad. Casi todas las demostraciones de StyleGAN usan ψ ≈ 0.7.
StyleGAN 1 → 2 → 3
| Versión | Año | Innovación |
|---|---|---|
| StyleGAN | 2019 | Red de mapeo + AdaIN + ruido + crecimiento progresivo (progressive growing). |
| StyleGAN2 | 2020 | La desmodulación de pesos (weight demodulation) reemplaza a AdaIN (corrige artefactos de gotas); arquitectura de tipo skip/residual; regularización de longitud de trayectoria (path-length regularization). |
| StyleGAN3 | 2021 | Convolución libre de aliasing (alias-free) + kernels equivariantes; elimina el efecto de textura pegada a la cuadrícula de píxeles (texture sticking). |
| StyleGAN-XL | 2022 | Condicionado por clase (class-conditional), 1024², ImageNet. |
| R3GAN | 2024 | Renovación de marca (rebranding) con regularización más fuerte; cierra la brecha con la difusión en FFHQ-1024 con 20 veces menos parámetros. |
En 2026, StyleGAN3 sigue siendo la opción predeterminada para (a) fotorrealismo de dominio estrecho a altos FPS, (b) adaptación de dominio de pocos ejemplos o few-shot (entrenar en un nuevo conjunto de datos con 100 imágenes, congelando el mapeo), (c) edición basada en inversión (encontrar el w que reconstruye una foto real y luego editar ese w). Para la generación de texto a imagen en dominios abiertos, esta no es la herramienta; la difusión lo es.
Build It
El archivo code/main.py implementa un "style-GAN lite" de juguete en 1-D: un MLP de mapeo, una función de síntesis que toma un vector constante aprendido y lo modula con escala/sesgo derivados de w, y ruido por capa. Muestra que inyectar w a través de modulación afín iguala o supera la concatenación de z en la entrada del generador.
Paso 1: red de mapeo
def mapping(z, M):
h = z
for i in range(num_layers):
h = leaky_relu(add(matmul(M[f"W{i}"], h), M[f"b{i}"]))
return h
Paso 2: normalización de instancia adaptativa
def adain(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]
La escala y el sesgo por mapa de características provienen de w a través de una proyección lineal.
Paso 3: ruido por capa
def add_noise(x, sigma, rng):
return [xi + sigma * rng.gauss(0, 1) for xi in x]
El sigma por canal es aprendible.
Pitfalls
- Artefactos de gotas (droplet artifacts). StyleGAN 1 producía una gota amorfa en los mapas de características porque AdaIN anulaba la media. La desmodulación de pesos (weight demodulation) de StyleGAN 2 corrige esto escalando los pesos de convolución en lugar de las activaciones.
- Textura pegada (texture sticking). Las texturas de StyleGAN 1 y 2 seguían las coordenadas de los píxeles, no las coordenadas del objeto (visible al interpolar). Las convoluciones libres de aliasing (alias-free) de StyleGAN 3 corrigen esto con filtros sinc con ventana (windowed sinc filters).
- Cobertura de modo (mode coverage). El truncamiento
ψ < 0.7se ve limpio pero toma muestras de un cono estrecho; usaψ = 1.0si necesitas diversidad. - La inversión tiene pérdidas (lossy). La inversión de una foto real a
Wgeneralmente se realiza mediante optimización o un codificador (e4e, ReStyle, HyperStyle). Los resultados se desvían a lo largo de muchas iteraciones.
Use It
| Caso de uso | Enfoque |
|---|---|
| Rostros humanos fotorrealistas (anime, producto, dominio estrecho) | StyleGAN3 FFHQ / ajuste fino (fine-tune) personalizado |
| Edición de rostros a partir de una foto | inversión e4e + direcciones de StyleSpace / InterFaceGAN |
| Intercambio de rostros (face swap) / recreación | StyleGAN + codificador + mezcla (blending) |
| Pipelines de avatar | StyleGAN3 con ADA para ajuste fino con pocos datos |
| Adaptación de dominio a partir de unas pocas imágenes | Congelar la red de mapeo, ajustar la síntesis |
| Generación multimodal o condicionada por texto | No lo uses; prefiere la difusión |
Para demostraciones a nivel de producto donde la respuesta es "foto del rostro de una persona", StyleGAN supera a la difusión en costo de inferencia (una sola pasada directa, <10ms en una 4090) y nitidez para el mismo nivel de calidad.
Ship It
Guarda outputs/skill-stylegan-inversion.md. La Skill toma una foto real y produce: método de inversión (e4e / ReStyle / HyperStyle), pérdida latente esperada, presupuesto de edición (qué tan lejos en W te puedes mover antes de que aparezcan artefactos) y una lista de direcciones de edición que se sabe que funcionan (edad, expresión, pose).
Exercises
- Fácil. Ejecuta
code/main.pyconadain_on=Trueyadain_on=False. Compara la dispersión de las salidas para un espacio latente fijo frente a uno perturbado. - Medio. Implementa la regularización de mezcla (mixing regularization): para un lote de entrenamiento, calcula
w_a,w_by aplicaw_apara la primera mitad de la síntesis yw_bpara la segunda mitad. ¿Aprende el decodificador estilos desenredados? - Difícil. Toma un modelo StyleGAN3 FFHQ preentrenado (ffhq-1024.pkl). Encuentra la dirección de
wque controla la "sonrisa" entrenando una SVM en muestras etiquetadas; reporta qué tan lejos puedes empujarla antes de que la identidad comience a desvanecerse (drift).
Key Terms
| Término | Lo que dice la gente | Lo que realmente significa |
|---|---|---|
| Red de mapeo | "El MLP" | f: Z → W, 8 capas, desacopla la geometría latente de las estadísticas de los datos. |
| Espacio W | "El espacio de estilo" | Salida de la red de mapeo; aproximadamente desenredado. |
| AdaIN | "Normalización de instancia adaptativa" | Normaliza el mapa de características, luego escala y desplaza según la proyección de w. |
| Truco de truncamiento | "Psi" | w = mean + ψ·(w - mean), ψ<1 intercambia diversidad por calidad. |
| Regularización de longitud de trayectoria | "Reg PL" | Penaliza cambios grandes en la imagen por unidad de cambio en w; hace que W sea más suave. |
| Desmodulación de pesos | "La solución de StyleGAN2" | Normaliza los pesos de la convolución en lugar de las activaciones; elimina los artefactos de gotas. |
| Libre de aliasing (Alias-free) | "El truco de StyleGAN3" | Filtros sinc con ventana; elimina la textura pegada a la cuadrícula de píxeles. |
| Inversión | "Encontrar w para una imagen real" | Optimiza o codifica x → w de modo que G(w) ≈ x. |
Nota de producción: por que StyleGAN todavía se implementa en 2026
StyleGAN3 en una 4090 genera un rostro FFHQ de 1024² en menos de 10 ms — num_steps = 1, sin decodificación VAE, sin pase de atención cruzada (cross-attention). En términos de producción, esta es la latencia mínima para cualquier generador de imágenes. Un pipeline de SDXL de 50 pasos + decodificación VAE a la misma resolución es de aproximadamente 3 segundos. Esa es una brecha de 300×, y para productos de dominio estrecho (servicios de avatar, pipelines de documentos de identidad, generación de rostos para bancos de imágenes) gana en costo total de propiedad (TCO).
Dos consecuencias operativas:
- Sin scheduler, sin batcher. El lote estático (static batch) en la ocupación objetivo es óptimo. El loteo continuo (continuous batching, esencial para LLM y difusión) ofrece cero beneficios porque cada solicitud consume los mismos FLOPs.
- El truncamiento
ψes la perilla de seguridad.ψ < 0.7toma muestras de un cono estrecho del rango de la red de mapeo. Esta es la única palanca que tiene la capa de servicio sobre la varianza de la muestra. Reduceψen carga pico y auméntalo para usuarios premium.
Lectura Adicional
- Karras et al. (2019). A Style-Based Generator Architecture for GANs — StyleGAN.
- Karras et al. (2020). Analyzing and Improving the Image Quality of StyleGAN — StyleGAN2.
- Karras et al. (2021). Alias-Free Generative Adversarial Networks — StyleGAN3.
- Tov et al. (2021). Designing an Encoder for StyleGAN Image Manipulation — inversión e4e.
- Sauer et al. (2022). StyleGAN-XL: Scaling StyleGAN to Large Diverse Datasets — StyleGAN-XL.
- Huang et al. (2024). R3GAN: The GAN is dead; long live the GAN! — receta moderna y minimalista de GAN.