viernes, 29 de mayo de 2020

El brillante maridaje de la Inteligencia Artificial y el Cloud Computing


Más de una vez hemos comentado en artículos de este blog algunos de los motivos que impulsan el crecimiento actual de la Inteligencia Artificial. Hace algo más de un mes, por ejemplo, veíamos los argumentos que aportaba François Chollet para el caso específico del Deep Learning donde nos hablaba de progresos en el hardware y la algoritmia y también de disponibilidad de datos. Pero hay otro factor, creo, a tener muy en cuenta en este desarrollo, y tiene que ver con el Cloud Computing.

En efecto, el Cloud Computing, y sobre todo, la apuesta de los grandes del mundo de la Inteligencia Artificial por el Cloud Computing, son un factor democratizador y acelerador de la Inteligencia Artificial, no sólo a nivel de desarrollo científico sino, sobre todo, de accesibilidad para las empresas y entidades de formación y para la realización de implantaciones.

Y es que esos 'grandes' ponen a disposición de terceros, de una forma muy accesible, cuando no gratuita, servicios y capacidades cognitivas. Ya vimos en un artículo anterior, por ejemplo, una muestra de los servicios cognitivos en Azure. Y también, hace no tanto hablábamos de la importancia del cloud computing y la apuesta de 'los grandes' en el caso específico de los chatbots.

Esa apuesta por el Cloud Computing como soporte para la Inteligencia Artificial posibilita, en primer lugar, esa disponibilidad de algoritmos ya entrenados para su empleo en soluciones personalizadas. Pero también da acceso a unas capacidades computacionales amplias que en otro caso serían costosas. Así, por ejemplo, de cara a entrenar un algoritmo de Deep learning podemos disponer de GPUs ('Graphical Processing Unit')... sin disponer de ellas. Porque los proveedores de Cloud sí disponen de GPUs en sus Centros de Proceso de Datos y servicios que permiten a cualquiera entrenar a sus algoritmos sobre esas GPUs. Y es sabido que la velocidad de trabajo de una GPU para cálculos como los necesarios en Deep Learning es muy superior al de una CPU de las máquinas de que habitualmente disponemos los particulares y las empresas.

A la importancia de acceder a esa capacidad de computación que se encuentra en la nube, se refiere Jordi Torres al final de su libro 'Python Deep Learning' cuando dice:

estamos ante una nueva era de crecimiento e innovación del Deep Learning en las empresas gracias al Cloud Computing que no solo ha democratizado la computación sino que también lo está haciendo con el Deep Learning. En el documento AI Index Report se describe que en solo un año y medio, el tiempo requerido para entrenar un sistema de clasificación de imágenes en el cloud se ha reducido a unas tres horas (en Octubre de 2017) a unos 88 segundos (en Julio de 2019). El motivo es que los grandes proveedores de Cloud se han embarcado en una carrera frenética para dominar el mercado de Deep Learning ofreciendo cada vez más servicios en esta área.

La curva del AI Index Report que visualiza los datos a que se refiere Jordi Torres es la siguiente:


Tiempo de entrenamiento de un algoritmo de clasificación de imágenes


Tengo que reconocer que hace ya unos cuantos años, cuando comencé a entrar en contacto con el concepto del cloud computing, cuando éste era más una idea y una promesa que una realidad, no hubiera creído que se iba a desarrollar tan correctamente, tan ampliamente y con tanto impacto como está sucediendo. El cloud computing está cambiando de forma profunda, aunque casi inadvertida, la forma de gestionar las Tecnología de la Información, y la forma de desarrollar e implantar soluciones. Pero no sólo eso, como demuestra su maridaje con la Inteligencia Artificial, está convirtiéndose en un fantástico motor de progreso tecnológico, especialmente en lo que a difusión e implantación se refiere.

En ocasiones, las promesas grandilocuentes de las posibilidades tecnológicas se han convertido en decepciones y fiascos, pero en el caso del Cloud Computing, creo que es una brillante realidad.

miércoles, 27 de mayo de 2020

Catálogo de componentes de redes neuronales (y IV): optimizadores


Vamos a cerrar, al menos por el momento, esta serie de artículos dedicados a censar elementos de diseño de las redes neuronales, y lo haremos hablando de los optimizadores, es decir, esa pieza nuclear del aprendizaje que, tomando como dato de entrada el valor de la función de pérdida, decide cómo modificar los pesos de la red para conseguir que el resultado se acerque, en cada paso, un poquito más al objetivo deseado.

Ya anticipamos el algoritmo más 'típico' que podemos en este caso que el descenso de gradiente ('Gradient descent') cuando comentamos las intuiciones sencillas que existen tras muchos algoritmos en apariencia, y quizá no tan en apariencia, complejos.

Vimos que, en el fondo, el descenso de gradiente no es más, como intuición, que imaginar el perfil de la función de pérdida como una curva o superficie e ir 'bajando' en pequeños pasos por esa curva/superficie, en la dirección de máxima inclinación, hasta encontrar el 'valle', el punto más bajo, momento en que habríamos minimizado el error.

El descenso de gradiente ('Gradient Descent', GD) es un optimizador popular y la base de algunos otros. Vamos a ver, brevemente, el censo de otros optimizadores.

  • BGD ('Batch Gradient Descent'): Es una variante del gradient descent en que, en cada iteración, tomamos el conjunto entero de datos de aprendizaje para calcular el valor del gradiente. Es un algoritmo relativamente sencillo de entender, pero de convergencia lenta.

  • SGD ('Stochastic Gradient Descent'): Es el extremo contrario: en lugar de usar todo el conjunto de datos para calcular el gradiente y actualizar pesos como hace BGD, en este caso en cada iteración utilizamos un único punto de datos con lo que tenemos una convergencia mucho más rápida. A cambio, tiende a presentar ciertas inestabilidades y fluctuaciones.

  • 'Mini-batch Gradient Descent': Es el punto intermedio entre los dos anteriores. En este caso, en cada iteración elegimos un conjunto más o menos reducido de puntos de datos.

  • Nadam ('Nesterov-accelerated adaptive moment stimation') Este es un optimizador que utiliza el concepto de 'momento'. La idea intuitiva es acelerar más o menos el descenso de la curva de gradiente, según la pendiente de la misma, yendo más rápido en las direcciones en que la curva de la función de pérdida es más escarpada y más lento en las direcciones en que la curva presenta un perfil más suave. Y la forma de hacerlo matemáticamente es teniendo en cuenta, no sólo la pendiente actual, sino también la pendiente de las iteraciones anteriores con lo cual tenemos una cierta estimación de aceleración o deceleración.

  • Adagrad ('ADAptive GRADient algorithm') Un método que introduce el aprendizaje adaptativo, en que el nivel de variación de los parámetros depende de estos. La idea geométrica es que, si en el descenso de gradiente avanzamos en la dirección de la mayor pendiente en cada momento, pudiendo esa pendiente no apuntar directamente al mínimo global, en Adagrad intentamos que la dirección de descenso, aunque no sea la máxima, sí apunte más en la dirección del mínimo. Presenta, eso si, el problema de una tasa de aprendizaje cada vez menor, que es lo que intentan resolver los siguientes optimizadores.

  • RMSprop ('Root Mean Square prop'): Utiliza una media móvil de los cuadrados del gradiente y normaliza ese valor empleando para ello las magnitudes recientes de los gradientes anteriores. La normalización se realiza, evidentemente, por que si no, el hecho de elevar al cuadrado hace que, caso de no normalizar, tengamos un valor de gradiente exageradamente alto (el cuadrado, en concreto).

  • Adam ('ADAptive Moment stimation'): Viene a ser una combinación de Adagrad y RMSprop. Utiliza una media móvil exponencial de los gradientes para ajustar las tasas de aprendizaje. Es un algoritmo computacionalmente eficiente y que usa poca memoria. Y es uno de los optimizadores más populares hoy día.

  • Adadelta: Una extensión de Adagrad más robusta que usa una ventana móvil de actualizaciones de gradientes.

  • Adamax: Una variante algo sutil de Adam, en que en lugar de un momento de segundo orden, se utiliza un momento de orden infinito.

