Vous êtes sur la page 1sur 27

Parte 1

http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-1/

La prensa generalista como La Vanguardia o El Pas que encuentro en el restaurante donde


voy a comer, ya llevan tiempo mencionando de manera tmida las palabras Deep Learning.
Pero esto no ha hecho ms que empezar, y sin duda puede ser una oportunidad para
los ingenieros informticos.
Y en concreto, la semana pasada Google anunci que abra su cdigo de Deep Learning
llamado TensorFlow, creado por su equipo Google Brain. Sin duda es una noticia que se debe
analizar profundamente porque pienso que esta liberacin de cdigo puesto a disposicin de la
comunidad va a representar un punto de inflexin importante en este campo en muchos
sentidos.

Hay muchos ms entornos para deep learning,


como Theano, caffe, DeepLearning4J, torch, Mocha.jl o Lasagne, pero mi visin es
que TensorFlow va a marcar terreno rpidamente. Por ello les propongo que me acompaen
en esta breve introduccin prctica a TensorFlow (basndome en uno de los tutorials que
ofrece la misma pgina oficial de Tensorflow) siguiendo el modelo de learn by doing que utilizo
en mis clases prcticas en la universidad UPC.

Por motivos de disponibilidad voy a realizar esta introduccin en varios das mediante varios
post en este blog. Hoy, para acabar esta primera entrega, les avanzo una breve reflexin en
voz alta sobre los motivos que puede tener Google para liberar un cdigo de tanto valor, creo
que es importante. Tambin aado los pasos a seguir para instalar este paquete en su
ordenador.

1- Qu es lo ms importante hoy en da, el software o los datos?


Creo que una primera conclusin del paso que ha dado Google es que para poder extraer
conocimiento en el universo Big Data, lo ms importante ya no debe ser el software. Estoy
seguro que lo son los datos, que Google no comparte. Se puede entender que a medida que
las empresas son ms data-driven, est claro que se sienten ms cmodas abriendo su
software (sin liberar sus datos).

Pero estoy seguro que tambin hay en la decisin de Google el considerar el retorno que tiene
para cualquier empresa que libera un cdigo en cuanto a ideas que la comunidad aporta y la
empresa creadora tambin puede beneficiarse.

Pero tampoco hay que menospreciar el valor de marca que implica liberar un cdigo. Y si este
cdigo se usa, como estoy seguro que ser el caso TensorFlow, la compaa creadora del
software tiene mucha gente ya formada que puede incorporar en su empresa siempre que lo
necesite (y me imagino que esto va ha hacer Google pues todo pinta que continuar
creciendo).

2- Instalacin de TensorFlow
TensorFlow tiene una API Python que usaremos que requiere Python 2.7 instalado. La manera
ms fcil de instalar Su instalacin resulta bastante sencilla con el comando habitual pip install:

virtualenv ~/Virtualenvs/tensorflow
source ~/Virtualenvs/tensorflow/bin/activate
pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-
py2-none-any.whl
git clone --recurse-submodules https://github.com/tensorflow/tensorflow

No es imprescindible usar un entorno virtual como en el ejemplo, aunque recomendable. Estos


comandos son para MAC, si se encuentran en un entorno Ubuntu/Linux puede hacer:

$ pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-


0.5.0-cp27-none-linux_x86_64.whl

Si se opta por una instalacin a partir de fuentes pueden visitar esta pgina.
Para probar que tienen bien instalado el paquete, pueden hacer su primer programa Hello
World en TensorFlow. Cmo hemos comentado Tensorflow ofrece una fantstica API en
Python para poder ser usado. Despus de invocar el interprete de Python, puede teclear el
siguiente cdigo:

import tensorflow as tf

hello = tf.constant('Hello World!')


session = tf.Session()
print session.run(hello)

Hasta aqu he mostrado una manera de instalar el paquete TensorFlow para entrar de la
manera ms sencilla posible a usarlo. Pero hace falta remarcar que lo que ha liberado Google
es mucho ms y que podemos descargar el cdigo fuente de Tensorflow y compilarlo,
descargar la versin para GPUs, la versin que se ejecuta via Docker, entre muchas otras
cosas. Ms detalle de todas las posibilidades se puede encontrar en la pgina de Download
and Setup TensorFlow a la que invito al lector visitar una vez llegado al final de este post sin
haberse accidentado por el camino.

November 20th, 2015

Parte 2

http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-2/

3- Mucho tiempo entre nosotros, per

Sin duda las tcnicas de Deep Learning hasta hace pocos aos no han experimentado su
gran auge, a pesar que son tcnicas basadas en redes neuronales artificiales que ya aparecan
en la literatura cientfica de los aos 80 (por ejemplo con el Neocognitron de Kunihiko
Fukushima). Como dato, mencionar que en 1990, Yann LeCun junto con otros
investigadores, consiguieron aplicar el algoritmo estndar backpropagation (algoritmo creado a
mediados de los 70) a una deep red neuronal con varias capas con el propsito de reconocer
los dgitos de los cdigos postales del correo escritos a mano. A pesar del xito de aplicar el
algoritmo, el tiempo requerido para entrenar la red neuronal con ese conjunto de datos fue
aproximadamente de 3 das, hecho que lo haca impracticable para un uso generalizado.

4- Una capacidad de clculo nunca vista hasta ahora

