enero 26, 2019 6:00 pm

Jesús

?? Read in English

La semana pasada aprendimos sobre los autoencoders y su increíble utilidad en tareas como la compresión de información, así como la eliminación de ruido en los datos.

Sin duda, este tipo de redes neuronales es increíblemente fascinante. En mi opinión, el rasgo que las vuelve tan interesantes es que, a diferencia de las redes tradicionales, su rol no se limita a clasificar información, a responder preguntas sobre los datos, o a proveer un número que se correlacione con la entrada, sino que van más allá, produciendo, generando contenido con base a su aprendizaje.

Resulta que los autoencoders pertenecen a una familia de modelos cuyo propósito es generar información.

Por supuesto, el mecanismo y la filosofía de generación varía de algoritmo en algoritmo. Por un lado, tenemos las populares redes neuronales recurrentes (RNNs), las cuales entre sus múltiples facetas, cuentan con la habilidad de generar secuencias de texto bien sea caracter a caracter, o palabra a palabra. Es así como funcionan los chatbots o aplicaciones tan importantes como Google Translate.

Los autoencoders, por su parte, procuran generar una copia de la entrada lo más parecida a esta que sea posible, mediante la aplicación de una función de costo que compara el resultado producido con la imagen o entrada original. Como es de esperar, el cálculo de dicho costo incrementa en proporción a las dimensiones de las instancias sobre las cuales el modelo se está entrenando. Así, pues, un autoencoder con la meta de reproducir imágenes en full HD tomará mucho más tiempo en producir resultados decentes debido a la densidad de la información contenida en los ejemplos de entrada.

Redes Generativas Adversas

Entre los miembros más interesantes de la familia de modelos generadores se encuentran las Redes Generativas Adversas (Generative Adversarial Networks) o GANs, por sus siglas en inglés.

Una de las grandes ventajas de las GANs es su capacidad generar una imagen completa en paralelo, en una sola corrida, en vez de píxel a píxel.

Como sucede con los autoencoders, las GANs se componen de dos redes que funcionan en tándem. Sin embargo, mientras que en un autoencoder el encoder y el decoder trabajan en conjunto, en las GANs, el beneficio se produce del roce, del ida y vuelta, de la lucha entre el generador y el discriminador.

Generador

El generador es el encargado de, a partir de ruido aleatorio, producir imágenes realistas. El estado aleatorio del cual parta el generador, determinará el tipo de imagen resultante. La manera en la que lleva a cabo este proceso es pasando dicho ruido por una función diferenciable que lo transforma y lo amolda a una forma familiar, típicamente tridimensional, correspondiente a una imagen.

Al correr el generador sobre múltiples muestras de ruido aleatorio produce numerosas imágenes realistas.

De manera más matemática, a medida que el generador mejora y gana maestría, la distribución de la función diferenciable utilizada por el mismo se aproxima más y más a la distribución real de las imágenes o datos que busca emular. Así, por ejemplo, si entrenamos una GAN para producir rostros humanos, durante las primeras iteraciones sólo obtendremos ruido ininteligible, pero a medida que el entrenamiento progresa, las imágenes producidas se parecerán más y más (con mayor frecuencia) a caras. La meta es que en un punto no podamos distinguir entre una imagen real y una generada.

Discriminador

Por supuesto, el generador no nace aprendido. Es decir, no produce imágenes perfectas desde el principio, sino que tiene que entrenarse.

¿Cómo? El entrenamiento de un modelo generador no sigue los patrones del aprendizaje supervisado. Para empezar, no tenemos etiquetas que podamos asociar con cada imagen. Lo que hacemos es mostrarle un montón de imágenes al modelo, y le pedimos que produzca imágenes que pertenezcan a la misma distribución.

Fácil, ¿no? En teoría, sí. ¿Cómo llevamos esta noción a la práctica? En el caso de las GANs, necesitamos la ayuda de otro modelo, conocido como el discriminador. Éste será el encargado de decir si una imagen es real o falsa. Para ello, aproximadamente el 50% de las veces le pasaremos imágenes reales de nuestra data de entrenamiento, y el otro 50% de las veces le pasaremos imágenes producidas por el generador.

El discriminador será entrenado para producir probabilidades cercanas a 1 para imágenes reales, y probabilidades cercanas a 0 para aquellas que fueron generadas. Mientras tanto, el trabajo del generador es el opuesto: Será entrenado para generar imágenes a las que el discriminador le asignará probabilidades cercanas a 1. Es decir, el trabajo del generador es engañar al discriminador, mientras que la labor de éste es mantenerse alerta.

Es mediante esta tensión constante que el generador se verá forzado a generar imágenes cada vez más realistas, puesto que el discriminador también aprenderá a distinguir mejor con el tiempo.

Finalmente, el discriminador tenderá a asignar probabilidades cercanas a 0.5 con más frecuencia a medida que el generador se aproxime más y más a la distribución de las imágenes reales en el conjunto de entrenamiento. Una vez llegados a este punto, el discriminador será incapaz de distinguir entre imágenes reales y artificiales, por lo que el entrenamiento del generador se dará por concluido.

Es menester recordar que el discriminador es una herramienta para entrenar el generador. Es decir, cuando dicho proceso acaba, el primero es típicamente desechado, puesto que el verdadero valor yace en el segundo.

Las redes generativas adversas fueron inventadas por Ian Goodfellow.

Sólo por diversión, te recomiendo que veas el siguiente video, donde Siraj utilizará GANs para generar nuevos Pokémons:

Manos a la Obra

Cerremos este post implementando una GAN en TensorFlow:

Puedes encontrar el código utilizado en este artículo en el siguiente repositorio.

Nos vemos.

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.