ouhenio

GANsplaining: Qué son los modelos generativos y cómo domarlos

Desde que se hizo popular la banderita de Chile hecha por una Inteligencia Artificial (IA), esa de fondo rojo y con un perro de símbolo—y donde en realidad la descripción de ésta fue generada por una IA, no la famosa imagen—se ha vuelto cada vez más común encontrarse en redes sociales con alguien compartendo un "ingresé X texto a una IA y me generó esto".

El objetivo de este post es explicar en lenguaje común justamente cómo hemos logrado crear imágenes a través de texto. Lo más importante para mí con esta publicación es que personas que no saben programar y no tienen cercanía con las matemáticas entiendan los conceptos generales detrás de esto. Por esta razón, quédense tranquilxs de que no será necesario haber cursado un curso de cálculo para seguirme el hilo.

Eso sí, es por lo anterior que debo dar un aviso previo a las personas que sí saben del área: caeré en aberraciones con el fin de simplificar el tema para la población general—me parece un justo tradeoff.

¿Qué son los modelos generativos?

Para explicar qué es un modelo generativo, es conveniente primero explicar qué es un modelo clasificador.

Oye pero qué chucha es un modelo.

Cuando hablamos de modelos en el contexto de IA, nos referimos a un software que fue entrenado para resolver algún problema.

Un típico ejemplo es crear un modelo que diferencie entre fotos de perros y gatos. Para lograr esto, necesitamos de antemano una colección de fotos de ambos animales (a lo que le llamamos dataset), y luego diseñar una serie de pasos que permitan al software, mediante ensayo y error, ir aprendiendo patrones visuales que diferencien a perros de gatos.

Humanizando un poco esto, sería como ir mostrándole a este modelo una a una las distintas fotos, e interpelar con la pregunta: ¿Qué animal es este?

Si responde correctamente, todo bien. Si se equivoca, se lo hacemos saber y el modelo se ajusta un poquito para ojalá no volver a repetir este error.

Modelos clasificadores (🍐 vs 🍎)

En el ejemplo anterior, se desarrolló lo que denominamos un modelo clasificador, debido que este aprendió a clasificar cosas. Pero como estamos hablando de ciencia hay que ser algo más rigurosos y definir qué significa clasificar.

A continuación viene la parte que podría causar una reacción del tipo "hasta aquí llegué, esta wea está en koreano". Les prometo que si me dan la oportunidad, y siguen leyendo, lo lograrán entender.

Clasificar, en nuestra situación, es el acto de indicar si algo pertenece o no a una distribución.

En chileno, esto es saber diferenciar peras de manzanas. Para lograr lo anterior, necesitamos entender de cierta forma qué hace manzana a una manzana, y en contraste, pera a una pera.

Una forma de lograrlo sería ver todos los ejemplos habidos y por haber de manzanas y peras. Pero la naturaleza es hermosa y nos permitió desarrollar la habilidad de intuitivamente inferir al ver una nueva manzana o pera a qué familia esta pertenece.

Podríamos decir que, en dichos casos, estás asignando una probabilidad de que un espécimen sea pera, o bien, manzana. Y para lograr esto, tenemos una idea inconsciente de qué son estas frutas, es decir, inferimos la distribución de peras y manzanas.

En resumen:

  • Modelo: Software que aprende a resolver algo.
  • Distribución: Familia de probabilidades de cosas (ej: manzanas rojas pertenecen a la distribución de las manzanas).
  • Modelo clasificador: Modelo hecho para reconocer si algo pertenece a una distribución (ej: esa manzana pertenece a la distribución de las manzanas).

Modelos Generativos

La diferencia entre un modelo clasificador de uno generativo es que, mientras el primero busca aprender a reconocer si algo pertenece a una distribución, el segundo quiere aprender a representar dicha distribución.

Volvamos al ejemplo de peras y manzanas. ¿Recuerdan que mencioné que una posible opción para reconocer estas frutas es haber visto de antemano todas las peras y manzanas que existen y existirán, pero que en la práctica no hacemos esto ya que inferimos sus diferencias, o más precisamente, su distribución?

Lo que implica representar dicha distribución es justamente simular el haber visto todas las peras y manzanas habidas y por haber. Es decir, mediante la observación de algunas peras y manzanas, buscamos entender cómo se verán todas las demás peras y manzanas que existen o que incluso puedan existir.

