Redes generativas adversarias (GAN): el falsificador contra el detective
El juego del generador y el discriminador, una GAN escrita desde cero, la pérdida no saturante, ocho grupos en una circunferencia y el colapso de modos, dígitos más nítidos que con el VAE, pero no todos, y el camino de las GAN a los modelos de difusión.
Serie Fundamentos de IA Parte 45 de 52
- Mapa de la inteligencia artificial: qué es cada cosa y cómo encaja todo
- Breve historia de la inteligencia artificial: de Turing a los modelos de lenguaje
- Datos, modelo, entrenamiento, inferencia: los conceptos básicos en un solo ejemplo
- Cómo leer la notación matemática: símbolos, subíndices, sumatorios y cuantificadores
- Conjuntos y relaciones: las piezas con las que se construyen las definiciones en IA
- Funciones y aplicaciones: por qué todo modelo de IA es una función
- Lógica y demostraciones: las reglas con las que se razona en IA
- Grafos y árboles: la estructura sobre la que se apoyan la búsqueda y las redes neuronales
- Álgebra lineal para aprendizaje automático: vectores, matrices y por qué la IA sobre todo multiplica
- Derivadas, gradiente y regla de la cadena: cómo sabe un modelo en qué dirección aprender
- Descenso de gradiente: cómo aprende un modelo
- Qué es la probabilidad: del lanzamiento de un dado a los axiomas de Kolmogórov
- Probabilidad condicionada y teorema de Bayes: cómo cambiar una estimación cuando te enteras de algo nuevo
- Variable aleatoria y función de distribución: una sola función que lo dice todo sobre la distribución
- Función de densidad y función de probabilidad: por qué una variable continua tiene probabilidad cero en cada punto
- Esperanza, varianza y covarianza: dónde está una distribución, qué anchura tiene y qué se relaciona con qué
- Resumen de las distribuciones de probabilidad: Bernoulli, binomial, Poisson, uniforme, normal y exponencial
- Ley de los grandes números y teorema central del límite: por qué las medias se comportan de forma tan predecible
- Estadística y estimación de parámetros: máxima verosimilitud, MAP e intervalos de confianza
- Teoría de la información: entropía, entropía cruzada y divergencia KL, el origen de las funciones de pérdida
- Búsqueda en el espacio de estados: BFS, DFS, UCS y A* con animaciones
- Juegos y adversarios: minimax, poda alfa-beta y Monte Carlo tree search
- Satisfacción de restricciones: backtracking, propagación de restricciones y AC-3 con un sudoku y un mapa de regiones checas
- Lógica y sistemas basados en conocimiento: encadenamiento hacia delante y hacia atrás, resolución y sistemas expertos
- Planificación: STRIPS, el mundo de bloques, heurísticas a partir de la relajación y la planificación en los agentes de IA
- Búsqueda local y recocido simulado: un viajante por las capitales regionales checas
- Algoritmos genéticos: población, cruce, mutación y selección en una mochila para la excursión
- Estrategias evolutivas y programación genética: de la regla de un quinto a la ley de Kepler
- Optimización por colonia de hormigas: cómo un rastro de feromona encuentra un camino corto
- Optimización por enjambre de partículas: inercia, experiencia propia y experiencia del enjambre
- Neuroevolución: evolución de los pesos y la forma de las redes neuronales, y el algoritmo NEAT
- Conjuntos difusos y funciones de pertenencia: cómo escribir «algo cálido»
- Lógica difusa y probabilidad: por qué «algo cálido» no significa «probablemente cálido»
- Lógica difusa: t-normas, implicaciones y reglas SI–ENTONCES
- Control difuso: Mamdani y Sugeno, del ventilador al péndulo invertido sobre un carro
- Agrupamiento difuso: el algoritmo fuzzy c-means y los puntos entre clusters
- Sistemas neuro-difusos (ANFIS): reglas difusas que aprenden de los datos
- Cadenas de Markov: matriz de transición, distribución estacionaria y PageRank
- Modelos ocultos de Márkov: el algoritmo de Viterbi y el casino deshonesto
- Redes bayesianas: por qué está mojada la hierba y qué significa eso para el aspersor
- El filtro de Kalman: cómo estimar a partir de mediciones imprecisas dónde está un coche y a qué velocidad va
- Tipos de aprendizaje automático: supervisado, no supervisado, semisupervisado y más
- Prompts, contexto y RAG: cómo darle a un modelo la información correcta
- Autocodificadores variacionales (VAE): imágenes nuevas a partir de un espacio latente continuo
- Redes generativas adversarias (GAN): el falsificador contra el detective
- Modelos de difusión: cómo el ruido puro se convierte en una imagen
- Procesos de decisión de Markov: estados, acciones, recompensas y ecuaciones de Bellman
- Q-learning y DQN: aprender el valor de las acciones, de la tabla a la red neuronal
- Gradiente de la política y PPO: aprender directamente la política
- Cómo funciona un agente de IA: un modelo de lenguaje en un bucle con herramientas
- Programación con agentes de IA: encargo, pruebas y revisión
- Evaluación y seguridad de los sistemas de IA: cómo medir y cómo vigilar
Temario completo de la serie 52 de 83 temas publicados
- Cómo el generador aprende solo del gradiente del discriminador.
- Por qué el aprendizaje de las GAN es inestable y qué es el colapso de modos.
- En qué gana la GAN al VAE, en qué pierde y por qué hoy la ha sustituido la difusión.
Conviene conocer antes: Autocodificadores variacionales (VAE): imágenes nuevas a partir de un espacio latente continuo, Juegos y adversarios: minimax, poda alfa-beta y Monte Carlo tree search
El autocodificador variacional de la parte anterior genera con honradez, pero borroso. En 2014, Ian Goodfellow tuvo una idea que parece casi un truco: no mediremos cuánto se aleja una muestra de los datos, sino que dejaremos que lo juzgue otra red. Dos redes juegan una partida —una falsifica, la otra detecta la falsificación— y ambas mejoran por el camino. Así nacieron las primeras caras generadas por máquina que no distinguirías de una foto. En esta parte escribiremos las dos redes desde cero y veremos por qué su aprendizaje es tan caprichoso.
Se apoya en las partes Autocodificadores variacionales, Regresión logística (la sigmoide y la entropía cruzada) y Juegos y adversarios.
1. El falsificador y el detective
Definición — red generativa adversaria (GAN)
Una GAN (Ian Goodfellow et al., 2014) está formada por dos redes. El generador G transforma un ruido aleatorio z ~ N(0, I) en una muestra G(z). El discriminador D devuelve la probabilidad D(x) de que x provenga de los datos reales. Juegan un juego de dos jugadores de suma cero:
minG maxD Ex ~ data[log D(x)] + Ez[log(1 − D(G(z)))].
Para un G fijo, el mejor discriminador es D*(x) = pdata(x) / (pdata(x) + pG(x)). En el equilibrio, G genera exactamente la distribución de los datos y D devuelve ½ en todas partes.
El falsificador imprime billetes y el detective los clasifica en auténticos y falsos. El detective aprende de sus errores. El falsificador nunca ha visto un billete auténtico: solo aprende de lo que lo delató ante el detective. Mientras ambos mejoran, las falsificaciones son cada vez mejores. Fin del juego: el detective solo puede adivinar, y acierta la mitad de las veces.
minG maxD Ex ~ data[ log D(x) ] + Ez ~ N(0, I)[ log(1 − D(G(z))) ]
- Ex ~ data[log D(x)]
- el discriminador sobre los datos reales: es máximo (0) cuando D da 1 a las muestras auténticas; el logaritmo castiga sin límite un error cometido con seguridad (D → 0)
- Ez[log(1 − D(G(z)))]
- el discriminador sobre las falsificaciones: es máximo cuando les da 0; es el único término en el que aparece G, así que el generador aprende solo de él
- maxD
- el discriminador aumenta el valor: los dos términos juntos son la entropía cruzada binaria con signo negativo, así que se trata del aprendizaje corriente de un clasificador «auténtico / falsificación»
- minG
- el generador disminuye el valor: quiere que el discriminador se equivoque con las falsificaciones; lo que gana un jugador lo pierde el otro (suma cero)
Teorema — el mejor discriminador y lo que minimiza el generador
Para un G fijo, el valor del juego es ∫ [pdata(x) log D(x) + pG(x) log(1 − D(x))] dx. En cada punto x maximizamos la función a log y + b log(1 − y) para y ∈ (0, 1), donde a = pdata(x), b = pG(x).
Demostración. La derivada a/y − b/(1 − y) se anula en y = a/(a + b) y la función es cóncava (segunda derivada −a/y² − b/(1 − y)² < 0), así que se trata de un máximo. De ahí D*(x) = pdata(x) / (pdata(x) + pG(x)). Sustituyendo y simplificando (Goodfellow et al., 2014):
V(D*, G) = −log 4 + 2 · JSD(pdata ‖ pG), JSD(p ‖ q) = ½ KL(p ‖ m) + ½ KL(q ‖ m), m = ½(p + q).
La divergencia de Jensen-Shannon es no negativa y vale cero exactamente cuando pG = pdata. Por tanto, con el mejor discriminador el generador minimiza la JSD, y el mínimo −log 4 ≈ −1,386 se alcanza cuando genera exactamente los datos. ∎
Ejemplo: donde la densidad de los datos es 0,3 y la de las falsificaciones 0,1, D* = 0,3 / 0,4 = 0,75 (el punto es más bien auténtico); donde el generador se pasa (datos 0,1, falsificaciones 0,3), D* = 0,25. Donde las densidades coinciden, D* = ½ y la pérdida del discriminador (entropía cruzada binaria por muestra) es ln 2 ≈ 0,693.
El discriminador es un clasificador corriente con sigmoide y entropía cruzada, como la regresión logística, solo que con capas de más. La magia está en el generador: el gradiente de su pérdida fluye por retropropagación a través del discriminador hasta la imagen y de ahí a los pesos del generador. Así, el discriminador le dice en qué dirección debe mover cada píxel para que parezca más verosímil.
2. Aprendizaje: pasos alternos
Se aprende por turnos: un paso del discriminador (un lote de datos reales y un lote de falsificaciones; subir D en los auténticos, bajarlo en los falsos) y luego un paso del generador (mover las falsificaciones hacia donde D las considera auténticas). Las dos redes tienen aquí dos capas ocultas con leaky ReLU y aprenden con Adam.
Definición — pérdida no saturante del generador
En lugar de minimizar log(1 − D(G(z))) del juego original, el generador aprende a maximizar log D(G(z)), es decir, a minimizar −log D(G(z)). Ambas pérdidas tienen el mismo objetivo, pero un gradiente distinto: si D = σ(s), entonces |∂ log(1 − D)/∂s| = D, mientras que |∂(−log D)/∂s| = 1 − D. Ya la propusieron Goodfellow et al. en el mismo artículo.
Al principio las falsificaciones son malas y el detective las descubre con facilidad; D está cerca de cero para ellas. La pérdida original en ese momento apenas envía señal: el falsificador no se entera de qué mejorar justo cuando más lo necesita. La pregunta inversa («cómo convencer al detective») da una señal fuerte desde el principio.
∂/∂s log(1 − σ(s)) = −D, ∂/∂s (−log σ(s)) = −(1 − D)
- s
- logit: la salida del discriminador antes de la sigmoide; derivamos respecto a él porque desde ahí el gradiente fluye de vuelta al discriminador y, a través de él, a la falsificación
- D = σ(s)
- probabilidad de que la falsificación sea auténtica; se usa σ′(s) = σ(s)(1 − σ(s)), por eso salen expresiones tan sencillas
- log(1 − σ(s))
- pérdida original del generador (se minimiza): su gradiente tiene magnitud D, así que cuando el discriminador descubre la falsificación con seguridad (D ≈ 0), es casi nulo: saturación
- −log σ(s)
- pérdida no saturante: el gradiente tiene magnitud 1 − D, es decir, es máximo precisamente para las falsificaciones que el discriminador ha descubierto
Para ser sinceros: en nuestros pequeños experimentos también aprendía la pérdida original, porque al principio el discriminador no estaba tan seguro de sí mismo. En redes grandes sobre imágenes, donde el discriminador gana rápido, la diferencia es decisiva. De aquí en adelante usamos la pérdida no saturante.
Cómo llega el gradiente hasta el generador lo muestra la regla de la cadena. La falsificación x = G(z) es para el discriminador solo una entrada, así que la retropropagación no tiene por qué detenerse en ella:
∂LG / ∂θG = ∂LG / ∂s · ∂s / ∂x · ∂x / ∂θG
- ∂LG / ∂s
- un único número que sale de la pérdida, en la no saturante −(1 − D): «cuánto» debe mejorar la falsificación
- ∂s / ∂x
- gradiente del discriminador respecto a su entrada (2 números en la circunferencia, 64 en un dígito): «en qué dirección» mover cada coordenada para que la falsificación parezca más auténtica; los pesos del discriminador no cambian en este paso
- ∂x / ∂θG
- retropropagación corriente a través del generador: convierte el desplazamiento deseado de la falsificación en un cambio de los pesos del generador
Definición — pérdida del discriminador y softplus
El discriminador devuelve un logit s y D = σ(s). Para una muestra auténtica con logit sr y una falsificación con logit sf, su pérdida es la entropía cruzada binaria
LD = −log σ(sr) − log(1 − σ(sf)) = softplus(−sr) + softplus(sf), softplus(u) = ln(1 + eu),
porque −log σ(s) = ln(1 + e−s) y 1 − σ(s) = σ(−s). El programa calcula softplus a partir del logit, no de D: para s = 40, σ(s) en coma flotante es exactamente 1 y log(1 − D) daría −∞, mientras que softplus(40) ≈ 40. Gradientes: ∂LD/∂sr = σ(sr) − 1, ∂LD/∂sf = σ(sf).
for t in range(kroku):
# 1. paso del discriminador: auténticas → 1, falsificaciones → 0
gD = 0
for _ in range(davka):
x = nahodny_vzorek(data)
gD += D.zpet(D(x), dL_ds=sigmoid(D(x)) - 1)
f = G(sum()) # falsificación, G no aprende ahora
gD += D.zpet(D(f), dL_ds=sigmoid(D(f)))
adam_D(gD / davka)
# 2. paso del generador: el gradiente atraviesa D hasta la falsificación
gG = 0
for _ in range(davka):
x = G(sum())
dL_ds = sigmoid(D(x)) - 1 # no saturante −log σ(s)
dL_dx = D.zpet_do_vstupu(dL_ds) # pesos de D sin cambios
gG += G.zpet(dL_dx)
adam_G(gG / davka) # Adam con β₁ = 0,5 como en DCGAN
3. Ocho grupos en una circunferencia
Un experimento clásico: los datos son puntos de ocho pequeños grupos normales (σ = 0,05) repartidos sobre una circunferencia de radio 2. El generador recibe ruido bidimensional y devuelve un punto del plano. Medimos la calidad (la fracción de muestras a menos de 3σ de algún centro) y la cobertura (en cuántos grupos cae al menos el 2 % de las muestras).
Definición — datos, calidad y cobertura
Los centros de los grupos son cj = (r cos(2πj/8), r sin(2πj/8)) para j = 0, …, 7 con r = 2; un punto de datos es cj con j aleatorio más un ruido N(0, σ²I), σ = 0,05. Para las muestras del generador x1, …, xn:
calidad = (1/n) · #{i : minj ‖xi − cj‖ < 3σ}, cobertura = #{j : nj ≥ 0,02 · n},
donde nj es el número de muestras a menos de 3σ del centro cj. En números: 3σ = 0,15, los centros vecinos distan entre sí 2r sin(π/8) ≈ 1,53, es decir, más de diez veces más. Las instantáneas tienen n = 400 muestras, así que un grupo cuenta como cubierto a partir de 8 muestras.
Ni siquiera un generador perfecto tiene una calidad del 100 %: la distancia de un punto al centro de una distribución normal bidimensional sigue una distribución de Rayleigh, y dentro de 3σ cae una fracción 1 − e−9/2 ≈ 0,989, es decir, aproximadamente el 98,9 %.
Tras 500 pasos, el generador produce una nube borrosa (calidad del 6 %); tras 2 000 pasos, los puntos se concentran en 6 grupos, y al final (paso 8 000) cubre los 8 con una calidad del 73 %. El generador nunca ha visto un solo punto real: todo lo ha aprendido del gradiente del discriminador.
4. Colapso de modos
Definición — colapso de modos (mode collapse)
El generador produce solo una parte de la distribución de los datos —unos pocos modos (grupos, tipos de imágenes)— y omite los demás. La pérdida no lo castiga directamente: el discriminador evalúa cada muestra por separado, y una buena falsificación de un solo tipo le resulta tan convincente como una colección variada. En el colapso completo, el generador produce casi lo mismo para cualquier z.
El falsificador descubre que lo que más le cuesta al detective es reconocer los billetes falsos de cien. Así que solo imprime billetes de cien. Con el tiempo, el detective se da cuenta y empieza a sospechar de los de cien; el falsificador salta a los de doscientos. El juego da vueltas en círculo y el falsificador nunca produce todos los billetes a la vez.
Teorema — contra un discriminador fijo, lo mejor es un único punto
Para un D fijo, la pérdida del generador cumple LG = Ez[−log D(G(z))] ≥ −log D(x*), donde x* es el punto en el que D es máximo. La igualdad se da para el generador que envía cada z a x*.
Demostración. Para cada z se tiene D(G(z)) ≤ D(x*), y como −log es decreciente, −log D(G(z)) ≥ −log D(x*); la esperanza conserva la desigualdad. ∎
La pérdida es una media sobre las muestras individuales y nada en ella premia la diversidad. Contra un rival fijo, el colapso completo es, por tanto, óptimo; lo único que lo impide es que el discriminador reacciona y empieza a sospechar de x*. Si el generador salta más rápido de lo que el discriminador olvida, el juego da vueltas en círculo. Por eso ayudan las modificaciones que le dan al discriminador una vista de todo el lote (minibatch discrimination, Tim Salimans et al., 2016) u otra distancia entre distribuciones (Wasserstein, más abajo).
La misma red, los mismos datos, la misma configuración; solo cambia la semilla aleatoria:
| semilla | grupos cubiertos tras los pasos 1 000 … 8 000 | al final | calidad al final |
|---|---|---|---|
| 1 | 0 · 2 · 7 · 6 · 6 · 7 · 7 · 7 | 7 de 8 | 66 % |
| 2 | 4 · 5 · 8 · 8 · 8 · 8 · 8 · 8 | 8 de 8 | 73 % |
| 3 | 1 · 4 · 4 · 4 · 5 · 5 · 5 · 5 | 5 de 8 | 54 % |
| 4 | 0 · 5 · 6 · 6 · 6 · 6 · 6 · 6 | 6 de 8 | 49 % |
Solo una de las cuatro ejecuciones cubrió los ocho grupos. La ejecución con semilla 3 se quedó en 5 y desde el paso 5 000 ya no se movió. Esto es típico de las GAN: el aprendizaje no tiene una única pérdida que vaya bajando, sino un juego de dos jugadores, y el resultado depende del azar más de lo que quisiéramos.
5. Dígitos: más nítidos, pero no todos
Ahora, los mismos dígitos de 8 × 8 que con el VAE. Generador: ruido de ocho dimensiones → 64 → 64 → 64 píxeles con sigmoide; el discriminador, en espejo. 6 000 pasos, dos ejecuciones con semillas distintas. Medimos la calidad igual que en la parte anterior: por la distancia de la muestra al dígito de entrenamiento más cercano.
Las muestras de la GAN son más nítidas: distancia 0,049 y 0,042 frente a 0,054 del VAE (los dígitos reales, 0,017). La GAN no castiga lo borroso promediando, como la pérdida de reconstrucción del VAE: una imagen borrosa el discriminador la reconoce fácilmente. Pero ¿cuántos dígitos de cada tipo produce el generador?
En los datos hay la misma cantidad de cada cifra. Sin embargo, la ejecución con semilla 2 produce sobre todo seises (69 de 200), ochos y treses, y las cifras 0, 1, 2, 4, 7 casi nunca (3 muestras como mucho). La ejecución con semilla 1 es más variada, pero también en ella las cifras 0, 4, 9 tienen menos de la mitad de lo que les corresponde (como mucho 6 muestras en lugar de 20). Es el mismo colapso de modos que en la circunferencia, solo que con imágenes: la GAN gana en nitidez y el VAE, en cobertura.
6. De las GAN a la difusión
- DCGAN (Alec Radford et al., 2015) mostró cómo construir GAN convolucionales que se pueden entrenar de forma fiable con fotos.
- Wasserstein GAN (Martin Arjovsky et al., 2017) sustituyó el clasificador por un «crítico» que mide la distancia entre distribuciones; el aprendizaje es más estable y menos propenso al colapso de modos.
- StyleGAN (Tero Karras et al., Nvidia, 2018-2020) genera caras fotorrealistas con una resolución de 1024 × 1024: la conocida web «this person does not exist».
- Hacia 2021, las GAN fueron superadas por los modelos de difusión (Prafulla Dhariwal y Alex Nichol: «Diffusion Models Beat GANs on Image Synthesis»). Son más lentos, pero aprenden de forma estable y cubren toda la distribución. La idea del discriminador, sin embargo, sigue viva: como pérdida auxiliar que aporta nitidez a las imágenes, por ejemplo en códecs de imagen o de sonido.
Por qué ayuda Wasserstein se ve en el ejemplo más sencillo (versión simplificada del ejemplo del artículo de Arjovsky et al., 2017): los datos son un único punto 0 y el generador produce un único punto θ. Mientras θ ≠ 0, las distribuciones no se solapan y JSD = ln 2 ≈ 0,693 independientemente de lo lejos que esté θ: el gradiente respecto a θ es nulo y el generador no sabe hacia dónde ir. La distancia de Wasserstein es |θ|, así que indica la dirección incluso desde muy lejos.
W(pdata, pG) = sup‖f‖L ≤ 1 ( Ex ~ data[f(x)] − Ez[f(G(z))] )
- sup‖f‖L ≤ 1
- el crítico f: una red que, en lugar de una probabilidad, devuelve un número cualquiera; la condición «1-lipschitziana» (|f(a) − f(b)| ≤ ‖a − b‖) le impide distinguir dos puntos cercanos de forma arbitrariamente brusca; de lo contrario, la diferencia podría crecer hasta el infinito
- Edata[f(x)]
- puntuación media de los datos reales: el crítico la quiere lo más alta posible
- Ez[f(G(z))]
- puntuación media de las falsificaciones: el crítico la quiere lo más baja posible y el generador, lo más alta posible; la diferencia es continua en los parámetros del generador, así que el gradiente no desaparece ni siquiera cuando las distribuciones no se solapan
7. Resumen
- GAN = generador y discriminador en un juego; el generador aprende solo del gradiente que le envía el discriminador.
- La pérdida no saturante −log D(G(z)) le da al generador una señal fuerte incluso al principio, cuando gana el discriminador.
- Con los ocho grupos, solo una de las cuatro ejecuciones los cubrió todos (7, 8, 5, 6); el resultado depende mucho del azar.
- Con los dígitos, las muestras son más nítidas que con el VAE (0,042 frente a 0,054), pero faltan algunas cifras: colapso de modos.
- Hoy las imágenes las generan sobre todo los modelos de difusión; el discriminador se ha quedado como ayudante para la nitidez.
¿Quieres probarlo tú mismo? Pídele a un agente de IA que entrene una pequeña GAN con los ocho grupos en la circunferencia y la ejecute cinco veces con semillas distintas. Después, que pruebe una Wasserstein GAN con la misma red y compare cuántos grupos cubre cada vez.
¿Lo ves de otra manera? Escribe a support@coden-app.com.