← Todo el material
Curso Intermedio 23 de agosto de 2026

Generación de imágenes — Módulo 6: GANs — el duelo entre generador y discriminador

Sexto módulo del curso de generación de imágenes: las GANs, dos redes que compiten en un juego adversarial. Cómo entrena un generador contra un discriminador, qué es el mode collapse, DCGAN y StyleGAN, y por qué la difusión terminó desplazándolas.

☰ Índice del contenido

En el Módulo 5 el VAE logró generar imágenes nuevas, pero pagó un precio: salían borrosas, porque su pérdida premia el promedio y el promedio de muchos bordes nítidos es un borde suave. Hoy vemos la idea que atacó ese problema de frente y dominó la generación de imágenes durante casi una década: las GANs. En vez de pedirle a una red que se parezca a las fotos, le ponemos un rival cuyo único trabajo es cazar imágenes falsas — y la obligamos a mejorar hasta engañarlo.

La tesis del módulo

La calidad nace de la competencia. Una GAN no aprende comparando píxel a píxel con un objetivo; aprende tratando de engañar a un crítico que también está aprendiendo. Esa carrera armamentística entre falsificador y detective produce imágenes nítidas — cuando no se descarrila por el camino.

Dos redes, un juego

Una GAN (Generative Adversarial Network: red generativa adversarial — dos redes que compiten entre sí) tiene dos jugadores con objetivos opuestos:

  • El generador (la red que fabrica imágenes falsas): recibe ruido al azar y produce una imagen. Es el falsificador. Su meta es que sus falsificaciones pasen por reales.
  • El discriminador (la red que juzga si una imagen es real o falsa): recibe una imagen —a veces real del dataset, a veces falsa del generador— y suelta un número: probabilidad de que sea real. Es el detective.

La analogía clásica: un falsificador de billetes y un policía. Al principio el falsificador es pésimo y el policía lo descubre todo. Pero cada vez que lo atrapan, el falsificador aprende qué lo delató y mejora. El policía, a su vez, afina el ojo. Ronda tras ronda, los billetes falsos se vuelven tan buenos que el policía ya no puede distinguirlos — y ese es exactamente el momento en que la GAN generó imágenes fotorrealistas.

   START: ruido al azar
        │
        ▼
  ┌───────────┐   imagen    ┌───────────────┐
  │ GENERADOR │   falsa     │ DISCRIMINADOR │
  │(falsifica)│ ─────────►  │  (detective)  │
  └───────────┘             └───────┬───────┘
        ▲                           │
        │   imágenes reales ─────►  │
        │   (dataset)               ▼
        │                    ¿real o falsa?
        │                           │
        └───────────────────────────┘
          señal: "así te pillé, mejora"

El discriminador se entrena para acertar; el generador se entrena para hacerlo fallar. Es un juego de suma cero: lo que uno gana, el otro lo pierde. A esto se le llama entrenamiento adversarial.

El loop de entrenamiento

Cada paso alterna: primero mejora un poco al detective, luego mejora un poco al falsificador. Este pseudocódigo en PyTorch es correcto y muestra la lógica esencial.

import torch
import torch.nn as nn

criterio = nn.BCELoss()   # ¿acertó real (1) vs falsa (0)?
opt_g = torch.optim.Adam(generador.parameters(),     lr=2e-4)
opt_d = torch.optim.Adam(discriminador.parameters(), lr=2e-4)

for reales, _ in loader:              # imágenes reales del dataset
    B = reales.size(0)
    unos  = torch.ones(B, 1)          # etiqueta "real"
    ceros = torch.zeros(B, 1)         # etiqueta "falsa"

    # ---- 1) Entrenar el DISCRIMINADOR ----
    ruido  = torch.randn(B, 100)      # semilla al azar
    falsas = generador(ruido).detach()  # detach: no tocar el generador aquí
    perdida_d = criterio(discriminador(reales), unos) \
              + criterio(discriminador(falsas), ceros)
    opt_d.zero_grad(); perdida_d.backward(); opt_d.step()

    # ---- 2) Entrenar el GENERADOR ----
    ruido  = torch.randn(B, 100)
    falsas = generador(ruido)
    # el generador GANA si el discriminador cree que son reales (unos)
    perdida_g = criterio(discriminador(falsas), unos)
    opt_g.zero_grad(); perdida_g.backward(); opt_g.step()

La clave está en la última pérdida: el generador se entrena para que el discriminador diga “real” (unos) ante sus falsificaciones. No hay ninguna imagen objetivo píxel a píxel — por eso no promedia, y por eso las salidas son nítidas.

El lado oscuro: por qué las GANs son difíciles