Hay muchas formas en que se crean modelos generativos. Pero todos estos métodos requieren fotos reales de la distribución a aprender (el dataset). Es con este elemento que, mediante ensayo y error, van aprendiendo a recrear elementos no presentes en el dataset, o en otras palabras, a generar cosas.

Generative Adversarial Networks

Si bien como recién mencioné existen muchos modelos generativos distintos, me tomaré aquí un espacio para mencionar aquél que más me fascina y marcó mi vida, haciendo que entrara a este nicho de IA: las Generative Adversarial Networks (GANs).

Como su nombre en inglés indica, las GANs son modelos generativos que logran aprender a representar una distribución mediante un juego adversarial.

¿Qué significa que sea adversarial?

Que involucra a modelos compitiendo entre sí.

Las GANs funcionan bajo un esquema de juego en donde participan dos agentes: un Discriminador, y un Generador. El discriminador es básicamente un modelo clasificador, mientras que el generador, como podrán imaginar, es un modelo generativo.

Las reglas del juego son bien simples:

  • Contamos con un dataset de imágenes.
  • El generador generará imágenes, mientras que el discriminador clasificará imágenes tanto del dataset como también las creadas por el generador.
  • Si el discriminador logra correctamente reconocer que una imagen es ficticia o real, es recompensado.
  • Si el generador engaña al discriminador, es decir, el discriminador clasifica una imagen generada como real, es recompensado.

Bajo estas reglas—y varios detalles técnicos más—termina ocurriendo que mientras el discriminador y generador van aprendiendo a pillarse uno a otro, cada uno mejora en su rol, lo cual finalmente termina con una situación de empate técnico. El discriminador logrará reconocer sólo con un 50% de éxito si una foto es real o no, debido a que el generador generará fotos indistinguibles de las reales—a los lectores familiares con la teoría del juego, este empate técnico ocurre porque forzamos el equilibrio óptimo de una competencia Minimax de dos jugadores.

¡Y eso son las GANs!

Personalmente encuentro hermoso cómo Ian Goodfellow (el creador de las GANs), logró en el 2014 resolver el problema de cómo crear un modelo generativo usando un esquema de competencia con otro clasificador. Este es un caso en donde la sana competencia puede traer buenos resultados.

Espacio Latente

Hay un último detalle muy importante de entender sobre los modelos generativos para poder explicar cómo logramos manipularlos mediante texto: el espacio latente.

Este concepto—cuyo nombre puede parecer sacado de una maldición de terror cósmico sci fi—hace referencia a la distribución aprendida por el modelo. Y es que por bacanes que sean éstos, debemos aceptar que aprenden una distribución no necesariamente igual a la distribución real. Es decir, puede que aprendan a generar infinitas manzanas, pero no necesariamente todas las manzanas.

Pero el espacio latente es en verdad más que esto—nueva alerta de "este weón se puso a hablar en koreano", dame unos párrafos para explicarme mejor—este se refiere también a que representamos la distribución bajo un espacio métrico.

¿A qué me refiero con esto?

Las imágenes generadas no vienen de la nada, necesitamos una forma de lograr controlar qué genera el modelo. De lo contrario, ¿cómo podríamos hacer que éste genere en diferentes ocasiones la misma imagen?

Para lograr este control, es que los modelos generativos reciben un número—en verdad una lista de números, pero simplificaremos las cosas—a partir del cual generan una imagen. Es decir, cada vez que a mi modelo le paso un 0, generará la misma imagen. Así, podríamos decir que el 0 corresponde a dicha imagen. De igual forma, sin importar cuántas veces le demos un 1, el modelo generará la misma imagen (distinta eso sí a la del 0).

Aquí viene una consecuencia interesante de lo anterior. Entre el 0 y el 1 existen más números, de hecho, infinitos: 0.1, 0.15, 0.2, 0.32, 0.453654765, etc. ¿Qué pasa entonces si nos movemos contínuamente entre el 0 y el 1?

Como podrán ver, la imagen cambiará contínuamente, partiendo desde la correspondiente al 0, hasta llegar a la del 1. Esto ocurre porque, en su necesidad de lograr aprender a representar una distribución y hacerlo asociando números con las imágenes generadas, los modelos generativos se ven forzados a aprender a desarrollar un espacio en donde va a tener sentido ubicar cada elemento de la distribución.

Intentaré explicar esto con un ejemplo:

Imagínense que les plantean ordenar en una pizarra muy grande miles post-its de distintos colores. ¿Cuál sería la forma más intuitiva de hacerlo? Si han trabajado con algún software que requiera mucho manejo de colores, sabrán que probablemente lo mejor sería replicar las paletas de colores que éstos utilizan. Es decir, colores parecidos cerca uno del otro, y según algún parámetro como intensidad, luz, o lo que sea, ordenarlos en distintos ejes.

Ejemplo de cómo se ordenan los colores en Photoshop

Este mismo problema intenta resolver un modelo generativo, pero en vez de una pizarra tiene un espacio latente, y en vez de miles de post-its, tiene infinitas imágenes.

CLIP

Ahora es momento de explicar la segunda patita del asunto: CLIP.

CLIP (Contrastive Language-Image Pre-Training), es un modelo publicado a principios de este año que fue entrenado con el fin de parear texto e imágenes. Es decir, al recibir un texto y una imagen, te indica si ambos están relacionados.

En otras palabras, si le entrego una foto de una manzana y también un texto "foto de manzana", la idea sería que CLIP me dijese "sí, este texto e imagen tienen relación".

Nótese sí que la forma en que CLIP confirma esta correlación es mediante un número entre 0 y 1, donde 0 es un "absolutamente no relacionados" y un 1 es "son exactamente lo mismo, pero expresado en medios distintos".

Es importante recalcar el en medios distintos. La genialidad de CLIP fue que logró comprender, hasta cierto grado, cuándo las cosas son lo mismo, pero expresadas en medios distintos. A esto le llamamos multimodalidad, y es una propiedad que incluso ocurre en nuestro cerebro.

Fue observada por primera vez durante los 2000s, cuando investigadores notaron que conjuntos de nuestras neuronas se especializan en comprender conceptos, a pesar de que éstos sean expresados en medios distintos.

Usando el mismo ejemplo que dieron los autores que descubrieron esto: si comparamos la actividad neuronal de una persona al ver una foto de Jennifer Aniston y al escuchar el nombre Jennifer Aniston, observaremos que se activan casi las mismas neuronas. Y esto va más allá, si esta persona escucha la famosa intro de Friends, también presentará activaciones parecidas.

CLIP in a nutshell

Es por esta última razón que alcanzar la multimodalidad es algo revolucionario. Permite entender relaciones más allá de un tan sólo "esta foto y texto representan lo mismo". Por ejemplo, CLIP arroja un alto número de relación al recibir el texto "Daniel Radcliffe" y una foto de una portada del libro Harry Potter.

Se puede decir que estamos acercándonos a un mundo en que la IA entenderá relaciones culturales entre cosas, incluso si estas están representadas en medios distintos.

Modelos Generativos + CLIP

Recapitulemos lo visto hasta ahora:

  1. Los modelos generativos aprenden distribuciones (ej: aprender a generar fotos de manzanas).
  2. Al aprender esta distribución, generan un espacio latente, espacio en donde lugares cercanos corresponden a generar cosas cercanas (ej: la manzana generada con el número 0.00000001 será muy parecida a la que saldrá con el 0.00000002).
  3. CLIP es un modelo que aprendió a confirmar si texto e imagen tratan de cosas similares, a pesar de que sean representadas en medios distintos (ej: una foto de una manzana y el texto "una manzana" tratan de lo mismo).
  4. CLIP entrega un número entre 0 y 1 para informar la intensidad de la relación entre un texto e imagen.

Con todos estos ingredientes, finalmente podemos entender cómo con texto podemos generar una imagen.

A principios de este año, pasado muy poco tiempo desde que se hizo público CLIP, la comunidad del arte generativo desarrolló una manera de tomar ventaja de sus propiedades multimodales.

Ya sabemos que CLIP entrega un feedback de si texto e imagen tienen relación. Por ende, no importa si la imagen que reciba fue generada por otro modelo, será igual capaz de decirnos si esta tiene relación con un texto.

Y aquí es donde entran en juego el espacio latente y el hecho de que CLIP entregue un número para decirnos qué tanta relación existe.

Gracias a que si nos movemos contínuamente en el espacio latente, las imágenes generadas cambiarán también de forma contínua, y que por otro lado, con CLIP podemos evaluar qué tanto se relaciona una imagen con un texto, entonces podemos diseñar una forma de guiarnos dentro de este espacio latente para encontrar un lugar en donde la relación entre texto e imágen sea mayor.