El lector a estas alturas ya debe suponer que hay de nuevo en el escenario de hoy en da para
hacer posible la llegada del Deep Learning: una capacidad de computacin antes nunca
vista. Desde entonces la capacidad de clculo de los computadores ha experimentado un
crecimiento espectacular. Una muestra de ello lo podemos encontrar en la lista Top500 con los
quinientos ordenadores ms rpidos del planeta que se elabora dos veces al ao desde 1993.
La grfica resumen de las capacidades de clculo a que llegan estos ordenadores, llamados
supercomputadores, se muestra a continuacin:
En esta grfica indica dos veces al ao (Junio y Noviembre) la velocidad mxima de
procesado que consigue un supercomputador (en nmero de instrucciones en coma flotante
que un ordenador puede ejecutar por segundo) , indicando el ms rpido con un tringulo, el
ordenador nmero 500 con un cuadrado y la suma de todos ellos con un crculo. Tenemos
desde 1993 hasta la semana pasada, que se present la ltima lista, siendo el ms rpido del
mundo por sexta vez consecutiva, el supercomputador Tianhe-2, desarrollado por la National
University of Defense Technology de China que llega a una velocidad de 33.86
PetaFlop/segundo, es decir, realizar 33.860.000.000.000.000 operaciones por segundo. Qu
les parece?

Cmo podemos observar en la grfica, desde que Yann LeCun creo su red neuronal para
interpretar cdigos postales, a hoy en da, la potencia de los ordenadores se ha multiplicado
por 1.000.000.000 aproximadamente. Nada despreciable, Verdad?. Otro tema es que
seamos capaces de usar toda esta potencia de clculo disponible para poder entrenar una red
neuronal. Cmo sufren mis colegas tericos, de momento queda bastante margen para
mejorar. Sin duda hace falta tambin el conocimiento de los ingenieros de
computadores (hardware y software) en este nuevo mundo del aprendizaje automtico. Hoy
en dia hay una gran diversidad de componentes y de arquitectura de computadores. Por
ejemplo TensorFlow ya tiene libreras para explotar las ventajas de trabajar con arquitecturas
especiales basadas en GPUs, que presentan un gran rendimiento para entrenar redes
neuronales. Sin duda todo un mundo que se escapa de este tutorial.

5- Un sunami de datos

Pero aunque yo me dedique a la supercomputacin y para justificar mi trabajo les intente


convencer que esta es fundamental para el Deep Learning , hay otro factor quizs aun mucho
ms fundamental por el que podemos asegurar que ahora el Deep Learning ha llegado para
quedarse. En realidad, para que estos algoritmos sean realmente tiles, se necesitan
cantidades ingentes de datos para poder ser entrenados correctamente y en realidad hasta
ahora los datos disponibles eran muy limitados. Con la llegada del Big Data, en todas sus
formas, la generacin de datos nunca haba sido tan enorme. Cmo muestra me limito a
reproducir unos datos de un interesante artculo en el portal UNIVERSIA que comenta algunas
cifras que Bernard Marr presenta en la revista Forbes.com:
Se han creado ms datos en los ltimos 2 aos que en toda la historia de la humanidad
Se estima que para 2020 cada individuo crear 1,7 megabytes de informacin nueva
por segundo
Para 2020, nuestro universo de datos pasar de 4.4 zettabytes que existen
actualmente a 44 zettabytes (44 billones de gigabytes).
Creamos nuevos datos a cada segundo: realizamos 40.000 nuevas bsquedas en
Google por segundo, lo que equivale a 3.5 millones de bsquedas por da y 1.2 billones
por ao.
En agosto de 2015, se conectaron ms de 1.000 millones de personas a Facebook por
da, lo que supone un aumento del 3,37% con respecto al mismo perodo en 2014
Los usuarios de Facebook envan una media de 31,25 millones de mensajes y miran
2,77 millones de vdeos por minuto
Se sube una media de 300 horas de vdeos a YouTube por minuto
En 2015 se tomaron 1 billn de fotografas, y miles de millones sern compartidas en la
red. Para 2017 se estima que casi el 80% de las fotografas sern tomadas por
smartphones
Este ao, se importarn ms de 1.400 millones de de smartphones, todos ellos con
sensores capaces de recolectar todo tipo de datos, sin mencionar aquellos creados por
los mismos usuarios del mvil.
Para 2020 tendremos ms de 6.100 millones de usuarios de smartphones en el mundo.
En los prximos 5 aos habr ms de 50.000 millones de dispositivos smart
conectados en el mundo, todos desarrollados para recolectar, analizar y compartir
datos.

Una pregunta para acabar, Leyendo esto, qu empresas creen que concentran una gran parte
de estos datos generados? Cmo decamos en la anterior entrega de este tutorial de
introduccin a Deep Learning, el poder est en los datos y no en el software. Otra cosa es que
tengas la capacidad econmica para comprar los sistemas informticos y lo ms importante,
poder pagar la energa que estos consumen. Saben cuanto consume el supercomputador
Tianhe-2? La pequea cantidad de 17,808 W/h, estando conectado 24 horas al dia todos los
das del ao. Calculen!

November 23rd, 2015

Parte 3
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-3/

6- Por donde empezar?

Con los datos que presentbamos en la segunda entrega el lector se sentir abrumado por
los cifras que aparecen , siendo probable que aun no tenga datos y se pregunte que datos
puedo usar para entrenar a mis redes neuronales si mi empresa aun no ha acumulado
suficientes? Por suerte en la comunidad de machine learning, y en el caso que nos ocupa la de
Deep Learning, dispone de un gran nmero de conjuntos de datos de acceso abierto para
poder crear modelos a partir de ellos si no se dispone de datos propios para empezar. En el
portal DeepLearning.net se puede encontrar una lista de conjuntos de datos disponibles con
diferentes caracterstica y tamaos.

