Universidad Carlos III de Madrid Departamento de Informática

Proyecto Final de Carrera

Comparativa de Tecnologías de

Author: Alberto Lozano Benjumea

Supervisors: Alejandro Baldominos Gómez Ignacio Navarro Martín

Leganés.Septiembre de 2017 Alberto Lozano Benjumea Universidad Carlos III de Madrid Avenida de la Universidad, 30 28911 Leganés, Madrid (Spain) Email: [email protected] “Just because it’s not nice doesn’t mean it’s not miraculous”

Terry Pratchett This page has been intentionally left blank. Abstract

Este proyecto se localiza en la rama de aprendizaje automático del campo de la in- teligencia artificial. El objetivo del mismo es realizar una comparativa de los diferentes frameworks y bibliotecas existentes en el mercado, a día de la realización del presente documento, sobre aprendizaje profundo. Esta comparativa, pretende compararlos us- ando diferentes métricas y una batería heterogénea de pruebas. Adicionalmente se realizará un detallado estudio del arte indicando las técnicas sobre las que sustentan dichas bibliotecas. Se indicarán con ejemplos cómo usar cada una de estas técnicas, las ventajas e inconvenientes de las mismas y sus relaciones. Keywords: aprendizaje profundo, aprendizaje automático frameworks, comparativa

v This page has been intentionally left blank. Agradecimientos

Probablemente se podría escribir la mitad del documento con agradecimientos a las personas que han influido en que este documento pueda existir. Podría partir de mi abuelo quién me enseñó la informática y lo que se podía lograr con el Amstrad y de ahí hasta el día de hoy, a familia, compañeros, amigos que te influyen, incluso las personas que influyen negativamente, con los que ves que que camino no debes escoger. Para no extenderlo demasiado si quiero destacar a algunas personas. Literalmente, este documento no existiría sin la ayuda, el apoyo, insistencia, amistad y un largo etcétera de Ignacio Navarro Martín que me lleva demostrando desde hace años lo que significa, o lo poco catalogable, que es la amistad. Es imposible no incluir a Anabel, con la que llevo compartida más de media vida. Durante este tiempo he vivido con ella los mejores momentos de mi vida, siendo el más reciente nuestra boda. Día a día me hace ver que cualquier cosa se puede hacer, me apoya, se ríe conmigo, perdona mis errores y sé, que no hace falta pedirle nada porque siempre esta cuando la necesito. Desde pequeño la informática ha atraído mi atención y mi madre, aún siendo muy pequeño para saber lo que significaba en realidad, siempre me ha ayudado a poder alcanzarlo. Gracias a su sacrificio diario, esfuerzo y ánimos, nunca he visto que pudiera ser algo inalcanzable y no podía faltar porque parte de esta carrera es suya. Por último, también agradecer al resto de mi familia, siempre presentes en mi vida y a mis amigos de la universidad (Lidia, Iván, Pablo, Roberto, ...) que siempre me han apoyado y con los que he reído y compartido muy buenos momentos dentro y fuera de la universidad.

vii This page has been intentionally left blank. Contents

Contents 1

1 Introducción y Objetivos5 1.1 Contexto y Motivación...... 5 1.2 Objetivos...... 6 1.3 Medios empleados...... 7 1.4 Estructura de la Memoria...... 7

2 Estado del arte9 2.1 Conceptos básicos...... 9 2.1.1 Aprendizaje Automático...... 9 2.1.2 Reglas de Asociación...... 13 2.1.3 Redes de Neuronas Biológicas...... 17 2.1.4 Perceptrón...... 19 2.1.5 Perceptrón Multicapa...... 21 2.1.6 Aprendizaje Profundo...... 25 2.1.7 Rectificador...... 26 2.1.8 Encoder...... 27 2.1.9 Restricted Boltzmann Machine...... 27 2.1.10 Enconders Aplicados...... 30 2.1.11 Redes de Creencias Profundas DBN...... 32 2.1.12 Red Neuronal Recurrente - RNR...... 33 2.1.13 Memorias a Corto-Largo Plazo - LSTM...... 35

1 2 Evolutionary Design of Deep Neural Networks

2.1.14 Backpropagation Through Time - BPTT...... 38 2.1.15 Unidad recurrente cerrada - GRU...... 39 2.1.16 Redes Convolucionales...... 40 2.2 Bibliotecas de Aprendizaje Automático...... 43 2.2.1 CPU y GPU...... 45 2.2.2 Frameworks...... 45 2.2.3 Librerías de abstracción...... 46

3 Experimentación 51 3.1 Elección de los Frameworks/bibliotecas...... 51 3.2 Análisis de la Implementación de cada Biblioteca...... 52 3.2.1 ...... 52 3.2.2 PyTorch...... 54 3.2.3 ...... 55 3.2.4 Deeplearning 4J...... 56 3.2.5 TensorFlow...... 57 3.2.6 ...... 58 3.2.7 Lasagne...... 59 3.3 Elección de los Clasificadores...... 59 3.4 Elección de los Conjuntos de Entrenamiento...... 60 3.5 Diseño de las pruebas...... 60 3.5.1 Métricas a medir...... 60 3.5.2 Estructura de las pruebas...... 61 3.6 Pruebas...... 62 3.6.1 Definiciones...... 62 3.7 Resultados...... 66 3.7.1 Pytorch...... 66 3.7.2 Lasagne - Theano...... 73 3.7.3 Keras...... 80 3.7.4 Tensor...... 88 Contents 3

3.7.5 ...... 95 3.8 Comparativa...... 98

4 Presupuesto 99 4.1 Costes...... 99 4.2 Planificación...... 99 4.3 Presupuesto...... 100

5 Conclusiones y líneas futuras 103 5.1 Dificultades encontradas...... 103 5.2 Conclusiones...... 103 5.3 Líneas futuras...... 104

Appendix A Ejemplos conjuntos de entrenamiento 107

Appendix B Instalación de librerías/framework 109 B.1 Theano...... 109 B.2 Lasagne...... 110 B.3 TensorFlow...... 110 B.3.1 Virtualenv...... 111 B.3.2 Pip...... 112 B.3.3 Docker...... 112 B.3.4 Anaconda...... 112 B.4 Keras...... 113 B.5 Pytorch...... 113 B.6 Caffe...... 113 B.7 Deeplearning 4J...... 114

Bibliography 115 This page has been intentionally left blank. Chapter 1 Introducción y Objetivos

1.1 Contexto y Motivación

Últimamente es cada vez más habitual escuchar el término aprendizaje automático [28] asociado a cualquier campo. Ya no solo en los de tipo técnico como las finanzas [14][19][31], predicciones meteorológicas [25][46][46], biotecnología [2] o la medic- ina [4][47][39], sino en otros más inesperados como la moda [34], deportes [37][18][42] o educación [17][43]. Esta tendencia va en aumento, cada vez más el aprendizaje au- tomático va a influenciar aspectos de la vida. Entendemos aprendizaje automático como la rama de informática especializada en crear técnicas que puedan aprender y mejorar resultados por sí mismas. Recibiendo una información como entrada son capaces de generalizar comportamientos, creando un modelo de salida que será utilizado para realizar predicciones sobre datos futuros. Aunque el aprendizaje automático sea una rama dentro del campo de la inteligencia artificial, su tamaño y complejidad no son irrelevantes. Existen multitud de técnicas, muchas de las cuales son igualmente válidas para el mismo problema, con cientos de parámetros de configuración. Esto puede ocasionar problemas al usuario no experi- mentado en estas técnicas, que desea usarlas pero no tiene conocimientos en profun- didad sobre las mismas. ¿Qué técnicas se deben usar para cada ocasión? ¿Cuales son mejores? ¿Debería mejorar el hardware de mi máquina para mejorar el rendimiento? Intentar crear un estudio comparativo de todas las técnicas de aprendizaje automático está fuera del alcance de este proyecto, llevaría demasiado tiempo y podría llegar a ser casi inabordable. Por ello se ha decidido centrar el enfoque del proyecto en las técnicas de aprendizaje profundo (deep learning en inglés). Estas técnicas intentan crear modelos predictivos basados en conjuntos de datos iniciales usando modelos profundos (como redes de neuronas). Este aprendizaje puede ser supervisado, si el conjunto de entrenamiento indica el resultado, por ejemplo la clase del dato en un problema de clasificación; o no supervisado, si solo se proveen los datos en bruto sin más información. No obstante, el aprendizaje no supervisado no se asocia con modelos predictivos y por ello no será usado en el presente documento.

5 6 Evolutionary Design of Deep Neural Networks

Esta memoria está orientada al usuario que desea usar bibliotecas de aprendizaje au- tomático, que implementan distintos métodos de aprendizaje profundo. Tras leer el pre- sente documento, el lector sabrá cuáles son las bibliotecas de aprendizaje profundo más usadas, las ventajas, inconvenientes y características de las mismas, y conocerá algunas de las técnicas de aprendizaje profundo más usadas. Además, conocerá el rendimiento de dichas bibliotecas bajo diferentes condiciones: diferentes técnicas, conjuntos de en- trada, parámetros de configuración, hardware específico usado, etc. No se pretende explicar en profundidad las técnicas de aprendizaje profundo exis- tentes, ya que existen multitud de libros y amplia bibliografía donde se explican mejor dichas técnicas, siendo las obra de Goodfellow et al. [23] y de Schmidhuber [36] las principales referencias en el campo a día de hoy. Nuestro objetivo es mostrar el estado del arte en las bibliotecas de aprendizaje automático y no hacer recomendaciones entre ellas. Que exista una variedad de bibliotecas y técnicas implica cuales serán útiles en ciertas circunstancias y serán las que nos ayudarán a elegir aquellas bibliotecas más adecuadas a nuestras exigencias. En resumen, en este proyecto se pretende dar una comparativa de las diferentes bib- liotecas existentes, explicando de forma general las técnicas que implementan o usan cada una de ellas. También se explicarán conceptos necesarios para entender algunas de las bibliotecas usadas o las pruebas a las que se han sometido. A continuación se explicará como crear un plan de pruebas, qué conjuntos de entrenamiento y pruebas son las más idóneas y por qué lo son. Por último se realizarán las pruebas compara- ndo el conjunto de bibliotecas, explicando cuáles son los objetivos de dichas pruebas, y sus resultados. Finalmente se expondrán las conclusiones sobre estos resultados y el proyecto en general.

1.2 Objetivos

El objetivo de este proyecto es realizar una comparativa entre las diferentes herramien- tas de aprendizaje profundo existentes en el mercado. Para poder hacerlo, además se realizará un extenso estado del arte donde se indicará cada una de ellas explicando brevemente su origen, lo que aporta y como usarlas. Una vez presentado el estado de arte y explicados conceptos teóricos importantes para la presentación de la memoria, se explicará cada uno de los frameworks usado dando instrucciones detalladas de como montar el entorno en una máquina y su uso. Para finalizar se presentarán todas las pruebas, los resultados de las mismas y unas breves conclusiones. En conclusión, podemos decir que los objetivos a realizar son:

• Presentar qué es el aprendizaje automático y aprendizaje profundo y explicar porque es importante conocerlos.

• Presentar un completo estado del arte sobre técnicas de aprendizaje profundo y otras relacionadas para poder aplicarlas. Chapter 1. Introducción y Objetivos 7

• Explicar en detalle cada uno de los frameworks escogidos y dar instrucciones de- talladas de como crear un entorno y usarlos. • Crear un plan de pruebas, dando motivos de la elección de los parámetro de las mismas y el porque de la elección de las métricas escogidas. • Detallar los resultados obtenidos en las diferentes pruebas, ofreciendo gráficas y comentarios cuando sea preciso. • Enumerar una serie de conclusiones y líneas futuras sobre los datos creados.

1.3 Medios empleados

La herramienta física utilizada para la realización de este proyecto ha sido un portátil Acer Aspire E 17, con un procesador Intel® Core™ i5-6200U a 2,3 Ghz y 8GB DDR4 de RAM. Como GPU incluye una NVIDIA® Geforce® 940MX con 2GB dedicados. Con esta máquina se pueden realizar las pruebas comparativas al tener un procesador de cada tipo. Respecto al software se ha utilizado el sistema operativo Ubuntu en la distribución 16.04 LTS. Dentro de este, todas las librerías/frameworks descritos en este documento y sus dependencias. Por último, para la realización de la memoria, se ha utilizado LaTeX.

1.4 Estructura de la Memoria

A continuación explicamos, a modo de resumen, el contenido del presente documento y las partes que lo componen.

• El presente capítulo Introducción y Objetivos se detallan los motivos por los que realizar el presente documento, los objetivos del mismo y la estructura del mismo. • En el Estado del Arte se explicarán los conceptos teóricos necesarios para com- prender las técnicas usadas en los diferentes frameworks usados o en las pruebas realizadas. Además se explicará en detalle cada uno frameworks usados. • En la Experimentación se darán motivos de la elección de frameworks, clasifi- cadores y conjuntos de entrenamiento. Además se explicará cada prueba real- izada, ofreciendo los resultados de las mismas. • Para acabar en Conclusiones y Líneas futuras se listarán las dificultades encon- tradas en la realización del presente documento, las conclusiones y las líneas futuras.

Por último se incluirán referencias bibliográficas y anexos necesarios para entender el presente documento. This page has been intentionally left blank. Chapter 2 Estado del arte

En este apartado se definirá qué es el aprendizaje automático, se realizará una intro- ducción a su base matemática y se enumerarán conceptos relacionados y sus vertientes más importantes, entrando en detalle en alguna de ellas. Por último, se van a detallar las herramientas a usar para realizar el análisis comparativo. Para describir las distintas partes que componen el aprendizaje automático, se irán subdiviendo los grupos más importantes en subapartados, para poder ir introduciendo nuevos conceptos poco a poco.

2.1 Conceptos básicos

2.1.1 Aprendizaje Automático

Para comenzar, vamos a definir algunos conceptos básicos que nos permitirán com- prender mejor el ámbito de aplicación del presente trabajo. Según el diccionario de la Real Academia de la Lengua Española:

• Aprender 1: – Adquirir el conocimiento de algo por medio del estudio o de la experiencia. – Concebir algo por meras apariencias, o con poco fundamento. – Fijar algo en la memoria. • Y Automático 2: – Del gr. αὐτόματος autómatos «que actúa por sí mismo». – Dicho de un mecanismo o de un aparato: Que funciona en todo o en parte por sí solo.

1http://dle.rae.es/srv/fetch?id=3IWZ4nr 2http://dle.rae.es/srv/fetch?id=4TO3M08

9 10 Evolutionary Design of Deep Neural Networks

– Ciencia que trata de sustituir en un proceso el operador humano por dispos- itivos mecánicos o electrónicos.

Por tanto, desde un punto de vista puramente académico y lingüístico, el apren- dizaje automático se podría definir como: Mecanismo o aparato que funciona en todo o en parte por sí solo por medio de un conocimiento adquirido del estudio o de la experiencia. Para lograr esto, es necesario dotar al mecanismo o aparato de una «memoria» donde alma- cenar conocimientos que le sirven para aprender cómo realizar tareas. Además, debe ser capaz de recuperar y usar dichas memorias. Específicamente dentro del campo de la computación, Simon [38] define aprendizaje automático como:

Aprendizaje es cualquier proceso por el cual un sistema mejora por medio de la experiencia

Una definición moderna más concreta podría ser rama de las ciencias de la com- putación encargada del estudio y creación de sistemas que mejoren de forma autónoma mediante la experiencia, es decir por inferencia en lugar de siguiendo una serie previ- amente establecida de reglas. Los sistemas de aprendizaje automático que se están desarrollando hoy en día en el campo de la computación se enfocan en el aprendizaje de una tarea o tareas concretas, es decir, tienen un conocimiento del mundo y una aplicación limitada. A este tipo de sistemas se les denomina sistemas de uso específico. Por ejemplo, no podrán realizar tareas muy dispares a su objetivo principal tales como saber qué día es hoy. Esto obliga a tener que definir claramente la tarea que debe resolverse y en base a qué conocimiento disponible (datos de entrada) se resolverá. Por ejemplo, un sistema para detectar una sonrisa en una imagen requerirá información completamente distinta comparado con un sistema de optimización de planes logísticos. Con esto podemos definir las partes involucradas en el aprendizaje automático que se pueden agrupar en base a las características del método que se utilice. Un primer nivel de diferenciación, establecido en base al método utilizado por el algoritmo para alcanzar su objetivo, distingue dos grupos: sistemas colaborativos, que ayuden al usuario en la toma de decisiones; o bien sistemas expertos que sean capaces de tomar decisiones por sí mismos. En ambos casos, los sistemas tendrán como salida un modelo, es decir, el resultado de un aprendizaje, que al recibir una entrada proporcionará un elemento de salida. Dicho modelo no tiene por qué ser final, puede seguir ajustándose (aprendiendo), y perfeccionándose con el tiempo. Dependiendo de la estructura de este modelo pode- mos distinguir los siguientes tipos:

Modelos probabilísticos En estos modelos se devuelve la salida ponderada para cada categoría de salida, indicando que con la entrada dada, esa es la probabilidad Chapter 2. Estado del arte 11

