Neural Network Training Labs
Clase 30 de 31 · Avanzada · Módulo 7 — Especializaciones avanzadas

🌫️ Difusión DDPM sobre Fashion-MNIST

Difusión DDPM sobre Fashion-MNIST

Antes de tocar el código

Si añadimos ruido en pasos pequeños conocemos exactamente la corrupción; la red aprende a estimar qué ruido retirar en cada instante.

Pregunta esencial: ¿Cómo aprende un modelo a invertir un proceso que destruye gradualmente la imagen?

Haz una predicción antes de ejecutar el notebook. Al final volverás a ella y tendrás que decir qué evidencia la confirmó, la corrigió o la dejó abierta.

Destruir de forma conocida para aprender a reconstruir

Mapa de esta clase: Destruir de forma conocida para aprender a reconstruir. La figura no es decorativa; úsala para explicar el mecanismo con tus propias palabras.

🎯 Qué vas a aprender y construir

Aprender predicción de ruido y muestreo iterativo sobre imágenes reales.

Práctica propia de esta clase: Visualizar la cadena directa e inversa y comparar calidad y latencia al cambiar pasos y cronograma.

Es la clase 30 de 31 del programa y pertenece a 🔬 el módulo 7, Especializaciones avanzadas. Llegas desde WGAN-GP sobre Fashion-MNIST y lo que hagas aquí lo da por supuesto Aprendizaje autosupervisado SimCLR.

Trabajarás con el dataset fashion_mnist (Torchvision / Zalando Research, licencia: MIT para código; consultar dataset), y tendrás que superar la línea base Autoencoder generativo simple, decidiendo con la métrica noise_mse medida sobre validation. Nivel avanzado, unas 8 horas de dedicación.

Qué recibe el modelo como entrada: imágenes Fashion-MNIST normalizadas.

Lo que conviene traer resuelto de las clases anteriores: CNN, probabilidad, modelos generativos.

Al terminar deberías ser capaz de:

Una idea que conviene desmontar

Menor error de predicción de ruido no garantiza automáticamente muestras perceptualmente mejores.

🧠 Comprender antes de entrenar

Esta sección es la explicación completa del tema. No hace falta abrir otro archivo para entender lo que viene después: aquí está la idea, la matemática que la sostiene y sus límites. (El mismo texto vive en theory.md, que es la fuente desde la que se genera esta guía, junto con la bibliografía del final.)

De qué trata

Las dos rutas generativas anteriores atacan el problema de frente: una GAN aprende a producir una imagen completa de un salto, a partir de ruido, y el entrenamiento consiste en un juego adversarial delicado. La difusión hace lo contrario, y esa inversión es la idea entera: en vez de aprender la tarea difícil de una vez, la descompone en muchos pasos fáciles.

El razonamiento es este. Destruir una imagen es trivial: se le añade un poco de ruido gaussiano, y repitiendo el gesto mil veces queda ruido puro. Cada paso individual de esa destrucción es tan pequeño que invertirlo también es fácil: dada una imagen apenas ruidosa, quitarle ese poco de ruido es un problema de regresión sencillo, no un problema creativo. Y si se sabe invertir cada paso, se sabe invertir la cadena entera: se parte de ruido puro y se deshace la destrucción hasta llegar a una imagen. Generar deja de ser un salto y pasa a ser un descenso gradual.

Eso cambia la naturaleza del entrenamiento por completo. No hay dos redes compitiendo, no hay equilibrio que mantener, no hay colapso de modos: hay una sola red y un error cuadrático medio. Se toma una imagen real, se elige un paso al azar, se la corrompe con un ruido conocido, y se entrena la red a adivinar exactamente ese ruido. Es supervisión pura, con la etiqueta generada por uno mismo, y por eso el entrenamiento es tan estable comparado con el de la clase 29.

El precio aparece en el otro extremo. Una GAN genera con una sola pasada por el generador; la difusión necesita recorrer la cadena entera, es decir cientos de evaluaciones de la red por muestra. Esa asimetría —entrenamiento estable y barato por paso, muestreo caro— es la característica que define a la familia, y es lo que este laboratorio mide de forma explícita en la latencia de muestreo.

La matemática, paso a paso

Un modelo de difusión aprende a generar imágenes invirtiendo un proceso que las destruye. El proceso directo (forward) parte de una imagen real x₀ y le añade ruido gaussiano en T pasos pequeños, según un cronograma de varianzas βₜ ∈ (0, 1) creciente:

q(xₜ | xₜ₋₁) = 𝒩(xₜ ; √(1 − βₜ)·xₜ₋₁, βₜ·I).

Tras muchos pasos, x_T se vuelve indistinguible de ruido puro 𝒩(0, I). Una propiedad clave permite saltar directamente a cualquier paso t sin iterar: definiendo αₜ = 1 − βₜ y ᾱₜ = Π_(s=1..t) αₛ, se obtiene la forma cerrada

q(xₜ | x₀) = 𝒩(xₜ ; √ᾱₜ·x₀, (1 − ᾱₜ)·I), equivalente a xₜ = √ᾱₜ·x₀ + √(1 − ᾱₜ)·ε, con ε ∼ 𝒩(0, I).

Así, para cualquier t, la imagen ruidosa es una mezcla determinista de la imagen original (peso √ᾱₜ) y ruido (peso √(1 − ᾱₜ)). A medida que t crece, ᾱₜ → 0 y domina el ruido.

Generar equivale a recorrer el proceso inverso p_θ(xₜ₋₁ | xₜ), partiendo de ruido y quitándolo paso a paso. El aporte central de DDPM (Ho, Jain y Abbeel) es que, en lugar de predecir directamente la media de esa distribución, la red neuronal ε_θ(xₜ, t) —una U-Net condicionada al paso t— se entrena para predecir el ruido ε que se añadió. El objetivo se simplifica a una regresión de error cuadrático medio sorprendentemente simple:

ℒ = 𝔼_(x₀, ε, t) [ ‖ ε − ε_θ(√ᾱₜ·x₀ + √(1 − ᾱₜ)·ε, t) ‖² ].

Es decir: se toma una imagen real, se elige un paso t al azar, se la corrompe con un ε conocido, y la red aprende a adivinar ese ε. Predecir el ruido resulta más estable y efectivo que predecir la media o la imagen limpia directamente, y conecta la difusión con la idea de score matching (aprender el gradiente ∇ log p(x) de la densidad de datos).

El muestreo inverso usa el ε predicho para dar un paso de denoising. La media del paso anterior se estima como

μ_θ(xₜ, t) = (1 / √αₜ) · ( xₜ − (βₜ / √(1 − ᾱₜ)) · ε_θ(xₜ, t) ),

y se muestrea xₜ₋₁ = μ_θ(xₜ, t) + σₜ·z con z ∼ 𝒩(0, I) (y z = 0 en el último paso). Repitiendo de t = T hasta t = 1 se transforma ruido en una muestra coherente. Esto explica el compromiso característico de la difusión: la calidad es alta, pero el muestreo es iterativo y por tanto costoso, pues requiere T evaluaciones de la red. Nichol y Dhariwal mejoraron el método aprendiendo también las varianzas y proponiendo cronogramas βₜ más suaves (p. ej. tipo coseno), que reparten mejor la dificultad entre pasos. La raíz teórica está en Sohl-Dickstein et al., que formularon la generación como difusión inversa inspirada en la termodinámica de no equilibrio. La línea base autoencoder generativo simple ofrece un punto de comparación de menor fidelidad.

De dónde sale esa pérdida tan simple

La forma final del objetivo parece demasiado buena para ser el resultado de una derivación probabilística, y conviene ver por qué lo es. Como en cualquier modelo de variables latentes, no se puede maximizar log p_θ(x₀) directamente, así que se maximiza una cota inferior variacional (ELBO). Descomponiéndola por pasos, queda

ℒ_VLB = 𝔼_q [ D_KL( q(x_T | x₀) ‖ p(x_T) ) + Σ_(t>1) D_KL( q(x_(t−1) | xₜ, x₀) ‖ p_θ(x_(t−1) | xₜ) ) − log p_θ(x₀ | x₁) ].

El primer término no depende de θ —el proceso directo es fijo y x_T es ruido puro por construcción—, así que desaparece de la optimización. Todo el trabajo está en los términos centrales, que comparan el paso inverso aprendido con el posterior verdadero del proceso directo. Y ese posterior tiene forma cerrada gaussiana, lo que es la pieza que hace tratable todo el método:

q(x_(t−1) | xₜ, x₀) = 𝒩( x_(t−1) ; μ̃ₜ(xₜ, x₀), β̃ₜ·I ),

con

μ̃ₜ(xₜ, x₀) = (√ᾱ_(t−1)·βₜ / (1 − ᾱₜ))·x₀ + (√αₜ·(1 − ᾱ_(t−1)) / (1 − ᾱₜ))·xₜ, β̃ₜ = ((1 − ᾱ_(t−1)) / (1 − ᾱₜ))·βₜ.

