Una breve introducción a las GAN

Con explicaciones de las matemáticas y el código.

Las GAN, o Redes Adversarias Generativas, son un tipo de arquitectura de red neuronal que permite a las redes neuronales generar datos. En los últimos años, se han convertido en uno de los subcampos más populares en el aprendizaje profundo, pasando de generar imágenes borrosas de dígitos a imágenes fotorrealistas de rostros.

Antes: dígitos difusos, Después: caras fotorrealistas

Las variantes de GAN ahora han hecho cosas locas, como convertir imágenes de cebras en caballos y viceversa.

Las GAN me parecieron fascinantes y, en un esfuerzo por comprenderlas mejor, pensé que escribiría este artículo y, en el proceso de explicar las matemáticas y el código detrás de ellas, las entendería mejor.

Aquí hay un enlace a un repositorio de Github que hice para los recursos de GAN:

Entonces, ¿cómo funcionan las GAN?

Las GAN aprenden una distribución de probabilidad de un conjunto de datos al enfrentar dos redes neuronales entre sí.

Aquí hay un gran artículo que explica las distribuciones de probabilidad y otros conceptos para aquellos que no están familiarizados con ellos:

Un modelo, el generador, actúa como un falsificador de pintura. Intenta crear imágenes que se vean muy similares al conjunto de datos. El otro modelo, el discriminador, actúa como la policía e intenta detectar si las imágenes generadas eran falsas o no.

Lo que sucede básicamente es que el falsificador sigue mejorando para hacer falsificaciones, mientras que la policía sigue mejorando para detectar falsificaciones. Efectivamente, estos dos modelos siguen tratando de vencer entre sí, hasta que después de muchas iteraciones, el generador crea imágenes indistinguibles del conjunto de datos real.

La formación de redes de confrontación generativas implica dos objetivos:

  1. El discriminador maximiza la probabilidad de asignar la etiqueta correcta tanto a los ejemplos de entrenamiento como a las imágenes generadas por el generador. Es decir, el policía se vuelve mejor para diferenciar entre falsificaciones y pinturas reales.
  2. El generador minimiza la probabilidad de que el discriminador pueda predecir que lo que genera es falso. Es decir, el generador se vuelve mejor creando falsificaciones

Intentemos codificar estas dos ideas en un programa.

Seguiremos este código en este tutorial

Los datos

Las GAN necesitan un conjunto de datos para usar, por lo que para este tutorial, utilizaremos el clásico hola mundo para el aprendizaje automático: MNIST, un conjunto de datos de dígitos escritos a mano.

El generador también necesita vectores de entrada aleatorios para generar imágenes, y para esto, usaremos numpy

La función GAN

La GAN juega un juego minimax, donde toda la red intenta optimizar la función V (D, G). Esta es la ecuación que define lo que está haciendo una GAN:

Ahora, para cualquiera que no esté bien versado en las matemáticas detrás de esto, se ve aterrador, pero la idea que representa es simple, pero poderosa. Es solo una representación matemática de los dos objetivos definidos anteriormente.

El generador está definido por G (z), que convierte algo de ruido z que ingresamos en algunos datos, como imágenes.

El discriminador está definido por D (x), que genera la probabilidad de que la entrada x provenga del conjunto de datos real o no.

El discriminador actúa como la policía.

Queremos que las predicciones en el conjunto de datos del discriminador sean lo más cercanas posible a 1, y que el generador sea lo más cercano posible a 0. Para lograr esto, utilizamos el log-verosimilitud de D (x) y 1-D (z) en la función objetivo.

El registro solo se asegura de que cuanto más se acerca a un valor incorrecto, más se penaliza.

Aquí hay una explicación para la pérdida de registros si no está seguro de lo que hace:

Codificando el generador

El generador es solo un modelo de red neuronal vainilla que toma un vector de entrada aleatorio y genera un vector de 784 dim, que, cuando se reforma, se convierte en una imagen de 28 * 28 píxeles.

Codificando al Discriminador

El discriminador es otra red neuronal que toma la salida de la red anterior, un vector de 784 dimensiones, y genera una probabilidad entre 0 y 1 de que proviene del conjunto de datos de entrenamiento.

Compilarlo en una GAN

Ahora compilamos ambos modelos en una única red de confrontación, configurando la entrada como un vector de 100 dimensiones y la salida como la salida del discriminador.

Entrenando a la GAN

  1. Primero, cargamos los datos y los dividimos en varios lotes para alimentar nuestro modelo
  2. Aquí solo inicializamos nuestra red GAN según los métodos definidos anteriormente
  3. Este es nuestro ciclo de entrenamiento, donde corremos por el número especificado de épocas.
  4. Generamos algo de ruido aleatorio y sacamos algunas imágenes de nuestro conjunto de datos
  5. Generamos algunas imágenes usando el generador y creamos un vector X que tiene algunas imágenes falsas y algunas imágenes reales.
  6. Creamos un vector Y que tiene las "respuestas correctas" que corresponden a X, con las imágenes falsas etiquetadas con 0 y las imágenes reales etiquetadas con 0.9. Están etiquetados 0.9 en lugar de 1 porque ayuda a GAN a entrenar mejor, un método llamado suavizado de etiquetas unilateral.
  7. Necesitamos alternar el entrenamiento entre el discriminador y el generador, así que aquí, actualizamos el discriminador
  8. Finalmente, actualizamos el discriminador.

Nuestra primera GAN

Una vez que ejecutamos el código anterior, ¡hemos creado efectivamente nuestra primera GAN que genera dígitos desde cero!

¡Imágenes generadas de la GAN que entrenamos!

Con suerte, este artículo proporcionó una introducción a las redes adversas generativas y cómo crear una. En el futuro cercano, escribiré mucho más sobre el aprendizaje automático, ¡manténgase actualizado!

Gracias por leer,

Sarvasv

¿Quieres hablar? Búscame en Twitter y Linkedin

Aquí hay algunas otras publicaciones que he escrito