Por detrás de los optimizadores, ya se intuye, existe un cierto aparataje matemático y no es fácil describirlos de una forma realmente sencilla. En mi caso, y para realizar este post, me ha sido útil el artículo sobre optimizadores 'Machine Learning: Gradient Descent' y 'Overview of differente optimizers for neural netowrks', publicados ambos por Renu Khandelwal en Medium.

Y con esto cierro, como decía, esta serie de cuatro artículos sobre elementos de diseño que tenemos en redes neuronales, y catalogar de forma sencilla las principales opciones existentes.

No se agotan aquí los elementos de diseño disponibles pero, para una primera visión, he preferido centrarme en conocer e intentar consolidar éstos: capas, funciones de activación, funciones de périda y optimizadores.


Artículos de este blog relacionados

lunes, 25 de mayo de 2020

Catálogo de componentes de redes neuronales (III): funciones de pérdida


Continuando con el catálogo de elementos de diseño, en este post vamos a hacer un catalogado básico de las funciones de pérdida ('loss functions').

¿Qué es una función de pérdida?

La función de pérdida, también denominada función objetivo, en esencia, nos dice, durante el proceso de entrenamiento de la red, lo lejos que está en un momento dado, lo que la red nos ofrece como salida y el resultado que nosotros consideramos que es el correcto o deseado. El valor de la función de pérdida será luego un dato de entrada en el algoritmo de aprendizaje.

Dado que los algoritmos de aprendizaje como el descenso de gradiente, calculan la derivada de la función de pérdida, ésta debe ser una función continua y derivable. 

Hay una gran variedad de funciones de pérdida posibles pero para nuestro catálogo sencillo, y basándonos en los libros 'Deep Learning con Python' de François Choillet y 'Python Deep Learning' de Jordi Torres, seleccionamos las siguientes:

  • Error Cuadrático Medio ('Mean Square Error', MSE): Una función muy conocida que calcula la distancia 'geométrica' al valor objetivo. Hablar de distancia geométrica es una forma de visualizarlo que nos orienta cuando pensamos en dos o tres dimensiones. Más allá de esas dimensiones, es sólo una forma de entenderlo. Además, decimos distancia, pero en realidad es la distancia elevada al cuadrado. Una variante de ésta seria la que, en lugar del cuadrado de la distancia, elige el valor absoluto ('Absolute Error'). MSE se puede usar, por ejemplo, en problemas de regresión a valores arbitrarios y con una última capa sin función de activación.

  • Entropía cruzada Categórica ('Categorical Cross Entropy'): Sin entrar en detalles, la entropía cruzada, en general, es una medida de la distancia entre distribuciones de probabilidad. La entropía cruzada suele ser adecuada en modelos de redes cuya salida representa una probabilidad, como cuando hacemos una clasificación categórica con función de activación 'softmax'. Se puede utilizar, por ejemplo, en problemas de clasificación categórica con una sola etiqueta de salida y precedida de una función de activación 'Softmax'.

  • Entropía cruzada binaria ('Binary Cross Entropy'):  Una variante de la anterior pero en que tratamos con clasificación binaria y , por tanto, la función de activación sería una sigmoide.

  • Entropía Cruzada Categórica Dispersa ('Sparse Categorical Cross Entropy'): Una variante que se suele usar en el caso de trabajar con números enteros.

Hay mucho más aparato matemático detrás de las funciones de pérdida, y más opciones posibles pero, en aras de la simplicidad que busco, también en mi propio provecho, dejaremos nuestro catálogo limitado estas cuatro y sin entrar en la formulación matemática exacta de las funciones.

En el próximo artículo de este catálogo ya atacaremos al aprendizaje propiamente dicho. 

Artículos de este blog relacionados

miércoles, 20 de mayo de 2020

Catálogo de componentes de redes neuronales (II): funciones de activación


En el artículo anterior de este blog, hablamos sobre los tipos de capas más habituales que se utilizan en redes neuronales, empezando así un breve trabajo de catalogado de las opciones de diseño de que se dispone en redes neuronales, pensando muy especialmente en Deep Learning.

Neurona artificial. Fuente: Jordi Torres
En este segundo artículo de esta breve serie, vamos a hablar de las funciones de activación. Como se recoge en la figura (autoría de Jordi Torres) y que ya utilizamos en el artículo anterior, una neurona artificial habitualmente divide su procesamiento en dos partes. Por un lado un tratamiento de las entradas (que puede ser, por ejemplo, una suma ponderada como se muestra en la figura o una convolución) y, al resultado de esa primera función, aplicarle otra pequeña transformación para obtener el valor de salida de nuestra neurona. Esa segunda transformación, esa segunda función que en la figura se representa dentro de un rectángulo, es a lo que se denomina función de activación y es un segundo elemento de diseño relevante.

Existe una cierta variedad de funciones de activación, algunas de las cuales se muestran en la figura.



No vamos a verlas todas, pero sí mencionar algunas de las más habituales.

  • Función Lineal: Se trata, quizá, del caso más simple, en que la función de activación básicamente, da una salida igual a la entrada, es decir, actúa como función identidad trasladando a su salida el resultado obtenido en la primera parte del procesamiento de la neurona (la suma ponderada de entradas, por ejemplo).

  • Función Rectified Linear Unit ('ReLU'): Aunque el nombre pueda llamar a engaño, se trata en realidad de una función no lineal. En este caso, el valor de la función de activación es igual a su entrada mientras ésta sea mayor que cero (en ese caso sí actúa como lineal) pero, en caso contrario, el valor de activación es nulo. Su labor, en el fondo, no es más que eliminar valores negativos. Es difícil de explicar brevemente, pero este tipo de no linealidades aumenta las posibilidades de la red. En concreto, esta función, muy popular, da buenos resultados, por ejemplo, en redes de convolución y, por tanto, en tareas como visión artificial o reconocimiento de voz. Aparte de la ReLU, existen otras muchas funciones de activación que juegan con la linealidad y no linealidad de forma parecida, como pueden ser, por ejemplo, la 'Leaky ReLU' en que para los valores negativos se proporciona una pendiente diferente (más tendida) que para los positivos o la 'Exponential LU'.

  • Función Sigmoidea (logística): Se trata de una función continua y derivable (importante en los algoritmos de aprendizaje), con un rango entre 0 y 1 y generalmente cerca de esos extremos (0 ó 1). Esto la hace muy adecuada para problemas de clasificación. Por ejemplo, para una clasificación binaria, una única neurona de salida con esta función de activación sigmoidea tendería a dar muy bien el resultado (cercano a uno una categoría, cercana a cero la otra). También se utiliza en problemas de regresión con salida entre 0 y 1.

  • Función Tangente Hiperbólica: Una función con una forma parecida a la sigmoidea pero que, en este caso, proporciona valores entre 1 y -1, es decir, admite valores negativos en la salida.

  • Función 'softmax' (función exponencial normalizada): Es una función de activación un poco particular, puesto que la salida no sólo depende de las entradas de la neurona sino también de la salida de las otras neuronas de la misma capa. Cuando se aplica una función de activación, la suma de las activaciones de la capa debe ser 1. Se utiliza en problemas de clasificación en múltiples categorías y etiquetas, en las que cada neurona de salida representa una categoría. La que tiene el valor más alto es la que representa con más probabilidad la categoría que corresponde a los datos mostrados en la entrada de la red.

