¿Por qué SD 1.5 tenía problemas a alta resolución?

Stable Diffusion 1.5 fue entrenado a resolución 512x512 . Funcionaba notablemente bien dentro de ese marco, pero los usuarios querían imágenes de 1024x1024. ¿Qué sucede cuando simplemente duplicas el lienzo? El modelo produce objetos repetidos, patrones en mosaico y distorsiones anatómicas. Los rostros aparecen dos veces. Los edificios se duplican. La composición se desmorona.

La razón es arquitectónica, no una cuestión de calidad de difusión. La U-Net fue entrenada en latentes de 512x512 (64x64 en el espacio latente después del submuestreo 8x del VAE). En tiempo de inferencia, pedirle que elimine ruido de un latente de 128x128 (correspondiente a 1024x1024 píxeles) significa que cada capa convolucional y de atención ve dimensiones espaciales que nunca encontró durante el entrenamiento. La estructura posicional que la red aprendió — dónde tienden a aparecer los objetos, cómo se organizan las composiciones — está calibrada para mapas de características de 64x64, no de 128x128. El modelo no "sabe" que el lienzo más grande es una imagen coherente; trata parches de él como ventanas separadas de 64x64, produciendo los artefactos de duplicación característicos.

Surgieron dos estrategias arquitectónicas para resolver esto. La primera: entrenar un modelo mucho más grande nativamente a mayor resolución. Eso es SDXL . La segunda: generar una imagen pequeña primero, luego escalarla progresivamente con modelos especializados de super-resolución. Ese es el enfoque en cascada , pionero de Imagen. Ambas estrategias terminaron convergiendo — SDXL mismo usa una cascada de dos etapas con su modelo refinador.

SDXL: escalando la U-Net

SDXL (Podell et al., 2023) tomó el enfoque de fuerza bruta: hacer la U-Net mucho más grande y entrenarla nativamente a 1024x1024. El resultado es una U-Net de 3.5 mil millones de parámetros, aproximadamente 4x más grande que los ~860M parámetros de SD 1.5. Pero los cambios van mucho más allá del conteo de parámetros.

El primer cambio importante es el codificador de texto dual . SD 1.5 usaba un único codificador de texto CLIP-L produciendo embeddings de 768 dimensiones. SDXL concatena las salidas de dos codificadores de texto: CLIP-L (768-dim) y OpenCLIP-G (1280-dim). El vector de condicionamiento concatenado es:

$$c_{\text{text}} = [\text{CLIP-L}(\text{prompt}); \; \text{OpenCLIP-G}(\text{prompt})] \in \mathbb{R}^{77 \times 2048}$$

Aquí 77 es la longitud de la secuencia de tokens y 2048 = 768 + 1280 es la dimensión de embedding combinada. ¿Por qué dos codificadores? Cada uno fue entrenado en distribuciones de datos diferentes con objetivos diferentes. CLIP-L es fuerte en leyendas cortas y descriptivas. OpenCLIP-G fue entrenado en datos LAION con descripciones más largas y detalladas. Concatenarlos da a la U-Net una señal de texto más rica — el modelo puede atender a la representación del codificador que sea más informativa para un aspecto dado del prompt. En los límites: si estableces los embeddings de OpenCLIP-G a cero (equivalente a usar solo CLIP-L), la calidad de imagen se degrada notablemente, confirmando que el codificador más grande contribuye señal significativa más allá de lo que CLIP-L captura solo.

La segunda innovación importante es el micro-condicionamiento . Los datasets de entrenamiento reales contienen imágenes a resoluciones muy diferentes, y la práctica común es redimensionarlas y recortarlas a una resolución de entrenamiento fija. Esto introduce dos problemas: (1) el modelo aprende los artefactos de imágenes submuestreadas (desenfoque, pérdida de detalle), y (2) el modelo aprende el sesgo de imágenes recortadas (objetos cortados en los bordes, composiciones centradas). SDXL resuelve ambos codificando los metadatos de la imagen original como entradas de condicionamiento adicionales.

Para el condicionamiento por tamaño original , el modelo recibe la altura y el ancho de la imagen fuente antes de cualquier redimensionamiento. Estos se codifican mediante embeddings sinusoidales (del mismo tipo usado para los pasos de tiempo en modelos de difusión) y se añaden al embedding del paso de tiempo:

$$e_{\text{size}} = \text{MLP}\bigl(\text{fourier}(h_{\text{orig}}) \| \text{fourier}(w_{\text{orig}})\bigr)$$
💡 ¿Por qué ayuda esto? Considera dos imágenes de entrenamiento ambas recortadas a 1024x1024: una era originalmente 4000x3000 (una foto de alta resolución) y la otra era 256x256 (una miniatura de baja calidad escalada). Sin condicionamiento por tamaño, el modelo ve entradas idénticas de 1024x1024 y debe aprender a producir salidas que promedien ambos niveles de calidad. Con condicionamiento por tamaño, puede aprender que $h_{\text{orig}} = 256$ significa material fuente borroso y $h_{\text{orig}} = 4000$ significa detalle nítido. En tiempo de inferencia, establecemos $h_{\text{orig}} = w_{\text{orig}} = 1024$ (o superior) para solicitar la salida de máxima calidad.

Para el condicionamiento por recorte , el modelo recibe las coordenadas de recorte superior-izquierda $(c_{\text{top}}, c_{\text{left}})$ usadas durante el entrenamiento:

$$e_{\text{crop}} = \text{MLP}\bigl(\text{fourier}(c_{\text{top}}) \| \text{fourier}(c_{\text{left}})\bigr)$$

En el límite donde $c_{\text{top}} = c_{\text{left}} = 0$ (sin desplazamiento de recorte), el modelo genera imágenes con el sujeto correctamente encuadrado y centrado. Cuando las coordenadas de recorte son grandes, el modelo ha aprendido que la imagen de entrenamiento era un recorte periférico — los objetos pueden estar parcialmente fuera del marco. En inferencia, establecer ambas a cero le dice al modelo: "esta es una composición completa, sin recortar", eliminando el problema de sesgo central que afectaba a modelos anteriores.

El embedding total de micro-condicionamiento es la suma de los embeddings de tamaño y recorte, añadida al embedding del paso de tiempo de difusión $e_t$:

$$e = e_t + e_{\text{size}} + e_{\text{crop}}$$

Este embedding combinado se inyecta en cada bloque residual de la U-Net a través de normalización de grupo adaptativa (el mismo mecanismo usado para el condicionamiento por paso de tiempo). La sobrecarga es insignificante — unas pocas capas MLP extra — pero la mejora de calidad es sustancial.

El refinador SDXL: una cascada mínima

Incluso con un modelo base de 3.5B parámetros entrenado a 1024x1024, los autores de SDXL encontraron que la calidad de imagen mejoraba aún más con un proceso de dos etapas. El refinador SDXL es un modelo de difusión separado entrenado específicamente en la porción de bajo ruido del schedule de eliminación de ruido — los pasos finales donde se renderizan detalles finos como textura de piel, tejido de tela y bordes nítidos.

El proceso funciona de la siguiente manera. El modelo base ejecuta el schedule completo de eliminación de ruido desde ruido puro ($t = T$) hasta algún nivel intermedio de ruido ($t = t_{\text{switch}}$). En ese punto, el latente parcialmente sin ruido se pasa al refinador, que completa los pasos restantes desde $t_{\text{switch}}$ hasta $t = 0$. El punto de cambio es un hiperparámetro — típicamente alrededor de $t_{\text{switch}} = 0.2T$ a $0.3T$, lo que significa que el base maneja aproximadamente 70-80% de la eliminación de ruido y el refinador maneja el 20-30% final.

¿Por qué ayuda esto? Diferentes niveles de ruido requieren diferentes habilidades. A niveles altos de ruido ($t$ cerca de $T$), el modelo toma decisiones globales: composición general, ubicación de objetos, paleta de colores. A niveles bajos de ruido ($t$ cerca de 0), el modelo refina detalles locales: nitidez, textura, estructuras finas. Un solo modelo debe ser bueno en ambas cosas, lo cual es un problema desafiante de aprendizaje multitarea. Dividir el trabajo entre dos modelos especializados permite que cada uno se enfoque en lo que mejor hace.

Alternativamente, el refinador puede operar en modo SDEdit (Meng et al., 2022) : tomar la salida completamente sin ruido del modelo base, añadirle una cantidad controlada de ruido (al nivel de ruido $t_{\text{edit}}$), y luego eliminar ruido nuevamente con el refinador. Esto es matemáticamente equivalente a:

$$\mathbf{z}_{\text{noised}} = \sqrt{\bar{\alpha}_{t_{\text{edit}}}} \, \mathbf{z}_{\text{base}} + \sqrt{1 - \bar{\alpha}_{t_{\text{edit}}}} \, \boldsymbol{\epsilon}, \quad \boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \mathbf{I})$$

Cuando $t_{\text{edit}}$ es pequeño (digamos 0.1T), solo se perturban y regeneran detalles finos — la composición general se preserva. Cuando $t_{\text{edit}}$ es grande (digamos 0.5T), el refinador tiene libertad para alterar sustancialmente la imagen. Esto da a los practicantes una perilla controlable: $t_{\text{edit}}$ pequeño para mejora de detalles, $t_{\text{edit}}$ grande para refinamiento más agresivo.

Este diseño de dos modelos es la forma más simple de una arquitectura de difusión en cascada : múltiples modelos de difusión encadenados, cada uno responsable de un nivel diferente de detalle. La cascada de SDXL es mínima (misma resolución, dos etapas), pero el principio se escala a cascadas mucho más profundas.

Imagen: el codificador de texto es lo que más importa

Imagen de Google (Saharia et al., 2022) llevó la cascada a su extremo lógico con un pipeline de tres etapas, y en el proceso reveló un hallazgo sorprendente: escalar el codificador de texto mejora la calidad de imagen más que escalar el modelo de difusión .

Imagen usa T5-XXL (4.6B parámetros) como su codificador de texto — un modelo de lenguaje preentrenado y congelado mucho más grande que CLIP. Los autores realizaron experimentos controlados: mantener fijo el modelo de difusión y escalar el codificador de texto de T5-Small (60M) a T5-XXL (4.6B) mejoró las puntuaciones FID y las calificaciones de preferencia humana dramáticamente. Escalar el modelo de difusión por el mismo factor ayudó mucho menos. La explicación es intuitiva: el modelo de difusión solo puede generar lo que entiende del condicionamiento de texto. Una representación de texto más rica y matizada da al modelo de difusión mejores instrucciones a seguir.

La arquitectura es una cascada de tres etapas, donde cada etapa es un modelo de difusión separado entrenado independientemente:

  • Etapa 1 — Modelo base: genera imágenes de 64x64 condicionadas en embeddings de texto T5-XXL. Aquí es donde se decide todo el contenido semántico: composición, objetos, relaciones, estilo.
  • Etapa 2 — Super-resolución 64 a 256: toma la salida de 64x64 y la escala a 256x256, añadiendo detalle de escala media como límites de objetos y texturas de superficie.
  • Etapa 3 — Super-resolución 256 a 1024: toma la salida de 256x256 y la escala al 1024x1024 final, añadiendo detalle de grano fino como hebras de cabello, renderizado de texto y propiedades de materiales.

¿Por qué esta cascada es mucho más barata que generar 1024x1024 directamente? El costo del proceso de difusión escala aproximadamente con el número de píxeles (ya que la U-Net debe procesar mapas de características a esa resolución espacial para cada paso de eliminación de ruido). Compara los conteos de píxeles:

$$\text{Direct: } 1024^2 = 1{,}048{,}576 \text{ pixels}$$
$$\text{Cascade: } 64^2 + 256^2 + 1024^2 = 4{,}096 + 65{,}536 + 1{,}048{,}576 = 1{,}118{,}208 \text{ pixels}$$

A primera vista el conteo total de píxeles parece similar — la etapa final aún procesa 1024x1024. Pero la idea clave es que el número de pasos de eliminación de ruido difiere dramáticamente entre etapas. El modelo base (64x64) requiere muchos pasos para construir la composición semántica completa desde el ruido — típicamente 50-100 pasos. Los modelos de super-resolución necesitan muchos menos pasos (20-30) porque parten de una imagen estructurada, no de ruido puro. El razonamiento semántico costoso ocurre a 64x64 ($4{,}096$ píxeles), no a 1024x1024 ($1{,}048{,}576$ píxeles). Eso es una reducción de 256x en costo espacial para la parte más difícil de la generación.

