El modelo de difusión latente ( LDM ) [1] es una arquitectura de modelo de difusión desarrollada por el grupo CompVis (Computer Vision & Learning) [2] en LMU Munich . [3]
Los modelos de difusión (DM), introducidos en 2015, se entrenan con el objetivo de eliminar las aplicaciones sucesivas de ruido (comúnmente gaussiano ) en las imágenes de entrenamiento. El LDM es una mejora del DM estándar al realizar el modelado de difusión en un espacio latente y al permitir el condicionamiento de autoatención y atención cruzada.
Los LDM se utilizan ampliamente en modelos prácticos de difusión. Por ejemplo, las versiones 1.1 a 2.1 de Stable Diffusion se basaban en la arquitectura LDM. [4]
Los modelos de difusión se introdujeron en 2015 como un método para aprender un modelo que pueda tomar muestras de una distribución de probabilidad altamente compleja. Utilizaron técnicas de la termodinámica del no equilibrio , especialmente la difusión . [5] Fue acompañado por una implementación de software en Theano . [6]
En un artículo de 2019 se propuso la red de puntuación condicional de ruido (NCSN) o la combinación de puntuaciones con dinámica de Langevin (SMLD). [7] El artículo estaba acompañado por un paquete de software escrito en PyTorch publicado en GitHub. [8]
Un artículo de 2020 [9] propuso el modelo probabilístico de difusión de eliminación de ruido (DDPM) , que mejora el método anterior mediante inferencia variacional . El artículo estaba acompañado de un paquete de software escrito en TensorFlow publicado en GitHub. [10] Fue reimplementado en PyTorch por lucidrains. [11] [12]
El 20 de diciembre de 2021, el artículo de LDM se publicó en arXiv [13] y los repositorios de Stable Diffusion [14] y LDM [15] se publicaron en GitHub. Sin embargo, se mantuvieron prácticamente iguales. La información sustancial sobre Stable Diffusion v1 recién se agregó a GitHub el 10 de agosto de 2022 [16].
Todas las versiones de Stable Diffusion (SD) 1.1 a XL fueron instancias particulares de la arquitectura LDM.
CompVis lanzó las versiones SD 1.1 a 1.4 en agosto de 2022. No existe una "versión 1.0". SD 1.1 fue un LDM entrenado en el conjunto de datos laion2B-en. SD 1.1 se ajustó a 1.2 en imágenes más estéticas. SD 1.2 se ajustó a 1.3, 1.4 y 1.5, con un 10 % del condicionamiento de texto eliminado, para mejorar la guía sin clasificador. [17] [18] RunwayML lanzó SD 1.5 en octubre de 2022. [18]
Si bien el LDM puede funcionar para generar datos arbitrarios condicionales a datos arbitrarios, para ser más concretos, describimos su funcionamiento en la generación condicional de texto a imagen.
LDM consta de un autocodificador variacional (VAE), un U-Net modificado y un codificador de texto.
El codificador VAE comprime la imagen desde el espacio de píxeles a un espacio latente de dimensión más pequeña , capturando un significado semántico más fundamental de la imagen. El ruido gaussiano se aplica iterativamente a la representación latente comprimida durante la difusión hacia adelante. El bloque U-Net, compuesto por una estructura principal ResNet , elimina el ruido de la salida de la difusión hacia adelante hacia atrás para obtener una representación latente. Finalmente, el decodificador VAE genera la imagen final convirtiendo la representación nuevamente en espacio de píxeles. [4]
El paso de eliminación de ruido puede estar condicionado a una cadena de texto, una imagen u otra modalidad. Los datos de condicionamiento codificados se exponen a U-Nets de eliminación de ruido a través de un mecanismo de atención cruzada . [4] Para el condicionamiento en texto, se utiliza el codificador de texto CLIP ViT-L/14 preentrenado y fijo para transformar las indicaciones de texto en un espacio de incrustación. [3]
Para comprimir los datos de la imagen, primero se entrena un autocodificador variacional (VAE) en un conjunto de datos de imágenes. La parte codificadora del VAE toma una imagen como entrada y genera una representación latente de menor dimensión de la imagen. Esta representación latente se utiliza luego como entrada para la U-Net. Una vez que se entrena el modelo, el codificador se utiliza para codificar imágenes en representaciones latentes y el decodificador se utiliza para decodificar representaciones latentes nuevamente en imágenes.
Sean el codificador y el decodificador del VAE .
Para codificar una imagen RGB, sus tres canales se dividen por el valor máximo, lo que da como resultado un tensor de forma con todas las entradas dentro del rango . El vector codificado es , con forma , donde 0,18215 es un hiperparámetro, que los autores originales eligieron para blanquear aproximadamente el vector codificado a una varianza unitaria aproximada. Por el contrario, dado un tensor latente , la imagen decodificada es , luego se recorta al rango . [19] [20]
En la versión implementada, [3] : ldm/models/autoencoder.py el codificador es una red neuronal convolucional (CNN) con un único mecanismo de autoatención cerca del final. Toma un tensor de forma y genera un tensor de forma , que es la concatenación de la media y la varianza predichas del vector latente. La varianza se utiliza en el entrenamiento, pero después del entrenamiento, generalmente solo se toma la media y se descarta la varianza.
El decodificador es una CNN también con un único mecanismo de autoatención cerca del final. Toma un tensor de forma y genera un tensor de forma .
La red troncal de U-Net acepta los siguientes tipos de entradas:
Cada ejecución a través de la red troncal UNet produce un vector de ruido previsto. Este vector de ruido se reduce y se resta de la matriz de imágenes latentes, lo que da como resultado una imagen latente ligeramente menos ruidosa. La eliminación de ruido se repite de acuerdo con un cronograma de eliminación de ruido ("cronograma de ruido") y el decodificador VAE procesa la salida del último paso para obtener una imagen final.
De manera similar a la U-Net estándar , la red troncal de U-Net utilizada en SD 1.5 se compone esencialmente de capas de reducción de escala seguidas de capas de aumento de escala. Sin embargo, la red troncal de UNet tiene módulos adicionales que le permiten gestionar la incrustación. A modo de ilustración, describimos una única capa de reducción de escala en la red troncal:
ResBlock
:SpatialTransformer
pre-LN estándar sin enmascaramiento causal.En pseudocódigo,
def ResBlock ( x , tiempo , canales_residuales ): x_in = x incrustación_tiempo = red_feedforward ( tiempo ) x = concatenar ( x , canales_residuales ) x = conv_capa_1 ( activar ( normalizar_1 ( x ))) + incrustación_tiempo x = conv_capa_2 ( abandonar ( activar ( normalizar_2 ( x )))) return x_in + xdef TransformadorSpacial ( x , cond ): x_entrada = x x = normalizar ( x ) x = proy_entrada ( x ) x = atencion_cruzada ( x , cond ) x = proy_salida ( x ) return x_entrada + x def unet ( x , tiempo , cond ) : canales_residuales = [ ] para resblock , transformador_espacial en capas_de_reducción_de_escala : x = resblock ( x , tiempo ) canales_residuales.append ( x ) x = transformador_espacial ( x , cond ) x = capa_intermedia . resblock_1 ( x , tiempo ) x = capa_intermedia . spatialtransformer ( x , tiempo ) x = capa_intermedia . resblock_2 ( x , tiempo ) para resblock , spatialtransformer en upscaling_layers : residual = residual_channels.pop ( ) x = resblock ( concatenar ( x , residual ) , tiempo ) x = spatialtransformer ( x , cond ) devolver x
La arquitectura detallada se puede encontrar en [22] [23]
El LDM se entrena utilizando una cadena de Markov para agregar gradualmente ruido a las imágenes de entrenamiento. Luego, el modelo se entrena para revertir este proceso, comenzando con una imagen ruidosa y eliminando gradualmente el ruido hasta recuperar la imagen original. Más específicamente, el proceso de entrenamiento se puede describir de la siguiente manera:
El modelo se entrena para minimizar la diferencia entre el ruido previsto y el ruido real añadido en cada paso. Esto se hace normalmente utilizando una función de pérdida de error cuadrático medio (MSE).
Una vez que el modelo está entrenado, se puede utilizar para generar nuevas imágenes simplemente ejecutando el proceso de difusión inversa a partir de una muestra de ruido aleatoria. El modelo elimina gradualmente el ruido de la muestra, guiado por la distribución de ruido aprendida, hasta que genera una imagen final.
Consulte la página del modelo de difusión para obtener más detalles.