Difusión: de ruido a imagen
¿Cómo se crea una imagen quitando ruido paso a paso?
Lección completa
Si quieres:
Esto es estática: sesenta y cuatro píxeles al azar. Mira con calma: en unos segundos, una red diminuta la convierte en un siete que nunca existió.
Sin voz: la lección avanza sola con subtítulos.
La voz de esta lección está en preparación: por ahora avanza sola con subtítulos.
Modo revisiónComentar este pasoTerminé la lección
Qué lograrás
- Explicar el proceso hacia delante (mezclar una imagen con ruido, paso a paso, hasta que solo queda estática) y por qué deshacerlo de un salto es imposible y en muchos pasos pequeños, no.
- Describir, pieza por pieza, qué recibe y qué entrega la red de un modelo de difusión (imagen con ruido y paso → ruido estimado) y cómo se genera partiendo de estática pura.
- Reconocer qué hacen el guiado sin clasificador (exagerar la pista, a cambio de variedad) y la difusión latente (difundir en un espacio de códigos, mucho más barato).
Ideas clave
- El proceso hacia delante mezcla una imagen con ruido, paso a paso, según un calendario fijo, hasta que solo queda estática. No aprende nada, y al final toda imagen termina en la misma clase de estática, fácil de fabricar.
- Deshacer el ruido de un salto es imposible: la misma estática pudo venir de cualquier imagen y lo mejor que se puede adivinar es un promedio borroso. Un paso pequeño, en cambio, sí se puede estimar.
- La red recibe la imagen con ruido y el número del paso, y estima el ruido. Se entrena con ejemplos que nunca se acaban: el ruido lo fabricamos nosotros, así que conocemos la respuesta.
- Generar es partir de estática pura y quitar un poco del ruido estimado, muchas veces. Con otra estática sale otro resultado: nada estaba guardado.
- El guiado sin clasificador exagera la diferencia entre la estimación con pista y sin pista: más fidelidad, menos variedad. La difusión latente hace todo esto en un espacio de códigos mucho más pequeño y decodifica al final; así funciona Stable Diffusion.
Lo que mucha gente cree
Creencia común La red «limpia» una imagen que ya estaba escondida en la estática: solo la descubre.
Lo correcto En la estática no hay ninguna imagen. Paso a paso, la red va decidiendo qué dibujo es plausible según lo que aprendió de los datos; con otra estática, o con otra pista, sale otro dibujo distinto.
Compruébalo
Cuatro preguntas. Sin nota ni cuenta: sirven para ver si la idea quedó.
Por dentroPara quien quiere las fórmulas y el código. No hace falta para seguir el curso.
El proceso hacia delante
Con un calendario de ruido , sea y . Cada paso es , y al encadenarlos sale una fórmula cerrada para cualquier paso:
La barra de la lección muestra (la parte de la «energía» de la mezcla que todavía es imagen) y (la que es ruido). La lección usa y el calendario coseno de Nichol y Dhariwal (2021), con , recortando cada a 0.35 como máximo (con tan pocos pasos, los últimos del coseno se acercan a 1). Así vale 0.899 en el paso 10, 0.494 en el 25, 0.094 en el 40 y 0.003 en el 50. Los píxeles se pasan antes a la escala ; en pantalla se recorta a .
Por qué no de un salto
La red se entrena con error cuadrático, y lo que minimiza el error cuadrático es el promedio condicionado . Cuando la estática casi no conserva información, así que : el promedio de todos los dígitos, la mancha de la lección. En cambio, si cada es pequeño, el paso inverso es casi gaussiano, con la misma forma que el paso hacia delante (Sohl-Dickstein et al., 2015, que citan a Feller, 1949): basta estimar su media.
Qué aprende la red y cómo se entrena
La red estima el ruido. La pérdida simplificada de Ho et al. (2020) es
Gracias a la fórmula cerrada no hace falta recorrer los pasos al entrenar: se salta directo a un al azar. La red de píxeles de la lección tiene 53 056 parámetros (tres capas de 128 neuronas con conexiones residuales y SiLU; entradas: los 64 píxeles, 16 números que codifican el paso y la etiqueta en 11 casillas, la última para «sin pista») y se entrenó 30 000 rondas con lotes de 256 imágenes: 7 680 000 versiones con ruido de los 1500 dígitos de entrenamiento de la lección 15. Con la imagen del siete en el paso 20, su estimación del ruido tiene un error cuadrático medio de 0.135 por píxel; si dijera «no hay ruido», el error sería 0.864.
El muestreo
El muestreo original de DDPM parte de y, para , calcula
con un poco de ruido nuevo en cada paso (salvo el último). La escena usa la variante determinista de Song et al. (2021), DDIM con , con la misma red entrenada como en DDPM:
Es decir: con la estimación del ruido se calcula la imagen limpia que implica y se vuelve a mezclar con la parte de ruido que le toca al paso anterior. Sin ruido nuevo, cada punto del plano sigue exactamente su flecha y la misma estática da siempre el mismo resultado; con otra estática sale otro.
Guiado sin clasificador
Se entrena una sola red con la etiqueta y, con probabilidad 0.15, sin ella (). Al muestrear se combina
Con es la estimación sin pista (la pista se ignora); con , la condicional, que sigue la pista tal cual; con se exagera la dirección de la pista. Es la misma convención de la lección 18. Ho y Salimans (2022) escriben lo mismo con : . Cada paso guiado cuesta dos evaluaciones de la red. En el plano de la lección, con la pista «siete» y doscientos puntos (lector: la regresión logística de la lección 15), se leen como siete 26 con , 199 con y 200 con . A la vez, los sietes reales que se quedan sin ningún punto nuevo a menos de 0.3 son 4 de 154 con , 48 con , 95 con y 144 con : los puntos se amontonan en la orilla del grupo más alejada de los demás dígitos. La red de píxeles genera sus sietes con .
Difusión latente
Un autocodificador comprime la imagen a un código ; la difusión ocurre en y al final se decodifica (Rombach et al., 2022). En la lección, son los dos números del VAE de la lección 15, multiplicados por 1.6 antes de difundir (Stable Diffusion también reescala sus códigos con un factor fijo), y la red del plano tiene 10 370 parámetros. En Stable Diffusion v1, el autocodificador reduce cada lado 8 veces y entrega 4 canales: una imagen de números se vuelve un código de , 48 veces menos.
En código
import numpy as np
T, s = 50, 0.008
f = lambda t: np.cos((t / T + s) / (1 + s) * np.pi / 2) ** 2
a_full = f(np.arange(T + 1)) / f(0)
betas = np.clip(1 - a_full[1:] / a_full[:-1], 1e-4, 0.35) # calendario de ruido
alphas = 1 - betas
abar = np.cumprod(alphas)
print('imagen en la mezcla (%):', [round(float(100 * abar[t - 1]), 1) for t in (10, 25, 40, 50)])
# Datos de juguete: un solo número que vale -1 o +1. Para ellos, el mejor
# estimador del ruido se puede escribir a mano (en la lección lo aprende una red).
def ruido_estimado(x, i):
a, b = np.sqrt(abar[i]), np.sqrt(1 - abar[i])
x0 = np.tanh(a * x / b**2) # promedio de x0 dado x_t
return (x - a * x0) / b
rng = np.random.default_rng(0)
x = rng.standard_normal(10_000) # estática pura
for i in reversed(range(T)): # cincuenta pasos de regreso (DDPM)
e = ruido_estimado(x, i)
x = (x - betas[i] / np.sqrt(1 - abar[i]) * e) / np.sqrt(alphas[i])
if i > 0:
x += np.sqrt(betas[i]) * rng.standard_normal(x.size)
print('a menos de 0.1 de -1 o de +1:', round(float(np.mean(np.abs(np.abs(x) - 1) < 0.1)), 3))
print('fracción en +1:', round(float(np.mean(x > 0)), 3))
# imagen en la mezcla (%): [89.9, 49.4, 9.4, 0.3]
# a menos de 0.1 de -1 o de +1: 1.0
# fracción en +1: 0.499
Lo que viene
La lección 18 muestra cómo una frase se convierte en la pista que guía la difusión (CLIP y el condicionamiento por texto). Más adelante, el transformer (lecciones 21 y 22) reemplaza a la red convolucional en muchos modelos de difusión modernos.
Lente de decisión
Qué significa esta idea si tu trabajo es decidir, no programar.
- El costo de generar es pasos × evaluaciones de la red × imágenes. El guiado sin clasificador duplica las evaluaciones por paso: para campañas masivas, estima el volumen y compara configuraciones con menos pasos o menor resolución.
- La escala de guiado es una perilla de negocio: más alta da resultados más fieles a lo pedido, pero más parecidos entre sí. Prueba varias escalas con tus propios casos antes de fijarla.
- La calidad aparente engaña: revisa detalles (texto dentro de la imagen, manos, logotipos) y mantén revisión humana antes de publicar.
- Estos modelos aprenden de grandes colecciones de imágenes reales: pregunta al proveedor de dónde vienen los datos, qué licencias cubren y qué política de uso y de etiquetado de imágenes sintéticas ofrece.
Términos de la lección
- Modelo generativo Modelo que aprende la distribución de sus datos (qué es común, qué es raro) y por eso puede producir datos nuevos parecidos. Un modelo que clasifica, en cambio, solo aprende la frontera entre grupos.
- Distribución La forma en que se reparten los datos: qué valores (o combinaciones de valores) son comunes, cuáles raros y cuáles no aparecen nunca. En dos medidas se ve como una nube de puntos.
- Muestrear Sacar un dato nuevo siguiendo una distribución: lo común sale a menudo y lo raro pocas veces. Es como genera un modelo generativo. (No confundir con las muestras de audio de la lección 2.)
- Autocodificador Red de dos piezas: un codificador, que resume cada dato en pocos números (el código), y un decodificador, que intenta reconstruirlo desde el código. Se entrena para que baje el error de reconstrucción.
- Espacio latente El espacio de los códigos de un modelo («latente» significa oculto): cada dato es un punto, y los puntos cercanos suelen ser datos parecidos. Cualquier punto se puede decodificar.
- Autocodificador variacional (VAE) Autocodificador que resume cada dato en una nube (centro y tamaño) en lugar de un punto, y penaliza que las nubes se alejen de una zona estándar. Así el espacio latente queda sin huecos y se puede muestrear de él.
- Píxel El punto más pequeño de una imagen digital. En escala de grises es un número de 0 (negro) a 255 (blanco); en color son tres números (rojo, verde y azul).
- Función de pérdida Un único número que resume qué tan equivocado está un modelo con sus datos. Entrenar es buscar los parámetros que lo hacen lo más pequeño posible.
- Error cuadrático medio (MSE) Pérdida que promedia los errores elevados al cuadrado. Castiga mucho más los errores grandes que los pequeños y se mide en las unidades de la salida, al cuadrado.
- Descenso del gradiente Método que ajusta los pesos paso a paso, siempre en contra de la pendiente del error (el gradiente), hasta llegar a un fondo.
- Datos de entrenamiento Ejemplos, cada uno con su respuesta correcta, con los que un modelo ajusta sus parámetros.
- Modelo de difusión Modelo generativo que aprende a deshacer un proceso fijo que mezcla los datos con ruido paso a paso (el proceso hacia delante). Genera partiendo de estática pura y quitando un poco de ruido estimado, muchas veces.
- Quitar ruido (denoising) La tarea de la red en un modelo de difusión: recibe una imagen con ruido y el número del paso, y estima el ruido para poder restarlo.
- Calendario de ruido La receta fija de cuánto ruido se mezcla en cada paso del proceso hacia delante; determina qué parte de la mezcla sigue siendo imagen en cada paso.
- Difusión latente Hacer la difusión en el espacio de códigos de un autocodificador, mucho más pequeño que la imagen, y decodificar al final. Es más barata; así funciona Stable Diffusion.
- Guiado sin clasificador Al generar, se calcula la estimación del ruido con la pista (una etiqueta o un texto) y sin ella, y se exagera su diferencia con la escala de guiado: más fidelidad a la pista, menos variedad.
Transcripción completa
Fuentes
- Alpaydin, E., Kaynak, C. (1998). Optical Recognition of Handwritten Digits (UCI Machine Learning Repository, CC BY 4.0; datos de los dígitos de 8 × 8)
- Sohl-Dickstein, J., Weiss, E. A., Maheswaranathan, N., Ganguli, S. (2015). Deep Unsupervised Learning using Nonequilibrium Thermodynamics (ICML 2015)
- Ho, J., Jain, A., Abbeel, P. (2020). Denoising Diffusion Probabilistic Models (NeurIPS 2020)
- Nichol, A., Dhariwal, P. (2021). Improved Denoising Diffusion Probabilistic Models (ICML 2021)
- Song, J., Meng, C., Ermon, S. (2021). Denoising Diffusion Implicit Models (ICLR 2021)
- Ho, J., Salimans, T. (2022). Classifier-Free Diffusion Guidance
- Rombach, R., Blattmann, A., Lorenz, D., Esser, P., Ommer, B. (2022). High-Resolution Image Synthesis with Latent Diffusion Models (CVPR 2022)
- Stability AI (2022). Stable Diffusion Public Release (anuncio, 22 de agosto de 2022)
- CompVis (2022). Stable Diffusion v1-4 Model Card
- Alpaydin, E., Kaynak, C. (1998). Optical Recognition of Handwritten Digits (UCI Machine Learning Repository)
ComentariosConversación pública de esta lección: dudas, datos por revisar, ideas.
Los comentarios viven en GitHub Discussions, en el repositorio público del curso; para escribir se necesita una cuenta de GitHub. Se cargan desde giscus.app al abrir esta sección. Las personas que revisan el curso los leen, y si un cambio se acepta, se aplica en los dos idiomas. Abrir el hilo en GitHub