Nótese que este posterior está condicionado a x₀: sabiendo la imagen original, se sabe exactamente cómo desandar un paso. El modelo no dispone de x₀, y ahí está el problema que la red resuelve.

La KL entre dos gaussianas de igual varianza se reduce a la distancia entre sus medias, así que el término t-ésimo es proporcional a ‖μ̃ₜ(xₜ, x₀) − μ_θ(xₜ, t)‖². Ahora se usa la reparametrización: de xₜ = √ᾱₜ·x₀ + √(1 − ᾱₜ)·ε se despeja x₀ = (xₜ − √(1 − ᾱₜ)·ε) / √ᾱₜ, se sustituye en μ̃ₜ, y tras simplificar aparece justo la forma de μ_θ que se usa en el muestreo. La diferencia entre ambas medias se convierte entonces en la diferencia entre el ruido verdadero y el predicho, y el término queda

ℒ_t = ( βₜ² / (2·σₜ²·αₜ·(1 − ᾱₜ)) ) · ‖ ε − ε_θ(xₜ, t) ‖².

Ho, Jain y Abbeel observaron empíricamente que descartar ese coeficiente —fijarlo en 1 para todo t— da mejores muestras que conservarlo. Esa es la ℒ_simple que se implementa. La interpretación es que el peso original da mucha importancia a los pasos con t pequeño, donde queda poco ruido y la tarea es casi trivial; igualar los pesos obliga a la red a dedicar capacidad a los pasos intermedios, que son los que deciden la estructura global de la imagen. Es una decisión práctica que se aparta de la cota teórica y la documenta como tal.

El cronograma βₜ y qué cambia al elegirlo

El cronograma decide cuánta información se destruye en cada paso, y por tanto cómo se reparte la dificultad. El original es lineal, con βₜ creciendo de 10⁻⁴ a 0,02 en T = 1000 pasos. Su defecto es que ᾱₜ cae demasiado rápido al principio: buena parte de los pasos finales operan sobre entradas ya indistinguibles de ruido y aportan poco al aprendizaje.

Nichol y Dhariwal propusieron un cronograma coseno, definido directamente sobre ᾱₜ en vez de sobre βₜ:

ᾱₜ = f(t) / f(0), con f(t) = cos²( ((t/T + s) / (1 + s)) · (π/2) ),

y un desplazamiento pequeño s ≈ 0,008 que evita que βₜ sea demasiado pequeño cerca de t = 0. La curva resultante destruye información de forma más gradual en los extremos y concentra el cambio en el centro, que es donde la red tiene algo que aprender. La relación inversa βₜ = 1 − ᾱₜ/ᾱ_(t−1) permite recuperar el cronograma de varianzas a partir de cualquier ᾱₜ elegido.

En el muestreo queda por fijar σₜ, la varianza del paso inverso. Hay dos elecciones clásicas con garantía teórica —σₜ² = βₜ y σₜ² = β̃ₜ, que son las cotas superior e inferior del intervalo razonable— y dan resultados similares. Nichol y Dhariwal muestran que aprender una interpolación entre ambas mejora la verosimilitud, aunque no siempre la calidad visual percibida.

El costo del muestreo, en números

Cada muestra exige T evaluaciones de la U-Net, una por paso. Con T = 1000, generar una sola imagen cuesta mil pasadas hacia adelante; una GAN de calidad comparable cuesta una. Esa razón de tres órdenes de magnitud es la desventaja estructural de la difusión y explica toda la línea de investigación posterior sobre muestreadores acelerados, que buscan saltarse pasos sin degradar la muestra.

De ahí se sigue el compromiso que conviene tener presente al leer los resultados del laboratorio: reducir T abarata el muestreo pero engrosa cada paso de denoising, y llegado un punto la aproximación gaussiana del paso inverso deja de ser válida y las muestras se degradan. La sampling_latency que se reporta no es un detalle de ingeniería: es la mitad del perfil de esta familia de modelos.

Qué conviene graficar

Cadena de ruido, denoising, cuadrícula de muestras y costo por pasos. La cadena forward muestra cómo βₜ degrada la imagen; la secuencia de denoising ilustra la reconstrucción progresiva; la curva de costo por número de pasos T evidencia el compromiso entre calidad de muestreo y latencia.

Qué se mide y con qué se decide

