Curso de Prompt Engineering

0 de 26 lecciones completas (0%)

4. Prompting en IAs de Imágenes

4.1. Entendiendo las IAs de Imágenes

Esta es una lección de muestra

Inscríbete o accede para hacer esta lección.

Una vez visto el Prompt Engineering en las IAs de Texto y en las IAs de Diálogo, vamos con el Prompt Engineering en las IAs de Imágenes.

Como en los casos anteriores, lo primero que vamos a hacer es comprender un poco las IAs que vamos a manejar (sin profundizar más de lo necesario –recuerda que esto es un curso de Prompt Engineering, si quieres profundizar más, tendrás que pasarte por el Barrio de Inteligencia Artificial de Joseo20).

Y ya te lo adelanto: Estas IAs tienen poco o nada que ver con las IAs de Texto y Diálogo. Los sistemas, modelos y arquitecturas que hay trabajando por detrás son muy diferentes, así que tendrás que adoptar un enfoque totalmente distinto para comunicarte con ellas.

Pero no te preocupes.

Yo te cuento.

Cositas antes de empezar con este módulo:

  1. Como en los demás módulos, las IAs de Imágenes están en continuo movimiento. Este será un módulo robusto, en el que te enseñaré los fundamentos del Prompt Engineering en IAs de Imágenes. Por ello, aguantará bien el paso del tiempo y la aparición de IAs o nuevas versiones de las existentes (es decir, mi objetivo es que seas capaz de escribir BUENOS prompts en cualquier IA, actual o futura).
  2. A pesar de lo anterior, puedo equivocarme o el futuro pasarme la polla por la cara. Así que mantendré actualizado el módulo con aquello que considere necesario cuando sea necesario.
  3. Que algo te parezca desactualizado (por ejemplo, porque las imágenes de ejemplo son con una IA o la versión de una IA pasada de moda) no significa necesariamente que esté desactualizado. Probablemente, la misma lógica funciona en la nueva IA o nueva versión de la IA y no lo he actualizado porque no es necesario, a pesar de que la imagen del ejemplo sea más fea que la que ofrece la nueva IA o la nueva versión de la IA. Cuando dudes, haz la prueba.
  4. Por todo lo anterior, este módulo NO será un repositorio de prompts para IAs de Imágenes. Los prompts sí que pueden tener fecha de caducidad y ser frágiles al paso del tiempo y a la aparición de nuevas IAs o versiones de las mismas. No obstante, te enlazaré a repositorios donde podrás conseguir miles de prompts.
  5. En este módulo NO te voy a enseñar a conseguir, registrarte o configurar las herramientas. Voy a dar eso por hecho y te voy a enseñar lo relativo al Prompt Engineering. Si necesitas ayuda con la parte de seteo, puedes buscar guías en Google o en el Barrio de Inteligencia Artificial de Joseo20. No obstante, para todas las herramientas, usaremos siempre la opción más simple de usarlas.
  6. Por último, mis conocimientos artísticos y mi gusto estético son nulos. Un jabalí usando la mierda y el barro de sus colmillos pintaría mejores cosas que yo. Si tú tienes talento artístico, podrás sacar a estas IAs diez mil veces más provecho que yo, porque tendrás más idea de qué buscar y cómo expresarlo. 

También estaría bien mencionar que pensé en hacer una breve historia de la evolución de las IAs de Imágenes en los últimos años para empezar este módulo.

Pero, mira, no.

Es innecesario.

Te basta con saber que, antes de los Modelos de Difusión estaban las GANs (Generative Adversarial Networks), que funcionaban bastante bien, pero que tenían el problema de que su capacidad generativa estaba limitada al tipo de imagen con el que había sido entrenada (tenía poca variabilidad).

No tiene sentido explicar más de ellas aquí, porque este es un curso de Prompt Engineering y las herramientas de generación de imágenes más potentes y que funcionan con prompts son las que utilizan Modelos de Difusión por detrás.

Es cierto que a las GANs también les puedes enchufar capas para hacerlas funcionar con prompts (como se hace con los Modelos de Difusión), pero no está ahí su auténtico potencial (que aún tienen y mantienen, como verás en el Curso de Creación de Contenidos con IA).

Y, bueno, tú has llegado aquí queriendo aprender a generar cosillas con Midjourney, no a usar una tecnología de hace un lustro.

Por todo ello, nos vamos a ir directamente a los Modelos de Difusión.


Más de 3000 orangotanes ya reciben mis emails

Suscríbete a la Niusleta de Joseo20.

Yo sí mando spam. Cuando tengo que vender, vendo. El resto de tiempo envío emails con temas que considero interesantes.

Hablo de todo lo que me sale de los cojones, no sólo de marketing o negocios. Hay política, filosofía y otras gilipolleces.

Es probable que después de leerla me odies.

Incluye orangotanes.


Modelos de Difusión, la clave de todo

Modelos de Difusión.

Te voy a dar una definición de lo que son que quizá se hace un poco cuesta arriba, pero luego bajaremos a explicar el asunto paso a paso:

Los Modelos de Difusión son Modelos Generativos entrenados con sets de imágenes que han sufrido una conversión gradual de datos a ruido. La tarea a aprender por el modelo consiste en identificar el ruido de una imagen dada para, posteriormente, restárselo, obteniendo así la imagen original nítida.

La definición completa incluiría términos esotéricos y nombres arcanos como “Termodinámica del No Equilibrio” o “Cadena de Markov”. Pero, para el propósito y alcance de este curso, no es necesario (ni deseable) que nos metamos ahí.

Bueno, vamos a explicar un poco más lo del párrafo este.

Lo que queremos es tener dos grandes trabajos: El de añadir ruido (diffusion process) y el de eliminar ruido (reverse diffusion process o denoising).

Diffusion Process

Empecemos: ¿Qué es eso de “conversión gradual de datos en ruido”?

Fácil, es esto:

Cogemos una imagen que está bien y, poco a poco, le vamos añadiendo ruido (como el ruido ese que se veía en las teles viejas cuando se desconectaba la antena).