de pertenecer a un grupo u otro. Por ejemplo, es útil en la medicina, al indicar síntomas podemos obtener las enfermedades más probables que cumplan con esas condiciones

Modelo lógicos Los modelos generados son árboles de decisión. Son una repre- sentación de una sucesión de decisiones (nodos) que, utilizando una serie de probabilidades o valores de de entrada, continúan por unas opciones (ramas) u otras, hasta llegar a una hoja o punto final, que dará el resultado.

Modelo geométrico Producen fórmulas matemáticas para clasificación de datos. El modelo más simple es el lineal, que divide un espacio multidimensional (una dimensión por cada característica independiente de los datos de entrada) en dos espacios, uno para cada grupo de clasificación. Otros modelos más complejos permiten decisiones más detalladas, pero el concepto es similar.

Otra diferenciación se basa en la información que se tenga sobre los datos, funda- mental al basarse el aprendizaje en la experiencia. Se pueden distinguir tres categorías:

• Los datos y el resultado deseado del sistema (clasificación, decisión, etc) son cono- cidos.

• Solo se conocen los datos de entrada.

• Una combinación de ambos, datos con resultado y sin él.

Existen varios métodos de aprendizaje que dependen directamente de estas cate- gorías:

Aprendizaje supervisado Si se dispone del dato y el resultado deseado se puede eval- uar y modificar el modelo para cada instancia de los datos. Este tipo de métodos pueden ser útiles para deducir la regla general que aplique a un conjunto de datos.

Aprendizaje no supervisado En este tipo de aprendizaje no se dispone de información adicional de los datos de entrada. Con este tipo de sistemas se trata de encontrar relaciones entre los datos que pueden no ser conocidas de antemano.

Aprendizaje por refuerzo Podría incluirse dentro del supervisado. En este tipo de aprendizaje se refuerzan o disuaden ciertos aprendizajes en función de la salida esperada.

Por último falta definir cómo aprender, hasta ahora se ha definido, la posible entrada de datos (y tipo de aprendizaje), el modelo de salida y el objetivo a alcanzar. Pero aún falta definir como alcanzar ese objetivo. Actualmente estos son las técnicas más representativas del aprendizaje automático: 12 Evolutionary Design of Deep Neural Networks

• Árboles de decisiones

• Reglas de asociación

• Algoritmos genéticos

• Máquinas de vectores de soporte (SVM)

• Algoritmos de agrupamiento (clustering)

• Redes bayesianas

• Redes neuronales artificiales

• Ensembles: Conjuntos de varias técnicas

• Algoritmos basados en el vecino más cercano (KNN)

2.1.1.1 Árboles de Decisión

Técnica que permite analizar decisiones secuenciales basada en el uso de resultados y probabilidades asociadas. Los árboles de decisión se pueden usar para generar sistemas expertos, búsquedas binarias y árboles de juegos. Las principales características de un árbol de decisión son:

• Resume los ejemplos de partida, permitiendo la clasificación de nuevos casos siempre y cuando no existan modificaciones sustanciales en las condiciones bajo las cuales se generaron.

• Facilita la interpretación de la decisión adoptada.

• Proporciona un alto grado de comprensión del conocimiento utilizado en la toma de decisiones.

• Explica el comportamiento respecto a una determinada tarea de decisión.

• Reduce el número de variables independientes.

• Es una magnífica herramienta para el control de la gestión empresarial.

Los árboles de decisión se utilizan en cualquier proceso que implique una toma de decisiones, ejemplos de estos procesos son:

• Búsqueda binaria

• Sistemas expertos Chapter 2. Estado del arte 13

• Árboles de juego

Los árboles de decisión generalmente son binarios, es decir, que cuentan con dos op- ciones, aunque esto no significa que no puedan existir árboles de tres o más opciones.

2.1.2 Reglas de Asociación

Esta técnica busca encontrar relación entre los distintos datos de entrada, a priori in- conexos. En este tipo de paradigma, el factor probabilidad es importante, ya que las reglas de asociación pueden no ser absolutas. Es decir, no todo el mundo que compra congelados y latas de vegetales comprará cerveza pero sí lo hará el X% de las personas. Otros porcentajes que se pueden estudiar es el número de ejemplos afectados por este hecho, ya que puede ser un hecho aislado dentro del grupo de datos, etc. La principal característica de esta técnica es que permite encontrar relaciones entre atributos que a priori no tienen relación entre sí. Sin embargo, los algoritmos de asociación tratan de encontrar patrones en un es- pacio de búsqueda potencialmente muy amplio y, por tanto, pueden necesitar mucho más tiempo de ejecución que otra implementación de aprendizaje. Las reglas de asociación utilizan dos métodos ejecutados de forma consecutiva para buscar reglas:

• Generación y comprobación. Inicialmente, se generan reglas sencillas que se val- idan basándose en el conjunto de datos. En este proceso, las buenas reglas se almacenan y todas las reglas, sujetas a varias restricciones, se especializan poste- riormente. • Especialización. Este método consiste en añadir condiciones a una regla. – Las reglas especializadas se validan basándose en los datos y el proceso almacena de forma iterativa las mejores reglas o las más interesantes que se encuentren. – Durante el proceso, el usuario puede proporcionar alguna limitación al número posible de antecedentes que permitir en una regla. – Para reducir potencialmente el espacio de la búsqueda, se pueden utilizar técnicas basadas en la teoría de la información o esquemas de indexación.

Tras las ejecución de los métodos anteriores, se presenta una tabla con las mejores reglas. Este conjunto de reglas, conocidas como «modelos sin refinar» no se pueden utilizar directamente porque contienen una gran variedad de conclusiones. Será nece- sario aplicar una transformación adicional para transformar las reglas de asociación en 14 Evolutionary Design of Deep Neural Networks un conjunto de reglas de clasificación. Dos posibles métodos para depurar las reglas de asociación consisten en:

• Extraer un conjunto de reglas de los datos y destacar aquellas reglas con un mayor contenido de información. • Encontrar reglas de asociación en datos secuenciales (lista de conjuntos de ele- mentos que tiende a producirse en un orden previsible) o en datos ordenados en el tiempo. Pongamos por ejemplo que si un cliente compra una cuchilla y una loción para después del afeitado, es muy probable que en su próxima visita a la tienda, compre crema de afeitar.

2.1.2.1 Algoritmos Genéticos

Los algoritmos genéticos son métodos adaptativos que pueden utilizarse para resolver problemas de búsqueda y optimización. Están basados en el proceso genético de los organismos vivos. A lo largo de las generaciones, las poblaciones evolucionan en la naturaleza de acorde con los principios de la selección natural y la supervivencia de los más fuertes, postulados por Darwin [7]. Por imitación de este proceso, los algoritmos genéticos son capaces de ir creando soluciones para problemas del mundo real. La evolución de dichas soluciones hacia valores óptimos del problema depende en buena medida de una adecuada codificación de las mismas. Para el estudio de los algoritmos genéticos hay que tener en cuenta una serie de parámetros:

• Tamaño de la población Este parámetro nos indica el número de cromosomas que tenemos en nuestra población para una generación determinada. En caso de que esta medida sea insuficiente, el algoritmo genético tiene pocas posibilidades de realizar reproducciones con lo que se realizaría una búsqueda de soluciones escasa y poco óptima. Por otro lado, si la población es muy numerosa, el algo- ritmo genético será excesivamente lento. Determinados estudios [15][1] revelan que hay un límite a partir del cual es ineficiente elevar el tamaño de la población, puesto que no se consigue una mayor velocidad en la resolución del problema. • Probabilidad de cruce Indica la frecuencia con la que se producen cruces entre los cromosomas padre, es decir, la probabilidad de reproducción entre ellos. En caso de que no exista probabilidad de reproducción, los hijos serán copias exactas de los padres. En caso de haberla, los hijos tendrán partes de los cromosomas de los padres. Si la probabilidad de cruce es del 100% el hijo se crea totalmente por cruce, no por partes. • Probabilidad de mutación Nos indica la frecuencia con la que los genes de un cromosoma son mutados. Si no hay mutación, los descendientes son los mismos Chapter 2. Estado del arte 15

que había tras la reproducción. En caso de que haya mutaciones, parte del cromo- soma descendiente es modificado y, si la probabilidad de mutación es del 100%, la totalidad del cromosoma se cambia. En este caso, no se cambian simplemente unos bits del cromosoma sino que se cambian todos, lo que significa que se pro- duce una inversión en el cromosoma y no una mutación por lo que la población degenera muy rápidamente.

En los algoritmos genéticos, el primer paso a realizar consiste en definir cómo se van a codificar los cromosomas que componen a un individuo. De cada cromosoma hay que definir qué posibles valores puede tomar. Por ejemplo, el primer cromosoma puede indicar el color del pelo y como valores posibles rubio, moreno, castaño, y el segundo puede determinar el sexo (hombre, mujer). Adicionalmente a la definición de los individuos, será necesario determinar reglas para el entorno en el que interactuarán. Por ejemplo, que dos hombres fisiológicamente no pueden tener hijos. Una vez se ha definido cómo se van codificar a los individuos, cuál es el tamaño de la población, la probabilidad de cruce, la probabilidad de mutación y las reglas que aplican al entorno, se puede comenzar con la fase de entrenamiento. La fase de entrenamiento consiste en los siguientes pasos:

• Se genera un número determinado de individuos, que depende del tamaño de la población.

• Se ejecuta en bucle un proceso en el que los individuos intervienen automática en el en entorno que se les ha preparado, compitiendo entre sí.

• Cuando finaliza la competición entre individuos, se tiene que analizar cuáles quedan al final, ya que puede pasar que el superviviente no sea el mejor de la población. Por ello, es necesario tener un criterio que nos permita valorar la salida, es decir, valorar al individuo/s que ha resultado ganador de la competi- ción.

2.1.2.2 Máquinas de Vectores de Soporte (SVM)

Los algoritmos de vectores de soporte fueron ideados por Vapnik en los años 90 [41]. Demostró que era equivalente minimizar el error empírico (Probabilidad que la hipóte- sis H tenga un error en un conjunto de pruebas seleccionado de manera aleatoria) a encontrar el hiper-plano que se encuentra a la distancia máxima de las dos pruebas de entrenamiento más cercanas entre sí y que pertenecen a distintos grupos de clasifi- cación, también llamado error estructural. Para que el hiperplano sea útil, es necesario que los grupos de clasificación sean linealmente separables, si no es así, se aplican funciones a los datos para lograr un cambio de estado. Se han desarrollado funciones específicas para lograr este objetivo: 16 Evolutionary Design of Deep Neural Networks

• Kernel: Son un grupo de funciones que cumplen un grupo de principios matemáticos. Es el grupo más utilizado.

• Funciones polinómicas

• Funciones de base radial (BSF)

Las características principales son:

• El entrenamiento es relativamente fácil.

• No hay óptimo local, como en las redes neuronales. Se escalan relativamente bien para datos en espacios dimensionales altos.

• El compromiso entre la complejidad del clasificador y el error puede ser contro- lado explícitamente.

• Datos no tradicionales como cadenas de caracteres y árboles pueden ser usados como entrada a la SVM, en vez de vectores de características.

• El principal problema es que se necesita una «buena» función kernel, es decir, se necesitan metodologías eficientes para sintonizar los parámetros de inicialización de la SVM.

2.1.2.3 Algoritmos de Agrupamiento

El análisis por agrupamiento [9] es la clasificación de observaciones en subgrupos (clus- ters) para que las observaciones de cada grupo se asemejen entre sí según ciertos crite- rios. Las técnicas de agrupamiento hacen inferencias diferentes sobre la estructura de los datos. Se guían normalmente por una medida de similaridad específica y por un nivel de compactamiento interno (similaridad entre los miembros de un grupo) y la separación entre los diferentes grupos. El agrupamiento se engloba dentro del tipo de aprendizaje no supervisado y es una técnica muy popular de análisis estadístico de datos. Los métodos de agrupamiento se dividen en tres grupos fundamentales: jerárquicos, particionales y basados en densidad.

• Los algoritmos jerárquicos son aquellos en los que se va particionando el con- junto de datos por niveles, de tal modo que en cada nivel se unen o se dividen dos grupos del nivel anterior, según si es un algoritmo aglomerativo o divisivo respectivamente. Chapter 2. Estado del arte 17

• Los algoritmos particionales son los que realizan una división inicial de los datos en grupos y luego mueven los objetos de un grupo a otro según se optimice alguna función objetivo.

• Los algoritmos basados en densidad enfocan el problema de la división de una base de datos en grupos teniendo en cuenta la distribución de densidad de los puntos, de tal modo que los grupos que se forman tienen una alta densidad de puntos en su interior mientras que entre ellos aparecen zonas de baja densidad.

2.1.2.4 Redes Bayesianas

Una red bayesiana [32] es un modelo probabilístico que representa las relaciones entre variables aleatorias y sus dependencias. Es un grafo acíclico dirigido y ponderado, donde los nodos son variables aleatorias, y los aristas son dependencias entre dichas variables. Si dos eventos no tiene una arista se consideran que tienen independencia condicional. Cada nodo tiene asociada una función de probabilidad la cual recibe un conjunto de valores de las variables padre del nodo y devuelve los valores del nodo.

2.1.2.5 Red de Neuronas

Este tipo de aprendizaje automático intenta emular el funcionamiento del cerebro, us- ando elementos llamados neuronas, que en base a una información de entrada, harán un determinado cálculo y darán una información de salida. Al igual que con el cerebro humano, las neuronas están interconectadas entre ellas, para transmitir información y poder dar una salida según una entrada dada. Estas interconexiones o paso de in- formación estarán ponderadas para evitar inundar a las neuronas con información no relevante, y así reducir en operaciones innecesarias. Estos pesos, son los que irán var- iando en el entrenamiento de estas redes, bloqueando información inútil pero dejando fluir la necesaria. Estas son un concepto vital en aprendizaje profundo y vamos a explicarlas en profundidad en el siguiente apartado.

2.1.3 Redes de Neuronas Biológicas

Como se ha comentado este tipo de redes intentan emular el cerebro de los seres hu- manos y para ello se parte de la estructura biológica de una neurona. Por ello, primero vamos a definir que es una neurona y cómo funciona en el cerebro. Definimos neu- rona [5] como:

Célula nerviosa, que generalmente consta de un cuerpo de forma variable y provisto de diversas prolongaciones, una de las cuales, de aspecto filiforme y más larga que las demás, es el axón o neurita. 18 Evolutionary Design of Deep Neural Networks

Ya en el comienzo de la definición se habla de célula nerviosa que se define como «un tipo de célula que recibe y envía mensajes del cuerpo al cerebro y del cerebro al cuerpo. Los mensajes se envían por medio de una corriente eléctrica débil». Esto nos indica, que tendremos células que tomarán información del cuerpo, la transmitirán por el cuerpo, llegará al cerebro, donde se tratará, devolviendo un impulso indicando la acción a realizar. Esto implica que habrá varios tipos de neuronas pero sin entrar al detalle, todas comparten ese flujo de información, Entrada de información, tratamiento y Salida de nueva información. Esto se puede ver como un procesador de información sencillo.

Figure 2.1: caption with FN3