Aqu les comentamos algunos de los datasets de la lista que pueden ser tiles para empezar a
trabajar y que podran ser usados como conjunto de datos para experimentar con lo que
iremos explicando en este tutorial introductorio.

El dataset CIFAR-10

El dataset CIFAR10 subconjunto de imgenes del conjunto del 80 million tiny images, contiene
60.000 imgenes a color de 3232 pertenecientes a 10 clases de 6.000 images cada una de
ellas. (las clases son exclusivas entre ellas, es decir no existe un caso que sea automvil y
camin a la vez). Estas imgenes se reparten en 50.000 para entrenar y 10.000 para testear.
Un ejemplo con 10 imgenes por clase puede ser:

aviones

automviles

pjaros

gatos

ciervos

perros

ranas

caballos

barcos

camiones

El dataset CIFAR-100

El dataset CIFAR100 es como el CIFAR-10, excepto que tiene 100 clases que contienen 600
imagenes cada clase. Las CIFAR100 las 100 clase estn agrupadas en 20 superclases. Cada
imagen est etiquetada con la clase que pertenece y la subclase a que pertenece.

El dataset MNIST

El dataset MNIST es un conjunto de imgenes en blanco y negro de dgitos hechos a mano,


que contiene 60.000 ejemplares para entrenar el modelo y 10.000 para test. Como veremos
ms adelante este dataset es con el que la mayora de personas se adentran por primera vez
en tcnicas de reconocimiento de patrones en el mundo real sin tener que dedicar mucho
tiempo al preproceso y formateado. El motivo es porque las imgenes originales en blanco y
negro (bilevel) han sido normalizadas a 2020 pixels conservando su relacin de aspecto. En
este caso es importante hacer notar que las imgenes contienen niveles de grises como
resultado de la tcnica de anti-aliasing usado en el algoritmo de normalizacin (que reducir la
resolucin de todas las imgenes a a una de ms baja resolucin). Posteriormente las
imgenes se han centrado a una imagen de 2828 pixels, calculando el centro de masa de los
pxeles, y trasladando la imagen con el fin de posicionar este punto en el centro del campo de
2828. Un ejemplo del resultado es esta seleccin de 20 imgenes por cada dgito.
El dataset SVHN

Otro dataset muy interesante para iniciarse en estos temas de reconocimiento de patrones
es SVHN. SVHN, acrnimo de Street View House Numbers, es un dataset formado
por imgenes de fotografas a color de los nmeros de casa en las fachadas de los edificios
obtenidas a partir de imgenes del Google Street View. La ventaja de este dataset es que
requiere mnimo preprocesado y formateado de los datos. En realidad es similar
al dataset MNIST pero incorporado un order de magnitud con sus 600.000 imgenes de dgitos
con una complejidad adicional al ser reconocimiento de dgitos y imgenes extrados de
escenas naturales. En su pgina web pueden encontrar ms detalle y descargar los datos. A
continuacin se puede ver un ejemplo de estas imgenes.

Imagenet
Finalmente mencionar Imagenet. Se trata de un conjunto de imgenes que sirve para realizar
una competicin anual de visualizacin a gran escala, la ImageNet Large Scale Visual
Recognition Challenge (ILSVRC). Esta competicin anual se ha convertido en el laboratorio
para probar ideas en este tema de Deep Learning. Propongo al lector que de momento no se
adentre en este dataset pero que lo tenga en cuenta por si ms adelante se plantea participar y
ganar la ILSVRC!

November 24th, 2015

Parte 4

http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
4/
Hoy, en esta cuarta entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera entrega, segunda entrega, tercera entrega) presentaremos en detalle uno
de los datasets que presentamos en la tercera entrega y que usaremos en este primera parte
del tutorial para crear nuestra primera red neuronal.

7- Dataset MNIST

Una de las aplicaciones habituales de Deep Learning incluyen reconocimiento de patrones. Por
ello, de la misma manera que cuando uno empieza a programar existe la tradicin de empezar
por un print Hello World, en Deep Learning se crea un modelo de reconocimiento de
nmeros escritos a mano. Se usa habitualmente el conjunto de imgenes de dgitos hechos a
mano contenidos en el dataset MNIST comentado en la anterior entrega. Recordemos que
cada imagen es del siguiente estilo:

Adems para cada imagen se incluye una etiqueta, indicando que dgito representa. Como
hemos visto los datos MNIST se puede encontrar en la pgina de Yann LeCuns. LeCun (de
NYU), Bengio (Montreal), Hinton (Toronto) y Ng (Stanford) son grandes nombres
de acadmicos que en 2006 empezaron esta ola de deep learning en que nos encontramos
ahora. Pero esta parte de historia la dejo ya para otra serie de posts.

La base de datos MNIST de dgitos realizados a mano que usaremos est formado por un
conjunto de entreno de 60.000 ejemplares y un conjunto de test de 10.000 ejemplares . Para
descargar los datos proponemos que usen este cdigo que para su comodidad hemos puesto
en nuestro github (obtenido de Google). Simplemente descarguen el cdigo input_data.py en
el mismo directorio de trabajo en que se encuentran y lo importen en su programa con

import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

En este momento disponen de los datos de entreno en mnist.train y los datos de test
en mint.test. Cmo ya hemos dicho anteriormente, cada elemento est compuesto por una
imagen que la referenciaremos como xs y su correspondiente etiqueta con notacin ys,
para facilitar expresar el cdigo de procesado. Recordar que tanto los datos de entreno como
de test contienen xs y ys. Por ejemplo las imgenes de entreno estn
en mnist.train.images y las etiquetas de entreno estn en mnist.train.labels.