Existen más funciones de activación, claro, pero con éstas mencionadas creo que se cubren los casos más habituales, así que podemos cerrar por ahora el catalogado. En el siguiente paso iremos a por los algoritmos de aprendizaje.


Artículos de este blog relacionados

lunes, 18 de mayo de 2020

Catálogo de componentes de redes neuronales (I): capas


En un artículo publicado recientemente en este blog y titulado 'Estructura de una red neuronal y el inicio de una catalogación sencilla', anunciaba una serie de posts en que resumiría las opciones básicas que se pueden elegir a la hora de diseñar una red neuronal. La idea es censar un catálogo corto y comprensible, pero razonablemente explicativo y abarcador, que ayude a entender este tipo de algoritmos avanzados y conocer las principales opciones de diseño disponibles.

Y éste es el primero de los posts de esa serie, y que dedicaré a las capas.

Neurona Artificial. Fuente: Jordi Torres
La unidad mínima en una red neuronal sería, en teoría, la neurona, que conceptualmente se corresponde con una unidad que recibe unos datos de entrada (en la metáfora neuronal serían las salidas de otras neuronas) y proporciona un valor de salida. Matemáticamente la podríamos considerar como una función aunque internamente suele encadenar dos funciones: por un lado una primera función que combina de forma ponderada (modulada por pesos) sus entradas y una función de activación que proporciona una salida en función de esa operación ponderada previa

Sin embargo, a la hora de trabajar, más que con neuronas individuales, se trabaja con capas que se corresponden intuitivamente con lo que la palabra capa indica, es decir, un conjunto de neuronas en un mismo, digamos, nivel, que tienen características homogéneas entre sí y que se conectan con las neuronas de la capa precedente. Desde un punto de vista matemático, en realidad, una capa se traduce en un módulo de procesamiento matemático que toma como entrada un tensor (que sería la salida de la capa anterior) y devuelve como salida otro tensor.

Entre los elementos que definen la tipología de una capa tenemos, por supuesto, el tipo de cálculos que aplican sus neuronas, pero también el patrón de conexión entre sí y, sobre todo, con la capa precedente.

Siguiendo a François Chollet en su libro 'Deep Learning con Python' incluiremos en nuestro catálogo tres familias de capas, a saber:
  • Densa (Perceptrón): En ellas todas las neuronas de una capa están conectadas a todas las neuronas de la capa anterior. Son capas que no asumen ningún tipo de estructura específica en las características de entrada. Se utilizan fundamentalmente en problemas de clasificación ya sea asumiendo la totalidad de las capas de la red o bien como fase final de clasificación en una red con capas de otros tipos.

  • Convolución: redes que aplican transformaciones geométricas locales en espacios acotados de sus datos de entrada. Es decir, recorren sus datos de entrada aplicando sucesivamente pequeñas transformaciones a subconjuntos pequeños de ese espacio de entrada hasta finalizar el recorrido. Su comportamiento tiende a ir extrayendo, mediante la acción de capas sucesivas, características significativas del espacio de entrada. Suelen apoyarse en otros tipos de capas auxiliares como son las capas de 'pooling' (reducción del espacio de datos) y 'flatten' (conversión de tensores n-dimensionales en vectores).Su aplicación más típica es en tratamiento de imágenes y visión artificial, pero también su utilizan en procesamiento de sonidos, de textos u otro tipo de datos secuenciales.

  • Recurrente (RNR): Capa específicamente diseñada para el tratamiento de secuencias de entradas, típicamente temporales. Las capas recurrentes se denominan así porque su salida en un momento dado depende, no sólo de las entradas en ese momento, sino de su salida en el paso anterior. Son capas que, además, conservan un estado. Se utilizan en todo tipo de tratamiento de series temporales, siendo quizá lo más relevante, todo lo que tiene que ver con el procesamiento de texto y lenguaje o el análisis de sentimiento, pero también, por ejemplo, en la predicción del tiempo e incluso en redes generativas de texto. Existen algunas variantes de las que las más comunes son las dos siguientes:

    • Long Short-Term Memory (LSTM): En que la información recurrente se transmite no sólo al paso anterior sino a varios pasos anteriores.

    • Gated Recurrent Unit (GRU): siguen la misma idea que las LSTM pero son computacionalmente más eficientes.

Este catálogo, seguro, no es completo, y además, las arquitecturas de redes neuronales más avanzadas no se limitan a un mero apilamiento de capas por lo que, el conocer las modalidades de capas no es suficiente para tener una base completa de las opciones en redes neuronales, pero disponer de este catálogo con los tipos de capas más habituales, me parece que orienta bastante en los primeros pasos (al menos a mi, me sirve como estructura de conocimiento).

En próximos posts veremos otros elementos relevantes del catálogo de componentes. El próximo paso: funciones de activación.

domingo, 17 de mayo de 2020

Meta-principios de humanismo digital


Como decía en un artículo que publiqué hace algo más de un mes, he iniciado una búsqueda, una exploración, casi una investigación, para dar forma y desarrollar el llamado humanismo digital.

No tengo realmente todavía ninguna conclusión definitiva ni ningún gran avance (sí alguno pequeño) pero he pensado que es bueno que, aunque sea de forma muy previa, aunque no sean más que esbozos y borradores, ponga alguna idea por escrito. Eso ayuda a la clarificación, al rigor y abre la posibilidad de los comentarios y opiniones.

Son ideas mudables, sometidas a posibles cambios fruto del aprendizaje, de la mayor reflexión, o incluso del eventual 'feedback' que pueda recibir. Se trata de algo así como un producto mínimo viable en materia de ideas y pensamiento sobre humanismo digital. 

Y se trata, como toda esta búsqueda, de una visión personal, no necesariamente alineada con las ideas de otros o con un eventual 'mainstream' en materia de humanismo digital, que creo que no existe todavía.

Y lo que voy a ofrecer en este post es un primer amago de definición de humanismo digital y un borrador de principios de humanismo digital, una especie de principio de principios que, jugando con las palabras, y de una forma no del todo linguísticamente correcta, llamo meta-principios.


Un amago de definición de humanismo digital


Como un primer intento de definición voy a proponer, voy a proponerme, el siguiente amago de definición:


El humanismo digital es un disciplina que integra los saberes científicos, tecnológicos y humanísticos buscando entender y orientar la ciencia y la tecnología de forma que ambas no solo impulsen el desarrollo económico, sino que además, respeten y potencien los valores intrínsecamente humanos y sociales.


Ahí lo dejo. Me gustaría un poco más compacta...pero de momento no me parece mal como punto de partida. ¿Y a ti, estimado lector?


Los meta-principios de humanismo digital


Y ahora los principios, que podrían ser un primer borrador de manifiesto de humanismo digital. De momento he condensado las ideas que rondan mi cabeza en seis principios

  • VALORES: El humanismo digital está regido por valores que, a la espera de elaboración, se delegan transitoriamente en la declaración universal de derechos humanos.

  • INDIVIDUALIDAD: El humanismo digital apuesta por el valor de la individualidad humana, aunque integrada en un marco político y social regido por valores.

  • NEUTRALIDAD RELIGIOSA E IDEOLÓGICA: El humanismo digital no se adscribe a ninguna confesión religiosa ni ideología política concreta, aunque tampoco las niega ni menos aún las combate.

  • MULTIDISCIPLINARIEDAD: El humanismo digital se concibe como multidisciplinar integrando conocimientos del campo de la tecnología (especialmente tecnología digital, y con más foco aún en inteligencia artificial y analítica de datos) de la ciencia (en especial lo relativo a genómica y neurociencia) y las disciplinas humanísticas como filosofía, ética, sociología, antropología, derecho y política.

  • HUMANIDAD DE CIENCIA Y TECNOLOGÍA: El humanismo digital considera a la ciencia y la tecnología como disciplinas plenamente humanas, sin más conflicto o contradicción con la naturaleza y valores humanos que los que puedan derivar de un mal uso de las mismas.

  • AFIRMACIÓN DE CIENCIA Y TECNOLOGÍA: El humanismo digital tiene una visión positiva de ciencia y tecnología y entiende que, adecuadamente orientadas y gestionadas, sólo pueden redundar en el bienestar y progreso de individuos y sociedades.