Entrando algo al detalle, el funcionamiento de una neurona, será recopilar todos los impulsos de entrada y el nivel de estos impulsos, ya que no son entradas binarias, no hay impulso o hay impulso, sino que vendrá dado por una intensidad. La neurona con estos impulsos, aplican una función de activación, que indicará si hay que dar un valor de salida en el axón, y la intensidad de ese valor. No se sabe con exactitud el número de neuronas en un humano, pero puede rondar en torno a las 86.000.000.000 o las 100.000.000.000 [3], además el número de sinapsis (uniones entre axón y dendritas) están en torno al 1014 y por neurona unas 1000. Por esto, y otras razones, emular un cerebro humano es a día de hoy inviable. Eso no sig- nifica, que al igual que hace el cerebro, podamos tener grupos de neuronas para realizar acciones específicas (visión artificial, reconocimiento de texto, aprendizaje matemático,

3https://en.wikipedia.org/wiki/Neuron#/media/File:Blausen_0657_MultipolarNeuron.png Chapter 2. Estado del arte 19 etc.).

Figure 2.2: Red neuronal4

Se puede ver que cada neurona tiene multitud de uniones y es imposible seguir las uniones, para identificar qué neurona está unida con que neuronas. Algún otro aspecto que se emula de las redes neuronales biológicas se tratará al ir explicando los subtipos de redes de neuronas artificiales existentes.

2.1.4 Perceptrón

Un perceptrón [10] está compuesto por un conjunto de entradas, asociadas a unos pesos, una unidad de procesamiento y una salida. Solo es utilizable en grupos de datos linealmente separables. Gráficamente:

4https://pixabay.com/es/neuronas-c%C3%A9lulas-del-cerebro-440660 20 Evolutionary Design of Deep Neural Networks

Figure 2.3: Perceptrón

El procesamiento se subdivide en dos partes:

• Sumatorio de las entradas ponderadas: Se suman los valores obtenidos al multi- plicar el valor de cada entra por el peso de su enlace.

• Función de activación: Con el valor obtenido con el sumatorio de las entradas se define el criterio de activación y con ello la señal de salida (en el caso básico 1 o 0).

El perceptrón se utiliza como patrón de clasificación bidimensional de los datos, usando para ello la función de la recta para dividir los datos. Si el dato buscado está por encima de la recta tendrá una etiqueta de la clasificación y si está por debajo otra etiqueta quedando así:

 n  1, si f (∑ xi ∗ wi + u) > 0 i=0 (2.1) 0, caso contrario

Para realizar el aprendizaje de los pesos(wi) y del umbral(u), se comienza dando valores aleatorios que se irán modificando si la salida no es igual a la esperada. Este proceso, será repetitivo. La regla a utilizar se llama regla de aprendizaje del percep- trón simple: w (k + 1) = w (k) + ∆w (k) j j j (2.2) ∆wj(k) = η(k)[z(k) − y(k)]xj(k) Chapter 2. Estado del arte 21

Esto nos indica que la variación del peso wj es proporcional al producto del error z(k) (salida esperada) menos y(k) (salida del perceptrón) por la componente j-ésima del patrón de entrada que hemos introducido en la iteración k, es decir, x(k)j. La constante de proporcionalidad η(k) es un parámetro positivo que se llama tasa de aprendizaje puesto que cuanto mayor es, más se modifica el peso sináptico y viceversa. Por tanto, es el parámetro que controla el proceso de aprendizaje. Cuando es muy pequeño la red aprende poco a poco. Cuando se toma constante en todas las iteraciones, η(k) = η > 0 tendremos la regla de adaptación con incremento fijo. La fórmula es por tanto, proporcional al error y únicamente afecta si la salida es errónea, dejando los valores correctos, como están. Para calcular el sesgo se hace de manera parecida porque se le considera como el peso de una unidad más de entrada, dando un valor a la x de −1. Por lo tanto, se aplicaría la regla anterior pero en lugar de tener j entradas, tendremos j + 1. Por último, al ser cíclico esta búsqueda es necesario definir una condición de parada. La red dejará de aprender cuando no se produzcan cambios en los pesos en un número marcado de iteraciones.Pudiera parecer que falta una condición más de parada, ya que si existen dos valores que impiden que la recta los divida, será un bucle infinito. Sin embargo, una condición indispensable para el uso del perceptrón es que los grupos de datos sean linealmente separables. Además, el perceptrón se apoya en un teorema llamado Teorema de convergencia del perceptrón que garantiza que si el grupo de datos es linealmente separable, el perceptrón será capaz de encontrar la solución en un número finito de pasos. Como tal el perceptrón es muy limitado al solo poder hacer frente a grupos de datos linealmente separables. Además, en la biología se veían neuronas individuales, pero también grupos de neuronas. En este caso sucede igual apareciendo el perceptrón multicapa, que estará compuesto de perceptrones simples.

2.1.5 Perceptrón Multicapa

El perceptrón multicapa es una generalización del perceptrón y surge por la limitación de este al resolver problemas linealmente no separables. Como su nombre indica está compuesto por perceptrones simples, distribuidos en capas, de la siguiente manera:

• Entrada: Compuesta por uno o varios perceptrones

• Oculta: Habrá de 1 a N capas de este tipo, cuyo tamaño podrá ser menor/mayor/igual al que las entradas y reciben valores de cada una de las entradas/capa anterior. En esta capa se representa de manera abstracta los datos de entrenamiento.

• Salida: Compuesta por uno o varios perceptrones, cuya entrada será la salida de la última capa oculta 22 Evolutionary Design of Deep Neural Networks

Estas capas están unidas entre sí, en el orden de capa de entrada, capa oculta 1, capa oculta 2, etc. y capa de salida. No hay uniones dentro de la propia capa y generalmente, tampoco existen uniones a más de dos capas, la predecesora y la sucesora. En la unión de una capa con la siguiente, de manera general, cada perceptrón es unido con todos los perceptrones de la capa siguiente, esto se conoce como red totalmente conectada.

Figure 2.4: Perceptrón Multicapa

Se ha demostrado que el perceptrón multicapa es un aproximador universal de funciones. Esto quiere decir, que un perceptrón multicapa con una única capa oculta y un número finito de neuronas es capaz de aproximar cualquier función continua dentro del espacio euclídeo. Claramente es una gran ventaja, pero el problema radicará en elegir cuantas neuronas irán en esa capa, si solo se tendrá una capa y el tiempo que tardará el sistema en ajustar los pesos. Uno de los aspectos que da la experiencia es que se aprende mejor con varias capas. Antes de entrar en el proceso de definir las capas, se va a definir el flujo de informa- ción en estas redes y el algoritmo utilizado para la actualización de pesos (aprendizaje). Como se ve en la imagen, las flechas indican que la información recorre las neuronas desde la entrada a la salida, sin volver hacia atrás en ningún caso. Es decir, llega la información a un perceptrón, que la trata como se vio en el punto anterior y la deja en la salida, y eso con cada perceptrón hasta llegar a la salida final. A esto se le denomina Chapter 2. Estado del arte 23 como red feedforward. Para el aprendizaje existe un algoritmo llamado algoritmo de retropropagación [35] que nos permite actualizar los pesos de cada neurona y capa. Este algoritmo incluye el paso feedforward de la red, con lo que se obtiene la salida de la red, a comparar con la salida esperada. La diferencia de ambos, nos da el error relativo de cada salida. Con dicho error se actualizan los pesos de la capa de salida y se traslada una proporción del error a cada neurona de cada capa en función de la contribución de esa neurona a la salida final. El aprendizaje por retropropagación queda como sigue:

1. Inicializar los pesos y los umbrales iniciales de cada neurona. Hay varias posi- bilidades de inicialización siendo las más comunes las que introducen valores aleatorios pequeños.

2. Para cada patrón del conjunto de los datos de entrenamiento

(a) Obtener la respuesta de la red ante ese patrón. Esta parte se consigue pro- pagando la entrada hacia adelante, ya que este tipo de red es feedforward. Las salidas de una capa sirven como entrada a las neuronas de la capa sigu- iente, procesándolas de acuerdo a la regla de propagación y la función de activación correspondientes. (b) Calcular los errores asociados según la ecuación del error cuadrático medio, descrita más abajo. (c) Calcular las derivadas parciales del error con respecto a los pesos que unen a la última capa oculta con la de salida. (d) Calcular las derivadas parciales del error con respecto a los pesos que unen la capa de entrada con la oculta.

3. Calcular el incremento total, para todos los patrones, de los pesos y los umbrales.

4. Actualizar pesos y umbrales.

5. Calcular el error actual y volver al paso 2 si no es satisfactorio.

El error cuadrático medio es l 2 2 ep = 1/2 ∑ δk (2.3) k=1 con s δk = (tk − ak) (2.4)

, siendo tk la salida esperada y ak la salida de la red El incremento total, utilizado para actualizar los pesos se calcula de manera general con el algoritmo de descenso del gradiente: p p ∆pwj = α(d − y )xj (2.5) 24 Evolutionary Design of Deep Neural Networks

Este algoritmo utiliza un valor α, tasa de aprendizaje, para controlar la actualización de pesos. No hay una metodología que indique qué valor dar a la tasa de aprendizaje, en algunos casos es un valor que irá variando a lo largo del entrenamiento. La consecuen- cia de este valor es el tamaño de los saltos que irá realizando la red para la búsqueda del mínimo. La idea básica sería, que minimizando el error, el perceptrón multicapa, hiciera un camino a la solución tal y como muestra la imagen:

Figure 2.5: Minimizar error5

Sin embargo, la imagen anterior no es una representación real de la función del er- ror, que es una función no lineal, pudiendo aparecer mínimos locales que nos impidan seguir avanzando para alcanzar la solución real.

Figure 2.6: Mínimos locales6

5http://www.cs.us.es/~fsancho/?e=165 6http://sebastianraschka.com/Articles/2015_singlelayer_neurons.html Chapter 2. Estado del arte 25

Para poder saltar estos mínimos nos es de utilidad la tasa de aprendizaje vista con el descenso del gradiente. Sin embargo podemos aumentar demasiado ese valor y conseguir lo contrario, alejarnos del óptimo. El otro gran problema del perceptrón es el llamado sobreajuste. El sobreajuste de una red se produce, si la red en lugar de hacer inferencia de los datos para conseguir un patrón, se adapta de manera exacta a esos datos, siendo incapaz de catalogar nuevos datos. Es decir se sobreajusta a los datos de entrenamiento. Otro de los problemas del perceptrón es la elección del número de capas y neu- ronas dentro de estas capas. No existe una metodología que indique qué valores son los correctos y más allá de saber que con una capa sería posible aproximar cualquier función, la elección se vaya en prueba y error. Una de las causas es la alta conectividad existente en la red y la presencia de componentes no lineales. El último problema a comentar es la lentitud que tiene el perceptrón para alcanzar soluciones debido a la complejidad del cálculo para actualizar los pesos, el número de pesos generalmente implicados y el tratamiento de la red feedforward para obtener cada resultar a analizar. Está muy relacionado con el número de capas y neuronas. El descenso de gradiente, es el algoritmo más utilizado en las redes de neuronas, pero no es el único. Otros algoritmos posibles son:

Método de Newton El objetivo en este algoritmo es encontrar las mejores direcciones de variación de los parámetros. Se basa en calcular las derivadas de la función y por eso su coste computacional puede ser elevado. Gradiente conjugado Se puede considerar como un método intermedio entre el de- scenso del gradiente y el método de Newton, acelerando la convergencia del primero pero reduciendo el coste computacional del segundo. En este método se basa en las direcciones conjugadas (dos direcciones, u y v se dicen conjugadas T respecto de una matriz A si u Av = 0), lo que normalmente se produce una convergencia más rápida. Método Cuasi-Newton En estos métodos, en lugar de calcular la segunda derivada (Hessiano) y después su inversa, se construye una aproximación de la inversa en cada iteración utilizando sólo información sobre las primeras derivadas de la función de error. Otros Aunque existen otras redes como Adaline o el grupo de redes de base radial, con lo visto hasta ahora podemos comenzar a ver el objeto del presente documento, el aprendizaje profundo.

2.1.6 Aprendizaje Profundo

El aprendizaje profundo [28] es una clase de aprendizaje automático aplicando redes neuronales que usa múltiples capas de unidades de procesamiento no lineal. Estas capas forman jerarquías de abstracción de más bajo a más alto [8]. 26 Evolutionary Design of Deep Neural Networks

Contrastan con el aprendizaje poco profundo por el número de transformaciones apli- cadas a la señal mientras se propaga desde la capa de entrada a la capa de salida. Cada una de estas transformaciones incluyen parámetros que se pueden entrenar como pesos y umbrales. En el 2004, Hinton con los fondos del CIFAR7 (Instituto Canadiense para la Investi- gación Avanzada) el apoyo de Lecun y Bengio fundó un grupo de trabajo directamente enfocado al aprendizaje profundo o la idea del mismo en 2004. En 2006 Hinton, Simon Osindero, and Yee-Whye Teh [22] lograron encontrar un algoritmo para entrenar una red de creencia profunda de manera rápida. Hasta ese momento este tipo de redes estaba sin mucha investigación, en ICML no había papers con ellas en todo el 2005. Con este trabajo se acuñó el término de aprendizaje profundo. Tras este paper, se volvió a trabajar sobre este tipo de redes y se lograron avances pero hubo que esperar al 2009 [11] para que una red ganará un concurso, y hasta el 2011, por el realizado por Yann Lecun, Geoff Hinton, Yoshua Bengio en 2011 [26] con la inclusión de rectificadores (función rampa) para redes supervisadas. Actualmente hay multitud de trabajos y esta implicado en investigaciones dispares como medicina, educación, fotografía etc. Por ejemplo Google publicó 8 recientemente un conjunto de fotografías retocadas automaticamente con deep learning, también se ha lanzado recientemente un traductor basado en deeplearning, que su propio url lo dice deepl.com por ello es díficil abarcar las posibilidades actuales con este tipo de redes, ni marcar un límite para ellas.

2.1.7 Rectificador

Es una función de activación para las neuronas. Las neuronas que usan el rectificador se les conoce como ReLu(Rectified Linear Unit).

f (x) = x+ = max(0, x) (2.6) también llamada función rampa Es la función de activación más utilizada desde 2015 [28] La función queda así:

Figure 2.7: Función Relu

7https://www.cifar.ca/research/learning-in-machine-and-brains/ 8https://research.googleblog.com/2017/07/using-deep-learning-to-create.html Chapter 2. Estado del arte 27

2.1.8 Encoder

Partiendo de las redes neuronales retroalimentadas, podemos definir este tipo de red como una red cuyo objetivo es aprender una representación codificada de los datos de entrada (p.e. reducción de dimensionalidad, compresión, cifrado, etc). Para lograr ese objetivo, la entrada y salida de la red, serán la misma y la diferencia se tendrá por la reducción de neuronas en la capa interna. Dentro de la estructura común del perceptrón la representación más común sería:

Figure 2.8: Rectificador

Como se ve en la imagen, el Codificador, reduce desde la capa de entrada hasta la capa oculta de mayor profundidad y el decodificador, que parte de esa capa oculta hasta la capa de salida. Se pueden ver como dos redes distintas, en una desde la capa de entrada a la última oculta y la otra comenzaría con la capa oculta de mayor profundidad (capa de entrada) y terminaría con la capa de salida. Su uso se puede extender, entre otros, a compresión de archivos, codificación de mensajes o extracción de características principales de los datos.

2.1.9 Restricted Boltzmann Machine

Una RBM [40] es un grafo no dirigido con nodos visibles y nodos ocultos. Los nodos (o neuronas) en la capa visible están totalmente conectados a los nodos de la capa oculta. Es un algoritmo útil para lograr una reducción dimensional, para el cálculo de la regresión, clasificación, modelado de temáticas, etcétera. 28 Evolutionary Design of Deep Neural Networks

Figure 2.9: RBM 1

Una condición necesaria de las máquinas Boltzmann restringidas es que los no- dos no están unidos a nodos de su misma capa. A nivel de grafo se le denomina grafo bipartido simétrico. Bipartido por ser dos capas y simétrico por estar totalmente conectado.El funcionamiento sería: Definir el número de entradas, que dependerá del número de características de los conjuntos de datos disponibles. Por ejemplo, para el caso de un conjunto de imágenes en escala de grises, cada nodo visible, recibiría el valor de un píxel por cada pixel de la imagen (En las bases de datos de MNIST las imágenes tienen 784 píxeles, por lo tanto, la red neuronal, tendría 784 nodos de entrada en la capa visible). A continuación se inicializan los pesos que unen las capas de manera aleatoria, con esto se definirá si esa entrada se transmite o no a la capa oculta. Siguiendo el valor de una entrada X, tendríamos:

Figure 2.10: RBM 2 Chapter 2. Estado del arte 29

Que corresponde a la función de salida/activación f ((w ∗ x) + b) = y donde, (w son los pesos, x la entrada y b el bias). Extendiendo a todas las x de la red, y una única celda oculta, tendremos:

Figure 2.11: RBM 3

Al saber que la red está totalmente conectada, podemos calcular el total de pesos en base al número de neuronas. En el caso de la imagen anterior serían 4 nodos capa visible por 3 de la capa oculta = 12 pesos. Visto de manera completa:

Figure 2.12: RBM 4

En el caso del perceptrón multicapa, el siguiente paso sería pasar la salida a la siguiente capa oculta y así por cada una de las capas del perceptrón. 30 Evolutionary Design of Deep Neural Networks

Figure 2.13: RBM 5

En el RBM, sin embargo, lo que se realiza es hacer ciclos entre la capa oculta y la capa visible. Es decir, la salida de la capa oculta se convierte en la entrada de la capa oculta siendo también ponderada (por los mismos pesos). Este paso es llamado reconstrucción:

Figure 2.14: RBM 6

El objetivo es hacer el proceso iterativo para reducir el error, que se corresponde con la diferencia entre t y el valor inicial de entrada, x.

2.1.10 Enconders Aplicados

Como su nombre lo indica, esta red consiste en múltiples encoders apilados [27]. Sin embargo, solo se toma la parte de codificación del Encoder, es decir, solo se toman las neuronas desde la capa de entrada hasta la capa oculta más profunda. Así la capa Chapter 2. Estado del arte 31 oculta T del encoder, se transforma el capa de entrada del encoder siguiente. por lo tanto la capa de entrada del primer encoder, se actúa como la capa de entrada de toda la red.

Figure 2.15: Encoders aplicados

Para realizar el entrenamiento de este tipo de redes, se usa un procedimiento avari- cioso, entrenando cada capa de manera independiente:

• Se entrena al primer encoder, incluyendo el decodificador, usando la retropropa- gación.

• Al finalizar, se elimina la parte del decodificador y se une a la entrada del segundo encoder.

• A continuación, se entrena ese segundo encoder, igualmente con la retropropa- gación.

• Al finalizar se elimina la capa del decodificador, y se une al tercer encoder.

• Se repite este proceso de entrenamiento de eliminación del decodificador hasta finalizar con la red.

Estos pasos, llamados pre-entrenamiento, dejan los pesos de los encoders inicializados correctamente. Sin embargo, falta una fase por realizar y es la que afecta a la capa (o 32 Evolutionary Design of Deep Neural Networks capas) de salida. En este último paso, denominado ajuste fino, se deben añadir capa/s para poder obtener el formato de salida esperado, es decir, las características que nos devolverá la red. Al hacer esto, tendremos un perceptrón multicapa, que se puede entrenar con el algoritmo de retropropagación.

2.1.11 Redes de Creencias Profundas DBN

Las redes de creencias profundas [21], son redes que, al igual que se realiza en el paso anterior con los , se apilan máquinas de Bolztmann restringidas para lograr un red más compleja. Para realizar el entrenamiento de este tipo de redes, se usa un procedimiento avaricioso, entrenando cada capa de manera independiente:

• Se entrena al primer RBM, utilizando divergencia contrastativa con todas las muestras de entrenamiento.

• Al finalizar, tendremos la RBM entrenada, y podemos usar la capa oculta de la RBM como capa de entrada del siguiente RBM.

• A continuación, se entrena el segundo RBM, igualmente se usa divergencia con- trastativa.

• Al finalizar, tendremos el segundo RBM entrenado, y se une al siguiente RBM.

• Se repite este proceso de entrenamiento, siempre usando la capa oculta del RBM entrenado como capa de entrada del siguiente RBM

Figure 2.16: Redes de Creencias Profundas local Chapter 2. Estado del arte 33 y a nivel global:

Figure 2.17: Redes de Creencias Profundas global

Al finalizar el pre-entrenamiento, la red se puede ampliar añadiendo una o más capas conectadas a la última capa oculta. Este nueva red se entrenaría como un per- ceptrón multicapa. A este último proceso se le denomina ajuste fino [22]. En este punto se incluye la divergencia contrastativa [20][20] que es una técnica, la cual es un caso concreto del muestreo de Gibss [12], ejecutando cadenas de Markov. De estas cadenas no se espera que lleguen a su estado estacionario y solo se ejecutan unos pasos. El funcionamiento es el siguiente (se presenta el caso de un solo paso):

• Se toma una muestra del grupo de entrenamiento v y se propaga a la capa oculta, guardando su valor de activación, llamado h. • Se realiza el camino inverso (las redes no son grafos dirigidos), obteniendo el valor v0. • Se vuelve a hacer feedforward con el valor v0 obteniendo un valor h0. • Con estos datos se actualizan los pesos.

w(t + 1) = w(t) + a(vhT − v0h0T) (2.7)

• Donde a es la tasa de aprendizaje y v, v0, h, h0, y w son vectores.

Lo que se intenta con este algoritmo es con el valor de h dada v, obtener como percibe la red, la realidad que le presentamos. Al obtener v0 y h0, obtenemos la representación interna que tiene la red. El objetivo debe ser que sean lo más parecidos posible y con esas diferencias, se actualizan los pesos.

2.1.12 Red Neuronal Recurrente - RNR

Las redes multicapas anteriores realizan clasificaciones (marcando el conjunto de datos de entrada con etiquetas para categorizarlo en una clase), realizan codificaciones, pero en ningún caso tienen en cuenta entradas anteriores para los análisis. Es decir, no son buenas con secuencias de datos. Si fuera necesario realizar aprendizaje automático para definir los elementos de una frase (sujeto, verbo, . . . ), es necesario tener en cuenta toda la frase o parte de ella. Para cubrir esta problemática aparecen las redes neuronales recurrentes. En las Recurrent Neural Network [45], se usa la salida de una red, como entrada de la siguiente red. Visualmente la red completa, de manera simplificada se representa así: 34 Evolutionary Design of Deep Neural Networks

Figure 2.18: Red Neuronal Recurrente Simplificada

De manera real sería una representación más parecida a:

Figure 2.19: Red Neuronal Recurrente

En esta imagen se ve como la salida de una red, es la entrada de la siguiente. Se puede aplicar a una gran variedad de problemas como reconocimiento del lenguaje, modelado del lenguaje, captura de imagen,etc. Uno de los atractivos de las Redes Neuronales Recurrentes es la capacidad de conectar información previa en la tarea actual, tales como usar, fotogramas anteriores para entender el fotograma actual. El problema de las dependencias a largo plazo, está en la cantidad de información previa a almacenar para usarla como entrada, es decir, como elegir que almacenar o dicho de otro modo cómo almacenar el contexto. Por ejemplo, si tenemos la frase la lengua está en la boca, no se necesita contexto para que la red, a medida que se escriba la frase pueda predecir que boca va a ser la siguiente palabra. En estos, casos en los que el espacio entre la información relevante y el re- sultado es pequeño y la RNR pueden aprender a usar la información del pasado. Sin embargo, cuando es necesario un contexto porque la información está muy lejana en la frase o párrafo, es decir, si el hueco entre la necesidad y la información relevante es lo suficientemente largo, las RNR no son capaces de aprender (aunque teóricamente debieran poder). Para tratar con este problema aparecen las Memorias a Corto-Largo Chapter 2. Estado del arte 35

Plazo (LSTM).

2.1.13 Memorias a Corto-Largo Plazo - LSTM

Las Memorias a corto-Largo Plazo [16][6] son un subtipo de las enfocadas a retener información para resolver el problema del contexto en secuencias largas de datos. En estos casos, para las RNN el gradiente (valor calculado para afinar la red) obtenido durante el entrenamiento, realizada por retroalimentación, ya sea calculo por descenso del gradiente o por subida a la colina (multiplicación de muchos valores elevados) provocan un lento aprendizaje. Se resuelve el problema del gradiente intro- duciendo unas pocas puertas que controlan el acceso a la memoria y así se elige que olvidar y que recordar. Como en las RRNs vistas en el punto anterior, las LSTM tienen forma de una cadena repitiendo los mismos módulos de la red neuronal. El módulo de una RRN, está compuesto por una estructura simple a repetir, tiene una simple estructura, como una simple capa como por ejemplo la tangente:

Figure 2.20: Memoria a corto-largo plazo

LSTMs también tiene esta cadena como estructura, sin embargo, el módulo a repetir cambia. En lugar de una única capa de red neural, se tienen 4 capas, que interactúan de una manera especial. 36 Evolutionary Design of Deep Neural Networks

Figure 2.21: Memoria a corto-largo plazo 1

En la imagen anterior cada línea transporta un vector de la salida de un nodo a la entrada de otro. Los círculos representan puntos donde realizar una operación, tales como suma de vectores. Los rectángulos son capas de redes neuronales. La clave en la LSTM es que la celda de memoria, , que es la línea horizontal que pasa a través de la parte superior del diagrama. Al tener solo unas pocas interacciones líneas, permite que el paso de la información de una celda anterior, sea sencilla y que fluya sin cambios.

Figure 2.22: Memoria a corto-largo plazo 2

Además de este paso de información, la LSTM tiene la habilidad de remover o añadir información al estado de la celda, a través de las puertas. Las puertas son señales sigmoidales ( salidas de 0 o 1, para permitir o restringir el paso de información ) y una tangente. Se puede dividir en varios pasos, siendo algunos paralelizables o paralelizables hasta cierto punto [13].

1. En este paso se decide qué información se va a desechar de la celda de memoria. La primera puerta, llamada puerta del olvido. Con la salida de la capa anterior ht − 1 y la entrada de la capa actual Xt se da un número entre cero y uno para cada número en la celda de memoria. Si se devuelve 0, significa olvida completamente y con 1, recuerda este valor. Chapter 2. Estado del arte 37

Figure 2.23: Puerta del olvido

2. Tras la unión de Ht−1yXt, esta fase de compones de dos pasos:

(a) Se decide en la Puerta de entrada, capa sigmoide, que valores se van a actu- alizar.

(b) tanh crea un vector de nuevos candidatos a memorizar.

Combinamos la salida de la tanh y de la sigmoide para crear la actualización del estado.

Figure 2.24: Actualización del estado

3. Tras finalizar los pasos 1 y 2, se puede realizar este paso, que supone la actual- ización del estado, pasando del viejo estado al nuevo (que puede ser el mismo según los valores de las puertas) Se realiza la multiplicación de la puerta del olvido con el estado de entrada y se suma a la salida de la puerta de entrada obteniendo el nuevo candidato. 38 Evolutionary Design of Deep Neural Networks

Figure 2.25: Actualización del estado 2

4. Y ya por último es necesario, como en cualquier red, dar la salida, que estará basada en el estado actual de la celda, pero pasa un filtro o puerta de salida. Primero le aplicamos una capa sigmoidal a la unión de la entrada actual y la salida de la neurona anterior, para decidir qué partes del estado de la celda va- mos a dar como salida. A continuación, pasamos el estado actual Ct por una capa tanh, para dar valores entre −1 y 1, y lo multiplicamos por la salida de la capa sigmoide, es decir, por la elección de las partes a dar como salida, dando como salida solo las partes que hayamos decidido.

Figure 2.26: Salida de la LSTM

2.1.14 Backpropagation Through Time - BPTT

El BPTT [30][33][44] algoritmo de aprendizaje para redes recurrentes se actualiza en pasos discretos en el tiempo (redes puntos no fijados). Estas redes pueden contener cualquier número de bucles de retroalimentación en su grafo de conexiones. La única restricción en un implementación es que no debe de haber conexiones entre unidades de entrada. En este tipo de redes, el algoritmo de retropropagación de redes neuronales no puede usarse, dado que este presupone que cada unidad está libre de ciclos, que no ocurre al ser redes recurrentes. Para solucionar esto, se «desenrolla» la red para Chapter 2. Estado del arte 39 tener imágenes de la red en distintos instantes de tiempo (por eso la actualización en pasos) [24]:

Figure 2.27: BPTT

Con esta representación se calcula el gradiente de los pesos de manera aproximada por medio de la red feedforward con un número fijo de capas (pasos de tiempo). Cada capa T contiene todas las activaciones ai(t) de la red recurrente en el paso de tiempo t. La capa superior contiene la activación más reciente en t = 0. Las activaciones son calculadas síncronamente usando solamente la activación de t = 1 en la capa inferior. Los pesos de las matrices entre capas sucesivas son idénticos. Para calcular el gradiente exacto de un patrón de secuencia de entrada de longitud T, la red feedforward nece- sitará T + 1 capas, siempre que el patrón de salida deba generarse después del último patrón de la secuencia de entrada. Para evitar redes profundas en largas secuencias, es posible usar únicamente un número fijo de capas para almacenar las activaciones pasadas. Existen otras versiones como BBPTT o QPTT.

2.1.15 Unidad recurrente cerrada - GRU

La Gated Recurrent Unit [6] al igual que las LSTM, capturan las diferencias en distintos períodos de tiempo. También tienen similaridades con las LSTM al tener puertas en su interior para controlar el flujo de información, sin embargo, no se tiene una celda de memoria independiente. La activación de HJT de la GRU en el tiempo t es una j j interpolación linear entre la activación anterior ht−1 y el candidato a la activación eht. j j j j j ht = (1 − zt)ht−1 + zteht (2.8)

Donde zjt, puerta de actualización, decide cuanto la unidad actualiza su activación o contenido. La puerta de actualización es calculada por:

j j zt = σ(WzxtUzht−1) (2.9) Es el resultado de aplicar una función sigmoide a la suma entre el estado actual y el estado recién calculado, de manera similar al LSTM. En las redes GRU, sin embargo, no existe mecanismo para controlar el estado, exponiendo todo el estado cada vez. 40 Evolutionary Design of Deep Neural Networks

j El candidato a la activación ht−1 es calculado de manera similar a las unidades recurrentes tradicionales j j eht = tanh(Wxt + U(rt ht−1)) (2.10)

Donde rt es un conjunto de puertas de reinicio y es una multiplicación elemento a j elemento entre los conjuntos de datos. Cuando rt se acerca a 0, la puerta de reinicio permite que la unidad tome el primer símbolo de una secuencia de entrada, permi- tiendo olvidar el estado guardado.El cálculo de las puertas de reinicio es similar al cálculo de las puertas de actualización.

j j rt = σ(Wrxt + Urht−1) (2.11)

Figure 2.28: LSTM vs GRU9

Diferencias entre LSTM y GRU:

• GRU tiene dos puertas, LSTM tiene tres puertas. • En las redes GRU las puertas de entrada y olvido, son reemplazadas por la puerta de actualización. La puerta de reinicio se aplica directamente al estado oculto anterior. Por lo tanto, la responsabilidad de reinicio de una LSTM está divida en 2 partes. • En las redes GRU no se aplica una segunda función no lineal para calcular la salida.

2.1.16 Redes Convolucionales

Las redes convolucionales [29] son redes enfocadas al reconocimiento de imágenes y para ello se busca extraer información de las imágenes para poder encontrar caracterís- ticas comunes que poder clasificar.

9https://arxiv.org/pdf/1412.3555v1.pdf Chapter 2. Estado del arte 41

Surgen a raíz de las redes neuronales como el perceptrón pero por la incapacidad de este a hacer el tratamiento de imágenes debido que a medida que aumenta el tamaño de la imagen, aumenta la cantidad de neuronas y pesos a tener, solo con la capa de entrada. Por ejemplo, si tenemos una imagen de 28X28 y 3 colores sería un total de 2352 pesos, si aumentamos a una imagen de 200 ∗ 200 ∗ 3 = 120, 000 pesos, lo que lo hace inviable. Los pasos a realizar son extraer pequeñas partes de la imagen que poder tratar de manera individual y extraer características, se finaliza con una capa de perceptrones con el número de características a catalogar. A las partes de la imagen extraídas se les conoce como mapa de características. Para extraer estas características se usan de manera combinadas las siguientes fun- ciones:

Desplazamiento (stride) No es una función pero es un parámetro que afecta a varias de las funciones. El stride define cuántos píxeles se avanza en cada iteración de las funciones de los siguientes puntos. Gráficamente se ve muy rápidamente: De- splazamiento en 1, al aplicar el array verde, se mueve solo una posición respecto al rojo.

Figure 2.29: Stride 110

Al aplicar el desplazamiento en 2 se desplaza dos posiciones.

Figure 2.30: Stride 211

El desplazamiento tiene el problema que al ir aplicando las funciones podemos tener un caso, como en el de arriba que al desplazarse por el matriz, se termine

10https://adeshpande3.github.io 11https://adeshpande3.github.io 42 Evolutionary Design of Deep Neural Networks

el matriz sin haber aplicado la función a todas las celdas. Para evitar eso, aparece una función de apoyo.

Relleno de ceros (zero-padding) Esta función auxiliar, se utiliza para rellenar de ceros el matriz aumentando con ello la dimensión.

Filtrado Se aplica a los datos de entrada un conjunto de matrices de tamaño N (parámetro configurable) llamados filtros. Esto devolverá una nueva matriz del tamaño que determina la fórmula:

(W − K + 2P)/S + 1 (2.12)

Siendo W el tamaño del matriz original, F el tamaño del filtro, P la cantidad de filas/columnas y S el desplazamiento.

Por ejemplo, en un matriz de 7x7 con un filtro de 3x3, un padding de 0 y un stride de 1 da un array de salida (7 − 3 + 2 ∗ 0)/1 + 1 = 5 Visualmente, se puede reutilizar la imagen anterior, para ver el comportamiento del filtro (3x3):

Figure 2.31: Filter12

Submuestro (downsample) Realiza una reducción de dimensión del tensor, la dimen- sión de la reducción se determinará por un parámetro. Para determinar la canti- dad de . El downsample se puede realizar como:

Pooling máximo Se toma el valor máximo del array de entrada. Por ejem- plo si tenemos el array de 4x4 y un array de pool de 2x2 y un desplaza- miento(stride) de 2, obtenemos un array de 2x2 (pool) en cada celda tendrá el máximo de cada 2x2 13:

12https://adeshpande3.github.io 13http://cs231n.github.io/convolutional-networks/ Chapter 2. Estado del arte 43

Figure 2.32: Pooling14

Pooling promedio En lugar de aplicar la función máximo, se aplica la función promedio Pooling estocástico Se elige de manera aleatoria la celda a recuperar

Para finalizar se tiene un capa de salida que devolverá las características encon- tradas.Una imagen de como podría ser una red sería:

Figure 2.33: Ejemplo Red Convolutional15

El entrenamiento se realiza usando propagación hacia atrás modificada, la cual toma en cuenta las capas de submuestreo y actualiza los pesos de filtro convolucional, basándose en todos los valores a los que se aplica dicho filtro.

2.2 Bibliotecas de Aprendizaje Automático

Todos los algoritmos o paradigmas descritos, están pensados para desarrollarse por medio de computadoras, ya que sin ellas, no podría ser automático el aprendizaje. Por ello, desde su aparición han ido apareciendo herramientas que han procurado facilitar la labor de usar cada uno de los algoritmos. Estas herramientas, en sus primeros años, estaban muy enfocadas a un algoritmo concreto pero con el paso del tiempo, el enfoque se ha variado y se han construido librerías o frameworks que pretenden facilitar todo el proceso matemático implicado

14https://adeshpande3.github.io 15https://adeshpande3.github.io 44 Evolutionary Design of Deep Neural Networks en el aprendizaje automático, incluyendo el tratamiento transparente de los datos. Al usuario final únicamente le queda definir a alto nivel el tipo de red a utilizar, dónde es- tán los datos de entrenamiento, test y si es necesario validación, además de los parámet- ros implícitos en cada red. Esta abstracción que se realiza de los algoritmos tiene su parte positiva al permi- tir agilizar el uso y comparativa de algoritmos, pues sólo es necesario definir unos pocos datos y ya se podría entrenar un red. Sin embargo, como parte negativa es que se depende de la eficiencia de esas librerías en la realización de operaciones y el tratamiento de datos. Este último punto, resaltado en negrita, es el origen del presente documento de- scrito en este documento, en el que se tomarán las librerías existentes, gratuitas, más utilizadas y se compararán usando los mismos algoritmos (y parámetros en dichos al- goritmos), para comprobar la bondad de su tratamiento de datos.A continuación, se listan algunas de las librerías o frameworks existentes:

• Theano

• Keras

• Lasagne

• TensorFlow

• Deeplearning4j

• Caffe

• Caffe2

• Paddle

• Microsoft Cognitive Toolkit

• Neural Designer

Si bien existen otros frameworks estos son los que hemos considerados más representa- tivos, ya sea por su utilidad o por su popularidad. No obstante, de este listado, no se usarán todos en las pruebas, solo un subconjunto de los mismos que hemos consider- ado más relevante, así que para comprender un poco mejor el enfoque de cada uno, en los siguientes puntos se dará un descripción breve. Chapter 2. Estado del arte 45

2.2.1 CPU y GPU

Antes de comenzar con la descripción, es necesario definir brevemente los conceptos de CPU y GPU y la importancia de estas.

CPU (Central Process Unit) : Se corresponde con el procesador de la computadora. Estos procesadores son de propósito general y permiten hacer cualquier cálculo pero a costa de eficiencia.

GPU (Graphic Computer Unit) : Se corresponde con el procesador de la tarjeta grá- fica. Este procesador es de uso específico para el tratamiento de imágenes, por lo que tiene una gran eficiente en su uso. Sin embargo en otros casos o eficiencia disminuye en varias órdenes de magnitud o no es capaz de resolverlo.

2.2.2 Frameworks

2.2.2.1 TensorFlow

TensorFlow es un framework abierto desarrollada por Google para computación numérica usando grafos de flujo de datos. Los nodos representan las operaciones matemáticas mientras que las uniones representan las matrices de datos multidimen- sionales (tensors) comunicadas entre dichos nodos. La arquitectura permite desplegar de manera sencilla, con un único API, en una o varias CPUs o GPUs, en el escritorio, en el dispositivo móvil, etc.

2.2.2.2 Theano

Theano es una librería de Python que permite definir, optimizar y evaluar expresiones matemáticas que afectan a arrays multidimensionales de manera eficiente. Sus carac- terísticas:

Estrecha integración con NumPy Paquete para la computación científica con Python orientado al uso de array n-dimensionales / contenedores genéricos multidimen- sionales, pudiendo definir tipos de datos arbitrarios que permite integrar con una amplia variedad de bases de datos.

Uso transparente de la GPU Realiza cálculo más rápido que en la CPU.

Diferenciación eficiente de símbolos Theano hace las derivaciones para funciones con uno o muchas entradas.

Optimizaciones de estabilidad y velocidad Es capaz de obtener la solución a log(1+x) incluso si la X es muy pequeña. 46 Evolutionary Design of Deep Neural Networks

Generación dinámica de código en C Evalúa expresiones más rápido.

Test y autoverificación Detecta y diagnostica muchos tipos de error.

Fuertemente tipado

Desde 2007, Theano ha estado impulsando investigaciones científicas en computación a gran escala. Theano representa simbólicamente las expresiones matemáticas como grafos acíclicos. En los grafos se distinguen dos partes:

Nodos Variables Usualmente representan tensores (matrices de datos multidimen- sionales).

Nodo Aplicar Representa la realización de fórmulas matemáticas.

2.2.3 Librerías de abstracción

2.2.3.1 Keras

Keras16 es un API de alto nivel para el uso de redes neuronales, está desarollado en Python y es capaz de funcionar por encima de TensorFlow, CNTK o Theano. Fue desarrollado para enfocarse en una rápida experimentación, es decir, ser capaz de ir de la idea al resultado con el menor retraso posible.El uso de la librería de aprendizaje profundo Keras aporta las siguientes ventajas:

• Realizar de manera sencilla y rápida los prototipos

• Permite el uso de redes convolucionales, redes recurrentes, o la combinación de ambas.

• Funcionar perfectamente con CPU o GPU.

Los principios sobre los que se sustenta Keras son:

Uso amigable Está diseñado para pensamientos humanos, no máquinas. Permite poner la experiencia del usuario por delante. Keras sigue las mejores prácticas para reducir la carga: Ofrece APIs consistentes y simples, minimiza el número de acciones requeridas por el usuario casos típicos, y proporciona retroalimentación clara y procesable sobre los errores.

Enfoque a modelos Un modelo se entiende como una secuencia o un grafo de mó- dulos independientes y totalmente configurables que pueden ser encadenados con las menores restricciones posibles. En concreto, número de capas neurales,

16https://keras.io/ Chapter 2. Estado del arte 47

funciones de coste, optimizadores, inicialización de esquemas, funciones de acti- vación, esquemas de regularización son módulos independientes que se pueden combinar para crear nuevos módulos.

Fácilmente ampliable Es sencillo añadir nuevos módulos (como nuevas clases y fun- ciones), y los módulos existentes sirven como ejemplos. Esta facilidad de crear nuevos módulos, permite una total expresividad convirtiendo a Keras candidato a investigaciones avanzadas.

Funcionamiento con Python] La configuración de los modelos se realiza en el mismo archivo con un formato declarativo. Los modelos se describen en Python, el cual es compacto fácil de depurar y permite una fácil ampliación.