Entrando un poco ms en detalle con las imgenes, estas son de 2828 pixels que se pueden
representar como una matriz de nmeros. Por ejemplo, una de las imgenes del nmero 1 se
podra representar como:

donde cada posicin indica la intensidad del pixel entre 0 y 1. Esta matrix se puede representar
con un array de 2828 = 784 nmeros. En realidad la imagen se ha convertido en un montn
de puntos en un espacio vectorial de 784 dimensiones. Solo mencionar que el reducir una
estructura de 2D a este espacio estamos perdiendo parte de informacin, y algunos algoritmos
de visin por computador avanzados podra afectar a su resultado, pero para el mtodo ms
simple que usaremos en este tutorial esto no es un problema.

El resultado es que mnist.train.images es un tensor (de momento podemos quedarnos con


la idea que un tensor es un array n-dimensional) con una forma de 60.000 x 784 como se
muestra en la figura siguiente:

La primera dimensin indexa la imagen y la segunda indexa el pixel en cada imagen. Cada
entrada en el tensor es la intensidad del pixel entre 0 y 1, para un pixel particular en una
imagen concreta.
Por otro lado tenemos las etiquetas, que recordemos son nmeros entre 0 y 9, que indican que
dgito representa la imagen. En este tutorial vamos a representar esta etiqueta con un vector de
10 posiciones donde la posicin correspondiente al dgito que representa la imagen contiene un
1 y el resto son 0. Por tanto, mnist.train.labels es una matriz de de 0 y 1 con una forma
de 60.000 x 10.

En estos momentos estamos ya preparados para hacer nuestro modelo. Nos vemos en la
prxima entrega.

November 25th, 2015

Parte 5
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
5/
Hoy, en esta quinta entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera entrega, segunda entrega, tercera entrega, cuarta entrega) vamos una
nociones mnimas sobre redes neuronales y introducir el modelo sencillo que vamos a usar en
este tutorial.

Recordemos un poco el propsito de este tutorial: ser capaces de comprender un ejemplo


concreto y sencillo para learn by doing de manera gradual e incremental.

9- Mi primera red neuronal


Como ya avanzamos al principio, en este tutorial consideraremos como modelo una red
neuronal (neural network) sencilla que dados unos valores de entrada retorna una salida, en
nuestro caso la clasificacin de las imgenes de los dgitos. Como veremos esta red neuronal
tiene otros parmetros, conocidos como pesos (weights) and sesgos (biases). Aprender un
modelo de red neuronal conlleva el ajuste de los parmetros weights y biases de tal manera
que ajusta el mapeo entrada-salida. Sin duda un tema nada simple, por ello vamos a empezar
explicando el elemento bsico de una red neuronal: la neurona.

La funcin bsica de una neurona en una red neuronal consiste, a partir de un determinado
nmero de valores de entrada x1,x2,xn, multiplicar cada uno de ellos por un peso
(weight) especfico w1,w2, wn. A continuacin se suman todos ellos para producir un valor
entre 0 y 1 como resultado:

En muchos casos, tal como ya hemos avanzado la neurona aade un parmetro de sesgo
(bias) que es una constante.

Veamos un ejemplo muy simple que creo que puede ser muy ilustrativo. Supongamos que
tenemos n puntos en un plano etiquetados con cuadrado y redonda. Dado un nuevo punto
x, queremos saber que etiqueta le corresponde:

Una aproximacin razonable es dibujar una lnea que separe los dos grupos y usar esta lnea
como clasificador:
En este caso los datos de entrada sern representados por un vector (x1,x2) y nuestra funcin
retornar 0 o 1 (encima o debajo de la lnea). Matemticamente la lnea (el clasificador)
puede ser definido por un vector de pesos w y un offset vertical (o sesgo) b.

Para ello nuestra funcin debe calcular primero una suma ponderada de las entradas adems
del sesgo y el resultado sera entonces la entrada a una funcin de activacin para producir un
etiquetado. En el ejemplo anterior, nuestra funcin de activacin es un punto de corte de
umbral (por ejemplo, 1 si es mayor que un cierto valor):

Esquemticamente se resumen los conceptos-componentes detrs de una neurona artificial de


la siguiente manera:
10- Un modelo sencillo para empezar: Softmax

Pero recordemos que nuestro problema a resolver consiste en ser capaces de dada una
imagen de entrada, obtener las probabilidades de que sea cada uno de los 9 posibles dgito.
Por ejemplo, nuestro modelo podra predecir en una imagen un nueve y estar seguro en
un 80% de que es un nueve, pero asignar un 5% de posibilidades de que sea un ocho (debido
al bucle superior) y asignar una cierta probabilidad de poder ser cualquier otro nmero. Esto
es debido a una cierta incertidumbre por no ser seguro, es decir, no podemos reconocer los
dgitos con un 100% de confianza (confidence). En este caso usar una distribucin de
probabilidades nos puede dar una mejor idea de cunto de confiados estamos de nuestra
prediccin.

Es decir, queremos como vector de salida una distribucin de probabilidad sobre un conjunto
de etiquetas mutuamente excluyentes. Nuestro vector de outputs es de la forma

y que la suma de todas sus componentes es 1.


Esto se logra mediante el uso de una capa de salida especial llamado una capa softmax. La
salida de una neurona en una capa softmax depende de las salidas de todas las
otras neuronas en su capa. Esto es porque se requiere la suma de todas las salidas para ser
igual a 1.

La regresin softmax se realiza en dos pasos principales. Primero calculamos las evidencias
de que una determinada imagen pertenece a una clase en particular y despus convertimos
estas evidencias en probabilidades de que pertenezca a cada una de las 10 clases. En la
siguiente entrega entramos en ms detalle.