La clase reporta noise_mse, sample_diversity, sampling_latency, reconstruction_proxy. De todas ellas, la que decide qué modelo se conserva es noise_mse, y se mide siempre sobre validation: es la única forma de que test siga siendo una estimación honesta de lo que pasará con datos nuevos.

📓 Los tres cuadernos

La clase se puede recorrer en Jupyter y trae tres cuadernos con papeles distintos. Los tres siguen el mismo camino —descargar el dataset real, auditar la partición, entrenar, sellar el experimento y evaluar test una vez—; lo que cambia es qué te toca escribir a ti:

Cuaderno Qué trae Cuándo usarlo
📓 notebook.ipynb El recorrido de referencia: 23 celdas (10 de código) con todo el código escrito y ejecutable, intercalado con las explicaciones. No trae ejercicios. Para leer y ejecutar de principio a fin.
✏️ notebook_student.ipynb El mismo recorrido más 8 ejercicios evaluables (38 celdas en total). Las celdas de ejercicio están marcadas con # YOUR CODE HERE y debajo de cada una hay una comprobación. Para practicar.
✅ notebook_solution.ipynb Los mismos ejercicios resueltos, marcados con # SOLUCIÓN DE REFERENCIA. Cada solución se ejecuta en la integración continua, así que se sabe que pasa. Para contrastar después de intentarlo.

Qué se practica en los ejercicios

Cinco de ellos cubren el contrato experimental común: auditar la partición, decidir con validation, compararse con la línea base, sellar antes de abrir test y dejar el plan por escrito. Se resuelven con Python estándar —sin descargar el dataset ni entrenar—, así que se corrigen en segundos y sin GPU, y cada uno está parametrizado con los valores de este laboratorio: su métrica de selección, su línea base y su experimento propio.

Cómo abrirlos

Los cuadernos necesitan el extra notebooks, que instala Jupyter junto con el paquete:

pip install -e ".[dev,notebooks]"
jupyter lab advanced_labs/29_diffusion_ddpm/notebook.ipynb

También se abren desde VS Code —con la extensión de Jupyter— haciendo doble clic en el archivo, o desde la interfaz clásica con jupyter notebook. El primer arranque descarga el dataset real desde su proveedor, así que la primera ejecución tarda más y requiere conexión.

Si prefieres ejecutar sin abrir un cuaderno, train.py hace exactamente lo mismo desde la terminal, y la sección de comandos de arriba explica cada opción.

🖥️ Los comandos, explicados

Todo el laboratorio se maneja con una sola herramienta de terminal, neural-labs, que se instala junto con el paquete (pip install -e ".[dev,notebooks]"). Cada subcomando hace una cosa del protocolo, y por eso se pueden ejecutar por separado: preparar datos, auditar la partición, entrenar, repetir con varias semillas.

La forma general es siempre la misma:

neural-labs <subcomando> --track <identificador> [opciones]
Opción Valor por defecto Valores Qué hace y cuándo cambiarla
--track 29_diffusion_ddpm obligatorio Qué especialización se entrena. Solo acepta los seis identificadores existentes.
--quick desactivado — Reduce datos y épocas para comprobar que la ruta corre de extremo a extremo.
--split-seed N 42 entero Semilla que decide qué ejemplo cae en qué partición. Se mantiene fija al comparar.
--training-seed N 42 entero Semilla de la inicialización de pesos y del barajado. Es la que se varía para medir dispersión.
--device auto auto · cpu · cuda · mps Dónde entrenar. auto elige GPU si la hay.
--output-dir runs-advanced ruta Dónde se escribe el directorio de la ejecución.

Lo mismo desde Python

from neural_labs.advanced.training import train_advanced

resultado = train_advanced(
    "29_diffusion_ddpm",
    quick=True,
    split_seed=42,
    training_seed=43,
)

print(resultado["run_dir"])
print(resultado["metrics"])

🪜 Laboratorio guiado

Cada paso dice qué ocurre por dentro, por qué se hace en ese orden y cómo comprobar que salió bien. El orden no es una convención de estilo: es el que ejecuta el código, y alterarlo invalida el resultado.

Paso 1 — Estudiar la teoría antes de ejecutar nada

Qué ocurre. Leer theory.md, que desarrolla Proceso directo de ruido, predicción de epsilon, cronograma beta y muestreo inverso. y cita las obras y papers de los que procede.

Por qué. Estas rutas usan arquitecturas donde un error de comprensión no se manifiesta como un fallo, sino como un número plausible pero equivocado.

