diciembre 1, 2018 6:00 pm

Jesús

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

?? Read in English

Las redes neuronales convolucionales son la piedra angular del exponencial auge que ha experimentado la visión computarizada en los últimos años.

A pesar de esta incontestable responsabilidad, las CNNs (siglas de Convolutional Neural Networks, su nombre en inglés) son más versátiles de lo que parece a primera vista. Han jugado un rol fundamental en los avances más recientes en áreas como:

  • Reconocimiento de voz de usuario.
  • Procesamiento de lenguaje natural.
  • Visión computarizada (claramente).
  • Conducción autónoma.
  • Aprendizaje reforzado.

Particularmente, en el área de NLP (Natural Language Processing), las redes neuronales recurrentes (RNNs) son la opción más utilizada, aunque las CNNs, como lo demuestra este artículo, han tenido éxito en este dominio.

El número de aplicaciones de las CNNs es prácticamente incontable. Por este motivo, en este post nos dedicaremos a explorar a fondo su funcionamiento, apoyándonos tanto en teoría como en práctica, a través de notebooks.

Como de costumbre, te invito a descargar el material de apoyo de este artículo aquí.

ADVERTENCIA: Este post es ENORME. Prepárate una buena taza de café antes de empezar a leer.

 

¿Por qué usar CNNs?

Si eres como yo, es posible que en este punto te estés preguntando por qué no podemos usar nuestras confiables redes neuronales tradicionales (FCNs o MLPs de ahora en adelante). ¿Qué hay de malo con ellas? ¿Realmente tengo que aprender una nueva arquitectura para poder procesar imágenes o texto?

La respuesta a esta pregunta es sí, pero también no. Hay razones de peso (las cuales descubriremos a lo largo de este artículo) para preferir una CNN para procesar imágenes. Ello no quiere decir que un MLP no vaya a ser capaz de hacer el trabajo, pero en la mayoría aplastante de las veces, la CNN se desempeñará considerablemente mejor que su contraparte.

 

MNIST

En el mundo de deep learning, MNIST juega un papel similar al de “Hello World!” en el mundo de la programación.

MNIST es una base de datos de imágenes de números escritos a mano, los cuales van desde el 0 hasta el 9. Está compuesta de 70.000 muestras que han pasado por diversos procesos de limpieza y preprocesado, lo que convierte a MNIST en el conjunto de datos perfectos para enseñar el funcionamiento de diversas arquitecturas de deep learning, sin tener que pasar demasiado tiempo entendiendo, limpiando o manipulando los datos.

En el siguiente notebook utilizaremos un MLP tradicional para hacer predicciones sobre MNIST. Léelo para obtener más detalles sobre los desafíos que nuestro algoritmo tendrá que sortear, así como lo que verdaderamente ve una computadora cuando lidia con imágenes (también puedes leer este post de acá, donde hablo con más detalle al respecto).

Como pudimos ver, los MLPs están diseñados para procesar únicamente vectores. Sin embargo, nuestras imágenes tienen un ancho y una altura de 28 pixeles cada una. ¿Qué podemos hacer?

Para poder pasar la imagen por nuestra red neuronal, tuvimos que “aplanarla”, es decir, volverla un vector de 28×28=784 elementos. La manera de hacer esto es concatenar cada fila en la imagen.

¿Cuál es el lado negativo de esto? El principal contratiempo es que la información espacial de los números representados en las fotos se pierde. La razón por la cual sabemos que un 7 es un 7 es porque su forma se manifiesta en dos dimensiones, donde la ubicación de cada elemento (una línea horizontal, un trazo vertical, etcétera), de cada píxel juega un papel fundamental en la definición del número.

Lamentablemente, las MLPs no son capaces de aprovechar la rica información espacial que está contenida en las imágenes. Cada fotografía es transformada en un gran vector de números sin ninguna relación en particular.

Por otro lado, las CNNs fueron diseñadas para entender y procesar cuadrículas numéricas que representan imágenes. De manera más concreta, las CNNs entienden que píxeles más cercanos están más relacionados entre sí, y son capaces de usar este hecho para mejorar sus predicciones.

Entonces, ¿por qué a nuestra MLP le fue tan bien clasificando los números de MNIST? Hay varios factores que hacen de MNIST un conjunto de datos relativamente sencillo para las FCNs:

  • Cada imagen ha sido fuertemente limpiada y preprocesada.
  • Los números se encuentran en el centro de cada fotografía.
  • Las imágenes son en blanco y negro.
  • El número de clases es bajo (sólo 10).
  • Las imágenes son de baja resolución (28×28)
  • Los números tienen aproximadamente el mismo tamaño en cada imagen.

Más adelante veremos otras aplicaciones en donde las MLPs no dan la talla.

 

Conectividad Local

Uno de los principales problemas con las redes neuronales tradicionales, también conocidas como redes totalmente conectadas es, precisamente, el hecho de que cada neurona en una capa tiene que estar conectada a cada neurona en la capa anterior. Como bien sabemos, cada conexión está gobernada por un parámetro que debe ser aprendido por la red. Por consiguiente, mientras más parámetros tenga una red, mayor tiempo se tomará en entrenar y en hacer predicciones.