Y maana ms, ahora ya he cogido el ritmo!

November 26th, 2015

Parte 6
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
6/
Hoy, en esta sexta entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera entrega, segunda entrega, tercera entrega, cuarta entrega, quinta
entrega) vamos a presentar un poco de teora para poder entender cmo se construye un
modelo que nos permita reconocer las imgenes MNIST.

La regresin softmax se realiza en dos pasos principales. Primero calculamos las evidencias
de que una determinada imagen pertenece a una clase en particular y despus 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 aproximacin muy usada consiste en realizar una suma ponderada de las intensidades de
los pxeles. El peso es negativo si ese pxel 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 grfico supongamos que disponemos del modelo aprendido
para el nmero cero (ms adelante veremos cmo se aprenden estos modelos). Por el
momento podemos ver un modelo como algo que contiene informacin para saber si un
nmero es de una determinada clase. En este caso hemos escogido un modelo como el que
presentamos a continuacin, donde el rojo (en b/n es el gris ms claro) representa pesos
negativos (es decir reducir la evidencia de que pertenece), mientras que el azul (en b/n es el
gris ms oscuro) representa los pesos positivos.
Imaginemos una hoja en blanco de 2828 pixels y trazamos un cero en ella. En general el trazo
de nuestro cero caera sobre la zona azul (recordemos que en la segunda entrega comentamos
que las imgenes haban sido normalizadas a 2020 pixels y posteriormente centradas a una
imagen de 2828).

Resulta intuitivamente bastante claro que si nuestro trazo pasa por encima de la zona roja, lo
ms probable es que no estemos trazando un cero (recordemos que los nmeros estn
centrados en el juego de pruebas). Por tanto usar una mtrica 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 mtrica del sumario antes mencionada. Pero en cambio, si el
modelo de referencia es el siguiente

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 quedara en parte en zona
roja. Espero que el lector, viendo estos dos casos concretos, pueda ver como la aproximacin
de los pesos indicados anteriormente nos permite hacer una estimacin de qu nmero se
trata.

El siguiente diagrama muestra los pesos de un ejemplo concreto de modelo aprendido (ms
adelante veremos cmo se aprenden estos modelos) para cada una de estas diez clases del
MNIST. Recordemos que hemos escogido el rojo en esta representacin visual de los pesos
negativos, mientras que usaremos el azul para representa los pesos positivos.
De manera ms matemtica podramos expresar que la evidencia para una clase i dado un
input x se puede calcular como:

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 parmetro extra que representa el sesgo
(bias en ingls) indicando un cierto marge de incertidumbre. En nuestro caso la frmula final
quedara como:

donde bi representa este sesgo descrito (ms adelante volveremos en ms detalle sobre este
parmetro).

12- Probabilidades de pertenencia

Recordemos que hemos comentado que el segundo paso consista 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 funcin softmax:

A diferencia del ejemplo de la neurona del apartado anterior que el output era una funcin lineal
con valor 0 o 1, ahora requerimos que el vector de output sea una distribucin de probabilidad
que la suma de todos sus componentes sume 1. Para conseguir normalizar cada componente
de tal manera que sume 1, la funcin softmax usa el valor exponencial de sus entradas y
luego las normaliza como se muestra en la siguiente expresin:

El efecto que se consigue con el uso de exponenciales es que una unidad ms de evidencia
tiene un efecto multiplicador en el peso. Y a la inversa, una unidad menos de evidencia
significa que una hiptesis obtiene una fraccin de su peso anterior. A la
vez softmax normaliza estos pesos, de modo que sumen uno, formando una distribucin de
probabilidad vlida.

Lo interesante de esta funcin es que una buena prediccin tendr una sola entrada en el
vector con valor cercano a 1, mientras que las entradas restantes estarn cerca de 0. En
una prediccin dbil tendrn varias etiquetas posibles, que tendrn ms o menos la misma
probabilidad.

13- Notacin matricial de softmax

De forma grfica podramos pintar la funcin softmax de la siguiente forma, aunque en el caso
de MNIST tendra 10 variables de entrada y salida.

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 tendramos (para
este ejemplo de 3):
Y finalmente lo podemos reescribir en este formato que usamos en clase de multiplicacin de
matrices y suma de vector:

De forma ms compacta y genrica podemos expresarlo de la siguiente manera:

Despus de esta visin rpida de la teora en la prxima entrega crearemos el modelo de


deteccin de dgitos usando TensorFlow desde Python. Nos encontramos en la prxima
entrega.

November 27th, 2015


Parte 7
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
7/
Hoy, en esta sptima entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera entrega, segunda entrega, tercera entrega, cuarta entrega, quinta
entrega, sexta entrega) vamos a presentar como puede implementar el modelo softmax en
TensorFlow. Nuestro objetivo en esta entrega no es crear un modelo muy elaborado con un
alto grado de acierto, sino uno simple que nos permita entender conceptualmente el uso de
TensorFlow.

14- Implementacin del modelo softmax en TensorFlow

Despus de esta visin rpida de la teora estamos ya en disposicin de ponernos a avanzar


con la creacin del modelo de deteccin de dgitos usando TensorFlow desde Python. Para ello
lo primero es importar la librera:

import tensorflow tf

A partir de este momento podemos empezar a especificar como ser nuestro modelo.

En realidad Tensorflow nos permite en lenguaje Python describir las operaciones que
queremos realizar. A partir de aqu el crear un grafo interno de estas operaciones y
las interacciones entre estas que ser usado durante la ejecucin de todas las operaciones.
Una vez finalizada toda la especificacin es cuando Tensorflow empieza a ejecutar todas las
operaciones. Remarcar que esto se hace totalmente fuera del contexto de Python. Ms
adelante ya hablaremos de esta pieza tan importante como es el grafo, pero por ahora
podemos avanzar sin entrar en ms detalle.