2.2.3.2 Lasagne

Lasagne17 se usa sobre Theano y está diseñado para usar este de una manera eficiente. Además, está orientado al uso del aprendizaje automático, lo que facilita definir los programas.

2.2.3.3 Caffe

Caffe18 es un framework de aprendizaje automático enfocado a la velocidad, la mod- ularidad y las expresiones. Fue desarrollado por la universidad de Berkley, siendo la primera librería de aprendizaje profundo en funcionar correctamente, y está muy acep- tado por la comunidad de investigación. Su uso es por terminal, aunque pycaffe le dota una parte gráfica. Es bueno en redes feedforward para el reconocimiento de imágenes (visión artificial), destacando en la implementación de redes convolucionales. No es recomendable para texto, sonido o conjunto de datos de tiempo. Es sencillo de codificar pero requiere de un tiempo de aprendizaje antes de poder a usarlo. También es sencillo incluir librerías, compilar e instalar, y la interfaz con Python y Matlab está bien desarrollada. Toda la codificación se realiza por medio de editores de texto, incluso usando pycaffe. Debido al tiempo de aprendizaje inicial, que cambiar entre el uso de CPU y la GPU requiere desarrollo de funciones específicas, y que la generación de nuevas capas implica una definición total, gradiente, enlaces... hace que su arquitectura esté por detrás de otros frameworks.

