Modelos Generativos Profundos

Un Modelo Generativo es una poderosa forma de aprender cualquier tipo de distribución de datos utilizando el aprendizaje no supervisado y ha logrado un enorme éxito en pocos años. Todos los tipos de modelos generativos tienen como objetivo aprender la verdadera distribución de datos del conjunto de entrenamiento para generar nuevos puntos de datos con algunas variaciones. Pero no siempre es posible aprender la distribución exacta de nuestros datos, ya sea implícita o explícitamente, por lo que intentamos modelar una distribución lo más parecida posible a la verdadera. Para ello, podemos aprovechar la potencia de las redes neuronales para aprender una función que pueda aproximar la distribución del modelo a la distribución verdadera.

Dos de los enfoques más utilizados y eficientes son los Autoencoders Variacionales (VAE) y las Redes Adversariales Generativas (GAN). VAE tiene como objetivo maximizar el límite inferior de la log-verosimilitud de los datos y GAN tiene como objetivo lograr un equilibrio entre Generador y Discriminador. En este blogpost, voy a explicar el funcionamiento de VAE y GANs y la intuición detrás de ellos.

Autoencoder Variacional

Estoy asumiendo que el lector ya está familiarizado con el funcionamiento de un autoencoder vainilla. Sabemos que podemos utilizar un autocodificador para codificar una imagen de entrada en una representación dimensional mucho más pequeña que puede almacenar información latente sobre la distribución de datos de entrada. Pero en un autocodificador vainilla, el vector codificado sólo puede asignarse a la entrada correspondiente utilizando un decodificador. Desde luego, no puede utilizarse para generar imágenes similares con cierta variabilidad.

Para conseguirlo, el modelo necesita aprender la distribución de probabilidad de los datos de entrenamiento. El VAE es uno de los enfoques más populares para aprender la complicada distribución de datos, como las imágenes, utilizando redes neuronales de forma no supervisada. Se trata de un modelo gráfico probabilístico basado en la inferencia bayesiana, es decir, el modelo pretende aprender la distribución de probabilidad subyacente de los datos de entrenamiento para poder muestrear fácilmente los nuevos datos a partir de esa distribución aprendida. La idea es aprender una representación latente de baja dimensión de los datos de entrenamiento denominada variables latentes (variables que no se observan directamente, sino que se infieren a través de un modelo matemático) que suponemos que han generado nuestros datos de entrenamiento reales. Estas variables latentes pueden almacenar información útil sobre el tipo de resultados que debe generar el modelo. La distribución de probabilidad de las variables latentes z se denomina P(z). Se selecciona una distribución gaussiana como un previo para aprender la distribución P(z) para poder muestrear fácilmente nuevos puntos de datos durante el tiempo de inferencia.

Ahora el objetivo principal es modelar los datos con algunos parámetros que maximicen la probabilidad de los datos de entrenamiento X. En resumen, estamos asumiendo que un vector latente de baja dimensión ha generado nuestros datos x (x ∈ X) y podemos mapear este vector latente a los datos x utilizando una función determinista f(z;θ) parametrizada por theta que necesitamos evaluar (ver fig. 1). Bajo este proceso generativo, nuestro objetivo es maximizar la probabilidad de cada dato en X que viene dada como,

Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)

Aquí, f(z;θ)ha sido sustituida por una distribución Pө(X|z).

Fig. 1. Vector latente mapeado a la distribución de datos usando el parámetro ө

La intuición detrás de esta estimación de máxima verosimilitud es que si el modelo puede generar muestras de entrenamiento a partir de estas variables latentes entonces también puede generar muestras similares con algunas variaciones. En otras palabras, si muestreamos un gran número de variables latentes de P(z) y generamos x a partir de estas variables, entonces la x generada debería coincidir con la distribución de datos Pdata(x). Ahora tenemos dos preguntas a las que debemos responder. ¿Cómo capturar la distribución de las variables latentes y cómo integrar la Ecuación 1 sobre todas las dimensiones de z?

Obviamente es una tarea tediosa especificar manualmente la información relevante que nos gustaría codificar en el vector latente para generar la imagen de salida. En lugar de ello, confiamos en las redes neuronales para calcular z sólo con la suposición de que este vector latente puede ser bien aproximado como una distribución normal para poder muestrear fácilmente en el momento de la inferencia. Si tenemos una distribución normal de z en un espacio n dimensional, entonces siempre es posible generar cualquier tipo de distribución utilizando una función suficientemente complicada y la inversa de esta función se puede utilizar para aprender las propias variables latentes.