Primero empecemos a ver cmo se pueden definir variables simblicas para poder
manipularlas durante la ejecucin del programa. Podemos hacerlo de la siguiente manera:

x = tf.placeholder("float", [None, 784])

en este caso x no es un valor especfico, sino lo que en TensorFlow se llama placeholder ,


un valor que damos de entrada cuando le pidamos a TensorFlow ejecutar un
clculo. Queremos ser capaces de introducir cualquier nmero de imgenes MNIST, cada
una aplanada en un vector de 784 dimensiones. Esto lo vamos a representar como un
tensor 2D de nmeros de coma flotante, con una forma [None, 784]. (Aqu None significa que
la dimensin puede ser de cualquier longitud).

Tambin necesitamos mantener la informacin de los pesos y sesgos de nuestro modelo.


Podramos imaginar el tratamiento de estos como entradas adicionales, pero TensorFlow
propone una manera mejor de manejarlo, mediante lo que llama Variable . Una Variable es un
tensor modificable que reside en el grfico de operaciones que construye TensorFlow que
hemos mencionado antes. Se puede utilizar e incluso modificar durante la ejecucin de las
operaciones del grafo. En nuestro caso podemos crear estas dos variables de la siguiente
manera:

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

Se crean estas Variables dando a tf.Variable el valor inicial de la variable, que en este caso se
inician con ceros, puesto que como se va a aprender el valor de W y b, no es muy no importa
mucho cual es el valor inicial. Debemos fijarnos que W tiene una forma de [784, 10] porque
queremos multiplicar el vector de imagen de 784 dimensiones por cada clase de 10
dimensiones, para producir un vector de evidencias. Por otro lado b tiene la forma de [10]
puesto que debemos sumar cada una de sus componentes a las componentes respectivas de
la variable de output. La forma de expresarlo en TensorFlow es:

y = tf.nn.softmax(tf.matmul(x,W) + b)

Inicialmente multiplicamos x por W mediante la expresin tf.matmul(x,W) y despus sumamos


el sesgo b, para finalmente aplicar tf.nn.softmax a todo.

15- Training del modelo

Una vez tenemos la implementacin del modelo debemos pasar a encontrar los pesos y
sesgos de la red mediante lo que se conoce como algoritmo de training. Para entrenar una red
neuronal hay varios algoritmos disponibles que buscan un peso ptimo para los parmetros de
cada neurona mediante iteraciones (tambin conocidas como epochs). Para cada iteracin, el
algoritmo de training vuelve a coger los datos de entrenamiento, aplica la red neuronal y
compara el resultado obtenido con el esperado.

Con el fin de entrenar a nuestro modelo y saber cundo ya tenemos un buen modelo, tenemos
que definir de alguna manera lo que significa que el modelo sea bueno. Lo que se
hace habitualmente es definir lo contrario, es decir calcular lo malo que es ese modelo con
funciones de coste (cost) o prdida (loss). En este caso el objetivo es intentar conseguir valores
de los parmetros W y b que minimicen el valor de la mtrica que indica cuan malo es el
modelo.

Hay diferentes mtricas del grado de error entre salidas calculadas y las salidas deseadas de
los datos de entrenamiento. Una medida comn de error es el conocido error cuadrtico medio
(mean squared error). Sin embargo, hay algunos resultados de las investigaciones que
sugieren utilizar otras mtricas diferentes para estas redes neuronales. Un ejemplo puede ser
el llamado error de entropa cruzada (cross entropy error) y es el que usaremos en nuestro
ejemplo. Esta mtrica se define como:

donde y es la distribucin de probabilidad predecida, y la distribucin real (obtenida a partir del


etiquetado de los datos de entrada). Puesto que la matemtica detrs de cross-entropy y su
papel en redes neuronales es bastante complejo no entrar en ms detalle.

Para implementar el cross-entropy necesitamos un nuevo placeholder para entrar la respuesta


correcta.

y_ = tf.placeholder("float", [None,10])

A partir de aqu podemos implementar el cross-entropy con la siguiente sentencia:

cross_entropy = -tf.reduce_sum(y_*tf.log(y))
Primero se calcula el logaritmo de cada elemento y con tf.log y despus se multiplica por cada
elemento y_ . Finalmente, tf.reduce_sum suma todos los elementos del tensor (un detalle: ms
adelante veremos que se mira por paquetes las imgenes, y en este caso el valor de cross-
entropy corresponde a la suma de las cross-entropies de las imgenes y no a la de una sola).

Para entrenar una red neuronal hay varios algoritmos disponibles en la literatura. Todos estos
algoritmos buscan los pesos ptimos para cada neurona. Esto lo hacen mediante iteraciones
(tambin conocidas como epochs). Para cada iteracin, el algoritmo de training vuelve a coger
los datos de entrenamiento, aplica la red neuronal y compara el resultado obtenido con el
esperado.

En nuestro ejemplo usaremos el conocido como Backpropagation, abreviacin de backward


propagation of errors, que como su nombre indica propaga hacia atrs el error para
poder recalcular los pesos. Y esto se hace a cada iteracin (epochs) en que el algoritmo vuelve
a coger los datos de entrenamiento, aplica la red neuronal y compara el resultado obtenido con
el esperado.

