Modelos de difusión: cómo el ruido puro se convierte en una imagen
El proceso directo que añade ruido, una red que estima el ruido, DDPM y DDIM escritos desde cero, ocho grupos sin colapso de modos, cuántos pasos de muestreo hacen falta, comparación con VAE y GAN en dígitos y el camino hacia las imágenes a partir de texto.
Serie Fundamentos de IA Parte 46 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 funcionan los procesos directo e inverso de la difusión.
- Por qué la difusión se entrena de forma más estable que una GAN y cuánto cuesta el número de pasos.
- Cómo la difusión se convierte en un generador de imágenes a partir de texto.
Conviene conocer antes: Redes generativas adversarias (GAN): el falsificador contra el detective, Autocodificadores variacionales (VAE): imágenes nuevas a partir de un espacio latente continuo
Stable Diffusion, Midjourney, DALL·E 3 y los modelos que generan vídeo se basan en la misma idea, y es sorprendentemente sencilla. Destruir una imagen es fácil: basta con ir añadiéndole ruido hasta que solo quede ruido. Si aprendiéramos a deshacer cada pequeño paso, podríamos partir de ruido puro y, paso a paso, sacar de él una imagen. En esta parte lo programamos desde cero y lo comparamos con VAE y GAN sobre los mismos datos.
Continúa las partes Redes generativas antagónicas y Autocodificadores variacionales.
1. Proceso directo: la imagen se disuelve en ruido
Definición — proceso directo (de difusión)
Se elige un número de pasos T y un plan de pequeñas varianzas β1, …, βT. En cada paso se añade un poco de ruido: xt = √(1 − βt) · xt−1 + √βt · ε, ε ~ N(0, I). Componiendo los pasos sale la forma cerrada xt = √ᾱt · x0 + √(1 − ᾱt) · ε, donde ᾱt = ∏s ≤ t (1 − βs). Para t suficientemente grande, ᾱt ≈ 0 y xt es ruido puro.
Una gota de tinta en un vaso de agua: durante un momento se ve la forma de la gota, luego se difumina y al final el agua queda teñida de manera uniforme y la forma original ya no se reconoce. La fórmula cerrada dice que puedes saltar directamente a cualquier instante: no hace falta simular todos los pasos.
xt = √ᾱt · x0 + √(1 − ᾱt) · ε
- xt
- la imagen con ruido en el paso t: exactamente lo que la red recibe como entrada durante el entrenamiento
- √ᾱt
- cuánto queda de la imagen original; ᾱt es el producto de todos los (1 − βs) hasta el paso t, así que disminuye con cada paso
- x0
- la imagen original de los datos
- √(1 − ᾱt)
- cuánto ruido hay; las raíces están porque lo que se suma son las varianzas: (√ᾱ)² + (√(1 − ᾱ))² = 1, así que unos datos con varianza 1 tienen varianza 1 en cada paso y al final pasan suavemente a N(0, I)
- ε
- una muestra de ruido de N(0, I): justo lo que la red tendrá que adivinar; que la conozcamos convierte el aprendizaje en una regresión corriente
Teorema — por qué basta un solo salto
Si xt−1 = √ᾱt−1 x0 + √(1 − ᾱt−1) ε′ con ε′ ~ N(0, I), entonces también xt = √ᾱt x0 + √(1 − ᾱt) ε con un nuevo ε ~ N(0, I).
Demostración. Sustituimos en un paso: xt = √(1 − βt) √ᾱt−1 x0 + √(1 − βt) √(1 − ᾱt−1) ε′ + √βt ε″. El primer término es √ᾱt x0, porque ᾱt = (1 − βt) ᾱt−1. Los otros dos son ruidos normales independientes de media 0; su suma vuelve a ser normal y las varianzas se suman: (1 − βt)(1 − ᾱt−1) + βt = 1 − (1 − βt) ᾱt−1 = 1 − ᾱt. Para t = 1 la afirmación se cumple directamente (ᾱ0 = 1); el resto, por inducción. ∎
Ejemplo — nuestro plan de ruido en números
β crece linealmente: βt = β1 + (βT − β1) · (t − 1)/(T − 1), es decir, 0,00101 por paso.
| t | βt | ᾱt | √ᾱt (señal) | √(1 − ᾱt) (ruido) |
|---|---|---|---|---|
| 1 | 0,00010 | 0,9999 | 1,000 | 0,010 |
| 2 | 0,00111 | 0,9988 | 0,999 | 0,035 |
| 25 | 0,02432 | 0,7351 | 0,857 | 0,515 |
| 37 | 0,03643 | 0,5045 | 0,710 | 0,704 |
| 38 | 0,03744 | 0,4856 | 0,697 | 0,717 |
| 50 | 0,04955 | 0,2830 | 0,532 | 0,847 |
| 100 | 0,10000 | 0,0056 | 0,075 | 0,997 |
Comprobemos a mano la segunda fila: ᾱ2 = (1 − β1)(1 − β2) = 0,9999 · 0,99889 = 0,99879. La señal y el ruido se igualan (ᾱ = 0,5) entre los pasos 37 y 38; en el paso 100 la imagen original tiene un peso de solo 0,075 frente a 0,997 del ruido.
En nuestro caso T = 100 y β crece linealmente de 0,0001 a 0,1. La parte de la señal original √ᾱt es 0,86 en el paso 25, 0,53 en el paso 50 y ya solo 0,07 en el paso 100.
2. Proceso inverso: una red que adivina el ruido
Definición — DDPM (denoising diffusion probabilistic model)
DDPM (Jonathan Ho, Ajay Jain y Pieter Abbeel, 2020; idea de Jascha Sohl-Dickstein et al., 2015) entrena una red εθ(xt, t) para que, a partir de una imagen con ruido y del número de paso, estime qué ruido ε se le añadió. La pérdida es el error cuadrático medio corriente E ‖ε − εθ(√ᾱt x0 + √(1 − ᾱt) ε, t)‖² con un t aleatorio. Se muestrea hacia atrás desde xT ~ N(0, I): xt−1 = (xt − βt/√(1 − ᾱt) · εθ) / √(1 − βt) + √βt · z.
La red recibe una foto borrosa y con ruido y la pregunta «¿cuánto ruido hay en ella y cómo es?». Si sabe estimarlo, también sabe restarle un poco. Lo repetimos cien veces, cada vez con un poco de azar nuevo, y del ruido surge una imagen. Además, el aprendizaje es una regresión corriente: ningún rival como en una GAN, ningún compromiso como en un VAE.
L(θ) = Ex0, t, ε ‖ε − εθ(√ᾱt x0 + √(1 − ᾱt) ε, t)‖²
- ε
- el ruido que nosotros mismos añadimos a la imagen: la respuesta correcta, y por eso la conocemos sin tener que etiquetar ningún dato
- εθ(…, t)
- la estimación del ruido que hace la red; recibe también el número de paso t, porque con t = 2 tiene que encontrar poco ruido y con t = 100 en xt casi solo hay ruido
- √ᾱt x0 + √(1 − ᾱt) ε
- la imagen con ruido xt obtenida de un solo salto: gracias a la fórmula cerrada basta con sortear t y ε para cada ejemplo; no se simula nada paso a paso
xt−1 = 1/√(1 − βt) · (xt − βt/√(1 − ᾱt) · εθ(xt, t)) + √βt · z
- xt
- el estado actual con ruido; se empieza desde ruido puro xT ~ N(0, I)
- εθ(xt, t)
- la estimación del ruido que hay en xt
- βt/√(1 − ᾱt)
- qué parte del ruido estimado restar: solo la porción que corresponde a un paso (βt), reescalada al nivel total de ruido √(1 − ᾱt); en nuestro caso 0,01 en el paso 1 y 0,10 en el paso 100
- 1/√(1 − βt)
- deshace la reducción del paso directo (allí se multiplicaba por √(1 − βt)); en el paso 100 vale 1,054
- √βt · z
- ruido nuevo z ~ N(0, I) (en el último paso z = 0): el proceso inverso es aleatorio como el directo; sin él las muestras se irían hacia imágenes promedio. El tamaño √βt es una de las dos opciones que probaron Ho et al.
# entrenamiento (DDPM)
repite 16 000×:
para cada uno de los 64 ejemplos del lote:
x₀ = ejemplo aleatorio de los datos
t = aleatorio de 1 … 100
ε = vector de números aleatorios de N(0, 1)
x_t = √ᾱ_t · x₀ + √(1 − ᾱ_t) · ε
error = ‖ε − ε_θ(x_t, código(t))‖² / dimensión
paso de Adam sobre el error medio
# muestreo (DDPM, 100 pasos)
x = vector de N(0, 1)
para t = 100, 99, …, 1:
ε̂ = ε_θ(x, código(t))
z = vector de N(0, 1), cero en el paso t = 1
x = (x − β_t / √(1 − ᾱ_t) · ε̂) / √(1 − β_t) + √β_t · z
devuelve x
Definición — codificación sinusoidal del tiempo
La red no recibe el número t directamente, sino ocho números código(t) = (sin(fπt/T), cos(fπt/T)) para f = 1, 2, 4, 8. Las frecuencias lentas dicen «más o menos en qué punto del proceso estamos», las rápidas distinguen pasos vecinos; todos los números están entre −1 y 1, así que ninguna entrada pesa más que las demás.
Para t = 25 (un cuarto del proceso, ángulos π/4, π/2, π y 2π): código(25) = (0,707; 0,707; 1,000; 0,000; 0,000; −1,000; 0,000; 1,000).
Nuestra red es la red multicapa corriente de la parte sobre GAN: a la entrada, xt y los ocho números de la codificación sinusoidal del tiempo t (como la codificación posicional de un transformer); a la salida, la estimación del ruido. En el círculo tiene dos capas ocultas de 64 neuronas; en los dígitos, de 128. Se entrena con Adam durante 16 000 pasos.
3. Ocho grupos sin colapso
Los mismos datos que en la parte anterior: ocho grupos en un círculo. Así se ven 400 muestras durante el proceso inverso:
Todavía en el paso 25 los puntos están repartidos de forma casi uniforme (calidad 3 %), en el paso 10 se perfila el círculo y en los últimos diez pasos los puntos se reúnen en grupos. Al final están cubiertos los 8 grupos y cada uno recibió entre 28 y 50 de las 500 muestras. La calidad (proporción a menos de 3σ de un centro) es del 63 %.
La diferencia con la GAN no está en la calidad, sino en la fiabilidad. La GAN cubrió los ocho grupos solo en una de cada cuatro ejecuciones; la difusión lo logró en la única ejecución que lanzamos (una ejecución no es una prueba, pero concuerda con lo que se sabe de la difusión). La pérdida de la difusión no es un juego, sino una regresión, y la red es penalizada por cada muestra de los datos: no puede «desentenderse» de ningún grupo.
4. Cuántos pasos hacen falta
Definición — DDIM
DDIM (Jiaming Song, Chenlin Meng y Stefano Ermon, 2020) usa la misma red entrenada, pero muestrea de forma determinista y a saltos más grandes: a partir de la estimación del ruido calcula una estimación de la imagen limpia x̂0 = (xt − √(1 − ᾱt) εθ) / √ᾱt y de ella directamente xs = √ᾱs x̂0 + √(1 − ᾱs) εθ para cualquier tiempo anterior s < t.
En lugar de cien pasitos damos veinte más grandes. En cada uno, la red se pregunta «¿cómo sería más o menos la imagen terminada?» y salta parte del camino en esa dirección. Cuando los saltos son demasiado grandes, la red no acierta.
xs = √ᾱs · x̂0 + √(1 − ᾱs) · εθ(xt, t), x̂0 = (xt − √(1 − ᾱt) εθ) / √ᾱt
- xt
- el estado en el que estamos ahora mismo
- εθ
- la estimación del ruido: la misma red que en DDPM, no se reentrena nada
- x̂0
- la estimación de la imagen terminada: la fórmula cerrada del proceso directo despejada para x0; se divide entre √ᾱt, que al principio es pequeño, así que aquí es donde la estimación es menos precisa
- √ᾱs
- cuánta imagen debe haber en el tiempo de destino s: el mismo factor que en el proceso directo, solo que para otro tiempo
- √(1 − ᾱs)
- cuánto ruido debe quedar; DDIM usa para ello el mismo ruido estimado y no sortea uno nuevo, por eso es determinista
Ejemplo — por qué dos pasos no bastan (simplificado)
DDIM con n pasos recorre tiempos repartidos de manera uniforme: con 5 pasos 100 → 80 → 60 → 40 → 20 → 0, con 2 pasos 100 → 50 → 0. El primer salto siempre parte de t = 100, donde √ᾱ100 = 0,075.
Si la red se equivoca en δ al estimar el ruido, la estimación x̂0 se equivoca en δ · √(1 − ᾱ100)/√ᾱ100 = 13,3 δ: el error se amplifica más de diez veces. Al sustituirlo en el salto al tiempo s, el nuevo estado difiere del correcto en δ · (√(1 − ᾱs) − √ᾱs · 13,3):
- 5 pasos, salto 100 → 80: factor −1,59,
- 2 pasos, salto 100 → 50: factor −6,23,
Con un salto pequeño, la mala estimación x̂0 se mezcla con un peso pequeño √ᾱ80 = 0,19 y los pasos siguientes la corrigen. Con un salto hasta la mitad del proceso entra con un peso √ᾱ50 = 0,53 y queda un único paso. El razonamiento sigue solo un error en un paso y supone que, por lo demás, la red estima con exactitud; pero muestra por qué los primeros pasos, los más ruidosos, son los más sensibles.
DDIM con 50 pasos alcanza una calidad del 79 %, más que DDPM con 100 pasos (63 %), probablemente porque no añade ruido aleatorio que nuestra red imprecisa no llega a eliminar en los últimos pasos. Con 10 pasos todavía es del 70 %; con 5 pasos, del 60 %. Con 2 pasos el muestreo se viene abajo (0 %). El número de pasos es el principal coste de la difusión: cada paso es una pasada por la red, mientras que una GAN genera la imagen en una sola pasada.
5. Dígitos: comparación de tres generadores
Con los dígitos de 8 × 8 (píxeles llevados al rango de −1 a 1) la red se entrena durante 16 000 pasos.
| modelo | distancia al dígito más cercano | dígito menos representado (de 200) | dígitos con menos de 10 muestras |
|---|---|---|---|
| VAE (k = 8) | 0,054 | 10 | 0 |
| GAN, semilla 1 | 0,049 | 3 | 3 |
| GAN, semilla 2 | 0,042 | 0 | 6 |
| difusión (100 pasos) | 0,063 | 12 | 0 |
Aquí hay que ser honestos: nuestra difusión tiene una distancia de 0,063, peor que el VAE (0,054) y que la GAN (0,042). En las imágenes se ve ruido residual. En cambio, los dígitos están representados de forma equilibrada: el dígito menos frecuente tiene 12 muestras, mientras que a la GAN con semilla 2 le faltan dos dígitos por completo.
¿Por qué es peor la nitidez? Una red multicapa pequeña tiene que quitar el ruido de imágenes en los cien niveles de ruido a la vez, y eso es una tarea más difícil que la única correspondencia ruido → imagen de una GAN. A cambio, mejora de forma constante con el cómputo: la distancia de las muestras fue bajando durante el entrenamiento 0,096 (paso 4 000), 0,082 (paso 8 000), 0,068 (paso 12 000), 0,063 (paso 16 000) (estimación rápida a partir de 100 muestras de DDIM con 20 pasos). Ni colapso ni oscilaciones. Los modelos de difusión reales usan redes convolucionales U-Net o transformers con cientos de millones de parámetros y se entrenan durante semanas, y entonces ganan también en nitidez.
6. De los dígitos a las imágenes a partir de texto
- Condicionamiento. La red εθ(xt, t, c) recibe además una descripción c: un embedding del texto procedente de un modelo de lenguaje, conectado mediante atención (la parte sobre la atención). Se entrena con miles de millones de pares imagen–descripción.
- Guía sin clasificador (classifier-free guidance, Jonathan Ho y Tim Salimans, 2021). La red se entrena con la descripción y sin ella, y al muestrear la estimación se desplaza en la dirección «con descripción menos sin descripción», amplificada por un coeficiente. Así la imagen se ajusta mejor a la petición a costa de menos variedad.
- Difusión latente. La difusión se ejecuta en el pequeño espacio latente de un autocodificador, no en los píxeles; ver la parte sobre los VAE. Gracias a ello, Stable Diffusion (2022) funciona incluso en una tarjeta gráfica para juegos.
- Menos pasos. Mejores muestreadores y la destilación (una red aprende a imitar muchos pasos en uno o unos pocos) han reducido la generación de cientos de pasos a unos pocos.
ε̃ = εθ(xt, t, ∅) + w · (εθ(xt, t, c) − εθ(xt, t, ∅))
- εθ(…, ∅)
- la estimación del ruido sin descripción (condición vacía ∅): «cómo es una imagen cualquiera»; la red la aprende porque durante el entrenamiento la descripción se descarta de vez en cuando al azar
- εθ(…, c) − εθ(…, ∅)
- cuánto cambia la estimación cuando la red conoce la descripción: la dirección hacia la que la descripción arrastra la imagen
- w
- fuerza de la guía: w = 0 ignora la descripción, w = 1 es un modelo condicional corriente, w > 1 exagera la influencia de la descripción: la imagen se ajusta mejor a la petición, pero las muestras se parecen más entre sí
7. Resumen
- El proceso directo añade ruido poco a poco; a cualquier paso se puede saltar con la fórmula √ᾱ x₀ + √(1 − ᾱ) ε.
- La red aprende a estimar el ruido añadido: una regresión corriente. Se genera hacia atrás a partir de ruido puro.
- En los ocho grupos, la difusión los cubrió todos en una única ejecución (DDIM con 50 pasos, 79 %); la GAN, solo en una de cada cuatro ejecuciones.
- Menos pasos (DDIM) aceleran el muestreo; con 10 pasos la calidad es del 70 %, con 2 pasos se viene abajo.
- En los dígitos, la difusión cubre todas las cifras, pero con nuestra red pequeña se queda atrás en nitidez; eso sí, mejora de forma constante con el cómputo.
¿Quieres probarlo tú mismo? Pide a un agente de IA que entrene un DDPM pequeño con datos bidimensionales (por ejemplo, puntos con la forma de tus iniciales) y que dibuje cómo los puntos se van juntando en letras durante el proceso inverso.
¿Lo ves de otra manera? Escribe a support@coden-app.com.