Saltar al contenido
coden

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.

12 minutos Matěj Žalmánek 2026-10-16

Serie Fundamentos de IA Parte 46 de 52
  1. Mapa de la inteligencia artificial: qué es cada cosa y cómo encaja todo
  2. Breve historia de la inteligencia artificial: de Turing a los modelos de lenguaje
  3. Datos, modelo, entrenamiento, inferencia: los conceptos básicos en un solo ejemplo
  4. Cómo leer la notación matemática: símbolos, subíndices, sumatorios y cuantificadores
  5. Conjuntos y relaciones: las piezas con las que se construyen las definiciones en IA
  6. Funciones y aplicaciones: por qué todo modelo de IA es una función
  7. Lógica y demostraciones: las reglas con las que se razona en IA
  8. Grafos y árboles: la estructura sobre la que se apoyan la búsqueda y las redes neuronales
  9. Álgebra lineal para aprendizaje automático: vectores, matrices y por qué la IA sobre todo multiplica
  10. Derivadas, gradiente y regla de la cadena: cómo sabe un modelo en qué dirección aprender
  11. Descenso de gradiente: cómo aprende un modelo
  12. Qué es la probabilidad: del lanzamiento de un dado a los axiomas de Kolmogórov
  13. Probabilidad condicionada y teorema de Bayes: cómo cambiar una estimación cuando te enteras de algo nuevo
  14. Variable aleatoria y función de distribución: una sola función que lo dice todo sobre la distribución
  15. Función de densidad y función de probabilidad: por qué una variable continua tiene probabilidad cero en cada punto
  16. Esperanza, varianza y covarianza: dónde está una distribución, qué anchura tiene y qué se relaciona con qué
  17. Resumen de las distribuciones de probabilidad: Bernoulli, binomial, Poisson, uniforme, normal y exponencial
  18. Ley de los grandes números y teorema central del límite: por qué las medias se comportan de forma tan predecible
  19. Estadística y estimación de parámetros: máxima verosimilitud, MAP e intervalos de confianza
  20. Teoría de la información: entropía, entropía cruzada y divergencia KL, el origen de las funciones de pérdida
  21. Búsqueda en el espacio de estados: BFS, DFS, UCS y A* con animaciones
  22. Juegos y adversarios: minimax, poda alfa-beta y Monte Carlo tree search
  23. Satisfacción de restricciones: backtracking, propagación de restricciones y AC-3 con un sudoku y un mapa de regiones checas
  24. Lógica y sistemas basados en conocimiento: encadenamiento hacia delante y hacia atrás, resolución y sistemas expertos
  25. Planificación: STRIPS, el mundo de bloques, heurísticas a partir de la relajación y la planificación en los agentes de IA
  26. Búsqueda local y recocido simulado: un viajante por las capitales regionales checas
  27. Algoritmos genéticos: población, cruce, mutación y selección en una mochila para la excursión
  28. Estrategias evolutivas y programación genética: de la regla de un quinto a la ley de Kepler
  29. Optimización por colonia de hormigas: cómo un rastro de feromona encuentra un camino corto
  30. Optimización por enjambre de partículas: inercia, experiencia propia y experiencia del enjambre
  31. Neuroevolución: evolución de los pesos y la forma de las redes neuronales, y el algoritmo NEAT
  32. Conjuntos difusos y funciones de pertenencia: cómo escribir «algo cálido»
  33. Lógica difusa y probabilidad: por qué «algo cálido» no significa «probablemente cálido»
  34. Lógica difusa: t-normas, implicaciones y reglas SI–ENTONCES
  35. Control difuso: Mamdani y Sugeno, del ventilador al péndulo invertido sobre un carro
  36. Agrupamiento difuso: el algoritmo fuzzy c-means y los puntos entre clusters
  37. Sistemas neuro-difusos (ANFIS): reglas difusas que aprenden de los datos
  38. Cadenas de Markov: matriz de transición, distribución estacionaria y PageRank
  39. Modelos ocultos de Márkov: el algoritmo de Viterbi y el casino deshonesto
  40. Redes bayesianas: por qué está mojada la hierba y qué significa eso para el aspersor
  41. El filtro de Kalman: cómo estimar a partir de mediciones imprecisas dónde está un coche y a qué velocidad va
  42. Tipos de aprendizaje automático: supervisado, no supervisado, semisupervisado y más
  43. Prompts, contexto y RAG: cómo darle a un modelo la información correcta
  44. Autocodificadores variacionales (VAE): imágenes nuevas a partir de un espacio latente continuo
  45. Redes generativas adversarias (GAN): el falsificador contra el detective
  46. Modelos de difusión: cómo el ruido puro se convierte en una imagen
  47. Procesos de decisión de Markov: estados, acciones, recompensas y ecuaciones de Bellman
  48. Q-learning y DQN: aprender el valor de las acciones, de la tabla a la red neuronal
  49. Gradiente de la política y PPO: aprender directamente la política
  50. Cómo funciona un agente de IA: un modelo de lenguaje en un bucle con herramientas
  51. Programación con agentes de IA: encargo, pruebas y revisión
  52. 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

Qué te llevarás
  • 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.

Dicho de forma sencilla

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)
10,000100,99991,0000,010
20,001110,99880,9990,035
250,024320,73510,8570,515
370,036430,50450,7100,704
380,037440,48560,6970,717
500,049550,28300,5320,847
1000,100000,00560,0750,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.

Un tres en el proceso directo (desde la izquierda t = 0, 10, 25, 50, 75, 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.

Dicho de forma sencilla

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
La esperanza se toma sobre las imágenes de los datos, un paso t ∈ {1, …, T} sorteado de manera uniforme y el ruido ε ~ N(0, I); en la práctica, la media sobre el lote. Ho et al. llegaron a esta pérdida tan sencilla simplificando la cota inferior variacional (la misma que optimiza el VAE): eliminaron de ella los pesos de cada 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.
El paréntesis multiplicado por el primer factor es una estimación de la media de una imagen con un paso menos de ruido; después se le añade tanto azar como corresponde a ese paso.
# 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:

t = 100 t = 50 t = 25 t = 10 t = 0 coordenada x₁ (sin unidades) x₂ (sin unidades)
Proceso inverso: del ruido (t = 100) a los datos (t = 0)

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.

Dicho de forma sencilla

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
Un paso es «quita todo el ruido y luego vuelve a añadirlo hasta el nivel del tiempo s». Así DDIM puede saltar tan lejos como quiera.
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.

0 %25 %50 %75 %100 % 63 · 8/8 100 79 · 8/8 50 77 · 8/8 20 70 · 8/8 10 60 · 8/8 5 0 · 0/8 2 pasos de muestreo (número) calidad (% de muestras a menos de 3σ)
Calidad y cobertura en el círculo según el número de pasos de muestreo DDPM (100 pasos) DDIM mejor ejecución de la GAN

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.

difusión GAN, semilla 2 VAE
Las diez primeras muestras
modelodistancia al dígito más cercanodígito menos representado (de 200)dígitos con menos de 10 muestras
VAE (k = 8)0,054100
GAN, semilla 10,04933
GAN, semilla 20,04206
difusión (100 pasos)0,063120

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í
Al muestrear, ε̃ se usa en lugar de εθ; el coste son dos pasadas por la red en cada paso. Ho y Salimans escriben la misma fórmula como (1 + w′) εθ(…, c) − w′ εθ(…, ∅), es decir, w = 1 + w′. La biblioteca diffusers usa para Stable Diffusion un valor por defecto de w = 7,5.

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.

Un Agente en tu ordenador, controlado desde el móvil