💡 El principio de cascada se generaliza: cada vez que puedes dividir la generación en "decidir qué generar" (barato, baja resolución) y "añadir detalle" (condicionado en estructura existente), ahorras cómputo. Las etapas de super-resolución son modelos mucho más simples porque no necesitan resolver el problema más difícil de composición desde cero — solo necesitan alucinar detalle de alta frecuencia plausible consistente con la entrada de baja resolución.

Cada modelo de super-resolución en Imagen está condicionado tanto en el embedding de texto como en la imagen de baja resolución de la etapa anterior. La imagen de baja resolución se escala (mediante interpolación bilineal) a la resolución objetivo y se concatena canal por canal con la entrada ruidosa:

$$\mathbf{x}_{\text{input}} = [\mathbf{z}_t; \; \text{upsample}(\mathbf{x}_{\text{low-res}})] \in \mathbb{R}^{H \times W \times (C + C_{\text{low}})}$$

Donde $\mathbf{z}_t$ es el objetivo ruidoso en el paso de tiempo $t$, y $\mathbf{x}_{\text{low-res}}$ es la salida de la etapa de cascada anterior. El modelo aprende a usar la estructura de baja resolución como guía mientras llena el detalle de alta frecuencia faltante. Imagen también aplica aumento de ruido a la imagen de condicionamiento de baja resolución durante el entrenamiento: añadiendo ruido gaussiano a un nivel aleatorio $s$ (extraído de un schedule). Esto evita que el modelo de super-resolución se vuelva frágil — si entrena solo con entradas de baja resolución limpias, cualquier imperfeción en la salida del modelo base en tiempo de inferencia causará errores en cascada.

Trucos de condicionamiento que rinden por encima de su peso

El micro-condicionamiento de SDXL (metadatos de tamaño y recorte) es parte de un patrón más amplio en el diseño de modelos de difusión: convertir metadatos baratos en señales de condicionamiento potentes. Estos trucos requieren cambios arquitectónicos mínimos pero mejoran significativamente la calidad de generación.

La técnica de condicionamiento por puntuación estética , usada en modelos como Stable Diffusion 2.1 y DeepFloyd IF, añade una calificación de calidad escalar al condicionamiento. Durante el entrenamiento, cada imagen es puntuada por un predictor estético preentrenado (típicamente una sonda lineal sobre embeddings de CLIP). La puntuación se codifica con Fourier y se añade al embedding del paso de tiempo, igual que el condicionamiento de tamaño y recorte. En inferencia, establecer la puntuación estética a un valor alto (por ejemplo, 7.0 en una escala de 1-10) sesga al modelo hacia generar imágenes que coinciden con las cualidades visuales — nitidez, composición, armonía de color — asociadas con imágenes de entrenamiento bien calificadas.

Todas estas señales de condicionamiento comparten la misma forma matemática. Dado un valor de metadatos escalar o vectorial $m$, codíficalo vía características de Fourier y proyéctalo a la dimensión oculta del modelo:

$$e_m = \text{Linear}\bigl(\text{SiLU}(\text{Linear}(\text{fourier}(m)))\bigr)$$

La codificación de Fourier mapea el escalar a una representación sinusoidal de alta dimensión (la misma técnica usada para pasos de tiempo de difusión), y el MLP de dos capas con activación SiLU lo proyecta al espacio de embedding del modelo. Esto se añade al embedding del paso de tiempo $e_t$ y se inyecta en cada bloque residual vía normalización adaptativa. La idea clave: cualquier pieza de metadatos que se correlacione con propiedades de la imagen puede convertirse en una señal de condicionamiento de esta manera. El modelo aprende a separar estos factores durante el entrenamiento, y en tiempo de inferencia podemos establecer cada factor independientemente.

Considera qué sucede en los extremos del condicionamiento estético. En la puntuación mínima ($\sim$1.0), el modelo genera imágenes que se parecen a los datos de entrenamiento de menor calidad: borrosas, mal compuestas, descoloridas. En la puntuación máxima ($\sim$10.0), la calidad mejora dramáticamente, pero el modelo también puede reducir la diversidad — gravita hacia un conjunto más estrecho de composiciones "convencionalmente atractivas". Hay un compromiso entre calidad y diversidad que refleja lo que vemos con la fuerza de guía sin clasificador.