En la ecuación 1, la integración se lleva a cabo sobre todas las dimensiones de z y, por tanto, es intratable. Sin embargo, se puede calcular utilizando métodos de integración de Monte-Carlo que es algo no fácil de implementar. Así que seguimos otro enfoque para maximizar aproximadamente Pө(X) en la ecuación 1. La idea de VAE es inferir P(z) usando P(z|X) que no conocemos. Inferimos P(z|X) utilizando un método llamado inferencia variacional que es básicamente un problema de optimización en estadística bayesiana. Primero modelamos P(z|X) usando una distribución más simple Q(z|X) que es fácil de encontrar y tratamos de minimizar la diferencia entre P(z|X) y Q(z|X) usando el enfoque de la métrica de KL-divergencia para que nuestra hipótesis se acerque a la distribución verdadera. Esto es seguido por un montón de ecuaciones matemáticas que no voy a explicar aquí, pero se puede encontrar en el documento original. Pero debo decir que esas ecuaciones no son muy difíciles de entender una vez que se entiende la intuición detrás de VAE.

La función objetivo final de VAE es :-

La ecuación anterior tiene una interpretación muy agradable. El término Q(z|X) es básicamente nuestra red codificadora, z es nuestra representación codificada de los datos x(x ∈ X) y P(X|z) es nuestra red decodificadora. Así que en la ecuación anterior nuestro objetivo es maximizar la log-verosimilitud de nuestra distribución de datos bajo algún error dado por D_KL. Se puede ver fácilmente que VAE está tratando de minimizar el límite inferior de log(P(X)) ya que P(z|X) no es trazable, pero el término de KL-divergencia es >=0. Esto es lo mismo que maximizar E y minimizar D_KL. Sabemos que la maximización de E es una estimación de máxima verosimilitud y se modela utilizando una red decodificadora. Como dije antes que queremos que nuestra representación latente sea cercana a la gaussiana y por lo tanto asumimos P(z) como N(0, 1). Siguiendo esta suposición, Q(z|X) también debería estar cerca de esta distribución. Si suponemos que es una gaussiana con parámetros μ(X) y Ʃ(X), el error debido a la diferencia entre estas dos distribuciones, es decir, P(z) y Q(z|X) dada por la divergencia KL resulta en una solución de forma cerrada dada a continuación.

Considerando que estamos optimizando el límite inferior variacional, nuestra función de optimización es :

log(P(X|z)) – D_KL, donde la solución de la segunda se muestra arriba.

Por lo tanto, nuestra función de pérdida contendrá dos términos. El primero es la pérdida de reconstrucción de la entrada a la salida y la segunda pérdida es el término de divergencia KL. Ahora podemos entrenar la red utilizando el algoritmo de retropropagación. Pero hay un problema y es que el primer término no sólo depende de los parámetros de P sino también de los parámetros de Q pero esta dependencia no aparece en la ecuación anterior. Así que cómo retropropagar a través de la capa donde estamos muestreando z al azar de la distribución Q(z|X) o N para que P pueda decodificar. Los gradientes no pueden fluir a través de nodos aleatorios. Usamos el truco de la reparametrización (ver fig) para hacer la red diferenciable. Muestreamos de N(μ(X), Σ(X)) muestreando primero ε ∼ N(0, I), y luego computando z=μ(X) + Σ1/2(X)∗ε.

Esto se ha mostrado muy bellamente en la figura 2 ? . Hay que tener en cuenta que el paso feedforward es idéntico para estas dos redes (izquierda & derecha) pero los gradientes sólo pueden retropropagarse por la red derecha.

Fig.2. Truco de reparametrización utilizado para retropropagar a través de nodos aleatorios

En tiempo de inferencia, podemos simplemente muestrear z de N(0, 1) y alimentarlo a la red decodificadora para generar un nuevo punto de datos. Dado que estamos optimizando el límite variacional inferior, la calidad de la imagen generada es algo pobre en comparación con las técnicas más avanzadas como las Redes Generativas Adversariales.