A este proceso de añadir ruido a la imagen lo llamamos “diffusion” o “forward noising porcess”. Es el proceso por el cual generamos datos para entrenar al modelo a hacer el segundo paso (el “reverse diffussion process”, luego hablamos de él –de momento, quédate con que lo que hacemos aquí es generar datos para el entrenamiento).

Ahora, ¿cómo añadimos el ruido?

Se lo añadimos gradualmente en una serie de pasos consecutivos (en el paso 0 la imagen está nítida, en el 1 con un poco más de ruido, en el 2 con un poco más… Y así con tantos pasos como quieras, donde el último paso sería la imagen de puro ruido).

Pero, aun así, el ruido se puede añadir de muchas formas distintas. Estas dos son formas de añadir ruido, pero son distintas.

¿Cómo añadimos el ruido?

Bueno, pues esto es algo que podemos manipular mediante el “schedule de varianza”.

Así pues, podemos tener dos modelos de difusión idénticos, pero con el schedule de varianza distinto. Sólo con eso, la forma en que se estaría añadiendo el ruido sería diferente.

Y la forma en que agregamos el ruido, como puedes suponer por la importancia que le estoy dando al mencionarlo, influye en la capacidad de aprendizaje del modelo de difusión. Y, por tanto, en su capacidad para, posteriormente, generar buenas imágenes.

El schedule de varianza puede ser dado por nosotros o podemos dejar que lo aprenda la propia IA para dar con el óptimo (igual que las IAs de Texto aprenden ellas mismas con qué tokens trabajan de forma más eficiente).

Además, el proceso por el que añadimos el ruido sigue una Cadena de Markov. En una Cadena de Markov, el estado de algo (la imagen) en un momento en el tiempo (el proceso de difusión, el conjunto de pasos) sólo depende del estado de ese algo (la imagen) en el momento (el paso en el proceso de difusión) anterior.

Es decir, a la hora de añadir ruido a la imagen por segunda vez, sólo tenemos en cuenta la imagen inmediatamente anterior. Es decir, una imagen que ya tenía algo de ruido (no la original, que era 100% nítida).

Esto (junto alguna otra pijada matemática que no nos hace falta entender ahora, pero que puedes aprender en el Barrio de Inteligencia Artificial de Joseo20) hace que el set de datos de entrenamiento que tengamos al finalizar este proceso de difusión sea un conjunto de datos independientes entre sí, a pesar de que sean la misma imagen con varios niveles de ruido añadidos (hasta llegar al 100% ruido).

Además, esto es lo que hace que el proceso de reverse diffusion process sea posible, porque el ruido no se ha añadido de forma 100% aleatoria, sino que se han seguido unos pasos lógicos y matemáticos en el proceso de añadir ruido a las imágenes, de forma que es aleatorio, pero sólo dentro de unos márgenes (dentro de una distribución de probabilidad –gaussiana, para más señas).

Reverse Diffusion Process o Denoising

Vale, pero… ¿Con qué objetivo queremos añadir ruido a las imágenes?

Con el objetivo de entrenar un modelo que se encargue de hacer el proceso inverso (al que llamamos “reverse diffusion process”). Es decir, generar imágenes a partir del ruido.

Por centrarnos, hasta ahora, tenemos:

  1. Un proceso basado en Cadenas de Markov (que NO tiene nada que ver con redes neuronales ni otras hechicerías machinelearningianas) que añade ruido a una imagen dada en una serie de pasos (forward diffusion).
  2. Una red neuronal que trata de invertir el proceso. O sea, eliminar el ruido (reverse diffusion process).

Esta red neuronal del punto 2 es, propiamente dicho, el modelo que entrenamos. Lo anterior (punto 1) no es más que la forma de generar el dataset con el que entrenar al modelo que de verdad nos interesa.

La idea es que, pasándole al modelo (la red neuronal que elimina el ruido) una imagen de puro ruido, éste sea capaz de generar la imagen nítida original.            

Y esto, de nuevo, no se hace de golpe. Se hace poco a poco. Es decir, si, en la primera etapa (agregación de ruido), agregamos el ruido a través de 10 pasos, el modelo, en el reverse diffusion process, pasará del paso 10 al 9, del 9 al 8 y así hasta el paso 0 (la imagen nítida).

Esto es algo que puedes ver al utilizar Midjourney o Dall·E. Primero, se genera una imagen borrosa y, poco a poco, se va generando el resultado final. Y tú puedes ver esos pasos poco a poco.

Es el proceso de denoising. Es decir, de pasar de puro ruido a una imagen definida.

¿Y cómo logra hacerlo?

Pues no es fácil.

Lo primero que hacemos es tener una red neuronal que se encarga de recibir la imagen con ruido y extraer el ruido. Es decir, esa red neuronal, como output, te arroja el ruido que tiene la imagen… ¡No la imagen nítida!

Pero, obviamente, una vez determina qué es ruido, puede restar el ruido al total de la imagen y conseguir la imagen nítida.

Tiene sentido, ¿no?

Este proceso de identificación del ruido o primera fase del reverse diffusion process se hace mediante una red neuronal de tipo U-Net, que es un autoencoder.

Las U-Nets tienen su origen en radiología médica, porque son redes muy capaces de diferenciar diferentes elementos dentro de una imagen. Por ejemplo, pueden identificar un pequeño tumor en la imagen de un pulmón, por decir algo. Y, claro, también pueden identificar el ruido en una imagen de un rascacielos (por ejemplo).

Resumiendo: Entrenamos al modelo con un montón de imágenes nítidas a las que se les aplica diferentes niveles de ruido y el modelo aprende a identificar el ruido y lo genera como output.

Ahora bien, ¿sabes qué pasa si le hacemos caso y eliminamos todo el ruido que nos da la U-NET como output?

Pues que el resultado es una puta mierda.

Lo que hacemos entonces es hacerle dar más pasos.

Desde nuestro punto de vista, lo que hacemos es decirle que, en vez de quitar el 100% del ruido en un único paso, quite el 1% en una sucesión de 100 pasos.

Desde el punto de vista del modelo, está quitando continuamente el 100% del ruido en cada paso, porque, recuerda, el proceso de difusión ha seguido una Cadena de Markov y, por tanto, el estado en un paso sólo depende del anterior.

