stringtranslate.com

Modelo de difusión latente

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]

Historial de versiones

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]

Arquitectura

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]

Autocodificador variacional

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 .

U-Net

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.

Un único mecanismo de atención cruzada tal como aparece en un modelo de lenguaje Transformer estándar.
Diagrama de bloques de la arquitectura completa del Transformer. La pila de la derecha es un decodificador Transformer estándar anterior a LN, que es básicamente el mismo que el SpatialTransformer.

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:

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]

Entrenamiento e inferencia

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.

Véase también

Referencias

  1. ^ Rombach, Robin; Blattmann, Andreas; Lorenz, Dominik; Esser, Patrick; Ommer, Björn (2022). Síntesis de imágenes de alta resolución con modelos de difusión latente. Conferencia IEEE/CVF sobre visión artificial y reconocimiento de patrones (CVPR) 2022. págs. 10684–10695.
  2. ^ "Inicio". Computer Vision & Learning Group . Consultado el 5 de septiembre de 2024 .
  3. ^ abc "Repositorio de difusión estable en GitHub". CompVis - Grupo de investigación en visión artificial y aprendizaje, LMU Munich. 17 de septiembre de 2022. Archivado desde el original el 18 de enero de 2023 . Consultado el 17 de septiembre de 2022 .
  4. ^ abc Alammar, Jay. "La difusión estable ilustrada". jalammar.github.io . Archivado desde el original el 1 de noviembre de 2022 . Consultado el 31 de octubre de 2022 .
  5. ^ Sohl-Dickstein, Jascha; Weiss, Eric; Maheswaranathan, Niru; Ganguli, Surya (1 de junio de 2015). "Aprendizaje profundo no supervisado mediante termodinámica del no equilibrio" (PDF) . Actas de la 32.ª Conferencia internacional sobre aprendizaje automático . 37 . PMLR: 2256–2265. arXiv : 1503.03585 .
  6. ^ Sohl-Dickstein, Jascha (1 de septiembre de 2024). "Sohl-Dickstein/Modelos-probabilísticos-de-difusión" . Consultado el 7 de septiembre de 2024 .
  7. ^ "ermongroup/ncsn". ermongroup. 2019 . Consultado el 7 de septiembre de 2024 .
  8. ^ Song, Yang; Ermon, Stefano (2019). "Modelado generativo mediante la estimación de gradientes de la distribución de datos". Avances en sistemas de procesamiento de información neuronal . 32 . Curran Associates, Inc. arXiv : 1907.05600 .
  9. ^ Ho, Jonathan; Jain, Ajay; Abbeel, Pieter (2020). "Modelos probabilísticos de difusión para la eliminación de ruido". Avances en sistemas de procesamiento de información neuronal . 33 . Curran Associates, Inc.: 6840–6851.
  10. ^ Ho, Jonathan (20 de junio de 2020). "hojonathanho/difusión" . Consultado el 7 de septiembre de 2024 .
  11. ^ Wang, Phil (7 de septiembre de 2024). "lucidrains/denoising-diffusion-pytorch" . Consultado el 7 de septiembre de 2024 .
  12. ^ "El modelo de difusión anotado". huggingface.co . Consultado el 7 de septiembre de 2024 .
  13. ^ Rombach, Robin; Blattmann, Andreas; Lorenz, Dominik; Esser, Patricio; Ommer, Björn (20 de diciembre de 2021). "Síntesis de imágenes de alta resolución con modelos de difusión latente". arXiv : 2112.10752 [cs.CV].
  14. ^ "Actualizar README.md · CompVis/stable-diffusion@17e64e3". GitHub . Consultado el 7 de septiembre de 2024 .
  15. ^ "Actualizar README.md · CompVis/latent-diffusion@17e64e3". GitHub . Consultado el 7 de septiembre de 2024 .
  16. ^ "difusión estable · CompVis/stable-diffusion@2ff270f". GitHub . Consultado el 7 de septiembre de 2024 .
  17. ^ "CompVis (CompVis)". huggingface.co . 2023-08-23 . Consultado el 2024-03-06 .
  18. ^ ab "runwayml/stable-diffusion-v1-5 · Hugging Face". huggingface.co . Archivado desde el original el 21 de septiembre de 2023 . Consultado el 17 de agosto de 2023 .
  19. ^ "Explicación del factor 0.18215 en textual_inversion? · Issue #437 · huggingface/diffusers". GitHub . Consultado el 19 de septiembre de 2024 .
  20. ^ "difusión-nbs/Stable Diffusion Deep Dive.ipynb at master · fastai/difusión-nbs". GitHub . Consultado el 19 de septiembre de 2024 .
  21. ^ "latent-diffusion/ldm/modules/attention.py en main · CompVis/latent-diffusion". GitHub . Consultado el 9 de septiembre de 2024 .
  22. ^ "U-Net para difusión estable". U-Net para difusión estable . Consultado el 31 de agosto de 2024 .
  23. ^ "Transformador para difusión estable U-Net". Transformador para difusión estable U-Net . Consultado el 7 de septiembre de 2024 .

Lectura adicional