Creo que los seis principios transmiten bien mis primeras ideas, pero también tengo la aguda sensación de estarme dejando cosas en el tintero, cosas que incluso puede que haya pensado alguna vez pero que no había escrito y ahora no acuden a mi.

Pero bueno, esto son metaprincipios, un producto mínimo viable de pensamiento en materia de humanismo digital y, por tanto, siempre puedo hacerlos crecer, modificarlos o pivotar. Esto no deja de ser una especie de innovación intelectual y, por tanto, es de naturaleza iterativa.


Artículos de este blog relacionados

viernes, 15 de mayo de 2020

Repasando la disciplina de Ingeniería Software con Ian Sommerville

'Software Engineering. Global Edition' es un libro de texto sobre Ingeniería de Software, un libro además que se puede considerar un clásico, siendo ésta su décima edición y quizá la última, puesto que su autor ya se encuentra juilado. A pesar de ello es una obra todavía actual, ya que ha evolucionado incorporando a su contenido las nuevas tecnologías y tendencias.

El libro, muy largo, consta de 25 capítulos y no deja prácticamente ningún tema relevante sin tocar. Eso si, los capítulos se agrupan en cuatro partes y la primera, que recoge los nueve primeros capítulos, ya sirve casi para dar una visión suficiente del campo de la ingeniería de software, entrando el resto de partes y capítulos en temas más especializados o en mayor profundidad. En concreto, la estructura es como sigue:
  • 'PART 1 INTRODUCTION TO SOFTWARE ENGINEERING:' Una primera parte que proporciona los conceptos básicos y, sobre todo, desarrolla los aspectos fundamentales de la ingeniería de software en cada una de las etapas de un proyecto tradicional. Una primera parte que cas podría ser un libro por si misma y que comprende nueve capítulos: 

    • 'Chapter 1 Introduction:' Un breve capítulo introductorio en que explica la necesidad de la ingeniería de software cuando se desarrolla de forma profesional, define conceptos, identifica escenarios diferentes de sistemas y propone una suerte de ética de la ingeniería del software. Luego presenta una serie de casos prácticos que utilizará a lo largo de todo el libro.

    • 'Chapter 2 Software process:' Describe los diferentes modelos de proceso como el waterfall, incremental, agile y las actividades que se realizan. Y cierra hablando de la mejora de esos procesos.

    • 'Chapter 3 Agile software development:' Se centra en el modelo agile de una forma genérica, sin circunscribirse a un framework específico. En ese formato, cuenta algunas de las técnicas habituales y cómo se realiza la gestión del proyecto y finaliza abordando la problemática del escalado de agile para grandes proyectos.

    • 'Chapter 4 Requirements engineering:' Aborda la fase inicial del proyecto: la toma de requisitos. Primero explica la distinción entre requisitos funcionales y no funcionales. Luego describe el proceso y a continuación desarrolla cada una de las etapas: elicitación, especificación y validación.

    • 'Chapter 5 System modeling:' Explica los diferentes modelos que se usan habitualmente en el análisis y diseño, centrándose en los que incluye UML: diagramas de contexto, de proceso, de interacción, de secuencia, de clases, etc. Y finaliza el capítulo hablando del enfoque model-driven.

    • 'Chapter 6 Architectural design:' Se pasa a la siguiente fase abordando el diseño de arquitectura. Aquí, el autor identifica las principales decisiones a adoptar y las diferentes perspectivas y luego describe algunos patrones comunes de arquitectura.

    • 'Chapter 7 Design and implementation:' Siguiente capítulo y fase que se adentra en el diseño detallado y en la codificación. Dedica bastante espacio a describir el diseño orientado a objetos, incluyendo los patrones de diseño y luego revisa algunas problemáticas habituales de la implementación.

    • 'Chapter 8 Software testing:' Capítulo dedicado a las pruebas del software en sus diferentes niveles. Explica, por ejemplo, los conceptos de verificación y validación. Luego habla de las pruebas de desarrollo, pruebas unitarias y de componente, y del enfoque test-driven. Y finaliza con sendas secciones dedicadas a las pruebas de versión y las pruebas de usuario.

    • 'Chapter 9 Software evolution:' Cierra este recorrido por el ciclo completo del desarrollo software hablando del mantenimiento y evolución. Primero describe ese proceso de evolución del software y luego dedica bastante espacio a hablar de los sistemas 'legacy' y su gestión. Finaliza el capítulo hablando del mantenimiento del software


  • 'PART 2 SYSTEM DEPENDABILITY AND SECURITY:' Una segunda parte, muy alineada con los intereses y e investigación personales del autor en materia de confiabilidad de los sistemas. Abarca los siguientes seis capítulos: 

    • 'Chapter 10 Dependable systems:' Comienza hablando de confiabilidad ('dependability') para lo cual, lo primero que se hace es identificar sus características. Luego se introduce el concepto de sistemas sociotécnicos, es decir, una visión holística de los sistemas que incluye, no sólo la parte técnica sino también procesos, organizaciones y sociedad. Luego aborda algunas técnicas y estrategias para la confiabilidad como son la redundancia y diversidad o la forma de hacer los procesos confiables. Finaliza describiendo los procesos formales

    • 'Chapter 11 Reliability engineering:' Aborda otro concepto específico de fiabilidad ('reliability'). Se identifican los requisitosde la fiabilidad y también algunas características para la fiabilidad como la disponibilidad, la tolerancia a fallos, la medición de la fiabilidad y la forma de programar para la fiabilidad.

    • 'Chapter 12 Safety engineering:' Habla de seguridad ('safety') empezando por los sistemas críticos, la identificación de requisitos de seguridad, el proceso de ingeniería de seguridad y finaliza con algunos casos.

    • 'Chapter 13 Security engineering:' Aborda ahora la seguridad en un sentido más de protección ante ataques ('security'). Habla de las dimensiones de la seguridad y la pone en relación con sistemas y organización. Luego habla de la identificación de requisitos de seguridad y del diseño para la seguridad donde proporciona varias directrices y finaliza abordando el aseguramiento y prueba de la seguridad.

    • 'Chapter 14 Resilience engineering:' Finaliza esta parte hablando de sistemas resilientes ('resilience') centrándose primero en la ciberseguridad, siguiendo por una resiliencia a nivel sociotécnológico y finalizando por el diseño para la resiliencia.


  • 'PART 3 ADVANCED SOFTWARE ENGINEERING:' Una tercera parte muy interesante aunque algo dispersa en cuanto a temática, que aborda aspectos concretos algo más avanzados o especializados que lo que se hizo en la primera parte. Incluye los siguientes siete capítulos: 

    • 'Chapter 15 Software reuse:' Aboirda la temática de la reutilización del software. Primero presenta una visión general de todos los niveles y formas de plantear la reutilización y luego pone foco en tres formas de reutilización: frameworks, líneas de producto y sistemas.

    • 'Chapter 16 Component-based software engineeering:' En clara relación con el capítulo anterior, trata el tema de los componentes software. En concreto, primero explica el concepto de componente y algunos modelos existentes. Luego explica los procesos de ingeniería software basados en componentes (CBASE) y finaliza con mecanismos de composición de componentes para obtener un resultado final.

    • 'Chapter 17 Distributed software engineering:' Habla de software distribuido, comenzando el capítulo con la estructuración de conceptos y siguiendo por la descripción de algunos modelos de interacción como RPC (Remote Procedure Call) o RMI (Remote Method Invocation). Luego ataca el modelo cliente-servidor y a continuación se detiene bastante en la descripción de varios patrones arquitecturales y de diseño. Y finaliza hablando del software como servicio.

    • 'Chapter 18 Service-oriented software engineering:' Con la base que proporcionan los dos capítulo anteriores, en éste ataca el concepto de servicio y las arquitecturas orientadas a servicios. Primero proporciona una ideas básicas. Luego explica el modelo SOA tradicional basado en Web Services SOAP para, a continuación, dedicar una sección a los modelos RESTful. Y luego se extiende para explicar un proceso de ingeniería orientado a servicios y la forma de componer servicios.

    • 'Chapter 19 Systems engineering:' Propone aumentar un poco el alcance de la ingeniería para contemplar el sistema en su conjunto y no sólo el software. Retoma el concepto de sistemas sociotecnológicos para proporcionar una visión que va más allá incluso del propio sistema como elemento técnico. Y luego desarrolla aspectos concretos de la ingeniería de sistemas como el diseño conceptual, la adquisición de sistemas, el desarrollo, la operación y la evolución.

    • 'Chapter 20 Systems of systems:' Contempla el caso más complejo en que varios sistemas se combinan de alguna forma para dar lugar a un sistema mayor. Propone una clasificación de estos sistemas de sistemas y realiza un análisis algo más filosófico y teórico sobre complejidad y reduccionismo. Y, finalmente, desarrolla el proceso de ingeniería de sistemas de sistemas y su arquitectura, incluyendo la descripción de algunos patrones arquitecturales.

    • 'Chapter 21 Real-time software engineering:' Un capítulo especializado dedicado al software de tiempo real. En primer lugar habla de sistemas empotrados y su diseño y luego repasa varios patrones de arquitectura para sistemas de tiempo real. Habla también del análisis de tiempos y finaliza explicando ideas sobre sistemas operativos de tiempo real.


  • 'PART 4 SOFTWARE MANAGEMENT:' Una última parte que, como su título anuncia, está dedicada a aspectos no técnicos sino de gestión 

    • 'Chapter 22 Project management:' Un capítulo en que habla de dirección de proyectos, con un enfoque bastante tradicional y deteniéndose, específicamente, en la gestión de riesgos, la gestión de personas y el trabajo en equipo.

    • 'Chapter 23 Project planning:' En cierto modo, una continuación del capítulo anterior pero ahora muy centrado en la planificación, incluyendo también aspectos económicos de costes y precios. Empieza justamente por la temática de precios pero en seguida pasa a la planificación, explicando la planificación basada en diagramas de Gantt y el enfoque de planificación de Agile. Y luego aborda las técnicas de estimación donde explica con bastante detalle el modelo COCOMO.

    • 'Chapter 24 Quality management:' Otro aspecto, aunque especializado, de la dirección de proyectos que es la calidad. Primero se introducen aspectos generales y algunos estándares como ISO 9001. Luego se habla específicamente de las técnicas de revisiones e inspecciones de código y también se dedica una sección específica a la gestión de calidad en Agile. Y se finaliza con una larga sección dedicada a la medición y analítica de características del software

    • 'Chapter 25 Configuration management:' Capítulo final dedicado al control de configuración, donde se habla de la gestión de versiones, de cómo realizar la construcción de una versión concreta, incluyendo todos sus elementos y no sólo el software (documentación, configuración, etc), cómo gestionar los cambios y cómo gestionar las diferentes 'releases'.