Lo mejor de VAE es que aprende tanto el modelo generativo como un modelo de inferencia. Aunque tanto la VAE como las GAN son enfoques muy interesantes para aprender la distribución de datos subyacente utilizando el aprendizaje no supervisado, las GAN dan mejores resultados en comparación con la VAE. En el VAE, optimizamos el límite inferior de la variación, mientras que en el GAN no existe esta suposición. De hecho, los GAN no se ocupan de ninguna estimación explícita de la densidad de probabilidad. El fracaso de VAE en la generación de imágenes nítidas implica que el modelo no es capaz de aprender la verdadera distribución posterior. La VAE y la GAN difieren principalmente en la forma de entrenamiento. Ahora vamos a sumergirnos en las Redes Generativas Adversariales.

Redes Generativas Adversariales

Yann LeCun dice que el entrenamiento adversarial es lo más genial desde el pan rebanado. Viendo la popularidad de las Redes Adversariales Generativas y la calidad de los resultados que producen, creo que la mayoría de nosotros estaríamos de acuerdo con él. El entrenamiento adversarial ha cambiado por completo la forma de enseñar a las redes neuronales a realizar una tarea específica. Las redes adversariales generativas no trabajan con ninguna estimación de densidad explícita como los autocodificadores variacionales. En su lugar, se basan en un enfoque de teoría de juegos con el objetivo de encontrar un equilibrio de Nash entre las dos redes, el Generador y el Discriminador. La idea es tomar muestras de una distribución simple como la gaussiana y luego aprender a transformar este ruido en una distribución de datos utilizando aproximadores de funciones universales como las redes neuronales.

Esto se consigue mediante el entrenamiento adversario de estas dos redes. Un modelo generador G aprende a capturar la distribución de datos y un modelo discriminador D estima la probabilidad de que una muestra provenga de la distribución de datos y no de la distribución del modelo. Básicamente, la tarea del generador es generar imágenes de aspecto natural y la tarea del discriminador es decidir si la imagen es falsa o real. Esto puede considerarse como un juego mini-max de dos jugadores en el que el rendimiento de ambas redes mejora con el tiempo. En este juego, el generador intenta engañar al discriminador generando imágenes reales en la medida de lo posible y el generador intenta no ser engañado por el discriminador mejorando su capacidad de discriminación. La siguiente imagen muestra la arquitectura básica de GAN.

Fig.3. Bloque de construcción de la Red Adversarial Generativa

Definimos una prioridad en las variables de ruido de entrada P(z) y luego el generador mapea esto a la distribución de datos usando una función diferenciable compleja con parámetros өg. Además de esto, tenemos otra red llamada Discriminador que toma la entrada x y utilizando otra función diferenciable con parámetros өd produce un único valor escalar que denota la probabilidad de que x provenga de la verdadera distribución de datos Pdata(x). La función objetivo de la GAN se define como

En la ecuación anterior, si la entrada al Discriminador proviene de la distribución de datos verdaderos entonces D(x) debe dar como resultado 1 para maximizar la función objetivo anterior conEn cambio, si la imagen se ha generado a partir del Generador, D(G(z)) debe dar como resultado 1 para minimizar la función objetivo en relación con G. Esto último implica básicamente que G debe generar imágenes realistas que puedan engañar a D. Maximizamos la función anterior en relación con los parámetros del Discriminador mediante el Ascenso Gradiente y minimizamos la misma en relación con los parámetros del Generador mediante el Descenso Gradiente. Pero hay un problema en la optimización del objetivo del generador. Al principio del juego, cuando el generador no ha aprendido nada, el gradiente suele ser muy pequeño y cuando lo está haciendo muy bien, los gradientes son muy altos (ver Fig. 4). Pero nosotros queremos el comportamiento contrario. Por tanto, maximizamos E en lugar de minimizar E

Fig.4. Coste del Generador en función de la respuesta del Discriminador sobre la imagen generada

El proceso de entrenamiento consiste en la aplicación simultánea del Descenso Gradiente Estocástico sobre el Discriminador y el Generador. Durante el entrenamiento, alternamos entre k pasos de optimización de D y un paso de optimización de G sobre el minilote. El proceso de entrenamiento se detiene cuando el Discriminador es incapaz de distinguir ρg y ρdata, es decir, D(x, өd) = ½ o cuando ρg = ρdata.