17https://lasagne.readthedocs.io/en/latest/ 18http://caffe.berkeleyvision.org/ 48 Evolutionary Design of Deep Neural Networks

2.2.3.4 Caffe2

Caffe19, desarrollado por Facebook en abril del 2017, añade un traductor para pasar de Caffe a Caffe2 (algunos modelos antiguos no son convertibles). Algunas de las mejora de Caffe2 frente a Caffe:

• Despliegue en móvil

• Soporte a nuevos hardware, además de CPY y GPU

• Flexible a futuras direcciones tales como computación cuántica

• Pruebas de stress con las aplicaciones de Facebook

• Soporta el entrenamiento distribuido a gran escala.

• Soporta redes neuronales recurrentes

• Orientado a soportar aplicaciones corporativas.

2.2.3.5 Torch

Torch20 es una librería de computación científica con amplio soporte a algoritmos de aprendizaje automático enfocado al uso de la GPU:

• Funcionamiento por lenguaje de scripting LuaJIT.

• Uso de array N-dimensionales.

• Interfaz para C, via LuaJIT.

• Eficiente soporte a GPU.

• Redes neuronales y Modelos basados en energía (EMB).

• Múltiples rutinas para indexar, trocear, transponer, etc.

• Rutinas de álgebra lineal y optimización numérica.

• Embebible, con puertos para iOS y Android.

• Orientado a la investigación. Caffe2 incluye un conversor entre Torch y Caffe2 para poder usar ambos según las necesidades.

19https://caffe2.ai/ 20http://torch.ch/ Chapter 2. Estado del arte 49

2.2.3.6 DeepLearning 4j

Deeplearning4j21 es una librería distribuida de aprendizaje profundo específicamente diseñada para funcionar en entornos de negocio en GPUs y CPUs distribuidas. Tiene soporte comercial pero es de código abierto escrita para Java y Scala. Integrada con Hadoop (aplicaciones distribuidas) y Spark(cluster-computing). Incluye implementaciones de una gran variedad de algoritmos (Máquina de Bolzt- mann restringida, apilados, redes de creencias, ..) incluyendo versiones distribuidas para Hadoop y Spark. Tiene APIs desarrolladas para ser usadas por Java, Scala (ScalNet), Python (Se usa Keras como API) y Clojure (DL4CLJ). El lenguaje del núcleo que soporta las opera- ciones matemáticas a gran escala es C, C++ y CUDA C. Se puede lograr una computación de alto rendimiento, realizando ajustes en la JVM para optimizar el tiempo de entrenamiento de la red neuronal. Algunos de estos ajustes pueden ser el algoritmo de recolección, espacio de pila, pre salvado de datos, etc. Incluye DataVec, que vectoriza varios formatos de archivos y tipos de datos usando formatos de entrada y salida similar al mapreduce de Hadoop. DataVec está diseñado para vectorizar CSVs, imágenes, sonidos, texto, video y series temporales. También incluye herramientas para el modelado de espacio vectorial y modelado de términos, implementado en Java diseñado para manejar grandes cantidades de texto.

21https://deeplearning4j.org/ This page has been intentionally left blank. Chapter 3 Experimentación

3.1 Elección de los Frameworks/bibliotecas

En en este apartado se enumeran los frameworks/bibliotecas elegidas para la real- ización del estudio. Además de numerarlas, se hará una breve explicación del motivo de la elección. Las bibliotecas elegidas son:

1. Theano 2. Keras 3. Pytorch 4. Lasagne 5. Caffe 6. TensorFlow 7. Deeplearning4J

En la elección de Theano, se ha tenido en cuenta dos factores, la longevidad de la biblioteca, siendo prácticamente la primera en aparecer y por ello, es ampliamente usada. El segundo ha sido que es utilizado como cimientos por otras bibliotecas como Lasagne o Keras, así que es útil conocer el funcionamiento propio de la biblioteca para poder compararlas. Estaba perdiendo uso a favor de TensorFlow por no tener capacidad para paralelizar múltiples GPUs pero en la última versión han añadido esta funcionalidad. Keras permite ser usada como capa superior de TensorFlow o Theano, lo que a priori parece que puede ralentizar sus resultados. Se ha tomado TensorFlow como framework para soportar Keras. Pytorch se ha escogido porque a priori tiene una definición sencilla de las capas y operaciones, se comprueba en las pruebas.

51 52 Evolutionary Design of Deep Neural Networks

Lasagne es un biblioteca orienta orientada al aprendizaje profundo, que funciona como capa superior de Theano, lo que le debería permitir que la definición de la redes sea sencilla y rápida. Además de evitar problemas de sintaxis propias del Python o Theano. Caffe se disputa junto a Theano ser la primera biblioteca y es muy utilizada en investigación. Esta es una de las razones de uso. La otra, es porque Caffe no usa Python, como hacen la mayoría de bibliotecas/framework, proporcionando una visión alternativa. TensorFlow se ha escogido porque es una biblioteca que está aumentando su uso, tiene soporte y desarrollo en funcionamiento. Aunque no se usa en este PFC, tiene un modo visual que facilita la gestión. El último algoritmo escogido, DeepLearning4J se ha elegido porque al estar basado en Java, no genera problemas en la instalación, al contrario de otras bibliotecas que o por incompatibilidad de nuevas versiones de bibliotecas asociadas, o por cambios de versión de las propias bibliotecas sin retrocompatibiidad (Keras). También se le elige por el soporte y desarrollo que se realiza en el mismo, al usar por los desarrolladores, el framework para uso empresarial. Se han descartado bibliotecas como caffe2, paddle o Bigdl aun siendo nuevas, que podrían aportar información de su utilidad en los términos comparativos que aborda el presente documento. El motivo proviene de los problemas y soporte que aún mantienen, lo que resta credibilidad a los resultados.

3.2 Análisis de la Implementación de cada Biblioteca

En este apartado se describe cómo se debe implementar de manera básica una red en cada librería.

3.2.1 Keras

Para realizar las pruebas en Keras, primero se ha tenido que aprender el fun- cionamiento básico del mismo. Se ha comprobado que la definición de una red se realiza de manera muy sencilla:

• Primero es necesario invocar a Sequential para que se cree el modelo en blanco. Model=Sequential()

• El segundo paso es ir añadiendo capas con la función add de Sequential. Model.Add(CAPA), teniendo por defecto una gran cantidad de capas con una definición sencilla: Chapter 3. Experimentación 53

Dense Genera una capa totalmente conectada. Para generarla es necesario saber el número de unidades y la función de activación, además, si es la primera capa de la red, las unidades de entrada Dense(512, activation=’relu’, in- put_shape=(784,)). Dropout Genera una capa para realizar la operación de corte. Conv2d Genera una capa convolucional de 2 dimensiones, solo es obligatorio indicar las unidades de entrada, la función de activación y el tamaño del kernel. model.add(Conv2D(64, (3, 3), activation=’relu’)). • Un vez añadidas las capas, ya se tiene la estructura de la red preparada. Antes de entrenar, es necesario configurar como se evaluaran los datos que se realiza con la función Model.compile(Argumentos). Los argumentos básicos que puede recibir son: Optimizador Nombre del optimizador a aplicar. Descenso del gradiente, míni- mos cuadrados, etc. Pérdida Nombre de la función a utilizar para calcular el error del modelo. Este valor es el que el sistema intentará reducir en el entrenamiento. Medidores Lista de los medidores a evaluar en la red. Usualmente se usa el de precisión. • Con los datos anteriores, ya es posible entrenar la red, que se realiza con Model.fit(Valores). Los principales Valores son: – Tensor X con los datos de entrenamiento. – Tamaño del lote. – Número de iteraciones del entrenamiento. – Tensor X con los datos de test. – Tensor Y con las etiquetas de los datos de test. • Al finalizar, se debe evaluar el modelo con Model.Evaluate() para obtener los re- sultados de aplicar el conjunto de test.

Con unos pocos pasos claramente definidos se pueden generar una o varias redes sin mucha dificultad, lo que permite centrarse en el propio estudio de datos. Ajeno a la red, se pueden definir un par de aspectos:

Backend Al permitir varios, tales como TensorFlow, Theano, CNTK,... se ha analizado cómo se puede cambiar entre ellos, a priori, se realiza o bien en la propia llamada al ejecutar python y el programa o se puede configurar en un archivo local del usuario. Lo que facilita lanzar el mismo programa en varias librerías. Esto solo es posible si se programa con un API de keras que agrupa llamadas específicas de Theano o TensorFlow o etc. sino, al cambiar de backend, el nuevo backend no reconocerá la sintaxis. 54 Evolutionary Design of Deep Neural Networks

CPU y GPU Varía según el backend pero es sencillo de cambiar entre ellos.

3.2.2 PyTorch

El diseño de las pruebas en Pytorch implica conocer bien los algoritmos a utilizar y conocimientos básicos de programación, lo que dificulta el lanzamiento de las pruebas. Los pasos a seguir para construir un modelo son:

• Crear una clase para la red que se quiere crear Class NOMBRE (nn.Module). Den- tro de esta clase se divide dos definiciones:

– Constructor __init__(self): En esta parte se definen las capas de la red: Linear Capa con salida lineal, fórmula mx + n. Relu Capa con salida no lineal, max(0, x). Conv2d Genera una capa convolucional de 2 dimensiones, solo es obligato- rio indicar las unidades de entrada, la función de activación y el tamaño del kernel. model.add(Conv2D(64, (3, 3), activation=’relu’)). Dropout2d Genera una capa para realizar la operación de corte. – Flujo hacia delante de los datos forward (self, x), también la función de salida. Tendrá que tener coherencia con la capa init: Max_pool2d Hace una reducción tomando el máximo de cada subgrupo definido en la matriz 2,parámetro. Relu Aplica max(0, x). View No es una función de la capa, sino sobre la propia entrada. Modifica el tamaño, siempre respetando el tamaño total del tensor. si se desconoce el tamaño de una de las dimensiones, se permite poner -1, solo en una dimensión, y se recalcula automáticamente. Dropout Realiza el corte. Self Aplica la función por defecto de la capa, por ejemplo en Linear, aplica mx + n.

• Se define la pérdida a calcular para minimizar el error.

• Se define el optimizador, mínimos cuadrados, etc.