'Software Engineering. Global edition' es una visión amplia, ordenada, rigurosa y bastante actualizada del campo de la ingeniería de software. Con un enfoque más bien tradicional pero muy puesto al día en cuanto a tecnologías y enfoques como agile y tratando algunos temas muy específicos y no tan fáciles de encontrar como la ingeniería de software de tiempo real.

Es, eso si, un libro austero y desapasionado, sin inguna concesión ni a la literatura ni al marketing. Un libro, realmente, de estudio o consulta, y no tanto para una lectura.

En cualquier caso, una muy buena referencia en este campo de la ingeniería de software que ya proporciona pocas nuevas obras si no consideramos las dedicadas en exclusiva a Agile.

Ian Sommerville

(Fuente: Traducción y ligera elaboración propia de su entrada en Wikipedia)

Ian Sommerville
Ian F. Sommerville, nacido el 23 de Febrero de 1951, es un académico británico. Es autor de un popular libro de texto sobre ingeniería de software, así como de otros libros y artículos. Trabajó como profesor de Ingeniería de Software en la Universidad de St Andrews en Escocia hasta 2014 y es un investigador prominente en el campo de ingeniería de sistemas, fiabilidad de sistemas e informática social, siendo un temprano abogado defensor de un enfoque multidisciplinar a la fiabilidad de sistemas.

Ian Sommerville nació en Glasgow. Estudió Física en la Strathclyde University y CIencia de los Computadores en la University of St Andrews. Está casado y tiene dos hijas. Es un gourmet amateur y ha escrito varias reseñas sobre restaurantes.

Ian Sommerville fue profesor numerario en Ciencia de los Computadores en la University of St Andrews desde 1975 a 1978 y en la Strathclyde University desde 1978 a 1986. De 1986 a 2008, fue profesor de Ingeniería Software en el Computing Department en la University of Lancaster y en Abril de 2006 se unió a la School of Computer Science en la St Andrews University, donde impartió cursos de ingeniería de software avanzada e ingeniería de sistemas críticos. Se jubiló en Enero de 2014 y desde entonces continua realizando actividades relacionadas con la ingeniería de software que considera interesantes.

El trabajo de investigación de Ian Sommerville, parcialmente financiado por EPSRC, ha incluido ingeniería de requisitos de sistemas y evolución de sistemas. Un foco importante ha sido la fiabilidad de sistemas, incluyendo técnicas de análisis social como la etnografía para entender mejor como personas y ordenadores proporcionan conjuntamente la fiabilidad. Fue socio del consorcio IRC (Interdisciplinary Research Collaboration in Dependability) que se concentraba el diseño de sistemas confiables y ahora trabaja en el proyecto relacionado INDEED (Interdisciplinary Design and Evaluation of Dependability). También ha sido miembro del comité de asesores del proyecto REAIMS (Requirements Engineering adaptation and improvement for safety and dependability).

En 2006, Ian Sommerville fue uno de los académicos en el campo de la computación que escribió cartas abiertas pidiendo una auditoría independiente del British National Health Service's proposed Programme for IT (NPfIT) y expresando su preocupación por el programa de 12,4 billones de libras.

Puedes saber más del autor visitando su página oficial o siguiéndole en twitter donde se identifica como @IanSommerville.

Ficha técnica:

EDITORIAL: Pearson
AÑO: 2015 
ISBN: 978-1292096131
PAGINAS: 816

Artículos de este blog relacionados

miércoles, 13 de mayo de 2020

Estructura de una red neuronal y el inicio de una catalogación sencilla


Un aspecto curioso de una tecnología tan avanzada y de resultados tan espectaculares como es el deep learning, es que en su seno sólo sea medianamente científica. Y digo sólo medianamente científica, sin desprecio ninguno y muy a pesar de su complejo e ingenioso aparato matemático. Y lo digo por el hecho de que no existe un camino recto para el diseño adecuado de una red neuronal de Deep Learning. Cuenta, por el contrario, bastante la experiencia y el ensayo y error.