Aquí va un ejemplo de cómo se logra esto:

Imaginen una persona que busca tesoros en la playa mediante un detector de metal. La forma en que el detector avisa al usuario qué tan cerca se encuentra de un metal es lanzando secuencias de bips. Mientras más cercano está de un metal, más bips sonarán, lo cual ayuda a guiar al cazador de tesoros hacia dónde debe moverse en la arena.

Cuando acoplamos CLIP y un modelo generativo estamos haciendo esto mismo. Nuestro detector de metal es CLIP, donde en vez de detectar metal detectamos qué tanto se relacionan texto e imagen, y en vez de bips nos informamos con un número entre 0 y 1. Por otro lado, en vez de estar moviéndonos por una playa, nos movemos por el espacio latente. En cada paso que damos, recibimos el bip de CLIP, permitiéndonos así tener una idea de hacia dónde movernos para encontrar el punto preciso que genere una imagen correspondiente al texto que le dimos.

CLIP guiando a una StyleGAN para generar una imagen relacionada con "A portrait of Nicanor Parra"

De esta forma, podríamos resumir el algoritmo para generar imágenes desde texto en los siguientes pasos:

  1. Elegimos un texto (ej: "una manzana roja").
  2. Nos paramos en algún punto del espacio latente de nuestro modelo generativo favorito, generando así una imagen.
  3. CLIP compara la imagen generada en el paso anterior con el texto de 1), entregando un número entre 0 y 1.
  4. Iterativamente nos movemos en el espacio latente, generando en cada paso una imagen y repitiendo 3), de esta forma intentando acercarnos poco a poco a una imagen que entregue un número mayor.

Notar que este proceso implica un par de cosas:

Primero, el punto del espacio latente que elijamos para partir va a determinar lo que se termine generando. Volviendo a la analogía del buscador de joyas, no es lo mismo comenzar a buscar éstas en un extremo de una playa que en el otro. Probablemente terminará encontrando cosas distintas según el punto en el que parta, dado que el detector de metales guiará al usuario por caminos distintos. Esto último se vuelve más evidente a medida que la playa es de mayor tamaño.

Segundo, las imágenes generadas están limitadas tanto por el modelo generativo como también por CLIP. Es decir, puede ocurrir que un modelo generativo sí tenga capacidad de generar una imagen muy relacionada con un texto, pero que CLIP no cuente con la capacidad o entrenamiento suficiente para comprender de forma competente la relación. De la misma forma, es posible que un modelo generativo no cuente con la capacidad de generar la imagen ideal para CLIP.


Arte Generativo y dónde encontrarlo

No tengo muy claro cómo terminar mi primer post, así que simplemente me gustaría concluir compartiendo personas y proyectos que pueden seguir si es que les interesa este mundillo.

Sería un crimen no comenzar mencionando a Katherine Crowson. Ella es sin duda alguna una de las líderes de este nicho en crecimiento, desarrollando desde la comodidad de su casa y sin el apoyo de una mega empresa muchas de las técnicas estándares del mundo del arte generativo.

Otras personas famosillas de este mundillo son (sin orden particular):

También debo mencionar la existencia de EleutherAI, un grupo descentralizado y anónimo de investigadores y desarrolladores organizados por Discord, en el cual se han creado y descubierto muchas de éstas innovaciones (la mayoría de las personas que estoy compartiendo habitan estos chats). Esta comunidad ha sido capaz de darle cara a gigantes del área como Google, OpenAI y demases.

Finalmente compartiré plataformas en donde pueden jugar con estos modelos:

  • Notebooks creados por Katherine Crowson:
  • wombo.art: esta es probablemente la app que casi toda la gente que no es del área utiliza cuando dice "ingresé x texto a una IA y me generó esto". Se nota que por debajo utiliza una VQGAN y la verdad es que hay hartas mejores opciones si quieres generar cosas mediante texto con este modelo (como por ejemplo el primer notebook que compartí de Katherine).
  • Hugging Face Spaces: Aquí hay muchísimos modelos distintos que pueden ser probados. Esta es una plataforma pensada para que investigadores puedan compartir sus creaciones en una interfaz amigable.
  • StyleGAN3+CLIP. Estoy orgulloso de decir que este es el notebook más popular del mundo para manipular una StyleGAN3 con CLIP, y fue creado por mi. 😊