Cómo sabes que salió bien. Puedes explicar qué mide noise_mse y por qué es la métrica de selección aquí.

Paso 2 — Ejecutar la versión rápida

Qué ocurre. Descarga el dataset y los pesos preentrenados desde su proveedor, entrena una versión reducida y escribe la ejecución en runs-advanced/.

Por qué. Antes de gastar horas de cómputo conviene comprobar que la descarga, el entorno y la ruta completa funcionan de extremo a extremo.

neural-labs train-advanced --track 29_diffusion_ddpm --quick

Cómo sabes que salió bien. Termina sin error y deja metrics.json, history.json y best_model.pt en el directorio de la ejecución.

Paso 3 — Entrenar en serio y seleccionar con validation

Qué ocurre. Se entrena el modelo completo conservando el checkpoint con el mejor valor de noise_mse en validación, y se sella el experimento antes de evaluar test.

Por qué. Igual que en las clases centrales: validation decide, test solo confirma, y el sello deja por escrito qué se había decidido antes de mirar.

neural-labs train-advanced --track 29_diffusion_ddpm --split-seed 42 --training-seed 43

Cómo sabes que salió bien. Existe experiment.lock.json y metrics.json incluye tanto el valor de validación como el de test.

Paso 4 — Repetir con otra semilla de entrenamiento

Qué ocurre. Se repite el entrenamiento con la misma partición y distinta semilla de entrenamiento.

Por qué. Estas arquitecturas —adversariales, contrastivas, de difusión— son especialmente sensibles a la inicialización: una sola ejecución no permite distinguir una mejora de una casualidad.

neural-labs train-advanced --track 29_diffusion_ddpm --split-seed 42 --training-seed 44

Cómo sabes que salió bien. Puedes reportar el rango entre ejecuciones, no un único número.

Paso 5 — Documentar los límites

Qué ocurre. Registrar el resultado junto con la limitación declarada de la ruta y responder assessment.md.

Por qué. En generación y aprendizaje autosupervisado las métricas son aproximaciones: sin declarar qué NO demuestran, invitan a conclusiones que los números no sostienen.

Cómo sabes que salió bien. Tu reporte dice qué mejoró, cuánto costó y en qué condiciones no esperarías el mismo resultado.

🔍 Cómo leer lo que produce la ejecución

Cada ejecución escribe su propio directorio con nombre único, de modo que dos corridas nunca se pisan. Esto es lo que encontrarás dentro:

Archivo Qué contiene y qué mirar
config.json Track, semillas, dispositivo y opciones con las que se lanzó.
dataset_manifest.json Fuente, licencia y número de ejemplos por partición.
best_model.pt El checkpoint seleccionado por validación.
experiment.lock.json El sello: qué se decidió antes de abrir test.
history.json La métrica de validación época a época.
metrics.json Resultado de validación y de test, ya con el modelo congelado.

⚠️ Dónde suele perderse la gente

Riesgos al interpretar los resultados

El modelo pequeño sirve para estudio; no debe extrapolarse a generación fotográfica de alta resolución. El error de predicción de ruido (noise_mse) mide qué tan bien se estima ε, pero no equivale directamente a calidad perceptual, y los proxies de diversidad no descartan memorización de ejemplos del entrenamiento.

✅ Antes de darlo por terminado

La clase está aprobada cuando se cumplen estos criterios:

Y cuando tienes estos entregables:

El plan experimental con la tabla que hay que completar está en experiments.md, y las preguntas con su rúbrica, en assessment.md. Ambos documentos se abren desde la barra de navegación de arriba.

Para ir más lejos

📚 Fuentes

La teoría de arriba no es original de este repositorio: se apoya en la literatura de referencia del área y en los papers originales de cada arquitectura. Estas son las obras concretas, y lo que aporta cada una:

Las referencias apuntan a las obras; no se reproduce su contenido, la redacción es original.

Los archivos de este laboratorio

Todo lo que necesitas está en esta carpeta. Cada enlace abre el archivo directamente:

Archivo Qué es
📄 README.md Esta guía.
🧠 theory.md La teoría completa con su bibliografía; es la fuente del apartado teórico de arriba.
🔬 experiments.md El plan experimental y la tabla multi-semilla que hay que completar.
📝 assessment.md Las preguntas de evaluación y la rúbrica con la que se corrigen.
🧑‍🏫 instructor-guide.md La apertura, los tiempos y las intervenciones sugeridas para facilitar esta clase.
📓 notebook.ipynb El recorrido completo con todo el código escrito y ejecutable.
✏️ notebook_student.ipynb El mismo recorrido con las celdas de ejercicio vacías.
✅ notebook_solution.ipynb Los ejercicios resueltos, para contrastar.
🖥️ train.py El mismo entrenamiento desde la terminal, sin abrir un cuaderno.
🎛️ configs/baseline.yaml Épocas, lote, tasa de aprendizaje y qué recorta --quick.
🎚️ configs/improved.yaml La configuración ampliada que se compara contra la base.
🗄️ data/dataset.yaml Fuente, licencia, política de partición y límites del dataset.
🧾 lesson.yaml Nivel, prerrequisitos, resultados de aprendizaje y criterios.
🖥️ index.html Esta misma clase como página autocontenida, para leerla sin conexión.

Y fuera de la carpeta, tres referencias que esta guía usa: el catálogo configs/advanced_tracks.yaml —de donde salen el objetivo, la línea base y las métricas—, el código src/neural_labs/advanced/training.py —que define el orden de los pasos y los archivos que escribe cada ejecución— y docs/experiment-protocol.md, con la regla general del protocolo.

Los datasets se descargan de su proveedor original y conservan su licencia; este repositorio no los redistribuye ni sustituye una descarga fallida por datos generados.

🔬 Experimentos

Plan de experimentos — Difusión DDPM sobre Fashion-MNIST

Qué significa «experimentar» aquí

Entrenar un modelo y mirar el número que sale no es un experimento: es una observación. Un experimento empieza por una afirmación que podría resultar falsa, sigue fijando todo lo que no se está poniendo a prueba, y termina midiendo si la afirmación se sostiene cuando se repite.

La diferencia importa porque el entrenamiento de una red tiene azar por dentro: la inicialización de los pesos y el orden en que se barajan los lotes cambian el resultado aunque no cambies nada más. Si comparas una sola corrida contra otra sola corrida, no sabes si la diferencia viene de tu idea o de la semilla. Por eso todo lo que sigue está organizado para separar la señal (el efecto de lo que cambiaste) del ruido (la variabilidad propia del entrenamiento).

La hipótesis de este laboratorio

Aprender predicción de ruido y muestreo iterativo sobre imágenes reales.

Formulada como algo que se puede refutar: el modelo de este laboratorio supera a Autoencoder generativo simple en noise_mse, y la diferencia es mayor que la dispersión entre semillas.

Qué la haría falsa —y esto también es un resultado que hay que reportar—:

El experimento propio de esta clase

Además de la comparación con la línea base, aquí interesa una pregunta específica: Comparar 100 y 500 pasos, cronograma lineal y coseno, con igual dataset. Es la comparación que da sentido al tema de este laboratorio; la de la línea base solo dice si el modelo sirve, mientras que esta dice qué parte del diseño es la que aporta.

Qué se varía y qué se mantiene fijo

Un experimento es interpretable cuando cambia una cosa a la vez. Esta tabla dice qué papel juega cada elemento y, sobre todo, por qué:

Elemento En este experimento Por qué
Partición de los datos (--split-seed) Fija en 42 Si cambiara entre corridas, no podrías saber si la diferencia viene de tu modelo o de que le tocaron datos distintos.
Semilla de entrenamiento (--training-seed) Varía: 41, 42, 43 Es exactamente el ruido que quieres medir. Sin varias semillas no tienes con qué comparar la mejora.
Configuración (--config) Varía: baseline y improved Es la intervención bajo estudio: lo único que estás poniendo a prueba.
Dataset y preprocesamiento Fijos Ajustar la normalización o el vocabulario con otros datos cambiaría el problema, no el modelo.
Presupuesto de épocas y criterio de parada Fijos dentro de cada configuración Dar más épocas a una variante que a otra es comparar dos cosas distintas.
Hardware y versiones Registrados en environment.json No siempre se pueden fijar, pero sí dejar anotados: explican diferencias de tiempo y, a veces, de resultado.
El conjunto test Intacto hasta el final Se abre una sola vez, después de que noise_mse sobre validation haya elegido al ganador.

Cómo ejecutar la serie

En las especializaciones no hay comando de repetición automática: se lanza el entrenamiento una vez por semilla, manteniendo fija la partición.

neural-labs train-advanced --track 29_diffusion_ddpm --split-seed 42 --training-seed 41
neural-labs train-advanced --track 29_diffusion_ddpm --split-seed 42 --training-seed 42
neural-labs train-advanced --track 29_diffusion_ddpm --split-seed 42 --training-seed 43