Sin embargo, existe ya una buena experiencia acumulada y ciertas recetas o buenas prácticas aprendidas. Y con base en ello, hay bastantes aspectos del diseño de la red que están bastante claros, algunas líneas que seguir dependiendo del problema tratado. Unas líneas, además, bien documentadas.

Me he propuesto ir haciendo, en varios artículos que vendrán, una suerte de catálogo de componentes de las redes neuronales. Con ello me refiero a un censado de las opciones disponibles en diferentes aspectos del diseño con indicación básica de características y ámbito de aplicación.

Se trata más bien de un ejercicio de recapitulación y orden y no aportaré con ello nada realmente original, sino que me basaré en lo que he encontrado en dos de mis últimas lecturas: 'Deep Learning con Python' de François Chollet, y 'Python Deep Learning: Introducción práctica con Keras y TensorFlow 2' de Jordi Torres, dos libros con explicaciones muy claras y fundamentadas y que tienen no sólo una cercanía a nivel de título sino también de forma de explicarlo.

Pero antes de iniciar ese censo, quiero recuperar una figura (también presente con aspecto muy parecido en ambas obras), una figura que explica la estructura y elementos fundamentales de las redes neuronales y que me servirá de guía, también, para estructurar ese catálogo de componentes. Se trata de esta figura:



En la figura, se puede ver la estructura de la red, de donde extraemos los siguientes cuatro elementos:

  • Capas: Es el elemento fundamental. Hay ciertas variantes, ciertos hiperparámetros como se suele expresar, para definir la red en lo relativo a las capas (número de capas, número de neuronas por capa, etc). Pero de cara al catálogo que mencionaba arriba, me fijaré básicamente en el tipo de capa (o combinaciones de capa). Ya veremos si más adelante, me interesa profundizar más.

  • Función de activación: No se observa en el dibujo, pero es la función que rige la salida de las neuronas, especialmente relevante en las capas de salida. Dado que tiene relevancia en relación con el problema a tratar, hablaremos de ella en el catálogo.

  • Función de pérdida: La función que calcula cuán lejos está el resultado que produce la red del esperado, y que constituye la entrada fundamental para el aprendizaje.

  • Optimizador: Que, en función de lo que obtiene como entrada de la función de pérdida, 'decide' en qué cuantía y dirección modificar los parámetros de las capas, típicamente sus pesos. 

Existen bastantes más variantes, bastantes más hiperparámetros a elegir para definir una red neuronal pero creo que, al menos inicialmente, me circunscribiré a esos cuatro elementos a la hora de traer a este blog ese catálogo de componentes de redes neuronales.

Empiezo la semana que viene.


lunes, 11 de mayo de 2020

¿Quién enseña a los algoritmos? Explicación, conclusión y una consecuencia ética


Los algoritmos más usados actualmente en Inteligencia Artificial hoy en día, aquellos que producen los mejores y más útiles resultados, se encuadran dentro de lo que se conoce como machine learning y, más concretamente, dentro del deep learning, una variante que usa redes neuronales profundas, es decir con varias, muchas, capas.

Es bastante conocido, o eso quiero creer, que estos algoritmos parten de un modelo básico que luego debe ser entrenado, proceso mediante el cual el algoritmos aprende, lo que se traduce en la práctica en un ajuste de parámetros hasta conseguir producir el resultado deseado.


Aprendizaje de los algoritmos


Existen, básicamente, tres tipos de aprendizaje: el supervisado, el no supervisado y el aprendizaje por refuerzo, con alguna variante como el autosupervisado.

En el aprendizaje supervisado se le proporcionan al algoritmo ejemplos (muchos ejemplos) de datos de entrada y los datos de salida esperados, es decir, se le muestra al algoritmo cuál es la respuesta correcta ante una entrada concreta. Y con base en esa información se ajustan los parámetros del algoritmo.

En el aprendizaje no supervisado, sin embargo, no se le indica al algoritmo cuál es la respuesta correcta porque lo que se pretende es que el algoritmo sea el que identifique regularidades, patrones y clusteres en los datos de entrada. Pero, a cambio se le marcan el tipo de objetivos que tiene que perseguir.

Finalmente, en el aprendizaje por refuerzo, el algoritmo aprende por ensayo y error. Intenta una solución y recibe una recompensa o castigo en función de si esa solución es adecuada o no.


¿Quién enseña a los algoritmos?


En el caso del aprendizaje supervisado, vemos muy claramente que son los humanos, los desarrolladores o científicos de datos, lo que le indican al algoritmo cuál es la respuesta correcta ante cada entrada. Es decir, son humanos los que educan al algoritmo.

Puede parecer que, sin embargo, en el caso del aprendizaje no supervisado o por refuerzo que el algoritmo aprende sólo, que es autónomo en ese aprendizaje. Sin embargo, Jordi Torres, en su libro 'Python Deep Learning: Introducción práctica con Keras y TensorFlow 2' nos advierte de que eso no es exactamente así. En concreto, afirma

Es importante notar que ambos paradigmas de aprendizaje - no supervisado y por refuerzo- requieren que el entrenamiento esté diseñado por un humano.

Nos indica el profesor Torres que, en el caso del aprendizaje no supervisado, aunque el algoritmo es el que busca los patrones, recibe indicaciones acerca de qué objetivos tiene que perseguir en esa búsqueda. Es decir, los humanos están cuando menos condicionando el aprendizaje del algoritmo.

Por su lado, en el aprendizaje por refuerzo, son los humanos los que definen las recompensas o castigos y, por tanto, indirectamente, qué es un comportamiento adecuado.

El autor concluye que:

los entrenadores humanos, aunque no intervienen directamente en el bucle del aprendizaje, sí definen los límites del aprendizaje en ambos casos.

En resumen, en todos los casos de aprendizaje vistos, los humanos, o bien instruyen directamente al algoritmo (aprendizaje supervisado), o bien diseñan claramente los límites de ese aprendizaje.


Una consecuencia ética


Como conclusión, podríamos decir que son los humanos los que enseñan a los algoritmos.

Cierto que en algunos casos, más que enseñar directamente, condicionan el aprendizaje. Y cierto que se investigan y prueban otras formas de aprendizaje que podrían resultar más autónomas. Pero hoy en día, y más teniendo en cuenta la preponderancia del aprendizaje supervisado, podemos quedarnos con esa idea básica de que son los humanos los que educan a los algoritmos.

Eso, por un lado, nos debe llevar a evitar fantasías, procedentes de la tendencia hacia la antropomorfización de la inteligencia artificial, que confieren cierta personalidad y autonomía al algoritmo como si éste pensase, dedujese y decidiese por su cuenta y riesgo, No es así, los algoritmos hacen lo que se les ha enseñado, lo que le hemos enseñado los  humanos, o al menos, lo que cae dentro de los límites que les hemos establecido durante su aprendizaje.

Por otro lado, cuando pensamos en los sesgos que se producen en los algoritmos, debemos evitar de nuevo la desviación antropomórfica de atribuírselos a alguna malicia o intención del algoritmo. No es así. Los algoritmos sólo reconocen patrones en los datos con que se les ha entrenado. Si el algoritmo produce sesgos es porque se le ha enseñado con datos que tienen sesgos.

Ni los algoritmos ni los robots controlan el proceso. Lo hacemos los humanos.

Si el algoritmo produce algún resultado éticamente cuestionable, no le echemos la culpa al algoritmo o a la inteligencia artificial. Somos nosotros los que le hemos enseñado. Es nuestra responsabilidad. Asumamosla.


viernes, 8 de mayo de 2020

Aprendiendo Deep Learning y Keras con François Chollet