Así que, en cada paso, el modelo es como si se encontrase con una imagen aislada con una cantidad de ruido que debe eliminar al 100%. Y lo hace.

Para nosotros, que tenemos la perspectiva del proceso completo, cuando quita el 100% del ruido por primera vez, sólo ha quitado el 1%.

Pues bien, de esta forma, haciendo el proceso de denoising gradual, el resultado es mucho mejor.

Y el modelo es capaz de aprender a quitar este ruido, recuerda, porque hemos seguido unas reglas lógicas y matemáticas para añadirlo (de nuevo, si quieres conocerlas, visita el Barrio de IA en Joseo20).

¿Y cuántos pasos necesita el modelo para llegar a un resultado decente?

Pues depende. En los modelos originales se hablaba de 300 o 500 pasos. Hoy en día, con diferentes optimizaciones, se pueden conseguir buenos resultados incluso con 10 pasos (en Stable Diffusion, por ejemplo, se pueden generar imágenes razonables con 10 pasos –aunque, para conseguir mejores resultados, debes subirlo hasta, por ejemplo, 150 pasos).

En conclusión: El entrenamiento consiste en conseguir que el resultado que la IA obtiene al eliminar el ruido se parezca lo máximo posible a la imagen original a la que se le añadió ruido en primera instancia.

Como en tantos otros casos al trabajar con redes neuronales, al final del proceso obtenemos un valor que representa la diferencia entre el input original (resultado deseado) y el output generado (resultado generado).

Después, con backpropagation y descenso del gradiente (si quieres saber qué son estas cosas, ya sabes, al Barrio de la IA), podemos ajustar los parámetros de la red neuronal para que, la próxima vez que realice el proceso de denoising, el output generado se parezca mucho más a la imagen dada como input (es decir, reducimos la diferencia).

De esta forma, poco a poco, vamos maximizando el parecido entre el input original y el output generado.

Al final, lo que conseguimos es un modelo capaz de generar, a partir de una imagen de puro ruido, una imagen idéntica a la original (al menos, al ojo humano) que habíamos convertido en dicha imagen de puro ruido.

Y esto (simplemente esto) es el modelo de difusión.

Este tipo de modelos tienen múltiples aplicaciones, dependiendo de qué otros cacharros les conectemos y qué arquitecturas acabemos montando con ellos.

Desde computer vision hasta diseño de fármacos. Pasando, por supuesto, por la generación de imágenes.

Que es lo que nos ocupa.

Y es que, en este punto, el modelo ya puede generar nuevas imágenes desde puro ruido. Es decir, imágenes que no estaban en su set de entrenamiento.

Aquí un ejemplo sacado directamente de uno de los papers más importantes sobre el tema:

¿Y cómo entienden el lenguaje?

Los modelos de difusión propiamente dichos no entienden el lenguaje.

Menudo shock, ¿no?

No pasa nada.

Los modelos de difusión pueden insertarse en arquitecturas mayores que sí incluyan algún modelo que comprenda el lenguaje.

Por ejemplo, CLIP.

Es decir, podemos juntar CLIP y el modelo de difusión para que el modelo de difusión pueda trabajar a partir de texto.

Pero es importante hacer la diferenciación.

CLIP

CLIP es un modelo multimodal capaz de comprender si un par imagen-texto se corresponden. Es decir, es capaz de identificar si un texto y una imagen hacen referencia a lo mismo o no.

Básicamente, si le pasas el texto “un gato cazando un ratón” y una foto de un gato cazando un ratón, te va a decir “Sí, es lo mismo”. Si le pasas ese mismo texto con una foto del Coliseo, te dirá “No, eso no es lo mismo”.

Sencillo.

Bueno, no tan sencillo.

No nos vamos a enrollar mucho en la historia de CLIP, pero el caso es que vino de puta madre para que las IAs pudieran “entender” que era lo que había en una imagen, haciéndolo mucho mejor que las anteriores arquitecturas (principalmente, las redes convolucionales).

Pero, a nosotros, en este punto, CLIP no nos interesa por su capacidad de decir qué texto debe corresponder a una imagen, sino por su capacidad opuesta: Decir qué imagen debe corresponder a un texto.

En cualquier caso, ambas cosas van de la mano.

¿Y cómo funciona CLIP?

CLIP es una arquitectura que cuenta con dos modelos en su interior.

  1. El primer modelo es un Image Encoder, que convierte imágenes en embeddings (numeritos que condensan la información de la imagen).
  2. El segundo modelo es un Text Encoder, que convierte el texto en embeddings (numeritos que condensan la información del texto).

Teniendo estas dos cosas, entrenamos al modelo.

¿Cómo?

Pues le pasamos un montón de imágenes y un montón de descripciones asociadas y le dejamos que compare los numeritos de ambos embeddings (en la práctica, le pasamos imágenes con sus descripciones correctas e imágenes con descripciones incorrectas).

Si los numeritos se parecen, es que la imagen y el texto hacen referencia a lo mismo. Si no se parecen, es que hacen referencia a cosas diferentes.

Y, como nosotros ya sabemos a qué texto corresponde cada imagen y viceversa, pues si la IA lo hace mal, le decimos que corrija.

Así, poco a poco, la red irá aprendiendo a emparejar correctamente las imágenes con los textos en función de los elementos que haya dentro tanto de la imagen como de la descripción.

Y, como lo único que necesitamos para entrenar al modelo es tener imágenes y descripciones asociadas, podemos scrapear y obtener grandes datasets de una forma mucho más sencilla que en arquitecturas anteriores (donde necesitábamos etiquetados más o menos manuales).

Básicamente, nos descargamos imágenes de internet con textos asociados (texto de descripción, ALT, categoría a la que pertenece en la web de ilustradores de turno, etc) y listo, ya tenemos imágenes y sus correspondientes textos descriptivos.

Pero, de esto, hablaremos un poco después.

Lo importante aquí es que CLIP es capaz de tener una idea muy buena de qué es cada cosa tanto a nivel de texto como a nivel de imagen y, en consecuencia, puede vincularlos de una forma muy eficaz (incluso cuando el texto o la imagen de entrada es nuevo).