• Se debe definir explícitamente el bucle a recorrer, primero las repeticiones y pos- teriormente sobre el conjunto de datos. Dentro de estos bucles:

– Se recupera el bloque de datos. – Se inicializa el optimizador para la iteración actual. – Se realiza un entrenamiento de la red. – Se calcula la pérdida. Chapter 3. Experimentación 55

– Se realiza el cálculo del gradiente. – Se actualizan los parámetros del optimizador.

• Por último, se recuperan los datos de test y se valida el modelo.

3.2.3 Caffe

Tiene un entorno propio para el desarrollo de las pruebas, al contrario que la mayoría que usan Python o Java (dl4j), lo que a priori dificulta su uso por tener que aprender un lenguaje nuevo. Aún así, al estar orientado al aprendizaje automático permite que no se muy difícil aprender los conceptos básicos de uso. El uso se divide en dos partes un archivo con la estructura de la red y otro con los datos a aplicar en la red (datos de test, iteraciones, etc.). Esto permite lanzar red cambiando algunas configuraciones sin tener que modificar la red. Definición del archivo de red neuronal:

• Se estructura en bloques separados por llaves . Layer contiene la información de una capa.

• Dentro de cada capa se definen los datos que identifican y la actuación de cada capa. El nombre es identificativo y único.

• Es necesario definir el tipo de capa:

Data : Indica que es una capa de información, son lo datos de entrenamiento, test o validación. InnerProduct : Representa la operación de multiplicación del dato de entrada con un peso y un sesgo. Accuracy Representa el cálculo de la operación de precisión Loss Representa el cálculo de la operación de pérdida. Convolution Representa la capa tipo convolución. Otros Pool, Relu, etc.

• Hay que indicar explícitamente la unión de las capas:

– Con la etiqueta top se indica que capa precede a la capa actual. – Con la etiqueta bottom se indica la capa siguiente a la capa actual.

• Por último es necesario indicar los parámetros pero eso depende de cada capa. Por ejemplo:

Capa InnerProduct Es necesario definir el parámetro Peso y el parámetro Bias. También es imprescindible definir las neuronas de salida. 56 Evolutionary Design of Deep Neural Networks

Capa Relu No tiene parámetros porque es una función y se ajusta las unidades de la capa que lo englobe

Definición del archivo de lanzamiento o Solver (nombre dado por Caffe). Este archivo tiene como parámetros los valores que necesita la red para funcionar, pero es dependi- ente de cada red, porque el learning rate, se aplica al descenso del gradiente pero no a otros métodos. Algunas de las opciones son:

Ruta de la red Indica respecto al directorio de lanzamiento de la aplicación, donde está la red. solver_mode Permite elegir si usar CPU o GPU max_iter Número máximo de iteraciones Base_lr valor de Learning rato para el algoritmo de descenso del gradiente.

3.2.4 Deeplearning 4J

Deeplearning4j, tiene la ventaja de al usarse sobre java, existen multitud de frameworks preparados para su uso, con la ayuda propia de estos frameworks a la programación. También es robusto frente a la retrocompatibilidad, al contrario, que algunas de las librerías de este documento. Al estar orientado a un entorno comercial, la cantidad de redes ya implementadas y el número de ejemplos es muy amplio, lo que facilita su uso y aprendizaje. Respecto a este último punto, aunque está orientado al aprendizaje, es necesario definir explícitamente aspectos como el bucle de aprendizaje, en lugar de poder llamar a una función que se encargará, en base a parámetros. Los pasos a realizar para definir la red son:

• Definir los parámetros globales de la red, tamaño de lote, número de filas y columnas de la entrada, iteraciones, número de unidades de salida, etc. • Se generan iteradores para recorrer los conjunto de test y entrenamiento. • Se genera el modelo de la red neuronal, para eso se usa un modelo base, llamado MultilayerConfiguration: Algoritmo de optimización Se define con .optimizacionAlgo (NOMBRE). Se indica el nombre de uno de los algoritmos incluidos en la librería OptimizationAl- gorithm. Ratio de aprendizaje Se define como valor el Learning rate para el descenso del gradiente, si es usa este algoritmo. Layer Se podrá repetir porque en parámetro se definirá la red. – Lo primero es indicar en la propia llamada de la capa la posición y con el new, definimos el tipo de capa. Layer(POS, TIPORED): Chapter 3. Experimentación 57

DenseLayer Capa totalmente conectada. Relu Capa que indica la activación. ConvolutionLayer Capa para el cálculo de la convolución. – Dentro de cada capa se definen los parámetros específicos de esa capa. Con este modelo se genera la red, con una clase llamada MultiLayerNetwork. A continuación se entrena la red. Para eso se define el bucle por las iteraciones definidas en la cabecera. – Con la función fit(DATOS) se realiza el entrenamiento, que al tener ya incluido en la configuración el tamaño de lote, ese bucle no es necesario indicarlo. – Con la función evaluate(DATOS) se realiza la comprobación de la red, con el conjunto de test.

3.2.5 TensorFlow

TensorFlow nació como DeepBelief en Google para el estudio y desarrollo del apren- dizaje automático. La orientación por lo tanto es a un perfil técnico y se nota en la metodología de programación, orientada a funciones y sin una clara línea procedimen- tal a ejecutar. En la versión 1.0 se incluían referencias específicas a Keras facilitando el uso del mismo como capa superior, usando el motor propio de TensorFlow. Los pasos a realizar en TensorFlow para definir una red son:

• Definir los parámetros de la red:

– Número de entradas, salidas. – Tamaño del lote. – Número de iteraciones – Valores propios de cada red, tales como, neuronas por capa o ratio de apren- dizaje. También es necesario inicializar los pesos y umbrales. – Datos de entrada.

• Usando Def nombre(x) se define la red:

– Dentro de la red, las capas se van definiendo y apilando con la función .add de TensorFlow. – Los tipos de capa están predefinidos en el modulo nn de TensorFlow. Entre ellos están: matmul Se corresponde con un capa totalmente conectada con la función mx + n. Relu Aplica la fórmula max(0, x), se puede apilar, junto a otras capas como matmul. relu(matmul(W, x) + U). 58 Evolutionary Design of Deep Neural Networks

Conv2d Cálculo de convolución.

• Definición de la fórmula para el cálculo de perdida.

• Definición del optimizador.

• Definición de procesamiento CPU o GPU.

• A continuación se realiza el entrenamiento de la red.

– Se define el bucle para recorrer las iteraciones y el bucle para recorrer el lote. – Se lanza el entrenamiento con el .run de TensorFlow. – Se realiza el cálculo de la pérdida de cada iteración con el parámetro que devuelve el run. – Al finalizar cada lote, se calcula la precisión con la función reduce_mean.

• Al finalizar el entrenamiento, se realiza la validación con la función reduce_mean.

3.2.6 Theano

Theano permite configurar todos los aspectos de la red, pero también implica que es necesario conocer bien la red a construir y el funcionamiento de las redes, para poder emularlo. En opinión personal es el más complejo a desarrollar, junto con TensorFlow (por la no linealidad). Los pasos a seguir para generar la red son:

• Generar el comportamiento de las capas. Por ejemplo, generar el comportamiento de la capa oculta en un perceptrón. En caso que los pesos/umbrales sean vacíos se inicializan, tantos como unidades se indiquen, además se define la función de salida (mx + n).

• Generar el modelo. Se define completamente el modelo:

Las capas que lo componen Se usan las funciones generadas en el propio código. Salida de la red Se define como calcular la salida de la red. Cálculo del error Se definen fórmulas para definir el error.

• Se genera una función encargada de:

– Recuperar los datos. – Se define el cálculo de coste con las funciones generadas en el modelo. – Se define el cálculo para la actualización los parámetros del modelo. – Generar los bucles de iteraciones y lotes de entrenamiento. – Realizar el entrenamiento y validación. Chapter 3. Experimentación 59

3.2.7 Lasagne

Surge para facilitar el uso de Theano, abstrayendo la creación de las funciones a usar en las capas, funciones de salida, etc. Permitiendo construir redes sin ser necesario conocer y programar el comportamiento completo de la red. Sigue la una estructura parecida a Theano:

• Generar el modelo. Se define el funcionamiento del modelo, es decir, las capas. Como parámetro de entrada a cada capa, se incluye la capa anterior así se forma la red a la vez que se definen sus componentes. Tiene una gran cantidad de capas:

Dropout Capa de corte, como parámetro recibe la capa anterior y la probabilidad de corte. DenseLayer Capa totalmente conectada, como parámetro recibe las unidades, la salida, los pesos y la red anterior. Conv2d Capa convolucional, como parámetro recibe la entrada (filtros), el tamaño del filtro, la salida y la red anterior. MaxPool2D Capa que hace la reducción, como parámetro recibe la matriz.

• En la función main se realiza el resto:

– Recuperar los datos. – Se elige el cálculo de coste con las funciones generadas en el modelo. – Se elige el cálculo para la actualización los parámetros del modelo. – Generar los bucles de iteraciones y lotes de entrenamiento. – Realizar el entrenamiento y validación.

3.3 Elección de los Clasificadores

Se han elegido como algoritmos de clasificación para este estudio, el perceptron multi- capa y las redes convolucionales. El perceptrón se ha escogido al ser un aproximador universal, por lo que debe ser capaz de resolver el problema que se plantee. La red convolucional se ha escogido al ser una red que permite múltiples configu- raciones y las librerías o frameworks han facilitado el uso de las mismas. Para poder alcanzar el objetivo de la memoria y realizar la comparativa, no era necesario trabajar con algoritmos, ni conjuntos extremadamente complejos, ya que era necesario que convergían a una solución y que lo hicieran en un corto espacio de tiempo. 60 Evolutionary Design of Deep Neural Networks

3.4 Elección de los Conjuntos de Entrenamiento

Para realizar las pruebas no había un dominio sobre el que no se pudiera aplicar, como reconocimiento de texto, escritura automática, etc. En este caso se ha escogido el reconocimiento de imágenes. Dado que el aprendizaje requiere una cantidad elevada de datos se ha optado por usar un conjuntos de datos ya existente, la base de datos de números escritos MNIST. MNIST es una base de datos de números escritos a mano. Características:

• Son imágenes de números del 0 al 9, es decir, 10 clases a clasificar. • El número de imágenes para entrenamiento es 60000 con 10000 elementos para pruebas. • Son imágenes de tamaño 28X28 lo que suponen 784 píxeles por imagen.

Esto supone un conjunto muy amplio que permite realizar las pruebas de rendimiento. CIFAR-10 es un conjunto de imágenes y algunas de sus características son:

• Tienen 3 dimensiones una por color (RGB). • Categorizadas en 10 clases, aeroplanos, automóviles, pájaros, gatos, ciervos, per- ros, ranas, caballos, barcos y camiones. • El tamaño es de 32X32, 1024 píxeles, que por el color 3092 en total. • Son un conjunto de 50.000 imágenes para entrenamiento y 10.000 para test.

Al igual que con MNIST, existen grupos de datos diseñadas para el estudio del aprendizaje profundo. Algunos de ellos serían CIFAR-10, CIFAR-100, STL-10, etc.

3.5 Diseño de las pruebas

3.5.1 Métricas a medir

Se van a medir 3 aspectos:

Tiempo Es el aspecto principal a tener en cuenta para el objetivo del PFC. Comparar el tiempo ejecución de cada algoritmo, en cada librería y según se use CPU o GPU Precisión Es el porcentaje de acierto del modelo generado en el entrenamiento, re- specto al grupo de datos de test. Pérdida Es la suma de los errores al aplicar el modelo al grupo de datos de entre- namiento y validación. Es decir, no es el contrario a la precisión y el objetivo es minimizar este valor. Chapter 3. Experimentación 61

3.5.2 Estructura de las pruebas

A continuación se describen las pruebas a realizar, indicando todos los aspectos que puedan afectar al resultado de las pruebas. El primer factor fundamental es el equipo de trabajo, para poder comparar los resultados de manera cualitativa y cuantitativa, todo se va a ejecutar sobre la misma máquina. Esta máquina no será un entorno virtualizado, que añadiría una capa no controlada al estudio. Se van a realizar un total de 16 pruebas por librería. Estos experimentos se dividen en 8 experimentos, al diferenciar entre CPU y GPU. Para poder lograr una comparativa real, los 8 experimentos de la CPU son iguales a los 8 experimento de la GPU. Estos 8 experimentos, se pueden dividir en, 5 correspondientes al perceptrón multicapa y 3 a la red convolucional. Con estas dos redes se pueden lanzar infinitos experimentos, cambiando ligera- mente cada aspecto involucrado, pero antes definir algunos, también es necesario en- focar como se va a alimentar de datos las redes. Hasta ahora se han definido métodos de aprendizaje para la red enfocados al caso de un dato de entrada, que por inferencia se puede llevar al entrenamiento general, es decir, una vez recibido un dato se trata y se modifican los pesos en base a la sal- ida. Esto se repite para cada dato del conjunto de entrenamiento. Esto parece reflejar que la forma de alimentar la red no afecta, pero hay enfoques que pueden facilitar la convergencia de la red, en el caso del descenso del gradiente estocástico, hacer un entrenamiento por lotes permite reducir la varianza (se calcula como la media de la varianza de los lotes), aunque si el lote es demasiado pequeño la precisión del gradi- ente disminuye. También afecta la memoria de la computadora, si no es posible tener todos los datos para procesar, se puede hacer un entrenamiento por lotes. O también se puede utilizar para paralelizar trabajos de entrenamiento. Algunos de los parámetros que tendremos que configurar son:

Tamaño de lote Número de muestras que van a propagarse a través de la red neuronal. Número de repeticiones Número de veces que se recorre y entrena con el conjunto de entrenamiento la red. Datos para el entrenamiento subconjunto del grupo de datos a clasificar. Se utilizar para entrenar la red. Datos de test subconjunto del grupo de datos a clasificar, suele ser menor al de entre- namiento. Se utilizar para determinar el error de clasificación del modelo. Ratio de aprendizaje Indica la velocidad de aprendizaje. Datos para validación Conjunto de datos que se toman del conjunto de datos de en- trenamiento, para validar el modelo en la fase de entrenamiento y evitar el so- breaprendizaje. Dropout Técnica utilizada para evitar el sobreaprendizaje de la red. Consiste en elim- inar neuronas de la red para reducir la complejidad de la red, que suele aparecer al adaptarse en exceso a los datos. 62 Evolutionary Design of Deep Neural Networks

Dependiendo de cada algoritmo tendremos adicionalmente:

Perceptrón multicapa Número de capas, neuronas en cada capa y función de acti- vación de cada capa. Red convolucional Número de capas, neuronas en cada capa, función de cada capa, función activación en la salida.

3.6 Pruebas

3.6.1 Definiciones

3.6.1.1 Primera Prueba

Figure 3.1: Prueba 1

Para esta prueba se definen los siguientes parámetros:

Datos de entrenamiento MNIST Algoritmo Perceptrón multicapa Chapter 3. Experimentación 63

Número de capas ocultas 2 Neuronas de la capa 1 (entrada) 784 de entrada y 512 enlaces de salida Activación de la capa 1 ReLu Neuronas de la capa 2 (oculta) 512 Activación de la capa 2 ReLu Neuronas de la capa 3 (salida) 10 (clases de imagen) Dropout 0,2 Descenso del gradiente estocástico Tasa de aprendizaje 0,01

Tamaño del lote 1000

Número de repeticiones 70

Número de datos 70000

Entrenamiento 60000 Validación 0 Test 10000

3.6.1.2 Segunda Prueba

Figure 3.2: Prueba 2

Para esta prueba se definen los siguientes parámetros:

Datos de entrenamiento MNIST

Algoritmo Red convolucional 64 Evolutionary Design of Deep Neural Networks

Capa 1 (entrada) Red convolucional 2 dimensiones con 32 filtros de tamaño 3x3, activación Relu y 784 unidades de entrada Capa 2 Red convolucional 2 dimensiones con 64 filtros de tamaño 3x3, activación Relu Capa 3 MaxPool de 2x2 Capa 4 Dropout del 25% Capa 5 Flatten (aplanamiento) Capa 6 Capa de neuronas con 128 unidades de salida y activación ReLu Capa 7 Dropout del 20% Capa 8 Capa de neuronas con 10 unidades de salida (clases) y activación softmax

Tamaño lote 128

Número de repeticiones 12

Datos para entrenamiento (60.000), validación (0) y test (10.000).

3.6.1.3 Tercera Prueba

Figure 3.3: Prueba 3

Para esta prueba se definen los siguientes parámetros:

Datos de entrenamiento CIFAR-10

Algoritmo Red convolucional

Capa 1 (entrada) Red convolucional 2 dimensiones con 32 filtros de tamaño 3x3, activación Relu y 3072 unidades de entrada Capa 2 Red convolucional 2 dimensiones con 64 filtros de tamaño 3x3, activación Relu Chapter 3. Experimentación 65

Capa 3 MaxPool de 2x2 Capa 4 Dropout del 25% Capa 5 Flatten (aplanamiento) Capa 6 Capa de neuronas con 128 unidades de salida y activación ReLu Capa 7 Dropout del 20% Capa 8 Capa de neuronas con 10 unidades de salida (clases) y activación softmax

