Cómo funciona Stable Diffusion – y Dalle-2 o Midjourney -: Open Source Generative-IA que crea imágenes artísticas (1 de 2)
Para ponernos en contexto, este año 2022 comenzamos alrededor de abril con la puesta en escena de Dalle-2, que seguro ya conocéis, ya que por aquí se habló de Crayon – basado den Dall-e mini – en los artículos de «Haciéndome un selfie con CrAIyon (Dall-e mini)«, en el que veíamos «Cómo Dall-e mini (CrAIyon) pinta a personajes populares» o «Cómo Dall-e y OpenAI pintan con sesgos de género«. Esta IA supuso una gran revolución, y aunque antes ya se habían presentado modelos similares, ésta fue la que realmente hizo gran acto de presencia, porque se empezaron a usar los llamados modelos de difusión (explicaré en qué consiste más adelante en este artículo) dejando boquiabiertos a todos aquellos que la probaban por sus fantásticas creaciones.
Figura 3: Libro de Machine Learning aplicado a Ciberseguridad de Carmen Torrano, Fran Ramírez, Paloma Recuero, José Torres y Santiago Hernández |
Modelos de difusión
Para entender en qué consiste un modelo de difusión, observa este GIF, imagina que echamos una gota de pintura en un vaso de agua. Justo al caer la gota al agua, la densidad de la pintura será muy alta en un punto, y cero en otras partes. Al cabo de un tiempo, la gota se difundirá en el agua hasta alcanzar un equilibrio. Pensad que el hecho de que la gota de pintura esté en un punto equivale a tener una imagen en claro, sin ruido, y que con el paso del tiempo perdemos la información totalmente de la imagen, se “difunde en el agua”.
La pregunta que nos hacemos ahora es, ¿qué pasaría si pudiéramos revertir este proceso? Es decir, que, a partir de la pintura difuminada, podamos volver al punto donde la gota justo cae al agua. Obviamente, en nuestro mundo físico esto es imposible (no podemos volver atrás en el tiempo), pero en los modelos de difusión sí que es posible, es decir, podemos volver desde una imagen llena de ruido hasta su correspondiente imagen en claro, sin ruido. Los modelos de difusión funcionan replicando este proceso, es decir, a partir de una imagen, se va añadiendo ruido a ésta hasta tener una imagen totalmente llena de ruido, y después aprendiendo cómo revertir este proceso.
Añadir ruido a las imágenes
En los modelos de difusión, el ruido que se añade es el llamado Ruido Gaussiano. Básicamente, esto quiere decir que a la hora de elegir cómo aplicar el ruido en cada momento se sigue una distribución gaussiana. Si observamos la imagen, diferentes valores que forman esta distribución hace que esta se haga más ancha o estrecha y que se desplace a un lado u otro, pero la forma de campana sigue permaneciendo.
Veamos un ejemplo de cómo añadir ruido utilizando distribuciones gaussianas a una imagen. Para simplificarlo, suponemos que la imagen solo tiene dos píxeles (170 y 150). Podemos observar en la siguiente imagen cómo la distribución gaussiana se centra sobre la imagen, mientras que la anchura de la campana es un valor constante que se fija con anterioridad. De esta manera, añadir ruido significa seleccionar una posición aleatoria dentro de esta distribución, por lo que cambiarán los píxeles de la imagen y también la distribución se irá centrando en diferentes posiciones (dependiendo de los píxeles resultantes escogidos).
La predicción del ruido con CNN
En los modelos de difusión, obviamente, se trabaja con ejemplos de muchas más dimensiones. Normalmente, la Cadena de Markov suele ser de una longitud del orden de unas 1.000 adiciones de ruido. Además, el ruido que se va aplicando en cada paso no siempre es el mismo, esto se va regulando con un planificador que va cambiando poco a poco las formas de la distribución gaussiana (si quieres entender toda la matemática que hay detrás, puedes leer este artículo). De esta manera, finalmente tras todas estas iteraciones se pierde totalmente la información de la imagen original.
El hecho de realizar muchos pasos en la cadena (unos 1.000), nos permite llegar a tener una imagen con mucho ruido pero que se han ido añadiendo a cantidades muy pequeñas, lo que facilitará posteriormente el proceso de “predecir” cuánto ruido se ha utilizado en cada paso y poder ir eliminándolo. Ahora bien, ¿cómo revertimos las adiciones de ruido? Invertir este proceso significa ir recuperando los valores de los píxeles hasta tener una imagen resultante que se parezca a la original, y aquí es donde entran en juego las Redes Neuronales Convolucionales (CNNs), en concreto, la red conocida como U-Net.
Como podéis ver, esta arquitectura tiene forma de U. Esta recibe una imagen de entrada y la va procesando mediante convoluciones hasta recoger la información más crítica en un espacio de menos dimensiones (espacio latente), y a partir de esta información crítica se van construyendo características de más dimensiones hasta lograr las requeridas (por ejemplo, se puede entrenar una U-Net que reciba imágenes en escala de grises y genere su respectiva imagen a color).
Aún hay más …
Volveremos a la U-Net más adelante en la segunda parte de este artículo y entenderemos mejor cómo se entrena esta red. Solo comentaros que, en realidad, esta arquitectura en forma de U no se utiliza en este caso exactamente como os he explicado. Por lo que se volvieron tan famosas estas nuevas Generative-AI generativas basadas en modelos de difusión es porque tú las puedes introducir un texto (concepto conocido como «input prompt») y te genera contenido artístico basado en el texto que has introducido, y sin embargo esto ni siquiera lo he mencionado de momento. Entonces, ¿cómo funciona la generación de imágenes basadas en los «prompts» de entrada?
Dalle-2, Stable Diffusion, Midjourney… todos estos modelos de difusión pueden recibir además entradas como por ejemplo textos (text2image) u otras imágenes (image2image). Estas entradas se las conocen como elementos de condicionamiento, ya que, como bien dice su nombre, condicionan la salida para ajustarse a lo que hemos pedido. En este artículo quiero centrarme en el caso text2image, el más famoso, donde introduces un texto a la IA y te genera contenido basándose en este texto. Y para explicar esto, vamos a ver cómo funciona Stable Diffusion en la siguiente parte del artículo.
Powered by WPeMatico