TensorFlowPost

 

Hoy, en esta sexta entrega de la  introducción práctica al Deep Learning con TensorFlow de Google (primera entrega,  segunda entrega, tercera entrega, cuarta entrega, quinta entrega) vamos a presentar un poco de teoría para poder entender cómo se construye un modelo que nos permita  reconocer las imágenes MNIST.

La regresión softmax se realiza en dos pasos principales.  Primero calculamos “las evidencias” de que una determinada imagen pertenece a una clase en particular  y después  convertimos estas evidencias en probabilidades de que pertenezca a cada una de las 10 clases.

11- Evidencia de pertenencia

Para medir la evidencia de que una determinada imagen pertenece a una clase en particular, una aproximación muy usada consiste en realizar una suma ponderada de las intensidades de los píxeles. El peso es negativo si ese píxel que tiene una alta intensidad es evidencia en contra de la imagen de estar en esa clase, y positivo si es evidencia a favor.

Para explicarlo con un ejemplo gráfico supongamos que disponemos del modelo aprendido para el número cero (más adelante veremos cómo se aprenden estos modelos). Por el momento podemos ver un modelo como “algo” que contiene información para saber si un número es de una determinada clase. En este caso hemos escogido un modelo como el que presentamos a continuación, donde el rojo (en b/n es el gris más claro)  representa pesos negativos (es decir reducir la evidencia de que pertenece), mientras que el azul (en b/n es el gris más oscuro) representa los pesos positivos.

Screen Shot 2015-11-28 at 22.12.27

Imaginemos una hoja en blanco de 28×28 pixels y trazamos un cero en ella. En general el trazo de nuestro cero caería sobre la zona azul (recordemos que en la segunda entrega comentamos que las imágenes habían sido normalizadas a 20×20 pixels y posteriormente centradas a una imagen de 28×28).

Resulta intuitivamente bastante claro que si nuestro trazo pasa por encima de la zona roja, lo más probable es que no estemos trazando un cero (recordemos que los números están centrados en el juego de pruebas). Por tanto usar una métrica basada en sumar si estamos en zona azul y restar si nuestro trazo pasa por zona roja puede parecer razonable.

Imaginemos que trazamos un tres, está claro que la zona roja del centro del anterior modelo de referencia va a penalizar la métrica del sumario antes mencionada. Pero en cambio, si el modelo de referencia es el siguiente

Screen Shot 2015-11-28 at 22.22.08

podemos observar que en general, los diferentes posibles trazos que representan a un tres se mantienen en la zona azul. En este caso el trazado de un cero quedaría en parte en zona roja. Espero que el lector, viendo estos dos casos concretos, pueda ver como la aproximación de los pesos indicados anteriormente nos permite hacer una estimación de qué número se trata.

El siguiente diagrama muestra los pesos de un ejemplo concreto de modelo aprendido (más adelante veremos cómo se aprenden estos modelos) para cada una de estas diez clases del MNIST. Recordemos que hemos escogido el rojo en esta representación visual de los pesos negativos, mientras que usaremos el azul para representa los pesos positivos.

softmax-weights

De manera más matemática podríamos expresar que la evidencia  para una clase i dado un input x se puede calcular como:Screen Shot 2015-11-30 at 16.46.37

donde i indica la clase (en nuestro caso entre 0 y 9), j es un índice para sumar a lo largo de los pixels de nuestra imagen de entrada x, y finalmente Wi representa los pesos anteriormente mencionados.

Recordemos que en general los modelos incluyen un parámetro extra que representa el sesgo (bias en inglés) indicando un cierto marge de incertidumbre.  En nuestro caso la fórmula final quedaría como:

Screen Shot 2015-11-30 at 16.47.23

donde bi representa este sesgo descrito (más adelante volveremos en más detalle sobre este parámetro).

 

12- Probabilidades de pertenencia

Recordemos que hemos comentado que el segundo paso consistía en calcular unas probabilidades. En concreto se trata de convertir el recuento de evidencias en probabilidades predichas, que indicaremos con la variable y, usando la función “softmax“:

Screen Shot 2015-11-30 at 18.41.03

 

A diferencia del ejemplo de la neurona del apartado anterior que el output era una función lineal con valor 0 o 1, ahora requerimos que el vector de output sea una distribución de probabilidad que la suma de todos sus componentes sume 1. Para conseguir normalizar cada componente de tal manera que sume 1, la función softmax  usa el valor exponencial de sus entradas y luego las normaliza como se muestra en la siguiente expresión:
Screen Shot 2015-11-30 at 18.42.51

El efecto que se consigue con el uso de exponenciales es que una unidad más de evidencia tiene un efecto multiplicador en el peso. Y a la inversa, una unidad menos de evidencia significa que una hipótesis obtiene una fracción de su peso anterior. A la vez softmax normaliza estos pesos, de modo que sumen uno, formando una distribución de probabilidad válida.

Lo interesante de esta función es que  una buena predicción tendrá una sola entrada en el vector con valor cercano a 1, mientras que las entradas restantes estarán cerca de 0. En una predicción débil tendrán varias etiquetas posibles, que tendrán más o menos la misma probabilidad.

 

13- Notación matricial de softmax

De forma gráfica podríamos pintar la función softmax de la siguiente forma, aunque en el caso de MNIST tendría 10 variables de entrada y salida.

Screen Shot 2015-11-30 at 20.00.03

Para cada variable de salida yi, se calcula la suma ponderada de las entradas xs, se suma el sesgo, y luego se aplicar softmax. Si lo escribimos en forma de ecuaciones tendríamos (para este ejemplo de 3):

Screen Shot 2015-11-30 at 20.08.55

Y finalmente lo podemos reescribir en este formato que usamos en clase de multiplicación de matrices y suma de vector:

 

Screen Shot 2015-11-30 at 20.36.54

De forma más compacta y genérica podemos expresarlo de la siguiente manera:

Screen Shot 2015-11-30 at 20.15.46

 

Después de esta visión rápida de la teoría en la próxima entrega crearemos el modelo de detección de dígitos usando TensorFlow desde Python. Nos encontramos en la próxima entrega.

Link a siguiente entrega: parte 7

  Cualquier consulta o sugerencia pueden contactar a través de DeepLearningBarcelona@gmail.com