Tamaño lote 4

Número de repeticiones 100

Datos para entrenamiento (50.000), validación (0) y test (10.000). 66 Evolutionary Design of Deep Neural Networks

3.7 Resultados

En este apartado se muestran los resultados obtenidos de cada prueba para cada al- goritmo. Se muestran para cada prueba, primero los datos del experimento y después los datos del tiempo empleado. Por último, una comparativa del tiempo empleado en CPU con el tiempo empleado en GPU

3.7.1 Pytorch

CPU

Figure 3.4: 1a cpu

En esta imagen se observa que la red aprende correctamente al tener una baja per- dida y una alta precisión

Figure 3.5: pytorch 1b cpu Chapter 3. Experimentación 67

Figure 3.6: pytorch 2a cpu

En esta imagen también se observa una baja perdida y una alta precisión

Figure 3.7: pytorch 2b cpu 68 Evolutionary Design of Deep Neural Networks

Figure 3.8: pytorch 3a cpu

Se comienza con un perdida muy alta, que se reduce a lo largo de las iteraciones, sin embargo, la precisión pasa muy poco por encima del 0,5, lo que implica que no se realiza un buen aprendizaje del los datos CIFAR con esta red.

Figure 3.9: pytorch 3b cpu Chapter 3. Experimentación 69

GPU

Figure 3.10: pytorch 1a gpu

En pocas iteraciones se logra alcanzar resultados por encima del 90%.

Figure 3.11: pytorch 1b gpu 70 Evolutionary Design of Deep Neural Networks

Figure 3.12: pytorch 2a gpu

Se comporta de manera parecida al perceptrón multicapa.

Figure 3.13: pytorch 2b gpu Chapter 3. Experimentación 71

Figure 3.14: pytorch 3a gpu

Figure 3.15: pytorch 3b gpu

El entrenamiento de la red CIFAR no es efectivo con la configuración marcada y apenas es capaz de superar el 50% de aciertos. 72 Evolutionary Design of Deep Neural Networks

Figure 3.16: pytorch 1 cpu/gpu

Figure 3.17: pytorch 2 cpu/gpu

Figure 3.18: pytorch 3 cpu/gpu Chapter 3. Experimentación 73

Independiente del algoritmo utilizado, se comprueba que el tiempo usando la GPU es menor al tiempo dedicado por la CPU.

3.7.2 Lasagne - Theano

Lasagne daba resultados muy parecidos a los dado por Theano, se agrupa en este punto. CPU

Figure 3.19: lasagne 1a cpu

Se logra aprender con gran precisión la red.

Figure 3.20: lasagne 1b cpu 74 Evolutionary Design of Deep Neural Networks

Figure 3.21: lasagne 2a cpu

Comienza con una alta perdida pero se acerca a la solución, alta precisión, con poca perdida.

Figure 3.22: lasagne 2b cpu Chapter 3. Experimentación 75

Figure 3.23: lasagne 3a cpu

En este caso no se logra obtener una red válida al solo alcanzar el 11% de precisión.

Figure 3.24: lasagne 3b cpu 76 Evolutionary Design of Deep Neural Networks

GPU

Figure 3.25: lasagne 1a gpu

En las iteraciones se ajustan bien los pesos, obteniendo buenos resultados.

Figure 3.26: lasagne 1b gpu Chapter 3. Experimentación 77

Figure 3.27: lasagne 2a gpu

Se adapta correctamente a los datos

Figure 3.28: lasagne 2b gpu 78 Evolutionary Design of Deep Neural Networks

Figure 3.29: lasagne 3a gpu

Se puede observar que la red no esta bien entrenada y no es válida dando resultados erróneos en aproximadamente un 88% de las veces

Figure 3.30: lasagne 3b gpu Chapter 3. Experimentación 79

Figure 3.31: lasagne 1 cpu/gpu

Figure 3.32: lasagne 2 cpu/gpu

Figure 3.33: lasagne 3 cpu/gpu 80 Evolutionary Design of Deep Neural Networks

El caso de Lasagne ha sido especial porque para el caso más básico el percep- tron multicapa, la GPU tardaba más que la CPU. No se ha encontrado explicación a este caso, realizando pruebas con distintas versiones de CuDNN, Theano y Lasagne, además de distintas implementaciones del perceptron, se obtenía el mismo resultado y la CPU siempre resolvía cada iteración en menor tiempo. En el cado de la red con- volución, la GPU ha tardado menos que la CPU. Para el caso del CIFAR, no hay tanta diferencia entre los algoritmos. Puede ser debido por la codificación realizada de la red, ya que tampoco logra alcanzar precisiones mayores al 12%.

3.7.3 Keras

Se ha ejecutado usando el backend de TensorFlow. CPU

Figure 3.34: Keras 1a cpu

Se alcanza una precisión muy alta Chapter 3. Experimentación 81

Figure 3.35: Keras 1b cpu

Figure 3.36: Keras 2a cpu

La perdida en este caso es baja pero superior a otros casos. 82 Evolutionary Design of Deep Neural Networks

Figure 3.37: Keras 2b cpu

Figure 3.38: Keras 3a cpu

Este es un experimento desechable. Chapter 3. Experimentación 83

Figure 3.39: Keras 3b cpu

Figure 3.40: Keras 1a gpu

La red tras el entrenamiento se acerca a los extremos de la precisión y la perdida. 84 Evolutionary Design of Deep Neural Networks

GPU

Figure 3.41: Keras 1b gpu

Figure 3.42: Keras 2a gpu

Son resultados aceptables, contando el número de iteraciones realizadas Chapter 3. Experimentación 85

Figure 3.43: Keras 2b gpu

Figure 3.44: Keras 3a gpu

No se consigue nada con la red, dando valores extremadamente bajos de precisión. 86 Evolutionary Design of Deep Neural Networks

Figure 3.45: Keras 3b gpu

Figure 3.46: Keras 1 cpu/gpu Chapter 3. Experimentación 87

Figure 3.47: Keras 2 cpu/gpu

Figure 3.48: Keras 3 cpu/gpu

En todos los casos existe una diferencia clara entre el tiempo de procesamiento en la CPU y el tiempo de procesamiento en la GPU. Este tiempo disminuye en el caso 3, con el conjunto de datos CIFAR. 88 Evolutionary Design of Deep Neural Networks

3.7.4 Tensor

CPU

Figure 3.49: TensorFlow 1a cpu

Se construye una red capaz de clasificar las imágenes con un bajo error.

Figure 3.50: TensorFlow 1b cpu Chapter 3. Experimentación 89

Figure 3.51: TensorFlow 2a cpu

La precisión alcanzada es alta, además con una perdida baja.

Figure 3.52: TensorFlow 2b cpu 90 Evolutionary Design of Deep Neural Networks

Figure 3.53: TensorFlow 3a cpu

La precisión supera mínimamente el 50% por lo que nuestra red buena para predecir las imágenes.

Figure 3.54: TensorFlow 3b cpu Chapter 3. Experimentación 91

GPU

Figure 3.55: TensorFlow 1a gpu

Se alcanza rápidamente una red con buenos resultados, y el resto de iteraciones permiten perfeccionarla.

Figure 3.56: TensorFlow 1b gpu 92 Evolutionary Design of Deep Neural Networks

Figure 3.57: TensorFlow 2a gpu

Se obtiene una precisión alta. También se logra que la perdida sea baja.

Figure 3.58: TensorFlow 2b gpu Chapter 3. Experimentación 93

Figure 3.59: TensorFlow 3a gpu

No se alcanza una red con que puede predecir las imágenes, al solo acertar, según la precisión el 50% de las veces.

Figure 3.60: TensorFlow 3b gpu 94 Evolutionary Design of Deep Neural Networks

Figure 3.61: TensorFlow 1 cpu/gpu

Figure 3.62: TensorFlow 2 cpu/gpu

Figure 3.63: TensorFlow 3 cpu/gpu Chapter 3. Experimentación 95

En todo caso se puede ver que la velocidad de procesamiento es mayor en la GPU, dando menores tiempos, con los mismos resultados.

3.7.5 Deeplearning4J

En esta librería no se ha podido sacar la información de la misma manera que en el resto ya que los resultados los guarda la aplicación, devolviéndolo por medio de una interfaz web. Por ese motivo las imágenes son distintas. CPU

Figure 3.64: DL4J 1a cpu

Figure 3.65: DL4J 2a cpu 96 Evolutionary Design of Deep Neural Networks

Figure 3.66: DL4J 3a cpu

Se observa que en los dos primeros casos se alcanza rápidamente un red capaz de clasificar resultados de MNIST. Sin embargo, en la tercera, con CIFAR, al alcanzar el error (score) del 40% la aplicación, da valores NaN (Not a Number) de operaciones matemáticas y por eso la gráfica baja hasta cero. GPU

Figure 3.67: DL4J 1a gpu Chapter 3. Experimentación 97

Figure 3.68: DL4J 2a gpu

Figure 3.69: DL4J 3a gpu

Ocurre igual que en el CPU, los dos primeros son válidos pero el tercero no da resultados buenos para la red. A nivel de velocidad, nos aporta la aplicación este resultado:

Figure 3.70: Velocidad 98 Evolutionary Design of Deep Neural Networks

Se ve que en todo caso, los ejemplos por segundo es mayor en GPU lo que implica que más veloz que la CPU. Si se empiezan a equiparar con la resolución de CIFAR.

3.8 Comparativa

A continuación se muestra una tabla comparativa de tiempos (salvo Deeplearning4J por tener una salida de datos distinta):

Figure 3.71: Tabla tiempo ejecución librerías

Salvo en el caso de Lasagne, en el resto de algoritmos la CPU ha tardado más del doble en terminar la ejecución con unos resultados de precisión y perdida similares. Dentro de las librerías Caffe tiene los tiempos más bajos, tanto en CPU como en GPU, seguido de Keras y TensorFlow que como es lógico, tienen tiempos parecidos. El único caso de Caffe con tiempo elevado es para CPU y el perceptrón multicapa. Chapter 4 Presupuesto

4.1 Costes

En este apartado se detallan la planificación y los costes asociados al proyecto. Se dividirá en apartados:

• Planificación, se dividirá en fases u objetivos globales y específicos.

• Económico se dividirá en costes humanos y materiales.

4.2 Planificación

En este apartado se definen las fases generales definidas para desarrollar el proyecto. Para una mejor visualización se han descrito en formato tabla: El proyecto se ha realizado durante los meses de junio, julio, agosto y septiembre de 2017, dedicando el máximo de tiempo posible al compaginarlo con un trabajo. Al realizar jornadas no controladas y con tiempo dispares, las medidas dadas en las tablas

Nombre de tarea Duración Comienzo Fin Inicio del proyecto 0 horas jue 01/06/17 jue 01/06/17 Análisis 40 horas jue 01/06/17 jue 07/06/17 Estudio de la librerías 100 horas jue 07/06/17 jue 23/06/17 Experimentación 300 horas jue 01/07/17 jue 22/08/17 Desarrollo de la documentación 200 horas jue 14/08/17 jue 15/09/17 Fin de proyecto 0 días lun 18/09/17 jue 18/09/17

Table 4.1: Planificación

99 100 Evolutionary Design of Deep Neural Networks anteriores no son verificable teniendo un margen de error de aproximadamente 30 horas.

Figure 4.1: Gantt del proyecto

De manera detallada se han realizado las siguientes tareas:

Figure 4.2: Gantt detallado del proyecto

4.3 Presupuesto

En este apartado se hace un cálculo del coste del proyecto. Para este proyecto solo se consideran costos de horas y costos de materiales, al no haber costes de subcon- tratas/servicios. En el coste de mano de obra se incluyen costos de luz, desplazamien- tos, conectividad,etc. Para la mano de obra el coste por hora se ha valorado en 25€/hora, quedando un cálculo de costos del proyecto en horas:

Table 4.2: Mano de obra

Análisis Estudio de li- Experimentación Desarrollo Coste Total brerías de la docu- mentación 1.000,00€ 2.500,00€ 7.500,00€ 5.000,00€ 16.000,00€

En el caso de materiales, solo se ha usado un ordenador valorado en 1.200€. Dado que el ordenador no se desecha al finalizar el proyecto, la amortización será a 60 meses con lo que el coste en los 3 meses de duración es de 60€. No se han utilizado aplica- ciones con licencia privada, haciendo uso de aplicaciones gratuitas para el desarrollo del proyecto. Por lo tanto el coste por material queda así: Chapter 4. Presupuesto 101

Table 4.3: Materiales

Análisis Estudio de li- Experimentación Desarrollo Coste Total brerías de la docu- mentación 3,75€ 9,38€ 18,75€ 28,13€ 60,00€

El proyecto queda como la suma de ambos:

Table 4.4: Presupuesto

Coste Análisis Estudio de ExperimentaciónDesarrollo Coste Total Proyecto librerías de la docu- mentación Mano de 1.000,00€ 2.500,00€ 7.500,00€ 5.000,00€ 16.000,00€ obra Materiales 3,75€ 9,38€ 18,75€ 28,13€ 60,00€ Total 1.003,75 € 2.509,38 € 7.518,75 € 5.028,13 € 16.060,00 € This page has been intentionally left blank. Chapter 5 Conclusiones y líneas futuras

5.1 Dificultades encontradas

La principal dificultad ha sido poder hacer funcionar todas las librerías de manera simultánea en el mismo ordenador. La mayoría de las librerías requieren programas con versiones muy concretas y en algunos casos distintas entre las librerías. Para poder hacerlo funcionar, se ha tenido que compilar algunas de las librerías y corregir las diferencias de algunos programas secundarios. También se han usado distintas versiones de Python, para que funcione alguna librería concreta.

5.2 Conclusiones

En el capítulo de experimentación, a través de los datos expuestos en gráficas, se ha ex- traído información relevante y comparativas. En este apartado se aúna dicha informa- ción, extrayendo las características más destacables de cada uno de los experimentos. La primera conclusión, se puede dar independiente de las librerías, y tiene que ver con la CPU/GPU. Al visualizar las gráficas, es claramente visible la diferencia de tiempos entre ambos tipos de procesadores. Esto se ha producido por la diferencia entre la estructura interna de los procesadores GPU y los CPU. Los GPU se componen de una gran cantidad de procesadores sencillos, interconectados entre si para favorecer el procesamiento paralelo. Se puede hacer el símil de los procesadores con un grupo de pereceptrones, tienen entradas, salidas y realizan cálculos en su interior (función de activación, pesos por la entrada, ...). En cambio, la CPU se compone de procesadores muy complejos y en algunos casos conectados en serie permitiendo ejecutar unos pocos programas al mismo. Otra conclusión aparece al confrontar los resultados de MNIST con CIFAR. Si anal- izamos los datos comparando los conjuntos de entrenamientos, se comprueba como el aumento relativo de complejidad al usar CIFAR-10, tiene un gran impacto en el entre- namiento correcto de la red, dando resultados bajos de precisión y altos de perdida.

103 104 Evolutionary Design of Deep Neural Networks

Esta caída en los resultados, demuestra superficialmente las dificultades que aparecen en el campo de la visión artificial. Comparando los resultados de las librerías entre sí, Caffe destaca frente al resto de librerías sobretodo con la parte de GPU, obteniendo los mismos valores de error y per- dida, con tiempos más bajos. Si comparamos la característica del tiempo, observamos que los tiempos son dispares, por ejemplo Pytorch en la prueba 1 tarda 82 segundos en dar un modelo, es peor con diferencia pero para la prueba 2 tiene un tiempo muy bajo. Si miramos la resolución, todos han sido capaces de dar modelos válidos para MNIST pero ninguno lo ha logrado con CIFAR. A nivel personal, comparando las librerías, las más sencillas de usar han sido Keras, Deeplearning4J y en menor medida Caffe. Prácticamente sin leer tutoriales y solo con algún ejemplo, ha sido sencillo comprender la estructura y poder modificarla a nuevos valores o capas sin problema alguno. En el caso de Caffe la diferencia en dos archivos, dificulta en un primer momento entender el flujo, pero después, es muy visual la construcción de redes. Por último, como visión global, la conclusión que se puede extraer del estudio, es la importancia actual de este tipo de aprendizaje, visto por la cantidad de libr- erías/framework. Además, siguen apareciendo nuevas librerías durante los últimos meses. Otro aspecto a destacar, es la facilidad que aportan estas librearías/frameworks a independizar al investigador del conocimiento matemático del aprendizaje. También, facilitando los cambios de parámetros, funciones de activación de una manera simple e intuitiva. Como es obvio al tomar unos datos de una web, difíciles de clasificar hasta tiempo reciente, cabría esperar que no funcionarán a la primera, sin embargo en todo caso ha funcionado bien y rápido lo que aporta valor al uso de aprendizaje profundo.

5.3 Líneas futuras