CLIP es capaz, en resumen, de describir una imagen y de visualizar una frase.

OpenCLIP

Por último, hablemos de OpenCLIP.

CLIP tiene varios problemas, pero aun así es un bicho muy potente y fue la piedra filosofal de todo el avance que hubo en IAs Generativas de Imágenes (entre otras cosas) en 2022.

Tanto Stable Diffusion 1.x, como Midjourney, como Dall·E 2 utilizan CLIP.

El problema es que no sabemos qué hay dentro de CLIP.

Sabemos que funciona, pero no sabemos el dataset con el que fue entrenado. Tampoco podemos abrirlo y mirar en profundidad su código.

Es, en definitiva, un programa de código cerrado.

Por eso, la gente de LAION publicó OpenCLIP, que es una versión de CLIP pero Open Source.

Stable Diffusion 2.x ya funciona con OpenCLIP, y es probable que, a futuro, muchas más IAs lo utilicen.

Es por eso que te lo menciono.

De momento, todas (salvo Stable Diffusion 2.x) funcionan con CLIP. Pero esto puede cambiar a futuro.

Volviendo al modelo de difusión

Bueno, guay, ¿no?

Tenemos un modelo que es muy bueno generando imágenes a partir de la nada (puro ruido) y un modelo que es muy bueno entendiendo la relación entre un texto y una imagen y viceversa.

Solo hay que juntarlos.

Y lo haremos en dos fases distintas.

Durante el diffusion process…

Durante el proceso de difusión (el primero, el que genera el dataset), lo que haremos será lo que dijimos antes (añadir ruido a las imágenes), pero, además, añadiremos una descripción a la imagen.

Esta descripción da igual cómo la obtengas, pero perfectamente la podrías obtener a través de CLIP.

Que pa eso sirve.

Durante el reverse diffusion process o denoising…

El caso es que, ahora, cuando pasamos como input las imágenes con ruido a la U-NET, aprovechamos para pasarle una descripción de lo que hay en ella.

Y, durante esta fase de denoising, la IA sabe que tiene que eliminar el ruido para llegar a una cierta cosa. Ya no va a ciegas. Y no va a ciegas porque le hemos dicho con texto hacia dónde debe ir.

Mejor explicado: Ya no se enfrenta a puro ruido, sino a ruido condicionado. Ahora no tiene sólo la matriz de puro ruido (no es una “imagen” de puro ruido, recuerda que estamos en el Espacio Latente), sino que también tiene la matriz del prompt.

En ambos casos, tiene dos matrices con un montón de numeritos, pero, aunque una es aleatoria (imagen de puro ruido), la otra tiene un sentido (texto).

De esta forma, mientras se da el proceso de denoising, la matriz de puro ruido se va condicionando por la de texto y la imagen final a la que se llega acaba acercándose a la descrita en el prompt.

Te dejo una imagen que puede ayudarte a entenderlo mejor:

Es decir, el modelo sigue sin saber cuál es la imagen a la que debe llegar, pero tiene un texto que, gracias a CLIP, puede asociar con ciertas características de ciertos objetos y eso le sirve de ayuda en el proceso.

Al hacerlo de este modo, en realidad, lo que nos dice la IA cuando le metemos la imagen de un rascacielos no es “en esta imagen, este es el ruido y, por tanto, este es el rascacielos”, sino “en esta imagen, dado que hay un rascacielos, este es el ruido”.

Es ligeramente distinto.

En cierto sentido, “guiamos” a la IA en el proceso de eliminación del ruido, haciendo que, en cada paso del proceso, el modelo preste atención (tal y como funcionan los Transformers en las IAs de Texto) al “texto” para facilitar que se aproxime a él.

Generar sin imágenes originales

Y aquí llega la magia.

Ahora, podemos pasarle una imagen de puro ruido, sin ningún origen en una imagen real, y decirle con lenguaje natural a modo de input “aquí hay un perro”.

Y, a partir de ahí, la IA empieza el proceso de denoising guiada y encaminada a generar un perro… ¡Sin que hubiese una imagen original a la que llegar!

Además, aquí aparece cierto juego interesante.

En la medida en que el input textual y la imagen de puro ruido de partida sean los mismos, el resultado siempre será el mismo (bueno, el sampler también debe ser el mismo, pero eso nos da un poco igual ahora mismo).

Es decir, será determinista.

Porque, recuerda, el modelo está quitando ruido siempre siguiendo la misma fórmula (esta fórmula podemos variarla cambiando el sampler –pero, insisto, eso ahora da igual, asumamos que el sampler es el mismo), así que, dadas las mismas matrices como input, el resultado será el mismo.

Lo que pasa con las herramientas que usamos (Midjourney, Stable Diffusion, Dall·E, etc) es que la imagen de ruido inicial se cambia con cada generación, por lo que cada nueva generación acaba en un resultado distinto (siempre acercándose al input textual, si ese sí lo mantenemos).

Pero, al mismo tiempo, estas herramientas suelen darnos la opción de obtener la “semilla”. La semilla es un número que identifica la imagen de puro ruido de una determinada generación. Usando esa semilla junto al mismo prompt, obtenemos el mismo resultado, porque las matrices son las mismas.

NO ENTIENDE LO QUE LE DICES

Para terminar, después de explicar la relación entre los modelos de difusión y CLIP, quiero dejar algo claro.

CLIP NO TE ENTIENDE.

CLIP NO es un GPT (bueno, GPT tampoco te entiende stricto sensu, pero yamentiendes).

CLIP entiende los conceptos del texto que has escrito y sabe asociarlos a imágenes, pero no está entendiendo estrictamente el significado del texto.

CLIP no es capaz de detectar las sutilezas del lenguaje natural a través de las cuales puedes describir a la perfección una imagen.

Digamos (aunque no es correcto, pero por entendernos) que la IA de Texto que hay por detrás es una versión mucho más primitiva, que habla como Tarzán y que sólo entiende los objetos, emociones, estilos y ese tipo de cosas, pero no los elementos del lenguaje que relacionan entre sí esas cosas de forma compleja.

