La inteligencia artificial ha logrado grandes avances en los últimos años, una de las áreas que más se ha visto beneficiada por la I.A. es el procesamiento de imágenes. Tareas que a los humanos nos resultan sumamente fáciles, como ver una foto de una silla y saber que es lo que estamos viendo, es algo muy difícil para explicarle a una computadora. Antes de este boom reciente de deep learning, para poder identificar elementos en una imagen se tenía que programar de manera manual un montón de filtros para detección de bordes, colores, patrones etc. Esto podía llegar a consumir mucho tiempo y es difícil hacer un sistema que tenga la capacidad de hacer buenas generalizaciones, por ejemplo, hay muchas razas de perros y enseñarle a un programa características específicas de cada una es algo sumamente elaborado.
Hace unos años que se empezó a experimentar con las redes neuronales profundas se desarrolló una estructura la cual resultó ser sumamente eficaz y eficiente en la clasificación y detección de objetos en una imagen, esta estructura se llama red neuronal convolucional, mejor conocida como CNN por sus siglas en inglés (Convolutional Neural Networks). Esta estructura está formada por capas de convoluciones, tal como lo dice el nombre, y tenemos la opción de aplicar otras capas las cuales nos pueden ayudar a procesar de mejor manera nuestras imágenes, como serian capas de pooling o agrupamiento.
Para que quede claro que hacen estas capas, imaginemos que queremos hacer una red neuronal para identificar gorilas en una foto. Para esto tenemos una imagen con altura, longitud y profundidad, en este caso profundidad es igual a 3, (Los canales de colores R, G y B). Si queremos hacerlo con capas de neuronas normales, tomariamos nuestra imagen, la dividiríamos en pixeles, cada pixel lo conectaremos a todas las neuronas de la siguiente capa, que cuenta con su función de activación y la multiplicación de matriz.
En teoría esto suena bien, pero hay dos problemas, el primero es que el número de conexiones entre las capas sería gigantesco ya que conectaríamos cada pixel con todas las neuronas de la siguiente capa y esto saturaría la fuerza de procesamiento de nuestra computadora, la otra razón importante es que es que nosotros queremos que identifique los objetos sin importar su ubicación en la imagen, si hay un gorila en la imagen no importa si esta arriba, abajo a la derecha o a la izquierda, esto se llama invarianza translacional y haciendo una red neuronal común esto no lo logramos.
Convoluciones
Ahora, para solucionar esto, en vez de una capa normal usaremos una capa convolucional, lo cual lo podemos ver como una red neuronal pequeña que en vez de procesar todos los pixeles de la imagen en una tanda, va procesando por partes y de salida va generando una nueva abstracción de la imagen, la cual tiene un tamaño más pequeño pero una profundidad mayor. Lo que se hace es básicamente recorrer varios filtros por la imagen, cada filtro genera una imagen más pequeña y cada resultado del filtro añade profundidad a la “nueva imagen” que saldrá de esta capa y cada filtro identifica distintas características en la imagen original.
Los parámetros importantes para una convolución son el tamaño del filtro, el stride o “paso”, la profundidad del filtro.
- El tamaño del filtro, es la altura y la longitud del filtro que estaremos recorriendo a lo largo de nuestra imagen para generar una nueva abstracción.
- La profundidad del filtro; es el número de filtros que tenemos en una capa convolucional y la profundidad de imagen que saldrá, cada filtro se llamará “mapa de características” y se encarga de detectar distintos elementos en esa capa. Entonces si tenemos una imagen de 10×10 con profundidad de 3 y nuestra capa tiene una salida de imagen de 5×5 con profundidad de 15, es que en nuestra capa de convolución corrimos 15 distintos filtro en nuestra imagen, para generar una profundidad de 15 “mapas de características”
- El paso es que tantos pixeles vamos a recorrer nuestro filtro en la capa convolucional.
Pooling o agrupación
Ahora, cuando nuestra capa convolucional genera la nueva imagen más pequeña y más profunda, podemos aplicarle a esa nueva imagen un Pooling o Agrupación que consta en hacer otro filtro el cual solo va a reducir el tamaño de la imagen, agrupando varios píxeles en uno, esto nos ayuda para no sobre ajustar y reduce la carga de computación requerida en la próxima capa pues es una imagen mas chica. Este filtro también tiene una altura y longitud, para agrupar los píxeles tenemos dos métodos principales de pooling. Max Pooling y Average Pooling.
- Max Pooling: Este filtro va recorriendo bloques de pixeles en nuestra imagen y para agruparlos, elige el valor más grande que está sobre ese bloque de imagen.
- Average Pooling: Este filtro recorre bloques de pixeles pero en vez de unirlos solo tomando el número mayor, obtiene el promedio de todos los pixeles en ese rango y lo genera como un pixel.
Estos son los elementos más importantes que necesitamos saber sobre las CNNs y gracias a esa estructura hemos podido avanzar tanto en el campo del procesamiento de imágenes, generando clasificadores de imágenes, detectores de elementos en imagenes y video. También se han usado las CNNs para el procesamiento de lenguaje natural, generando clasificadores de texto sumamente buenos y para que funcione lo único que tenemos que hacer es vectorizar nuestro texto de manera que tengamos una matriz con altura y longitud (tal como en una imagen) y tratarla como el ejemplo de imágenes que vimos.