Este PFC sirve como introducción al aprendizaje profundo pudiendo dar una gran can- tidad de posibles caminos futuros. Algunos pueden ser 1) Seguir estudiendo conjuntos de datos de imagenes, haciendo uso de la librería opencv. Esta librería esta enfocada a la visión artificial, teniendo operaciones optimizadas a este conjunto de datos y a los procesadores GPU. 2) Aumentar el estudio, añadiendo otros grupos de datos,por ejemplo textos, y analizar el comportamiento de la CPU y GPU en esos casos. 3) Realizar el estudio enfocandolo al paralelismo, usando CPUs/GPUs par- alelizadas. 4) Debido a las dificultades para preparar el entorno, se puede realizar una imagen del entorno en la aplicación Docker, que permite lanzar imagenes que contienen sis- tema operativo, aplicaciones, ... con una conexión muy rápida y con poca perdida de procesamiento. Esto permite poder lanzar el entorno en distintas computadoras con Chapter 5. Conclusiones y líneas futuras 105 distintos procesadores y realizar una comparativa más extensa. 5) La última línea a destacar, puede ser enfocar el estudio a otro tipo de proce- sadores, tipo ARM, ... para conocer que librerías pueden instalarse y funcionar con cada tipo de procesador, limitaciones de rendimiento, ... ya que cada día aparecen nuevos dispositivos como por ejemplo aspiradores automáticos cuyo aprendizaje del entorno podría desarrollarse con este tipo de técnicas. This page has been intentionally left blank. Appendix A Ejemplos conjuntos de entrenamiento

En este anexo, se muestra un ejemplo de cada conjunto de entrenamiento.

Figure A.1: MNIST

Figure A.2: Cifar-10

107 This page has been intentionally left blank. Appendix B Instalación de librerías/framework

El anexo abarca una breve descripción de la instalación de cada librería.

B.1 Theano

Las librerías/aplicaciones necesarias para que funcione Theano son: Obligatorios

• Python == 2.7* or ( >= 3.3 and < 3.6 )

• NumPy >= 1.9.1 <= 1.12

• SciPy >= 0.14 < 0.17.1

• BLAS installation Con funcionalidad nivel 3

Opcionales

• NVIDIA CUDA drivers y SDK. Muy recomendado, sin él, solo funciona con la CPU. Instalado para estas pruebas

• libgpuarray. Muy recomendado, necesario para CUDA y OpenCL. Instalado para estas pruebas

• python-dev, g++ >= 4.2. Muy recomendado

• nose >= 1.3.0

• Sphinx >= 0.5.1

• pydot-ng

• pycuda and skcuda

109 110 Evolutionary Design of Deep Neural Networks

Es fácil perderse con la versión de cada librería, Theano recomienda el uso de conda, que permite agrupar las instalaciones e internamente tiene los requisitos anteriores almacenados, permitiendo que con pocos comandos tenerlo funcional. Además, es el único modo de instalación soportado. Otras tipos de instalación existentes son:

• Pip Instalador de Python

• Código fuente A través del código en Git se puede compilar e instalar directa- mente.

Para instalarlo tenemos dos opciones:

• Intalar por PIP de Python

• Uso de GIT para obtener el código y poder compilarlo sobre la máquina.

B.2 Lasagne

Lasagne, por puntos anteriores, solo funciona sobre Theano, así que mínimo usará Theano y por extensión las librerías necesarias en este. El problema que surge es que el desarrollo de una librería, no va al mismo ritmo que la otra, con lo que se produce que no coincidan las versiones necesarias de las librerías en Lasagne, con las que Theano necesita en un su última versión. La web de lasagne incluye un documento con la especificación exacta de Theano con la que Lasagne es funcional.

• Python + pip: Con python 2.7 o python 3.5, usar el pip que venga asociado a esas versiones

• Compilador C: Solo indica que necesita un compilador pero no especifica cuál, se recomienda Gcc

• numpy/scipy + BLAS + scipy 0.11

La instalación se realiza por medio de GIT y

B.3 TensorFlow

• CUDA® Toolkit 8.0 Para el uso de GPU.

• Tarjeta gráfica con CUDA

• Drivers de Nvidia Appendix B. Instalación de librerías/framework 111

• CuDNN v6 • libcupti-dev Librería para el uso de perfiles de Nvidia CUDA

Para realizar la instalación se proponen cuatro alternativas:

• virtualenv • pip • Docker • Anaconda

B.3.1 Virtualenv

Hay que seguir una serie de pasos: Instalar el entorno virtual

• sudo apt-get install python-pip python-dev python-virtualenv Para Python 2.7 • sudo apt-get install python3-pip python3-dev python-virtualenv Para Python 3.n

Crear un entorno virtual

• virtualenv –system-site-packages targetDirectory Para Python 2.7 • virtualenv –system-site-packages -p python3 targetDirectory Para Python 3.n

En targetDirectory se especifíca el directorio raiz del entorno virtual. Por defecto, se asume que /tensorflow es el directorio por defecto Se activa el entorno virtual

• source /tensorflow/bin/activate # bash, sh, ksh, or zsh • source /tensorflow/bin/activate.csh # csh or tcsh

Una vez se haya lanzado, ejecutamos el comando easy_install -U pip y según la versión que queramos lanzamos:

• pip install –upgrade tensorflow Para Python 2.7 • pip3 install –upgrade tensorflow Para Python 3.n • pip install –upgrade tensorflow-gpu Para Python 2.7 y GPU • pip3 install –upgrade tensorflow-gpu Para Python 3.n y GPU 112 Evolutionary Design of Deep Neural Networks

B.3.2 Pip

Según la versión a instalar elegimos una de las siguientes opciones:

• pip install tensorflow Python 2.7 Soporte CPU (Sin GPU )

• pip3 install tensorflow Python 3.n Soporte CPU (Sin GPU)

• pip install tensorflow-gpu Python 2.7 Soporte GPU

• pip3 install tensorflow-gpu Python 3.n Soporte GPU

B.3.3 Docker

Para este caso, se necesita tener Docker instalado. En caso de querer la versión de GPU, es necesario instalar NVIDIA-DOCKER. Por último solo es necesario elegir la versión a utilizar:

• CPU: docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow

• GPU: nvidia-docker run -it gcr.io/tensorflow/tensorflow:latest-gpu bash

B.3.4 Anaconda

Requiere tener Anaconda instalado. Una vez instalado es necesario seguir los sigu- ientes pasos:

• : conda create -n tensorflow

A continuación, activamos el entorno de tensorflow con:

• source activate tensorflow

En el nuevo entorno lanzar:

• pip install –ignore-installed –upgrade tfBinaryURL con tfBinaryURL una URL variable con la versión actual, se debe copiar de la página oficial Appendix B. Instalación de librerías/framework 113

B.4 Keras

Keras necesita tener Tensorflow o Theano instalado, porque no es funcional por si solo. No requiere más librerías de manera obligatoria. Opcionalmente:

• cuDNN: Si se va a utilizar GPU se recomienda su instalación

• HDF5 and h5py: Utilidad para guardar el modelo

• graphviz and pydot Utilidad de visualización gráfica.

Para instalarlo tenemos dos opciones:

• Intalar por PIP de Python

• Uso de GIT para obtener el código y usar con python el archivo setup.py para instalar.

Install Keras from PyPI (recommended): sudo pip install keras If you are using a virtualenv, you may want to avoid using sudo: pip install keras Alternatively: install Keras from the Github source:

B.5 Pytorch

Pytorch proporciona tres métodos de instalación y en la propia web, pulsando disintos botones se obtiene el comando a invocar para que se realiza la instalación, incluyendo las librerías necesarias.

• Uso de CONDA. Hay varias opciones, según la versión de python o cuda. Un ejemplo es: conda install pytorch torchvision cuda80 -c soumith

• Uso de PIP. Hay varias opciones, según la versiónde python o cuda. Un ejemplo es: pip3 install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35- cp35m-manylinux1_x86_64.whl pip3 install torchvision

• Uso de GIT. Descargars e código más reciente para instarllo automáticamente.

B.6 Caffe

• CUDA Necesaria para el modo GPU. V7 o V6 114 Evolutionary Design of Deep Neural Networks

• BLAS via ATLAS, MKL, or OpenBLAS.

• Boost >= 1.55

• vcprotobuf, glog, gflags, hdf5

Opcionales:

• OenCV >= 2.4

• IO libraries: lmdb, leveldb, snappy

• cuDNN v6 para aceleración con CUDA

La instalación se realiza por medio de:

• Instalación de aplicaciones Ubuntu apt-get. sudo apt install caffe-cuda para so- porte GPU/CPU o sudo apt install caffe-cpu para soporte solo de CPU

• Compilando el código

B.7 Deeplearning 4J

Las necesidades para su uso son:

• Java de 64-Bit y versión mínima 1.7

• Apache Maven. Gestor automático de dependencia y compilación automatizada

• IntelliJ IDEA o Eclipse como entorno de desarrollo

• Git

No se realiza instalación, solo se debe descargar el repositorio por medio de GIT. git clone https://github.com/deeplearning4j/dl4j-examples.git Se abre el archivo pom.xml con el Intellij IDEA, que por medio de Maven actualizará todas las depen- dencias y paquetes necesarios. Bibliography

[1]A lander, J. T. On optimal population size of genetic algorithms. In Com- pEuro’92.’Computer Systems and Software Engineering’, Proceedings. (1992), IEEE, pp. 65–70.

[2]A lipanahi, B., Delong, A., Weirauch, M. T., and Frey, B. J. Predicting the sequence specificities of dna-and rna-binding proteins by deep learning. Nature biotechnology 33, 8 (2015), 831–838.

[3]A zevedo, F. A., Carvalho, L. R., Grinberg, L. T., Farfel, J. M., Ferretti, R. E., Leite, R. E., Lent, R., Herculano-Houzel, S., et al. Equal numbers of neuronal and nonneuronal cells make the human brain an isometrically scaled-up primate brain. Journal of Comparative Neurology 513, 5 (2009), 532–541.

[4]B ar, Y., Diamant, I., Wolf, L., and Greenspan, H. Deep learning with non- medical training used for chest pathology identification. In Proc. SPIE (2015), vol. 9414, p. 94140V.

[5]C ayre, M., Malaterre, J., Scotto-Lomassese, S., Strambi, C., and Strambi, A. The common properties of neurogenesis in the adult brain: from invertebrates to vertebrates. Comparative Biochemistry and Physiology Part B: Biochemistry and Molec- ular Biology 132, 1 (2002), 1–15.

[6]C hung, J., Gulcehre, C., Cho, K., and Bengio, Y. Empirical evaluation of gated recurrent neural networks on sequence modeling. arXiv preprint arXiv:1412.3555 (2014).

[7]D arwin, C., and Bynum, W. F. The origin of species by means of natural selection: or, the preservation of favored races in the struggle for life. AL Burt, 2009.

[8]D eng, L., Yu, D., et al. Deep learning: methods and applications. Foundations and Trends® in Signal Processing 7, 3–4 (2014), 197–387.

[9]D river, H. E., and Kroeber, A. L. Quantitative expression of cultural relationships. University of California Press, 1932.

[10]F rank, R. The perceptron a perceiving and recognizing automaton. tech. rep., Technical Report 85-460-1 (1957).

115 116 Evolutionary Design of Deep Neural Networks

[11]G ee, J. P. Deep learning properties of good digital games: How far can they go? In Serious games: Mechanisms and effects. Routledge Taylor & Francis Group, 2009.

[12]G eman, S., and Geman, D. Stochastic relaxation, gibbs distributions, and the bayesian restoration of images. IEEE Transactions on pattern analysis and machine intelligence, 6 (1984), 721–741.

[13]G ers, F. A., Schmidhuber, J., and Cummins, F. Learning to forget: Continual prediction with lstm.

[14]G iesecke, K., Sirignano, J., and Sadhwani, A. Deep learning for mortgage risk. Tech. rep., Working paper, Stanford University, 2016.

[15]G oldberg, D. E. Genetic algorithms in search, optimization, and machine learn- ing, 1989. Reading: Addison-Wesley (1989).

[16]G reff, K., Srivastava, R. K., Koutník, J., Steunebrink, B. R., and Schmidhuber, J. Lstm: A search space odyssey. IEEE transactions on neural networks and learning systems (2016).

[17]H all*, M., Ramsay, A., and Raven, J. Changing the learning environment to promote deep learning approaches in first-year accounting students. Accounting Education 13, 4 (2004), 489–505.

[18]H armon, M., Lucey, P., and Klabjan, D. Predicting shot making in basketball us- ing convolutional neural networks learnt from adversarial multiagent trajectories. arXiv preprint arXiv:1609.04849 (2016).

[19]H eaton, J., Polson, N., and Witte, J. Deep learning in finance. arXiv preprint arXiv:1602.06561 (2016).

[20]H inton, G. A practical guide to training restricted boltzmann machines. Momen- tum 9, 1 (2010), 926.

[21]H inton, G. E. Deep belief networks. Scholarpedia 4, 5 (2009), 5947. revision #91189.

[22]H inton, G. E., Osindero, S., and Teh, Y.-W. A fast learning algorithm for deep belief nets. Neural computation 18, 7 (2006), 1527–1554.

[23]I an Goodfellow, Y. B., and Courville, A. Deep learning. Book in preparation for MIT Press, 2016.

[24]J aeger, H. Tutorial on training recurrent neural networks, covering BPPT, RTRL, EKF and the“ echo state network” approach, vol. 5. GMD-Forschungszentrum Informa- tionstechnik, 2002.

[25]K rasnopolsky, V. M., and Fox-Rabinovitz, M. S. Complex hybrid models com- bining deterministic and components for numerical climate modeling and weather prediction. Neural Networks 19, 2 (2006), 122–134. Bibliography 117

[26]K rizhevsky, A., Sutskever, I., and Hinton, G. E. Imagenet classification with deep convolutional neural networks. In Advances in neural information processing systems (2012), pp. 1097–1105. [27]L e, Q. V. Building high-level features using large scale unsupervised learning. In Acoustics, Speech and Signal Processing (ICASSP), 2013 IEEE International Conference on (2013), IEEE, pp. 8595–8598. [28]L eCun, Y., Bengio, Y., and Hinton, G. Deep learning. Nature 521, 7553 (2015), 436–444. [29]M atsugu, M., Mori, K., Mitari, Y., and Kaneda, Y. Subject independent facial expression recognition with robust face detection using a convolutional neural network. Neural Networks 16, 5 (2003), 555–559. [30]M ozer, M. C. A focused back-propagation algorithm for temporal pattern recog- nition. Complex systems 3, 4 (1989), 349–381. [31]N oel, K. Application of machine learning to systematic strategies. [32]P earl, J. Bayesian networks: A model of self-activated memory for evidential reasoning. In Proceedings of the 7th Conference of the Cognitive Science Society, 1985 (1985), pp. 329–334. [33]R obinson, A., and Fallside, F. The utility driven dynamic error propagation network. University of Cambridge Department of Engineering, 1987. [34]R omaniuk, O. Fashion technology deep learning can create added value retail. https://labs.eleks.com/2017/05/fashion-technology-deep-learning- can-create-added-value-retail.html, 2017. [Online; accessed May-2017]. [35]R umelhart, D. E., Hinton, G. E., Williams, R. J., et al. Learning representations by back-propagating errors. Cognitive modeling 5, 3 (1988), 1. [36]S chmidhuber, J. Deep learning in neural networks: An overview. Neural Networks 61 (2015), 85–117. Published online 2014; based on TR arXiv:1404.7828 [cs.NE]. [37]S hah, R., and Romijnders, R. Applying deep learning to basketball trajectories. arXiv preprint arXiv:1608.03793 (2016). [38]S imon, H. A. Why should machines learn? In Machine learning. Springer, 1983, pp. 25–37. [39]S uk, H.-I., Lee, S.-W., Shen, D., Initiative, A. D. N., et al. Hierarchical feature representation and multimodal fusion with deep learning for ad/mci diagnosis. NeuroImage 101 (2014), 569–582. [40]S utskever, I., Hinton, G. E., and Taylor, G. W. The recurrent temporal restricted boltzmann machine. In Advances in Neural Information Processing Systems (2009), pp. 1601–1608. 118 Evolutionary Design of Deep Neural Networks

[41]V apnik, V. The nature of statistical learning theory. Springer science & business media, 2013.

[42]W ang, K.-C., and Zemel, R. classifying nba offensive plays using neural networks. In Proc. MIT SLOAN Sports Analytics Conf (2016).

[43]W arburton, K. Deep learning and education for sustainability. International Jour- nal of Sustainability in Higher Education 4, 1 (2003), 44–56.

[44]W erbos, P. J. Generalization of backpropagation with application to a recurrent gas market model. Neural networks 1, 4 (1988), 339–356.

[45]W illiams, R. J., and Zipser, D. A learning algorithm for continually running fully recurrent neural networks. Neural computation 1, 2 (1989), 270–280.

[46]X ingjian, S., Chen, Z., Wang, H., Yeung, D.-Y., Wong, W.-K., and Woo, W.- c. Convolutional lstm network: A machine learning approach for precipitation nowcasting. In Advances in neural information processing systems (2015), pp. 802– 810.

[47]X u, Y., Mo, T., Feng, Q., Zhong, P., Lai, M., Eric, I., and Chang, C. Deep learning of feature representation with multiple instance learning for medical image anal- ysis. In Acoustics, Speech and Signal Processing (ICASSP), 2014 IEEE International Conference on (2014), IEEE, pp. 1626–1630. This page has been intentionally left blank.