'Deep Learning con Python' es un libro sobre Machine Learning, y más en concreto Deep Learning, en que su autor parece proponerse un doble propósito tratado a partes iguales: por un lado explicar los fundamentos de Deep Learning y, por otro, el uso de la librería Keras, una librería de Deep Learning de alto nivel escrita en Python y creada por el propio autor del libro.

Así. el autor aprovecha en la mayor parte de los capítulos para, por un lado explicar algún algoritmo o alguna particularidad de uso de los algoritmos de Deep Learning y, por otra, introducir alguna nueva función o facilidad de Keras.

El libro se estructura en nueve capítulos agrupados en dos partes conforme al siguiente esquema:
  • 'PARTE 1. FUNDAMENTOS DEL DEEP LEARNING:' una visión algo más transversal e introductoria del deep learning y compuesta por cuatro capítulos, a saber:
    • 'Capítulo 1 ¿Qué es el deep learning?:' Un primer capítulo algo menos práctico que el resto pero muy interesante e ilustrativo donde explica los conceptos de inteligencia artificial, machine learning y deep learning y cómo se relacionan entre sí. Además introduce algunos fundamentos muy básicos pero relevantes de los algoritmos del machine learning y también intenta explicar las razones del auge actual del deep learning.

    • 'Capítulo 2 Los bloques de construcción matemáticos de las redes neuronales:' Comienza 'tirando a la piscina' al lector con un primer ejemplo de red neuronal en Keras para clasificar dígitos manuscritos. Con esa base explica conceptos sobre tensores y sus operaciones y luego el algoritmo de descenso de gradiente.

    • 'Capítulo 3 Iniciarse en las redes neuronales:' Revisa de una forma algo más tranquila y estructurada los elementos de una red neuronal y su implementación en Keras. Comienza explicando, con la ayuda de un diagrama de bloques, el funcionamiento general de una red neuronal y los conceptos de capas, funciones de pérdida y optimizadores. Luego hace una breve introducción a Keras incluyendo cómo instalar y configurar una estación de trabajo para trabajar con Keras, que luego detalla en dos anexos. A continuación desarrolla dos ejemplos de clasificación: primero una clasificación binaria de críticas de películas y luego una clasificación multiclase de noticias de Reuters. Finalmente, desarrolla un último ejemplo, en este caso no de clasificación sino de regresión para el caso de predicción de precios de casas.

    • 'Capítulo 4 Fundamentos del machine learning:' En este capítulo vuelve a un enfoque algo más teórico y de fundamentos. Comienza por explicar los diferentes tipos de aprendizaje usados en machine learning. A continuación explica cómo validar un modelo de machine learning. Salta luego a abordar el procesamiento previo de los datos y la ingeniería de características, para continuar con una explicación sobre lo que es y cómo gestionar el sobreajuste y el subajuste. Y finaliza el capítulo propooniendo un flujo universal de trabajo en machine learning.


  • 'PARTE 2. DEEP LEARNING EN LA PRÁCTICA:' donde en cada capítulo aborda tipologías de uso diferentes el deep learning. Incluye cinco capítulos:
    • 'Capítulo 5 Deep learning para visión por ordenador:' Comienza con una explicación de cierto detalle sobre el funcionamientode las redes de convolución y luego desarrolla un ejemplo que trata imágenes de gatos y perros. Luego explica y ejemplifica mediante un ejemplo la importante idea del uso de redes preentrenadas. Y finaliza contando cómo visualizar la evolución durante el aprendizaje de las redes de convolución

    • 'Capítulo 6 Deep learning para texto y secuencias:' Este capítulo ataca el tratamiento de series temporales y de textos apoyándose en redes recurrentes y en redes de convolución 1D. Comienza explicando conceptos de trabajo con texto como los 'embeddings' de palabras o la codificación 'one-hot'. Luego cuenta cómo son y funcionan las redes recurrentes y las capas LSTM ('Long Short-Term Memory') y GRU ('Gated Recurrent Unit') de Keras. Continua explicando ciertos detalles apoyándose en un ejemplo de predicción de temperatura atmosférica. Finaliza con el uso de redes de convolución para el tratamiento de secuencias.

    • 'Capítulo 7 Prácticas adecuadas de deep learning avanzado:' Explica algunas prácticas algo más avanzadas como el uso del API funcional de Keras, monitorización y actuación de las redes durante el entrenamiento, normalización de lotes, optimización de hiperparámetros, etc

    • 'Capítulo 8 Deep learning generativo:' Se introduce en, si se quiere, la parte más creativa del deep learning abordando temas como la generación de texto con redes recurrentes generativas o la creación de imágenes mediante la técnica de DeepDream. Sigue con la generación de imágenes mediante autocodificadores variacionales y finaliza dando algunas ideas sobre redes antagónicas.

    • 'Capítulo 9 Conclusiones:' Un capítulo final, excelente y muy útil, que resume las principales ideas vistas a lo largo de todo el libro, nos explica algunas de las limitaciones actuales del deep learning y hace unas apuestas sobre el futuro de esta disciplina.

El libro incluye un par de anexos donde se explia con detalle cómo instalar y configurar Keras en dos entornos: Ubuntu y Notebooks Jupyter sobre una instancia de GPU en AWS (EC2).

El estilo de todo el libro es claramente didáctico, intentando hacer muy accesibles todos los conceptos de deep learning explicados. No obstante, conviene estar advertidos de que pese a esas buenas intenciones, y buena ejecución también, el texto no es del todo sencillo dada la complejidad de la materia que trata y podríamos decir que uniendo esos factores contrapuestos, complejidad inherente y estilo didáctico, el resultado es dificultad media salvo, claro está, que ya se sea conocedor, y con base sólida, de deep learning y de python, siendo menos relevante, en mi opinión, el conocimiento previo de Keras.

Se trata, en cualquier caso, de un muy buen libro. Bien explicado, ponderado, ordenado y con abundancia de ejemplos en modo de código y de menciones a su uso y problemáticas de la vida real.

Sin duda, una gran referencia.

François Chollet

(Fuente: Traducción y ligera elaboración propia de su perfil en LinkedIn)

François Chollet
François Chollet es Investigador en Inteligencia Artificial trabajando actualmente en Google.

Es el creador de Keras (keras.io) un muy popular framework de Deep Learning para Python, con más de 350.000 usuarios y más de 700 contribuidores en software abierto (datos de la segunda mitad de 2019). Keras está siendo usada por u considerable número de startups y laboratorios de investigación (incluyendo al CERN, Microsoft Research y NASA), y por grandes compañías como Netflix, Yelp, Square, Uber, Google, etc.

Es autor de artículos aceptados en grandes conferecnias como CVPR, NIPS, ICLR, etc.

Autor del libro 'Deep learning with Python' cib más de 30.000 copias vendidas (hasta la segunda mitad de 2019)

Fundador de Wysp (wysp.ws), una red social y plataforma de aprendizaje para artistas con más de 20.000 usuarios activos mensuales en 2016.

Puedes saber más del autor visitando su página oficial o siguiéndole en twitter donde se identifica como @fchollet.

jueves, 7 de mayo de 2020

#resistiré como llamada a la acción. Vídeo de cierre del webinar "La aportación de RPA y la automatización inteligente ante una crisis"


El pasado 4 de Mayo, impartí un webinar titulado "La aportación de RPA y la automatización inteligente ante una crisis" comprendido dentro del programa de formación abierta de la Escuela de Organización Industrial.