Es por ello que el Prompt Engineering en las IAs de Imágenes es bastante más complicado, esotérico y alquímico que el Prompt Engineering en IAs de Texto y Diálogo, que, aunque tiene sus particularidades, es básicamente lenguaje natural.

Cuando empecemos a ver los prompts para IAs de Imágenes, verás a lo que me refiero.

No obstante, aunque en este preciso momento es importante hacer estos matices, lo cierto es que, muy probablemente, en el futuro los modelos que hagan el trabajo de CLIP sí tendrán una comprensión más profunda del lenguaje natural.

Datasets

Nos falta una última cosa por comentar. Y es el tema de los datasets. Porque para entrenar a estos modelos necesitamos datos.

Pues bien, estos modelos se entrenan con imágenes con distintos niveles de ruido. Y, sí, ese ruido se lo añadimos nosotros, así que no hay que salir ahí a buscarlo en ningún lado.

Pero seguimos necesitando las imágenes originales.

Y las etiquetas (que, gracias a CLIP, pueden ser descripciones en lenguaje natural).

Y, como en cualquier otro entrenamiento de una IA, cuanto mayor sea el dataset, mejores datos (imágenes) lo prefiguren y mejores sean los tags o descripciones, más cosas (y de mejor forma) aprenderá el modelo.

A todo eso lo llamamos curación del dataset. Cuantas más y mejores imágenes haya en el dataset y mejores sean las descripciones, más curado estará el dataset y mejor aprenderá el modelo (y, por tanto, más capaz será de generar buenas imágenes).

Y ya te adelanto ahora que la diferencia que hay entre Stable Diffusion, Dall·E y Midjourney reside, fundamentalmente, en el dataset.

En general, una buena heurística para aproximarnos al tema es:

  1. A mayor curación del dataset, mejor será el resultado.
  2. Las IAs que usan modelos de difusión, en general, tienen datasets más curados a medida que avanzan las versiones.

La curación del dataset es un proceso fundamental para que los resultados que son capaces de generar las IAs de Imágenes sean buenos.

¡Por cierto!

Ya que estamos, esta es la razón por la que los prompts los tendrás que escribir en inglés.

Y es que, tanto los datos con los que se entrenó a estos modelos como los datos con los que se entrenó a CLIP y OpenCLIP, estaban en inglés (al menos, mayoritariamente).

Por tanto, todos estos sistemas entienden mucho mejor el inglés que el español.


Más de 3000 orangotanes ya reciben mis emails

Suscríbete a la Niusleta de Joseo20.

Yo sí mando spam. Cuando tengo que vender, vendo. El resto de tiempo envío emails con temas que considero interesantes.

Hablo de todo lo que me sale de los cojones, no sólo de marketing o negocios. Hay política, filosofía y otras gilipolleces.

Es probable que después de leerla me odies.

Incluye orangotanes.


Cada IA es de su padre y de su madre

Ya dijimos que, en lo que respecta a las IAs de Texto y de Diálogo, todas se parecen bastante entre sí.

Sin embargo, cuando hablamos de IAs de Imágenes, cada una es de su padre y de su madre.

Cada una tiene sus particularidades.

Todas ellas utilizan Modelos de Difusión y todo lo básico que hemos mencionado a lo largo de este (gran) apartado, pero tienen (a veces no tan) pequeñas diferencias en su arquitectura, funcionamiento interno y dataset.

En los siguientes apartados, veremos las particularidades de cada una de las actuales IAs Generativas de Imágenes (Stable Diffusion, Dall·E 2 y Midjourney).

Stable Diffusion

Y empezamos por Stable Diffusion, a pesar de que no fue la primera IA que utilizara modelos de difusión en aparecer (la primera fue Dall·E 2).

¿Por qué?

Pues porque es OpenSource y es la única (de entre las grandes) que podemos abrir y mirar cómo funciona exactamente.

Así que sabemos su arquitectura interna al detalle.

Además, Stable Diffusion tuvo varias ideas bastante TOP en su arquitectura interna que han hecho que su formulación sea la base de todas las demás herramientas actualmente disponibles (más o menos).

Para que me entiendas, antes de aparecer Stable Diffusion con su forma de usar los modelos de difusión, estos modelos se usaban directamente en las imágenes. Es decir, sobre los píxeles. Todo el trabajo de difusión se hacía sobre los píxeles de la imagen.

Y esto es muy costoso.

Lo revolucionario de Stable Diffusion fue lo que se conoce como Latent Diffusion Models.

Gracias a estos modelos, el proceso de difusión ya no se llevaba a cabo sobre los píxeles de las imágenes, sino sobre sus embeddings (representaciones numéricas más compactas que las representaciones numéricas que suponen los píxeles de una imagen), en lo que se conoce como Latent Space.

Vamos a verlo todo un poco más en profundidad en un momentito.

Simplemente, que te quede claro que esto que hizo Stable Diffusion fue revolucionario y está en la base de muchos de los avances que hoy en día estamos viendo.

Pues bien, decíamos que Stable Diffusion funciona con una arquitectura llamada Latent Diffusion.

Todas las versiones de Stable Diffusion usan esta arquitectura.

La diferencia entre las diferentes versiones 1.x son sólo diferencias de grado, donde, con los mismos componentes y datos, el entrenamiento ha sido más potente y profundo. Esa es la razón por la que la versión 1.5 es mejor que la 1.4.

En cambio, el salto de 1.5 a 2.0 sí supone un cierto cambio en los componentes internos. Y es que, aunque mantiene la arquitectura, cambian de CLIP a OpenCLIP, y eso supone cambios a la hora de entender los prompts (y también supone censura, dicho sea de paso).

Pero la arquitectura, sea con CLIP u OpenCLIP, es el mismo Latent Diffusion en ambos casos.

Así es la arquitectura Latent Diffusion por dentro y, en consecuencia, así es Stable Diffusion por dentro:

Asusta, ¿no?

Bueno, vamos a ver si queda un poco más claro yendo paso a paso.

¿Cómo funciona por dentro Stable Diffusion?

Hablemos, primero, de cómo funciona por dentro.

Fase de difusión

Antes de nada, date cuenta de que, en la parte superior de la imagen aparece la flecha de izquierda a derecha y no llega al tercer apartado del diagrama:

Bien, esta es la parte referida a la primera fase con la que opera un modelo de difusión: La de añadir ruido. La fase de difusión. La parte de generar el dataset para entrenar al modelo generativo.

En esta parte sólo opera el Encoder del Autoencoder y el Latent Space.

Veamos qué papel juega cada uno.

Autoencoder (Encoder)

La explicación que dimos anteriormente de los modelos de difusión está muy bien, pero tiene un problema: Es muy lento y costoso.

Si tratamos de hacer todo ese proceso con imágenes tal cual, será muy complicado. Y será tanto más complicado cuanto más grandes y ricas sean las imágenes.

Es lo que decíamos hace un momento de que, al principio, estos modelos de difusión se ponían a funcionar directamente sobre los píxeles de las imágenes, siendo muy costoso y lento.

Para arreglar eso, usamos un Autoencoder.

Un Autoencoder es una arquitectura que tiene como objetivo algo muy simple: Dada una determinada imagen como input, la comprimo mediante el Encoder y la descomprimo mediante el Decoder.

Sí. Como un .zip.

Bueno, más o menos.

Como digo, un Autoencoder consta de dos partes. El Encoder y el Decoder. Y ambos son entrenables.

El encoder se entrena para reducir la imagen a una representación vectorial (numérica) de sí misma que ocupa mucho menos espacio y que es muy rica y densa en datos.

El decoder se entrena para tomar esa representación vectorial de la imagen y revertirla a su forma original.

Idealmente, la imagen obtenida con el decoder es idéntica a la que entró como input en el encoder.

Lo que hace Stable Diffusion es utilizar el Encoder de un Autoencoder para comprimir las imágenes y transformarlas en esas representaciones vectoriales latentes. Y es con esas representaciones vectoriales (numeritos que representan de forma hipercondensada la imagen) con las que pone en marcha el proceso de difusión.

A ese “lugar” o “momento” en el que las imágenes están convertidas en representaciones vectoriales lo llamamos Espacio Latente (Latent Space).

Latent Space

Una vez la imagen ha sido llevada a ese Latent Space, se produce el añadido gradual de ruido. Es decir, el proceso de difusión.

Es decir, es en este Espacio Latente en el que se le añade ruido a las imágenes con las que entrenaremos al modelo.

Fase de difusión revertida

Pero lo cierto es que la fase de difusión nos importa un poco menos porque los modelos con los que vamos a trabajar ya están entrenados (si quieres aprender a entrenar o finetunear un modelo de este tipo, deberás aprender en el Barrio de la IA).

Lo que nos interesa hoy por hoy es la parte de generación. Es decir, utilizar la red neuronal (la parte de abajo, cuya flecha se ve de derecha a izquierda) en modo de inferencia (la fase de “generación” o “uso”, por contraposición a la de entrenamiento):

Así, siguiendo la dirección de la flecha, al generar imágenes tenemos:

Condicionamiento semántico

La cajita del Condicionamiento Semántico no aparece en la parte de la difusión porque… Bueno, porque no hay nada que condicionar si el resultado va a ser 100% ruido invariablemente y el origen siempre va a ser una imagen.

Pero sí juega un papel fundamental cuando hablamos del proceso opuesto (de denoising).

Como dijimos, este proceso puede estar condicionado por un texto, de forma que la IA vaya quitando ruido sabiendo de antemano lo que debe encontrar.

Y esto se puede hacer con las imágenes con las que fue entrenado, pero la gracia está en hacerlo con una imagen de puro ruido aleatorio y que sea ese condicionamiento el que le lleve a una imagen nueva.

Y eso es lo que se hace aquí y el proceso por el cual la Stable Diffusion transforma lo que le pides en una imagen.

Como ves, en la cajita de Condicionamiento Semántico aparecen varias cosas (Mapas Semánticos, Texto, Representaciones e Imágenes).

Esto es porque se pueden usar más cosas además de texto para condicionar a Stable Diffusion, pero, como estamos en el Curso de Prompt Engineering, pues hablaremos únicamente de texto.

Si quieres aprender a aprovechar las demás formas de condicionamiento (que son importantes), deberás echar un ojo al Curso de Creación de Contenidos con IA.

El caso es que el texto que introduzcamos aquí es el que va a condicionar la generación de la imagen.

¿Y cómo va a entender qué le estamos pidiendo?

Pues, en el caso de las versiones 1.x de Stable Diffusion, será gracias a CLIP, tal y como ya hemos explicado anteriormente.

En el caso de las versiones 2.x de Stable Diffusion, será gracias a OpenCLIP, una versión de CLIP desarrollada por LAION y que también es Open Source.

CLIP u OpenCLIP tomarán el input textual que le hemos dado y generarán como par para ese texto una imagen objetivo acorde. Una “idea” de lo que la IA debe conseguir.

(En realidad, no es exactamente así. No es que generen una imagen para ese texto. Simplemente, encuentran unas relaciones entre los valores matemáticos representativos de los fragmentos de texto y los valores matemáticos representativos de una posible imagen, de forma que, para el modelo, tanto es recibir una imagen como un texto.)

Y, con eso claro, se empezará el proceso de denoising a partir de una imagen de puro ruido aleatorio (sin ninguna imagen original asociada).

Y este proceso empezará directamente en el Espacio Latente.

Espacio Latente

En el Espacio Latente se producirá también todo el proceso de denoising que hemos explicado anteriormente. No sobre los píxeles de una imagen de ruido, sino sobre unos valores vectoriales que representan puro ruido.

Y poco a poco, esos valores vectoriales se irán modificando para aproximarse a los valores vectoriales especificados en el input textual. El resultado serán los valores vectoriales de una imagen que corresponde al input textual.

Durante este proceso, mediante técnicas que, a efectos prácticos, podemos considerar brujería, le iremos recordando al modelo el input textual, de forma que siempre esté condicionado y no se vaya por las ramas.

Al hacerlo en el Espacio Latente, la velocidad será mayor y el coste de procesamiento será menor.

Autoencoder (Decoder)

Una vez se ha llevado a cabo el proceso de denoising en el Espacio Latente, lo que tenemos es la representación vectorial de una imagen nítida asociada al input textual.

