menéame AI (Artificial Intelligence)

Hace dos semanas @dmoran publicaba un artículo sobre Deep Learning: www.meneame.net/m/Artículos/introduccion-deep-learning-1-4-1

No me voy a centrar en explicar lo que es el Deep Learning y toda la matemática que hay detrás, sino que iré poco a poco con experimentos que podáis ver en vuestro navegador.

Así que sin más dilación os invito a entrar a la url de menéame AI: meneameai.herokuapp.com

Lo que véis ahí son 5 experimentos de Deep Learning, los 4 primeros se ejecutan en vuestro navegador, el quinto se ejecuta en servidor.

Experimento 1: Entender una función

Veréis algo como esto:

Veréis una curva en verde, que es el input, y la roja es la salida del programa, que lo que hace es intentar aprender la curva verde. Por ponerlo de manera matemática, si f(x) = y, lo que hace el deep learning en este caso es intentar crear un modelo tal que para cada x,la y que devuelve sea lo más parecida a la de la función. Esto se hace entrenando, es decir, diciéndole a la red de neuronas pares de (x, y).

Y lo que estáis viendo es una regresión, este término es importante, una regresión es cuando la red de neuronas devuelve un valor real. En contraposición con una clasificación, que lo que hace es devolver un valor de entre una lista de posibles valores. Ejemplo, si la red debe devolver un valor de [rojo, blanco, negro, verde, azul], es una clasificación. Si la red debe devolver un valor entre 0 y 1, por ejemplo 0.7435, es una regresión.

Veréis 4 posibles botones, en realidad 2 funciones y la misma función con ruido. Esto es para tres cosas:

  1. Incluso cuando el input tiene ruido, el output no. Es una de las cosas que se buscan en inteligencia artificial: generalizar la función y eliminar outliers (valores que son erróneos en el input).
  2. Ver que se pueden aprender funciones más complejas
  3. Ver que la red neuronal va aprendiendo pesos, esto hace que si aprendéis una función y cambiais a la segunda, luego al cambiar a la primera la curva se adapta mucho más rápidamente que al principio, porque los pesos almacenados ya están condicionados en parte.

También puedes ver y modifcar la topología de la red, dónde pone topología es desplegable:

Verás que por defecto la topología son 10 capas ReLu de 32 neuronas cada una. Esto de ReLu es lo que llamamos "activación", hay otras como la sigmoide o la tangente hiperbólica, pero hoy en día se usa mucho ReLu por su sencillez: básicamente es una función que devuelve 0 si x <0, y es si x >= 0.

También se puede cambiar el método de entrenamiento, pero por defecto dejad adadelta que os irá bien.

Epoch es el número de iteración, y loss es el error, cuanto más bajo mejor, veréis que con el tiempo ese número va bajando.

Experimento 2: Una foto es una función

Pues eso, una foto se puede entender como una función f(x,y) = (r,g,b), es decir, dos entradas (el x e y del pixel) y 3 salidas (una por cada color). Entonces si una red neuronal intenta aprenderse una foto, salen cosas curiosas. Una de las cosas a tener en cuenta es que si una foto es 250x250, eso son 62500 puntos, y por cada punto se guardan 4 bytes de color y paleta. En cambio en la red, tal y como está, hay 7 capas con 20 neuronas por capa, es decir, que el modelo que aprende la red neuronal pesa menos que la foto en cuestión. Con las caras tendrá dificultades, demasiados detalles.

Experimento 3: MNIST, entender cifras escritas a mano

Este experimento sí es de clasificación. El input son fotos de cifras escritas a mano, en blanco y negro, y la salida debe ser uno de los elementos de [0,1,2,3,4,5,6,7,8,9]. Lo tenéis muy bien explicado en el artículo de @dmoran.

¿Cómo funciona? Tenemos 70.000 cifras escritas a mano y además clasificadas (de cada una sabemos lo que pone, dentro de los elementos mencionados). De esas 70.000 usamos 60.000 para entrenar, y 10.000 para testear que entrenamos. ¿Por qué se hace esto? Siempre en IA se procura tener un juego de train y de test para comprobar que la generalización es buena y además que no existe "overfitting", es decir, que no se ha aprendido al dedillo las respuestas para los inputs con los que hemos entrenado, sino que ha generalizado.

Cada 100 imágenes vistas por la red, se pinta lo que hay dentro de la red para intentar entenderla. Cada 1000 imágenes vistas, se calculan varios resultados del juego de test para probar.

Por explicar cada capa:

  • Input: la entrada
  • Convolution: varias modificaciones del input basadas en matrices
  • ReLu: la activación
  • Pooling: consiste en reducir el tamaño de la capa anterior
  • Softmax: la última capa que realiza la clasificación. Los colores aquí son la probabilidad, de manera que 1 es el blanco, 0 es el negro. En el ejemplo veréis que el cuadrado más blanco es el del 8.

Y en cuanto al juego de pruebas, lo va acertando así:

Al lado de cada imagen veréis tres números con barras. La longitud de la barra es la probabilidad que devuelve de que sea esa clasificación. Si una barra es verde, es que era el valor correcto. Veréis que ha fallado un 7 de 50, así que el accuracy sería 43/50 = 86%, que no está mal, y eso cuando todavía no ha visto más que el 15% de los inputs del juego de entrenamiento.

Experimento 4: CIFAR-10, clasificar fotos

Un ejemplo más complejo que MNIST. Son 60.000 fotos clasificadas en 10 categorías: airplane, car, bird, cat, deer, dog, frog, horse, ship y truck. El proceso es similar al de MNIST, así que no merece la pena volver a explicarlo, pero la topología de red necesaria es más compleja, y las fotos un pelín más grandes (32x32), así que va más lento. Cada 100 ejemplos vistos actualizamos lo que se ve en las capas y el test. La cantidad de ejemplos del test que se muestran se ha limitado a 200 para no pesar demasiado al navegador. Lo tendréis que dejar más rato para que empiece a aprender y acertar. Tened en cuenta que contestando cosas al azar, el accuracy sería 10%, y ya desde el principio veréis que el accuracy está por encima.

Si lo dejais suficiente tiempo comenzaréis a ver que es capaz de aprender.

Experimento 5: ¿Qué hay en la foto?

Este experimento no se ejecuta en vuestros navegadores, sin en servidor, y sirve para mostar ciertas cosas geńéricas que se pueden hacer con computer visition. Hemos visto lo que es regresión y lo que es clasificación, pues bien, si hay una cara se puede hacer una regresión para intentar saber la edad y una clasificación para intentar saber el género. Básicamente en este experimento puedes subir una foto y obtener información de la misma.

Para subir una foto pinchad en el + y luego en la nubecilla para subirla.

Veréis que se da una descripción de lo que hay en la foto, luego los tags de lo que cree que ve en la foto, y por último una descripción de las personas que ve.

¡Espero que os ayude a entender mejor Deep Learning y Computer Vision!