El objetivo principal era explicar los conceptos fundamentales de la Automatización Robótica de Procesos (RPA) de una forma asequible. Pero el webinar se extendía algo más allá y en realidad, tenía tres partes:

  • 1. Automatización inteligente y robots software: Un poco a modo de contexto explicaba conceptos básicos como inteligencia artificial, automatización, automatización inteligente y robot.

  • 2. Automatización Robótica de Procesos: La parte nuclear con la explicación del concepto de RPA, la tecnología que hay detrás, la aplicabilidad, el mercado y la proposición de valor.

  • 3. Ante una crisis: Una parte algo más especulativa y un poco obligada por el contexto actual, en que valoraba la crisis de COVID19 y el papel desempeñado hasta la fecha por la tecnología en general y los robots RPA en particular. Y tras esa valoración hacía una apuesta absolutamente personal por un modelo de futuro, un modelo de futuro más digital, más automático y más inteligente.

En esa última parte hice una llamada a la acción en que apoyándome en el quizá ya manido lema del 'resistire', pedí convertir la pura resistencia en un plan de acción combinando por un lado tecnología y automatización y por otro, plan de continuidad y un liderazgo plenamente humano.

Para cerrar el webinar hice, como es bastante frecuente en mis acciones formativas, un resumen de lo tratado. Pero esta vez lo hice en forma de vídeo, un vídeo con la música y en ocasiones la imagen del famoso tema que nos ha acompañado insistentemente en esta crisis.

Durante la preparación del webinar dudé en varias ocasiones entre si cerrar de esta forma o no por varios motivos que ya casi prefiero no detallar. Incluso, con el vídeo ya terminado (y me dio bastante trabajo, puedo asegurarlo), estuve dudando si mantenerlo o eliminarlo.

Al final opté por lo primero, y lo mantuve como forma de cierre, antes del turno de preguntas. Los asistentes sabrán si les pareció o no una buena idea.

Y, aunque no es el mismo efecto verlo aislado que tras todo el desarrollo del webinar, aquí dejo el susodicho vídeo, para que lo valoren, si lo desean, los lectores de este blog.

miércoles, 6 de mayo de 2020

Un flujo de trabajo universal para Machine Learning


La Inteligencia Artificial y el Machine Learning tienen un algo de magia.

Una magia que se manifiesta en las asombrosas capacidades que pueden aportar a software y robots, la magia más interesante y casi espectacular, aunque cada vez estemos más acostumbrados a ella.

Y otra parte de magia, no tan positiva, a nivel de metodología ya que, pese a todos los estudios e incluso resultados, la elección de las arquitecturas de los modelos, en especial redes neuronales en deep learning, el número y tipo de capas, las formas de aprendizaje y activación, etc se guían más por la experiencia e incluso el ensayo y error, que por una teoría sólida.

A pesar de ello, existe una cierta metodología de trabajo, una manera más o menos generalizada de afrontar un proyecto o problema que queremos resolver mediante machine learning.

De hecho, en su libro 'Deep Learning con Python', el creador de Keras, François Chollet, nos propone lo que él denomina un flujo de trabajo universal, un modelo de trabajo con siete fases:

  • Definición del problema y montaje de un conjunto de datos: Algo que parece evidente, pero que tiene más importancia y en algún caso dificultad de lo que parece. Por un lado hay que tener claro cuáles serán los datos de entrada para el algoritmo, típicamente una red neuronal de deep learning, y cuáles los datos de salida. En ese sentido, el autor nos advierte de que esa elección lleva implícitas dos importantísimas hipótesis: por un lado que realmente las salidas se pueden deducir de las entradas y, por otro, que los datos de que disponemos de cara al entrenamiento son suficientemente informativos como para que se pueda aprender la relación subyacente entre entradas y salidas que es lo que, en el fondo, nos interesa. Además, debemos tener claro el tipo de problema que afrontamos: una clasificación, una regresión, etc ya que eso, aparte de ser metodológicamente imprescindible, nos ayuda, y mucho, a seleccionar la arquitectura de la red.

  • Elección de la medida de éxito: Es decir, se trata de poner unos objetivos al algoritmo y cuantificarlos. Se trata de tener claro si queremos conseguir que el algoritmo sea exacto, o preciso o cualquier otra cosa, lo cual lleva a la elección o a veces definición personalizada de la métrica con que evaluaremos los resultados.

  • Decisión acerca del protocolo de evaluación: que tiene que ver con la forma en que se dividen los datos para, por un lado, entrenamiento del modelo y, por otro, evaluación del mismo. El autor menciona tres estrategias básicas (que no vamos a detallar ahora): hold-out, validación cruzada de K iteraciones y validación cruzada de K iteraciones aleatoria.

  • Preparación de los datos: una fase de trabajo que en la práctica puede resultar muy laboriosa y ocupar mucho tiempo de los ingenieros o científicos de datos. Los datos deben formatearse de manera que se conviertan en tensores, que es con lo que al final acaban terminando los algoritmos. Normalmente, además, esos valores deben escalarse para que tomen valores pequeños, por ejemplo entre 0 y 1. Además, con frecuencia es preciso normalizar los datos, es decir, hacer que datos que se mueven en rangos de valores muy diferente se mapeen a otros rangos similares. Finalmente, suele ser necesario hacer la denominada ingeniería de características para refinar los datos con base al conocimiento real del dominio en que trabajamos.

  • Desarrollo de un modelo mejor que el de referencia: Es el momento de elegir el modelo de red que vamos a utilizar. El modelo de referencia a que se refiere el título de la fase es un modelo de sentido común y muy sencillo que podemos usar como alternativa. Existen casos en que un modelo casi trivial y fuera del ámbito de la inteligencia artificial obtiene mejores resultados que un modelo muy elaborado. Evidentemente, si utilizamos machine learning es para intentar mejorar eso. En cualquier caso, en esta fase definimos la arquitectura de nuestra red y diversos elementos de ella como número y tipo de capas. Pero el autor señala como fundamentales en esta fase tres decisiones: la función de activación de la capa de salida, la función de pérdida y el optimizador usado durante el aprendizaje.

  • Desarrollo de modelos con sobre-ajuste: Los modelos de machine learning se mueven siempre entre el sobre-ajuste (nos hemos pasado con el entrenamiento y el algoritmo predice muy bien sobre los datos de entrenamiento pero no sobre otros diferentes) y el subajuste en que al algoritmo no produce buenos resultados, ni siquiera con los datos de entrenamiento). El óptimo es situarse justo en la frontera entre el sub-ajuste ('under-fitting') y el sobre-ajuste ('over-fitting´). Para buscar esa frontera, para conocer dónde se encuentra, conviene forzar el sobre ajuste lo cual se puede conseguir en general con modelos más complejos con más capas, más neuronas por capa o con más ciclos de entrenamiento.

  • Regularización del modelo y ajuste de hiper-parámetros: La fase más larga y donde se juega con el ensayo y error. Se trata de ensayar con las diferentes opciones de los modelos como el número de capas o de unidades por capa, mediante la aplicación de técnicas especiales como el 'dropout' o las regularizaciones, o mediante la identificación de nuevas características aplicando ingeniería de características.

Aunque se nos habla de un modelo universal para el machine learning, en el fondo el autor lo explica claramente para deep learning. No obstante, creo que el planteamiento es bastante generalizable.

Y se puede observar cómo, a pesar de las grandes dosis de matemática e ingeniería que atesora el deep learning, al final hay bastantes decisiones y opciones que se hacen mediante prueba y error aunque la experiencia y el razonamiento ayuden bastante a saber qué probar.

Un método de trabajo con unas incertidumbres que no parecen extrañas en un trabajo de Investigación y Desarrollo, pero que me resultan curiosas cuando las contemplo en el marco de un proyecto empresarial. Pero ese es el estado del arte, así debemos trabajar mientras no encontremos algo mejor, y trabajando así se han conseguido enormes éxitos en los últimos años, que nos proporcionan el verano de la Inteligencia Artificial que estamos viviendo.