Cada corrida escribe su propio directorio en runs-advanced/, con metrics.json e history.json.

La tabla que debes completar

Variante Semilla Métrica en validation Métrica en test Tiempo Parámetros Observación
baseline 41
baseline 42
baseline 43
improved 41
improved 42
improved 43

De dónde sale cada columna, para que no haya que adivinarlo:

Cómo decidir con esos números

  1. Compara medias, pero decide con la dispersión. Calcula media y desviación entre las tres semillas de cada variante. Una mejora de 0,3 puntos entre variantes cuya dispersión interna es de 1,2 puntos no es una mejora: es ruido con buena suerte.
  2. Si los rangos se solapan, dilo. «No se observó una diferencia distinguible del ruido con tres semillas» es una conclusión legítima y mucho más útil que un número inventado de confianza.
  3. Decide con validation. La columna de test sirve para reportar el resultado final una vez, no para elegir la variante ganadora.
  4. El costo forma parte del resultado. Si improved gana por poco y cuesta el triple de tiempo, la conclusión honesta menciona ambas cosas.
  5. Vuelve a la línea base. La comparación contra Autoencoder generativo simple es la que dice si todo el aparato de la red neuronal estaba justificado para este problema.

Qué debe decir tu conclusión

Una conclusión completa contiene cinco cosas, y se puede escribir en un párrafo:

Errores de diseño que invalidan el experimento

📝 Evaluación

Evaluación — Difusión DDPM sobre Fashion-MNIST

Cómo se evalúa esta clase

No se evalúa el número final. Un modelo con una métrica alta obtenida mirando test, o sin compararse con nada, vale menos que uno modesto cuyo resultado se puede auditar. Lo que se califica es el proceso: si las particiones están limpias, si la decisión se tomó donde debía, si la conclusión distingue lo que se midió de lo que se supone.

Evidencias que debes entregar

Evidencia Dónde vive Por qué se pide
Dataset preparado y auditado salida de neural-labs audit Es la única prueba de que el resultado no está contaminado por una fuga entre particiones.
Notebook ejecutado sin celdas omitidas notebook.ipynb Una celda saltada suele ser justo la que rompía el argumento.
Comparación contra Autoencoder generativo simple metrics.json y baseline_metrics.json Sin línea base, una métrica no dice si el modelo aporta algo.
Al menos tres semillas de entrenamiento, o la justificación de por qué no salida de benchmark Una sola corrida no permite separar mejora de azar.
Análisis de errores y limitaciones tu reporte Saber dónde falla vale más que saber cuánto acierta.
Model card actualizada model_card.md Es lo que permite a otra persona saber cuándo no debería usar tu modelo.

Las preguntas, y qué se busca en tu respuesta

No se corrige la longitud de la respuesta, sino si demuestra comprensión. Debajo de cada pregunta está lo que una buena respuesta debería contener.

1. ¿Cómo aprende un modelo a invertir un proceso que destruye gradualmente la imagen?

Qué se busca: Comienza con la predicción que hiciste al abrir la clase y contrástala con una gráfica, una medida o una observación concreta de tu ejecución.

2. Explica con tus palabras: Proceso directo de ruido, predicción de epsilon, cronograma beta y muestreo inverso.

Qué se busca: Una buena respuesta conecta cuatro cosas —cómo se representa la entrada, qué calcula el modelo, qué mide la función de pérdida y cómo se actualizan los pesos— en vez de repetir la definición del libro. Si puedes explicarlo sin la fórmula delante, lo entendiste.

3. ¿Qué información del dataset solo puede usarse durante el entrenamiento?

Qué se busca: Se espera que nombres casos concretos: las estadísticas de normalización, el vocabulario, la selección de variables, los umbrales. Todo eso se ajusta solo con train; calcularlo sobre el conjunto completo es una fuga silenciosa que infla el resultado sin dar ningún aviso.

4. ¿Por qué Autoencoder generativo simple es una comparación razonable para este problema?

Qué se busca: Una buena respuesta explica qué captura la línea base y qué no, y por qué superarla —o no superarla— es informativo aquí. Si la línea base ya resuelve el problema, la conclusión correcta es que la red no estaba justificada.

5. ¿Qué aprendiste al realizar esta práctica: Visualizar la cadena directa e inversa y comparar calidad y latencia al cambiar pasos y cronograma.?

Qué se busca: No basta con relatar los pasos. Explica qué cambió, por qué cambió y qué resultado te haría rechazar tu interpretación inicial.