Ahora, ¿son realmente necesarias tantas conexiones? Para las FCNs sí, ya que al no contar con la capacidad de entender información bidimensional (como imágenes), han de conformarse con vectores. En consecuencia, son incapaces de identificar patrones locales muy sencillos de ver en 2 dimensiones, pero que se pierden al pasar al mundo unidimensional.

Así, lo que para ti, para mí y para una CNN es una imagen con un número 1, independientemente de su ubicación en la imagen, para una FCN un 1 corrido un pixel a la izquierda es totalmente diferente a un 1 corrido un pixel a la derecha.

El gran valor que las redes convolucionales proveen es su conectividad local: Las neuronas de la siguiente capa se enfocan sólo en un subconjunto de las neuronas de la capa anterior. La primera consecuencia obvia de esta característica es la disminución drástica del número de parámetros que la red debe aprender. La segunda es que es las neuronas enfocadas en éstas regiones son capaces de identificar patrones específicos en cualquier lugar de la imagen. Por ejemplo, si las neuronas de una capa se especializaron en identificar líneas diagonales, estarán en capacidad de detectarlas donde sea que aparezcan en una fotografía.

 

Las Capas de las Redes Convolucionales

En esta sección hablaremos de las principales capas que nos permiten diseñar y construir arquitecturas de redes neuronales convolucionales.

 

Capas Convolucionales

Éstas capas son las encargadas de conectar cada neurona con una región específica de la imagen. La manera de hacer esto es aplicando lo que se conoce como una ventana de convolución o, de manera más sencilla, un filtro.

En esta imagen vemos que el filtro que se aplica es de 3×3 y produce un único resultado en la siguiente capa. Esta operación se conoce como convolución, la cual consiste en multiplicar los elementos del filtro por los elementos de la región, posición por posición, para posteriormente sumarlos. Como ocurre en la mayoría de las redes neuronales, el resultado de una operación luego es pasado a una función de activación. En el caso de las CNNs, la función de activación más utilizada es ReLU, la cual se define así: max(0, n), donde n es el resultado de la convolución.

En el caso de imágenes en 3 dimensiones (imágenes a color), cada filtro también tendrá tres dimensiones y el comportamiento será análogo al descrito arriba, solo que tomando en cuenta la profundidad.

Hay tres parámetros que controlan el comportamiento y, por lo tanto, las dimensiones que produce una capa convolucional:

  • Número de filtros: Es el número de ventanas de convolución que se aplicarán sobre la capa anterior. El resultado de cada uno de ellos es apilado en la siguiente capa, produciendo, en efecto, una sub red neuronal especializada en cada región de la capa anterior.
  • Stride: Es el número de pixeles que desplazaremos el filtro, tanto vertical como horizontalmente. En la imagen anterior, este parámetro es igual a 1.
  • Padding: Nos dice cómo debemos aplicar el filtro en los bordes. Puede darse el caso de que no tengamos una región lo suficientemente grande para aplicar la convolución. Si ello sucede, podemos hacer una de dos cosas:
    • Sólo aplicar convoluciones válidas, ignorando las regiones a los bordes de la imagen, lo cual hará que nuestra red no sepa cómo interpretar la información allí ubicada. Esta opción se suele nombrar VALID.
    • Agregar ceros en los extremos de la imagen hasta completar las dimensiones necesarias para poder aplicar la convolución. Esta opción se conoce como SAME.

En el siguiente notebook miramos en profundidad el rol que juegan los filtros en las capas convolucionales de una CNN.

Así es como las CNNs son capaces de descubrir patrones en las imágenes. ¿Sabes qué es lo más cool? Si consideramos que las imágenes no son más que volúmenes tridimensionales, podemos aplicar capas convolucionales al resultado de otras capas convolucionales, encontrando, en efecto, patrones en los patrones (y así sucesivamente).

http://gph.is/2AmePHo

Capas de Agrupación

Son utilizadas para sintetizar la información proveniente de capas anteriores mediante una operación en particular. Así como las capas convolucionales, se aplican en una región o ventana específica, la cual se va desplazando vertical u horizontalmente acorde al stride.

Existen dos tipos principales de capas de agrupación:

  • Max Pooling: Toma el máximo elemento dentro de la ventana de aplicación.
  • Average Pooling: Toma el promedio de los elementos dentro de la ventana de aplicación.

Capas de Agrupación Global

Cumplen con el mismo propósito que las capas de agrupación tradicional, sólo que actúan de manera más agresiva, puesto que no utilizan una ventana de aplicación, sino que calculan el máximo o el promedio tomando en cuenta todos los elementos del volumen (de ahí su nombre).

Solidifiquemos este conocimiento construyendo una CNN.

En el siguiente notebook comparamos el desempeño de una MLP y una CNN en otro bien conocido conjunto de datos llamado CIFAR-10.

Finalmente, en este último notebook hablamos de una técnica muy útil para mejorar el poder predictivo de una red neuronal convolucional:

¡Esto es todo por hoy! ¡Lo hiciste! ¡Te felicito por haber leído hasta aquí!

Las redes neuronales convolucionales son unas de las más poderosas dentro del mundo de deep learning, pero, ciertamente, son bastante complicadas de entender. Si tienes alguna duda sobre su funcionamiento, te exhorto a que leas el artículo nuevamente y que complementes con información de otras fuentes, puesto que las CNNs son el pilar de la visión computarizada moderna.

Nos vemos pronto.

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

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.