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.