Uno de los primeros modelos de GAN que emplean redes neuronales convolucionales fue DCGAN que significa Deep Convolutional Generative Adversarial Networks. Esta red toma como entrada 100 números aleatorios extraídos de una distribución uniforme y produce una imagen con la forma deseada. La red está formada por muchas capas convolucionales, deconvolucionales y totalmente conectadas. La red utiliza muchas capas deconvolucionales para asignar el ruido de entrada a la imagen de salida deseada. La normalización por lotes se utiliza para estabilizar el entrenamiento de la red. La activación ReLU se utiliza en el generador para todas las capas, excepto la capa de salida, que utiliza la capa tanh, y la activación ReLU se utiliza para todas las capas del discriminador. Esta red se entrenó utilizando el descenso de gradiente estocástico en mini lotes y se utilizó el optimizador Adam para acelerar el entrenamiento con hiperparámetros ajustados. Los resultados del trabajo fueron bastante interesantes. Los autores demostraron que los generadores tienen interesantes propiedades aritméticas vectoriales con las que podemos manipular las imágenes de la forma que queramos.

Fig.5. Generador de DCGAN

Fig.6. Discriminador de DCGAN

Una de las variantes más utilizadas de los GANs es el GAN condicional que se construye simplemente añadiendo el vector condicional junto con el vector de ruido (ver Fig. 7). Antes de cGAN, generábamos imágenes al azar a partir de muestras aleatorias de ruido z. ¿Y si queremos generar una imagen con algunas características deseadas? ¿Existe alguna manera de proporcionar esta información extra al modelo sobre el tipo de imagen que queremos generar? La respuesta es sí y el GAN Condicional es la forma de hacerlo. Al condicionar el modelo a la información adicional que se proporciona tanto al generador como al discriminador, es posible dirigir el proceso de generación de datos. Los GAN condicionales se utilizan en una gran variedad de tareas, como la generación de texto a imagen, la traducción de imagen a imagen, el etiquetado automático de imágenes, etc. Una estructura unificada de ambas redes se ha mostrado en el siguiente diagrama.

Fig. 7. Un ejemplo básico de cGAN con y como vector condicionante

Una de las cosas interesantes de los GANs es que pueden ser entrenados incluso con pequeños datos de entrenamiento. De hecho, los resultados de las GAN son prometedores, pero el procedimiento de entrenamiento no es trivial, especialmente la configuración de los hiperparámetros de la red. Además, las GAN son difíciles de optimizar, ya que no convergen fácilmente. Por supuesto, hay algunos consejos y trucos para piratear las GAN, pero no siempre son útiles. Puedes encontrar algunos de estos consejos aquí. Además, no tenemos ningún criterio para la evaluación cuantitativa de los resultados, excepto para comprobar si las imágenes generadas son perceptualmente realistas o no.

Conclusión

Los modelos de aprendizaje profundo están logrando realmente un rendimiento de nivel humano en el aprendizaje supervisado, pero no ocurre lo mismo con el aprendizaje no supervisado. Sin embargo, los científicos del aprendizaje profundo están trabajando duro para mejorar el rendimiento de los modelos no supervisados. En este blogpost, vimos cómo funcionan realmente dos de los marcos de aprendizaje no supervisado más famosos de los modelos generativos. Pudimos conocer los problemas de los Autoencoders Variacionales y por qué las redes Adversariales son mejores para producir imágenes realistas. Pero hay problemas con las GAN, como la estabilización de su entrenamiento, que sigue siendo un área de investigación activa. Sin embargo, las GAN son realmente potentes y actualmente se están utilizando en una gran variedad de tareas como la generación de imágenes de alta calidad (ver este vídeo) y de vídeos, la traducción de textos a imágenes, la mejora de imágenes, la reconstrucción de modelos 3D de objetos a partir de imágenes, la generación de música, el descubrimiento de fármacos contra el cáncer, etc. Además de esto, muchos investigadores de aprendizaje profundo también están trabajando para unificar estos dos modelos y obtener lo mejor de ambos. Viendo el creciente ritmo de avance del Deep Learning, creo que los GANs abrirán muchas puertas cerradas de la Inteligencia Artificial como el Aprendizaje Semisupervisado y el Aprendizaje por Refuerzo. En los próximos años, los modelos generativos van a ser muy útiles para el diseño de gráficos, el diseño de interfaces de usuario atractivas, etc. También será posible generar textos en lenguaje natural utilizando Redes Generativas Adversariales.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.