💡 La lección de las innovaciones de condicionamiento de SDXL es que no siempre necesitas un modelo más grande — a veces solo necesitas mejores metadatos. Decirle al modelo cuál era la resolución de la imagen fuente, dónde fue recortada y qué tan estéticamente agradable es son señales esencialmente gratuitas que reducen significativamente la ambigüedad que el modelo debe resolver por sí solo.

Los límites de las arquitecturas U-Net

SDXL empujó la arquitectura U-Net a su límite práctico. Con 3.5B parámetros, el modelo ya es costoso de entrenar y ejecutar. Pero más importante, la U-Net tiene restricciones arquitectónicas fundamentales que ninguna cantidad de escalado puede superar.

Las U-Nets están construidas principalmente a partir de capas convolucionales , que tienen dos sesgos inductivos clave: localidad (cada píxel de salida depende solo de un pequeño vecindario espacial definido por el tamaño del kernel) y equivarianza traslacional (un patrón se reconoce de la misma manera sin importar dónde aparezca). Estos sesgos son excelentes para datos espaciales — por eso las CNNs dominaron la visión por computadora durante una década. Pero también limitan la capacidad del modelo para razonar sobre estructura global.

Considera generar una imagen de "una persona sosteniendo un espejo que refleja su rostro". El modelo debe asegurar que el reflejo sea espacialmente consistente con la persona — el rostro en el espejo debe coincidir con el rostro reflejado, posicionado correctamente dado el ángulo del espejo. Las capas convolucionales con kernels de 3x3 solo pueden propagar información a través de toda la imagen apilando muchas capas (el campo receptivo crece linealmente con la profundidad). Las capas de auto-atención, que SDXL incluye en ciertas resoluciones (mapas de características de 32x32 y 16x16), permiten razonamiento global, pero son computacionalmente costosas:

$$\text{Self-attention cost} = \mathcal{O}(n^2 \cdot d)$$

donde $n$ es el número de tokens espaciales (píxeles o parches) y $d$ es la dimensión de embedding. Para un mapa de características de 64x64, $n = 4{,}096$ y $n^2 = 16{,}777{,}216$ — ya costoso. Para un mapa de características de 128x128, $n = 16{,}384$ y $n^2 \approx 268$ millones. Este escalado cuadrático es la razón por la que SDXL solo aplica atención en los niveles de resolución más baja de la U-Net, no a resolución completa. Las capas de mayor resolución (mapas de características de 64x64 y 128x128 en espacio latente) usan solo convoluciones, lo que significa que no tienen mecanismo para razonamiento global a esas escalas.

La estructura codificador-decodificador de la U-Net con conexiones residuales también impone una jerarquía multi-escala fija. La información fluye hacia abajo a través del codificador (reduciendo a la mitad la resolución espacial en cada nivel), a través del cuello de botella, y de vuelta hacia arriba a través del decodificador (duplicando la resolución en cada nivel), con conexiones residuales llevando características de alta resolución del codificador al decodificador. Este es un prior arquitectónico fuerte que funciona bien para muchas tareas, pero es rígido: el número de escalas, la resolución en cada escala, y el flujo de información están todos fijados en tiempo de diseño de la arquitectura.

Estas limitaciones motivaron una pregunta arquitectónica fundamental: ¿qué pasaría si reemplazáramos la U-Net completamente con un transformer ? Los transformers tratan la imagen como una secuencia de parches y aplican auto-atención a todos ellos en cada capa — razonamiento global en todas partes, no solo en el cuello de botella. El costo cuadrático de atención sigue ahí, pero técnicas como FlashAttention y la tokenización basada en parches lo hacen manejable. El siguiente artículo cubre este cambio: el Diffusion Transformer (DiT) , que reemplaza la U-Net con un vision transformer plano y desbloquea un nuevo régimen de escalado para la generación de imágenes y vídeo.

Quiz

Pon a prueba tu comprensión de SDXL y las arquitecturas de difusión en cascada.

¿Por qué Stable Diffusion 1.5 produce patrones repetidos al generar imágenes de 1024x1024?

¿Cuál fue el hallazgo más sorprendente de Imagen sobre el escalado?

En SDXL, ¿cuál es el propósito del condicionamiento por recorte ($c_{\text{top}}, c_{\text{left}}$)?

¿Por qué la cascada de tres etapas de Imagen es más barata que generar 1024x1024 directamente, aunque la etapa final aún procesa 1024x1024?