Esa competencia elegante tiene fama de infierno de entrenar. Los dos problemas clásicos:

  • Inestabilidad. Los dos jugadores se mueven a la vez. Si el discriminador se vuelve demasiado bueno demasiado rápido, aplasta al generador: lo atrapa siempre, la señal de mejora se apaga y el generador deja de aprender. El equilibrio es frágil y se rompe con nada.
  • Mode collapse (colapso de modos — cuando el generador se atasca produciendo siempre lo mismo). El generador descubre una imagen que engaña al discriminador y decide fabricar solo esa, o pequeñas variantes. Técnicamente “gana” el juego, pero pierde toda la diversidad: le pides caras y te da la misma cara mil veces. Es la trampa más común de las GANs.
   sano: el generador cubre todo el dataset
   [ 0 1 2 3 4 5 6 7 8 9 ]  ──►  variedad real

   mode collapse: se atasca en unos pocos modos
   [ . . 3 . . . 3 . 3 . ]  ──►  siempre "3"

Ojo: una pérdida que baja no garantiza que la GAN vaya bien. Como los dos jugadores compiten, las curvas de pérdida suben y bajan sin decir gran cosa. La única forma honesta de saber si mejora es mirar las imágenes que produce.

DCGAN y StyleGAN: de manchas a fotorrealismo

La primera GAN (2014) usaba capas densas y generaba miniaturas borrosas. Dos saltos la volvieron seria:

  • DCGAN (Deep Convolutional GAN): metió las convoluciones del Módulo 2 dentro de ambas redes. El discriminador es una CNN clasificadora normal; el generador es una CNN “al revés” que va agrandando (convoluciones traspuestas) del ruido a la imagen. Esto estabilizó el entrenamiento y subió la resolución.
  • StyleGAN (NVIDIA): el pico de la era GAN. Introdujo control por “estilos” en cada nivel de detalle y generó caras humanas fotorrealistas que no existen — el famoso sitio thispersondoesnotexist. Durante años, fue lo mejor que había en generación de imágenes.

GAN vs VAE

VAEGAN
Calidad de imagenborrosa (promedia)nítida (compite)
Diversidadalta (cubre bien el dataset)frágil (riesgo de mode collapse)
Estabilidad de entrenamientoestable y predecibledifícil, se descarrila
Cómo aprendereconstrucción + KLjuego adversarial
Latente interpretablesí, ordenadomenos directo
Genera muestreando ruidosísí

Resumido: el VAE es estable y diverso pero borroso; la GAN es nítida pero inestable y propensa a colapsar. Cada uno gana en lo que el otro pierde.

Errores comunes

  • Creer que el discriminador se usa al final. No: una vez entrenada la GAN, el discriminador se descarta. Solo querías el generador; el detective fue el andamio para construirlo.
  • Perseguir una pérdida que baje. En GANs las pérdidas no son un termómetro de calidad. Juzga por las imágenes, no por los números.
  • Confundir mode collapse con “el modelo aprendió”. Si tus muestras son casi idénticas entre sí, no ganaste: colapsó. Diversidad y calidad son cosas distintas.
  • Entrenar un jugador mucho más que el otro. Si el discriminador aplasta al generador (o viceversa), el juego muere. El arte de las GANs es mantener el equilibrio.

Por qué la difusión las terminó desplazando

Las GANs reinaron, pero hoy casi todos los generadores de punta (Stable Diffusion, FLUX, Midjourney, Imagen) son de difusión, no GANs. La razón es justo lo que acabas de leer:

  • Estabilidad. La difusión (Módulo 8) entrena con un objetivo simple y estable —predecir ruido— sin el frágil equilibrio de dos redes peleando. Entrenas y funciona, sin la brujería de balancear jugadores.
  • Diversidad. La difusión no sufre mode collapse: cubre naturalmente toda la variedad del dataset. Le pides mil caras y te da mil caras distintas.

La GAN demostró que la competencia produce nitidez; la difusión consiguió la misma nitidez —y más diversidad— por un camino mucho más manejable. Pero antes de llegar ahí falta una pieza de eficiencia: hacer todo esto sin generar en el carísimo espacio de píxeles.

La frase para llevarse

“La GAN es un falsificador entrenado por su propio policía: mientras el detective mejora, el falsificador se ve obligado a ser genial. El problema es que ese duelo es tan frágil como brillante.”

Qué viene

Módulo 7: del pixel-space al latent-space. Antes de meternos en difusión, un módulo corto pero clave: por qué generar directo sobre los píxeles es prohibitivamente caro, y cómo reutilizar el VAE del Módulo 5 para hacer toda la generación en un espacio latente chico. Es el truco de eficiencia que hace posible Stable Diffusion.

Material relacionado

Generación de imágenesGANDCGANStyleGANAprendizaje adversarial

Preguntas sobre este curso

Regístrate gratis para hacer preguntas y guardar tu progreso.

✉ Entérate de lo nuevo

Recibe un aviso cuando publique nuevos cursos, workshops o investigaciones. Sin spam.