Pero aún no hay imagen. Son números hiper-comprimidos. Todavía está dentro de ese Espacio Latente.

Y, aunque eso suene muy guay, para nosotros, humanos, es una mierda.

No nos interesa esa representación matemática de la imagen, por muy rica y densa en información que sea.

Nos interesa la representación matemática “normal” de la imagen. La que el Paint puede interpretar y presentarnos como una imagen que, a nuestros ojos de Sapiens, nos evoca algo.

Lo que entendemos por “imagen”, vaya.

Para ello, usamos el Decoder del Autoencoder para pasarla de esa versión matemática presente en el Espacio Latente a una versión imagen propiamente dicha presente en el Espacio de los Píxeles.

O sea, en el mundo real.

Y eso es lo que recibimos finalmente como output.

En resumen…

Al hablar de Stable Diffusion, el proceso es el siguiente:

  1. El usuario introduce su input textual como parte del Condicionamiento Semántico.
  2. CLIP/OpenCLIP “le dice” al modelo de difusión la imagen que debe buscar a partir del input textual.
  3. Se genera una imagen de puro ruido en el espacio latente.
  4. Comienza el proceso de denoising en el espacio latente (mientras, en varios momentos del proceso de denoising, mediante módulos de atención, vamos “recordando” constantemente el input textual para condicionar y guiar el resultado).
  5. El resultado es una imagen sin ruido, pero comprimida (todavía en el espacio latente).
  6. Se usa el decoder para llevar la imagen del espacio latente al espacio de píxeles.

El dataset de Stable Diffusion

El dataset de Stable Diffusion es público. Se trata del LAION-5B, un dataset público con casi 6 mil millones de pares texto-imagen.

La mayor parte del entrenamiento de Stable Diffusion fue con ese dataset, aunque también se le añadieron rondas adicionales de entrenamiento con subsets de ese dataset (selecciones de imágenes en alta resolución o de alta calidad).

Hay que mencionar que el dataset con el que se entrenó a Stable Diffusion 2.x está más filtrado que el de 1.x para eliminar todo tipo de contenido NSFW (Not Safe For Work). Es decir, porno, violencia y demás cosas dudosas.

Además, el paso de CLIP a OpenCLIP condujo a que la IA identificase menos a los artistas, porque, expresamente, se buscó reducir la comprensión de OpenCLIP de los términos relativos a artistas en particular, para limitar la posibilidad de replicar sus técnicas y estilos (por polémicas que ha habido, no es muy relevante).

En conclusión, sea por el dataset con el que se entrenó al Modelo de Difusión o sea por el dataset con el que se entrenó a OpenCLIP, la cuestión es que Stable Diffusion 2.x está más censurado que Stable Diffusion 1.x.

No obstante, esto no significa que genere peores imágenes. Sólo te limita en el qué puedes generar, no en el cómo.


Más de 3000 orangotanes ya reciben mis emails

Suscríbete a la Niusleta de Joseo20.

Yo sí mando spam. Cuando tengo que vender, vendo. El resto de tiempo envío emails con temas que considero interesantes.

Hablo de todo lo que me sale de los cojones, no sólo de marketing o negocios. Hay política, filosofía y otras gilipolleces.

Es probable que después de leerla me odies.

Incluye orangotanes.


Dall·E 2

En el momento de escribir este módulo, todavía no ha salido Dall·E 3.

Así que hablemos de Dall·E 2.

Dall·E 2 funciona con un modelo de difusión y CLIP. Y es importante decirlo porque Dall·E 1 no usaba modelos de difusión, sino GANs.

No es muy relevante para el tema del prompt Engineering, pero mejor mencionarlo para que no haya confusiones.

Por lo demás, Dall·E 2 fue la primera de las IAs de Imágenes de esta nueva hornada y supuso una revolución.

Ya se ha quedado un poco anticuada (estamos a la espera de Dall·E 3), pero aún es importante. Además, tiene ciertas particularidades interesantes.

En general, podemos decir que Dall·E (en general, no específicamente la 2) busca generar buenas imágenes con muy poco Prompt Engineering. Ese es el objetivo del CEO de OpenAI, Sam Altman.

Y, hecha esta presentación, veamos qué hay por dentro de Dall·E 2.

¿Cómo funciona por dentro Dall·E 2?

Esta es la arquitectura interna de Dall·E 2:

Como ves, la arquitectura de Dall·E 2 es un poco más sencilla que la de Stable Diffusion, pero sigue usando CLIP y un modelo de difusión (bueno, o un modelo autorregresivo, pero se comprobó que el de difusión funcionaba mucho mejor).

CLIP ya sabemos lo que es, así que puedes entender perfectamente la primera parte de la arquitectura: Toma el input textual y lo transforma en un embedding (es decir, una representación numérica -vectorial- del contenido del texto).

Una vez tiene ese embedding, CLIP deja de funcionar y se pone en marcha el modelo “Prior”.

Prior coge ese embedding de texto y busca el embedding de imagen más cercano semánticamente, usando, para ello, el mapa latente semántico que “construyó” durante su aprendizaje.

Es decir, cuando Dall·E 2 recibe el input textual, compara los elementos semánticos del input con su mapa latente semántico y es capaz de relacionar los elementos, comprendiendo qué representación visual tienen los elementos del input textual.

¿Por qué usar el Prior en vez del propio CLIP? No hay un motivo per se. De hecho, en OpenAI probaron de hacerlo así (y de otras formas) y el resultado no fue bueno. Metiendo el Prior funcionó mejor. Así que lo dejaron con el Prior.

Si pensabas que el mundo de la ingeniería informática y la arquitectura de redes neuronales era 100% medido al milímetro, siento decirte que no es así.

Algunas cosas son como son porque se probaron mil cosas random y esa fue la que funcionó.

Además, el prior es lo que permite que se generen varias imágenes (por motivos que no vienen a cuento).

Bueno, una vez tenemos el embedding de imagen para el embedding de texto, necesitamos generar la imagen a partir de la representación vectorial.

Para ello, Dall·E 2 usa GLIDE, que es otro modelo de difusión desarrollado por ellos mismos. De hecho, GLIDE fue el primer modelo de difusión que permitía “guiar” la generación de imágenes a partir de inputs textuales.