Este mtodo se usa conjuntamente con algn mtodo de optimizacin como puede ser
el gradient descent, que mediante el clculo del gradiente de la funcin de error nos permite ir
calculando el mnimo error en cada iteracin de acuerdo a la informacin local que se
dispone . Dado el carcter introductorio de este tutorial no entraremos en detalle de estos
mtodos, pero intuitivamente consiste en cambiar el valor de cada variable un poquito
(expresado con un parmetro llamado learning rate) en la direccin que reduce la funcin de
error.

Para nuestro ejemplo de imagenes de MNIST a continuacin vamos a expresar el comando


que pide a Tensorflow que use el algoritmo de backpropagation para minimizar el cross-
entropy usando el algoritmo gradient descent (con un learning rate de 0.01, que ya
comentaremos en futuros tutorials).

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

Solo nos falta un paso final antes de empezar, especificar la inicializacin de todas las
variables:

init = tf.initialize_all_variables()

16- Ejecucin en Tensorflow

Desde el punto de vista de un programador los programas en TensorFlow estn estructurados


en dos fases bsicas, una de construccin y otra de ejecucin. Hasta aqu hemos hecho la
primera, en la que hemos descrito los datos y los clculos que se requiere hacer sobre ellos.
Pero para empezar a computar se necesita lanzar una sesin (Session), que reparte los
clculos (ops) y datos entre los dispositivos (Devices) CPUs o GPUs disponibles en el sistema.

A continuacin veremos cmo lanzar la ejecucin, pero antes echemos un vistazo rpido a la
estructura interna de Tensorflow. TensorFlow representa la computacin en forma de grafo,
donde los nodos del grafo se llaman ops (diminutivo de operaciones) que reciben y se envan
datos entre ellos en forma de Tensors. En este contexto se puede entender que en realidad,
cuando TensorFlow recibe la lnea de cdigo anterior

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
lo que hace es aadir una nueva operacin al grafo interno que tiene, adems de todo lo
necesario para implementar el backpropagation y el gradientdescent. Entonces se devuelve
una simple operacin que, cuando se ejecuta, va a realizar un paso del entrenamiento
del gradientdescent, ajustando ligeramente las variables para reducir la mtrica de error o
coste definida.

Empecemos lanzando la ejecucin de nuestro modelo definido creando primero una sesin:

sess = tf.Session()

a continuacin podemos ejecutar la primera operacin que inicializa las variables

sess.run(init)

A partir de este momento ya podemos entrenar nuestro modelo. Por ejemplo supongamos que
lo queremos ejecutar 1.000 veces:

for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

En la primera lnea del bucle se especifica que en cada paso de este bucle se coge un lote de
100 datos escogidos al azar del conjunto de datos de entreno. Podramos usar todos los datos
en cada iteracin pero para hacer ms rpido este primer programa usamos solo un pequeo
conjunto en cada iteracin. En la segunda lnea se indica que se ejecute train_step indicndole
que los datos ledos anteriormente alimenten a los respectivos placeholders.

17- Evaluacin del modelo

Finalmente nos queda valorar cuan bueno es el modelo. Primero vamos a averiguar dnde
predijimos la etiqueta correcta. tf.argmax es una funcin muy til que retorna el ndice de la
entrada ms alta en un tensor lo largo de un eje. Por ejemplo, tf.argmax (y, 1) es la etiqueta de
nuestro modelo que es ms probable para cada entrada, mientras que tf.argmax (y_, 1) es la
etiqueta correcta. Podemos utilizar tf.equal comprobar si nuestra prediccin coincide con la
verdad:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

Esto nos retorna una lista de booleanos. Para determinar que fraccin es correcta, podemos
pasarlos nmeros en coma flotante y entonces calcular la media.

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

Por ejemplo, [True, False, True, True] se convertirn en [1,0,1,1] que la media
sale 0.75 y que representa el porcentaje de exactitud (accuracy). Ahora podemos pedir
la accuracy de en nuestro datos de test.

print sess.run(accuracy, feed_dict={x: mnist.test.images, y_:


mnist.test.labels})

A m me ha salido un valor alrededor del 91%. This should be about 91%. Son buenos estos
resultados? Yo creo que fantsticos porque esto significa que ya se ha programado y ejecutado
su primera red neuronal con TensorFlow. Otra cosa es que hay modelos que permiten mejorar
la accuracy mucho ms. Pero esto ya lo dejamos para ms adelante. Qu les parece?

Apndice: Cdigo:
import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
import tensorflow as tf
x = tf.placeholder("float", [None, 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_:
mnist.test.labels})

December 3rd, 2015

Parte 8
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
8/
Hoy, en esta octava entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera, segunda , tercera, cuarta, quinta, sexta, sptima) finalizo con esta
serie de posts.

Hoy, para acabar, aadir una breve reflexin sobre la necesidad que al lado de cualquier
cientfico de datos (Data Scientist) se requiere un buen ingeniero de computadores (Computer
Engineer) y otro ingeniero de datos (Data Enginyeer), en todo este proceso de extraccin de
valor del Big Data mediante analticas avanzadas.

18. Frameworks Big Data

Hasta aqu hemos hablado de las herramientas de analtica avanzada, poniendo un ejemplo de
cdigo en TensorFlow. Sin duda son herramientas fundamentales y la clave de la nueva era de
computacin que se avecina: Computacin Cognitiva (o Cognitive Computing). Pero como ya
hemos dejado claro, sin unos sistemas de computacin de altas prestaciones que permitan
ejecutar estos potentes algoritmos nada seria posible. Sin duda los conocimientos de
los ingenieros de computadores son esenciales, (y especialmente los formados en
Barcelona), para poder crear y manejar estos nuevos sistemas de computacin que
presentbamos en la entrega 2.

