enero 19, 2019 6:00 pm

Jesús

?? Read in English

Típicamente, las redes neuronales profundas son utilizadas en problemas de aprendizaje supervisado. Es decir, a partir de data etiquetada, bien sea con valores continuos (como el precio de un inmueble) o discretos (categorías, como gato o perro), buscamos hallar o aproximar la función que correlaciona entradas y salidas. De manera más sencilla, queremos saber para cada X, cuál es su y correspondiente.

>>> Descarga el código de este post aquí <<<

No obstante, las redes neuronales también albergan el potencial de brillar en contextos donde el conjunto de datos no está etiquetado (aprendizaje no supervisado).

Unas de las aplicaciones más fascinantes, por no decir útiles, en este respecto es la compresión de información. Para ello, utilizamos un tipo especial de redes neuronales conocidas como autoencoders.

Los autoencoders en vez de correlacionar X e y, lo que buscan es, a partir de una representación reducida de la entrada, reconstruirla. Para ello, cuentan con tres piezas específicas:

  • Codificador (Encoder): Es la porción de la red neuronal encargada de comprimir los datos de entrada, típicamente en forma de vector, conocido como bottleneck feature.
  • Bottleneck feature: Un feature cuello de botella es la capa media que divide al encoder y al decoder. Es la representación comprimida de la entrada, usualmente bastante más pequeña en cuanto a dimensiones e información.
  • Decodificador (Decoder): Es la segunda parte de la red neuronal, a cargo de reconstruir los datos de entrada originales a partir de la representación comprimida resultante del feature cuello de botella.

En teoría, los autoencoders deberían ser capaces de reproducir la data original sin pérdida de información, pero no suele ser el caso en la práctica, puesto que al convertir la entrada al bottleneck feature es inevitable que prescindamos de información que es difícil de reconstruir por el decoder.

Es por este motivo que seguimos prefiriendo formatos como GZIP, MP3 o JPEG, los cuales han sido diseñados para programáticamente comprimir un tipo de dato específico, en vez de los autoencoders.

Sin embargo, es necesario destacar que una de las aplicaciones donde éstas redes neuronales superan las expectativas es reduciendo el ruido en los datos de entrada (como en las imágenes), por lo que se suelen utilizar para mejorar la calidad de, por ejemplo, fotografías en mal estado.

Así mismo, aunque la red se entrena de principio a fin con la meta de reproducir de la manera más fidedigna posible el dato de entrada, el verdadero valor yace en el bottleneck feature, puesto que para que la misma sea capaz de alcanzar esta meta, dicho vector debe resumir lo suficientemente bien la información de la entrada original como para que la copia regenerada sea lo más similar posible. Por consiguiente, dependiendo del dominio, el decoder actúa más como un mecanismo de entrenamiento que luego es desechado para solo quedarnos con un encoder capaz de producir vectores de alta calidad, representativos de los datos de entrada, permitiéndonos así ahorrar espacio y recursos.

A continuación implementamos un simple autoencoder basado en capas fully-connected para reconstruir las imágenes del célebre conjunto de datos, MNIST.

Como ya bien sabemos, cuando se trata de imágenes, usar convoluciones es una apuesta segura. Por supuesto, en el caso de los autoencoders no iba a ser diferente, por lo que en el notebook que sigue a continuación adaptaremos nuestra implementación para usar capas convolucionales:

>>> Descarga el código de este post aquí <<<

¡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.