El dataset de Dall·E 2

Algo curioso de Dall·E 2 es que, a pesar de que el paper es público, el dataset no lo es.

Y, como tampoco sabemos qué dataset utilizó CLIP (a pesar de que, nuevamente, es público), pues no tenemos ni puta idea de qué entrenamiento recibieron ambos modelos.

En cualquier caso, podemos intuir que utilizaron algún tipo de filtro NSFW como en Stable Diffusion 2.x, porque, siendo una empresa privada y que va con tanto cuidadito con ese tipo de cosas, es normal que apliquen algo así a los datasets con los que trabajan.

Midjourney

Hablemos ahora de Midjourney.

Midjourney es 100% privado y no tenemos forma de saber qué hay por dentro, a pesar de que hay ciertas especulaciones por ahí.

No obstante, su calidad es impresionante y su versión v.5 marca el Estado del Arte actual (en el momento de escribir estas líneas).

Además, es la IA de Imágenes por la que seguramente estés aquí, porque es la que más llama a la gente.

Así que vamos allá con un breve resumen de la herramienta.

¿Cómo funciona por dentro Midjourney?

Como digo, Midjourney es 100% privado y no tenemos forma de saber cómo funciona por dentro.

Lo que parece evidente es que utiliza un modelo de difusión y algún modelo tipo CLIP.

Más allá de eso, no sabemos nada.

Se ha especulado mucho con que tiene diferentes elementos propios de Stable Diffusion (al menos, en sus últimas versiones).

Es posible.

A fin de cuentas, Stable Diffusion es Open Source y, si estás desarrollando algo así, es normal abrir la caja de Stable Diffusion para ver lo que hay por dentro.

Pero no tiene pinta de ser una copia de Stable Diffusion ni mucho menos.

Lamentablemente, no puedo decirte más sobre su funcionamiento interno porque es 100% secreto.

El dataset de Midjourney

Al igual que sucede con el código fuente, no tenemos forma de saber de qué se compone el dataset de Midjourney.

Es más que probable que el dataset de Midjourney tuviese una mayor representación de imágenes artísticas e ilustraciones, lo que explicaría por qué sus resultados son sistemáticamente más “artísticos” que en las demás IAs.

No obstante, esto puede no depender sólo de las imágenes propiamente dichas, sino de su etiquetado.

En definitiva, no hay forma de saber ni cómo funciona Midjourney por dentro ni de qué se compone el dataset con el que fue entrenado.

Comparativa Stable Diffusion vs. Dall·E 2 vs. Midjourney

Y, bueno, ya que hemos llegado hasta aquí, sabiendo que todas estas herramientas usan Modelos de Difusión y que sus arquitecturas son similares (al menos, conceptualmente), llega el momento de compararlas.

Ten en cuenta que no hay una “mejor IA de Imágenes”. En muchos casos, la mejor IA va a depender de nuestras necesidades. Y en muchos otros casos, tendremos que usar varias para conseguir el resultado deseado.

Pero… Bueno, podemos hacer una comparativa objetiva, ¿no?

Comparativa de características (Stable Diffusion vs. Dall·E 2 vs. Midjourney)

Empecemos por ver una comparativa de características de las distintas IAs.

Estas son características propias de las IAs. Digamos que es una comparación más a nivel técnico, por decirlo de algún modo. Una comparativa de aspectos menos prácticos.

CARACTERÍSTICASStable DiffusionDall·E 2Midjourney
Text EncoderCLIP (en v1.x) y OpenClip (en v2.x)CLIPDesconocido (probablemente CLIP)
Uso en local (en tu propio ordenador)✅ (a partir de 10GB de VRAM)
CopyrightSi usas Stable Diffusion, las imágenes generadas son tuyas. Si usas DreamStudio, son públicas (puedes usarlas para fines comerciales, pero no son tuyas).  Son tuyas tanto para uso comercial como no comercial.Si no eres miembro de pago, no son tuyas. Si eres miembro de pago, son tuyas tanto para uso comercial como no comercial, pero garantizas derechos a Midjourney sobre ellas.
Curva de AprendizajeDifícilFácilMedio
CopyrightOpen Source (tanto código como dataset)Propietario y público (dataset secreto)Propietario y secreto (dataset también secreto)
CensuraNo en las versiones 1.x y sí en las versiones 2.x
Posibilidad de finetuning
PrecioClic aquí para ver detalles actualizados de los precios. (Recuerda que Stable Diffusion es gratis y que estos precios son referidos a la interfaz DramStudio)Clic aquí para ver detalles actualizados de los precios.Clic aquí para ver detalles actualizados de los precios.
¿Prueba gratuita?

Comparativa de FUNCIONALIDADES (Stable Diffusion vs. Dall·E 2 vs. Midjourney)

Y, ahora, comparemos funcionalidades presentes en las distintas IAs (esto sí es más práctico).

Ten en cuenta que algunas de estas características y funcionalidades, en este Curso de Prompt Engineering, nos pueden sudar la polla, pero sí son importantes en otros casos.

Por ejemplo, elegir bien las características y funcionalidades es fundamental a la hora de crear contenidos con IA.

FUNCIONALIDADESStable DiffusionDall·E 2Midjourney
Texto-To-Image
Image-to-Image
Depth-to-Image
Control de la composición y la pose
Inpainting
Outpainting
Resolución máxima posible1024×1024 (hasta 4096×4096 usando la funcionalidad upscalling)1024×10241024×1024
Control del Aspect Ratio
Control de los principales paráemtros
Variaciones de una generación concreta
Image prompt
Multiprompt
Prompt Weights
Negative Prompt


Más de 3000 orangotanes ya reciben mis emails

Suscríbete a la Niusleta de Joseo20.

Yo sí mando spam. Cuando tengo que vender, vendo. El resto de tiempo envío emails con temas que considero interesantes.

Hablo de todo lo que me sale de los cojones, no sólo de marketing o negocios. Hay política, filosofía y otras gilipolleces.

Es probable que después de leerla me odies.

Incluye orangotanes.


Deja un comentario