Pero falta comentar una pieza importante en este puzle: los frameworks de Big
Data que permiten simplificar la manipulacin y el procesado de los datos en procesos
de anlisis, sin ellos sera totalmente imposible aplicar la analtica avanzada a las ingentes
cantidades de datos que se analizan hoy en da.

En los ltimos aos hemos sido testigos de la llegada de una oleada de nuevos frameworks Big
Data alrededor de los dos entornos de procesamiento distribuido ms populares en estos
momentos, Hadoop y Spark, acompaados de una amplia variedad de bases de datos NoSQL.
Cada herramienta tiene sus propias fortalezas y debilidades, y no hay una solucin de talla
nica para todos para cada caso de uso.

La comprensin de estas tecnologas y cmo encajan juntas puede ser uno de los mayores
retos para alguien nuevo en el campo de datos. Adjunto pueden encontrar un esquema que
uso en mis clases en la UPC (cada semestre se tiene que actualizar! ) donde se
enumero (intentando agrupar por categoras) las diferentes alternativas que tenemos (las ms
conocidas, hay ms, no, muchas ms!) cuando montamos un sistema completo para tratar un
problema Big Data real.

El lector puede intuir la complejidad de una buena eleccin, incluso para un ingeniero de datos.

19. High-Performance Big-Data Analytics: Un trabajo en equipo!

El lector se habr dado cuenta que no es trivial decidir cual es el mejor entorno para un
problema concreto, y que tampoco es fcil lidiar con cada una de sus piezas al juntarlas todas
juntas. Supongo que a estas alturas a nadie le queda la menor duda de la necesidad de
disponer de ingenieros de datos (Data Engineer) en el equipo al lado de cientficos de
datos (Data Scientist) expertos en algoritmos de analtica avanzada y ingenieros de
computadores (Computer Engineer) para conseguir un alto rendimiento de los sistemas tanto
a nivel hardware como software.

Para poner un nombre que lo englobe todo se usa el trmino de High-Performance Big-Data
Analytics para referirnos a la integracin de lo ms avanzado en conocimiento de Analtica,
con los nuevos frameworks Big Data y con la impresionante potencia que presenta el hardware
de los nuevos sistemas de computacin. Este trabajo conjunto ser la clave que nos permita
sacar valor de grandes volmenes de datos con una gran variedad de tipos a una velocidad sin
precedentes hasta ahora.

Estamos ante un reto que requiere un conocimiento multidisciplinar. Los que me conocen ya
me habrn visto dibujar en la pizarra o sobre un papel este esquema que resume de lo que
estamos hablando:

Desgraciadamente la mayora de nosotros no podemos ser un Messi en este campo de juego


de tres disciplinas, como mucho podemos aspirar a serlo en una de ellas. Porque no se trata de
ser un triatleta, se trata de ser un ironman, o incluso ms, de ser un ultramaratoniano si
queremos estar en la zona que se dominen las tres disciplinas con absoluta competencia.
La mejor aproximacin a mi entender es intentar crear un equipo donde cada uno de los
componentes sea muy bueno en una de las tres especialidades, pero a la vez saber un poco
de las otras dos (importante para comprender a los otros miembros del equipo y poder tener
una comunicacin fluida).

Una buena opcin es que cada uno de los miembros del equipo pudiera hacer una marathon
sprint por su cuenta y a la vez poder conseguir un buen resultado en una (solo una) de las tres
disciplinas en una ironman. Yo lo he conseguido! Para mi el Data Scientist es el nadador,
el Data Engineer el corredor y el Computer Engineer el ciclista . Y para ustedes, lo han
probado? Se lo recomiendo!

Con este pequeo tutorial de ocho entregas espero haber contribuido con mi granito de arena a
que los Data Engineers entendamos un poquito ms a los Data Scientists, tipos que hablan
un poco raro para un ingeniero de computacin como yo, al menos mis amigos cientficos de
datos!

20. Por donde continuar para seguir aprendiendo sobre TensorFlow?

Si el lector quiere avanzar un poco ms, aprendidas estas ideas bsicas aqu expuestas, les
propongo que continen con el tutorial de TensorFlow website con estos apartados:

Deep MNIST for Experts


TensorFlow Mechanics 101
Convolutional Neural Networks
Vector Representations of Words
Recurrent Neural Networks
Sequence-to-Sequence Models
Mandelbrot Set
Partial Differential Equations

En estos momentos existe muy escasa informacin de TensorFlow y creo que esta es la mejor
material de consulta disponible en este momento (si alguien encuentra una informacin ms til
e interesante le agradecera muchsimo que me lo indicara). Si estn interesados en detalles de
implementacin de TensorFlow les propongo que miren el artculo Large-Scale Machine
Learning on Heterogeneous Distributed System.

A partir del prximo febrero empezarn las actividades de un nuevo meetup en Barcelona
dedicado a TensorFlow a travs del cual pueden seguir los avances de esta tecnologa: http://w
ww.meetup.com/Barcelona-TensorFlow-Meetup/
Finalmente comentar que estoy pensando poner en orden varias de mis notas sobre el
tema. El escribir esta serie de posts me ha sido muy til y me gustara hacerlo con el resto de
notas que tengo. Les ir informando!

Espero que les parezca interesante esta ltima entrega de la Introduccin prctica al Deep
Learning con TensorFlow de Google.

December 6th, 2015

Autor:

Professor JORDI TORRES | UPC Barcelona Tech & Barcelona Supercomputing Center

Cualquier consulta o sugerencia pueden contactar a travs de


DeepLearningBarcelona@gmail.com

Vous aimerez peut-être aussi