6. Refuta con evidencia esta idea frecuente: «Menor error de predicción de ruido no garantiza automáticamente muestras perceptualmente mejores.»

Qué se busca: Se busca una refutación situada en esta materia, apoyada en el mecanismo estudiado y en los resultados obtenidos, no una negación genérica.

7. ¿Qué te dice noise_mse que no te dirían las otras métricas?

Qué se busca: Cada métrica pondera distinto los errores. Se espera que expliques por qué esa es la que decide aquí y en qué situación sería una mala elección.

8. ¿Qué cambiarías antes de usar este modelo fuera del laboratorio?

Qué se busca: Aquí se evalúa el criterio, no la técnica: licencias y condiciones de uso de fashion_mnist, representatividad de la población, calibración de las probabilidades, vigilancia de la deriva, desempeño por subgrupo y supervisión humana. Un «funcionaría bien» sin condiciones se corrige como respuesta incompleta.

La rúbrica, explicada

Criterio Insuficiente Adecuado Excelente Peso
Integridad de los datos mezcla particiones o no puede demostrar que no lo hizo las tres particiones están separadas y auditadas además documenta hashes, política de partición y justifica la estrategia elegida 20 %
Implementación no ejecuta o produce resultados irreproducibles entrena y evalúa siguiendo el protocolo código claro y reutilizable, con las decisiones explicadas 20 %
Diseño experimental un solo resultado aislado comparación controlada contra la línea base varias semillas, dispersión reportada y variables controladas explícitas 20 %
Análisis repite las métricas sin interpretarlas interpreta los errores y su distribución identifica sesgos, límites y costo, y distingue evidencia de suposición 25 %
Comunicación incompleta o sin contexto reporte entendible y model card presente conclusiones verificables por un tercero a partir de los artefactos 15 %

La diferencia entre adecuado y excelente casi nunca está en la métrica: está en si el trabajo permite que otra persona llegue a la misma conclusión con los artefactos que dejaste. Un resultado peor, bien medido y bien explicado, se califica por encima de uno mejor que no se puede auditar.

La aprobación exige al menos 70 % y cero errores críticos de fuga de datos. La fuga es eliminatoria por sí sola porque invalida todas las demás cifras del trabajo, por buenas que parezcan.

Autoevaluación antes de entregar

🧑‍🏫 Guía docente

Guía docente — Clase 30: Difusión DDPM sobre Fashion-MNIST

Módulo 7: Especializaciones avanzadas · Esta guía acompaña a quien facilita la clase; no es un guion que deba leerse literalmente.

La conversación que abre la clase

Si añadimos ruido en pasos pequeños conocemos exactamente la corrupción; la red aprende a estimar qué ruido retirar en cada instante.

Plantee primero esta pregunta y permita que el grupo formule una predicción antes de mostrar código:

¿Cómo aprende un modelo a invertir un proceso que destruye gradualmente la imagen?

Qué debe quedar comprendido

Secuencia sugerida

Momento Duración Acción docente Evidencia del estudiante
Activación 10 min Presentar el caso inicial y recoger predicciones. Explica qué espera observar y por qué.
Construcción 25 min Conectar intuición, representación y matemática. Dibuja o relata el mecanismo con sus propias palabras.
Demostración 25 min Recorrer el mapa visual y ejecutar el ejemplo mínimo. Interpreta cada transición sin limitarse a describir la figura.
Investigación 35 min Guiar la práctica propia de esta clase. Contrasta su predicción con una medida o gráfica.
Cierre 15 min Volver a la pregunta esencial y discutir límites. Entrega una conclusión breve con evidencia y una duda abierta.

Práctica propia de esta materia

Visualizar la cadena directa e inversa y comparar calidad y latencia al cambiar pasos y cronograma.

Destruir de forma conocida para aprender a reconstruir

La figura es un punto de entrada. Pida al estudiante que explique qué cambia entre los tres pasos y qué resultado observable invalidaría su explicación.

Dificultad conceptual que conviene provocar

Idea engañosa: Menor error de predicción de ruido no garantiza automáticamente muestras perceptualmente mejores.

No la corrija inmediatamente. Solicite un ejemplo o contraejemplo, ejecute una comparación y recién entonces reconstruya la explicación con el grupo.

Preguntas para acompañar sin resolver

Cierre verificable

La clase termina cuando el estudiante puede responder la pregunta esencial, interpretar su visualización y señalar al menos una limitación. Una métrica aislada no reemplaza ninguna de esas tres evidencias.