Qué es deep learning: caso práctico en EDICOM (Parte I)

En este artículo nos preguntamos si es posible programar un algoritmo que califique de forma automática la complejidad de una nueva tarea. Haremos un repaso a los conceptos básicos de inteligencia artificial, machine learning y deep learning.

    Artículo elaborado por:

    Jose Blas Vilata

    Director Técnico y socio fundador de EDICOM

Introducción

En EDICOM cada requerimiento de cliente genera en nuestro sistema de gestión una tarea técnica donde se recopilan diferentes datos como la descripción del trabajo a realizar, el cliente solicitante, fechas de trazabilidad, el número de jornadas que se le facturarán al cliente por dicho trabajo, etc. A continuación un responsable experto califica la complejidad de esta tarea en un orden del uno al cinco de forma manual. En base a esta calificación se le asignará para su ejecución un director de proyecto técnico con las competencias adecuadas. También servirá esta calificación para hacer un mejor ajuste de la capacidad de los técnicos en base al número de proyectos que gestionan según su complejidad.

En este artículo nos preguntamos si es posible programar un algoritmo que califique de forma automática la complejidad de una nueva tarea simulando de esta forma lo que actualmente hace un humano experto, apoyándonos en el conocimiento de todos los datos de tareas técnicas actualmente almacenadas en nuestro sistemas de gestión durante décadas y debidamente calificadas por un humano.

Aunque se puede intentar abordar el problema desde un punto de vista de algorítmica tradicional, vemos con bastante claridad que la definición de este problema encaja bien dentro de los algoritmos de inteligencia artificial, en concreto en la rama de machine learning e hilando más fino en su versión más moderna deep learning.

En este primer artículo, haremos un repaso a los conceptos básicos de inteligencia artificial, machine learning y deep learning. En el siguiente artículo, nos centraremos en la implementación de un sistema de deep learning que solvente el problema planteado.

Inteligencia artificial, machine learning y deep learning

Durante los últimos años, el interés y la aplicación de la inteligencia artificial (IA) ha experimentado un fuerte crecimiento de forma que se ha convertido en una disciplina aplicada en prácticamente todos los ámbitos de investigación académica e industrial.

Este hecho es debido en gran parte a que en la década de los 80 apareció una rama de la IA, el aprendizaje automático o machine learning (ML), que utiliza algoritmos matemáticos que permiten a las máquinas aprender. El machine learning seguramente desempeñará un papel clave en el futuro de la civilización.

Los algoritmos de machine learning aprenden de los datos introducidos y luego utilizan este conocimiento para sacar conclusiones de nuevos datos ya sean de tipo discreto clasificando en categorías o predicciones de resultados numéricos continuos.

Ya en el siglo XXI, en el año 2011, apareció una rama del machine learning llamada aprendizaje profundo o deep learning (DL). El deep learning se distingue del machine learning tradicional en que este último trabaja con algoritmos de regresión o con árboles de decisión y el deep learning, adicionalmente, usa redes neuronales artificiales que funcionan de forma muy parecida a las conexiones neuronales biológicas de nuestro cerebro. A nivel práctico, para problemas con muchas variables, es mucho más fácil programar un sistema de deep learning que desarrollar una fórmula de regresión para un algoritmo de machine learning tradicional. De ahí que el deep learning haya contribuido de forma decisiva al auge de la inteligencia artificial.

El machine learning, en general, utiliza diferentes tipos de algoritmos para encontrar patrones en los datos. Estos algoritmos se pueden clasificar en tres grupos:

  • Aprendizaje automático supervisado: el objetivo general de estos algoritmos es predecir un resultado a partir de la entrada que le proporcionamos en cada momento. Para ello, el programa se “entrena” con un conjunto predefinido de “datos de ejemplo o entrenamiento” para los que conocemos el resultado a predecir y crea con ellos estructuras (modelos) que los representan. Una vez que los modelos han sido generados, se pueden emplear para predecir resultados tomando como entrada nuevos datos no presentes en la muestra de entrenamiento. Es importante recordar que, los sistemas de machine learning “aprenden” patrones que están presentes en los datos con los que se entrenan, por lo tanto, solo pueden reconocer escenarios similares a lo que han visto antes. Al emplear sistemas entrenados con datos pasados para predecir resultados futuros se está asumiendo que, en el futuro, el comportamiento será similar, cosa que no siempre ocurre.
  • Aprendizaje automático no supervisado: el programa recibe una gran cantidad de datos y debe encontrar patrones y correlaciones en ellos, es decir, nos ayuda a encontrar relaciones entre los datos que a priori no se conocían, es decir, este tipo de algoritmos nos ayudan a conocer mejor nuestros datos. Abordan los siguientes tipos de problemas: familiaridad, análisis de componentes principales, agrupamiento, prototipado y extracción y relación de características.
  • Aprendizaje reforzado: el objetivo es construir un modelo con un agente que mejora su rendimiento basándose en la recompensa obtenida del entorno con cada interacción que se realiza. La recompensa es una medida de lo correcta que ha sido una acción para obtener un objetivo determinado. El agente utiliza esta recompensa para ajustar su comportamiento futuro con el objetivo de obtener la recompensa máxima.

En este artículo nos centraremos exclusivamente en al aprendizaje automático supervisado.

Aprendizaje automático supervisado

El procedimiento general es el siguiente:

  1. Tenemos un algoritmo que tiene un puñado de ejemplos etiquetados, digamos, 10 imágenes de perros con la etiqueta 1 (“Perro”) y 10 imágenes de otras cosas con la etiqueta 0 (“No perro”).
  2. El algoritmo “aprende” a identificar imágenes de perros y, cuando se le da una nueva imagen, espera producir la etiqueta correcta (1 si es una imagen de un perro y 0 en caso contrario).

Esta configuración se puede aplicar a muchos problemas de la vida real donde los datos de entrada pueden ser síntomas y sus etiquetas enfermedades; o donde los datos podrían ser imágenes de caracteres escritos a mano y sus etiquetas los caracteres reales que representan, etc.

En este artículo trataremos de resolver el problema real de EDICOM de calificar de forma automática la complejidad de una tarea técnica en un orden del uno al cinco basado en la decisión humana experta previa almacenada en el sistema de gestión de la empresa.

Hay dos aplicaciones principales de aprendizaje supervisado: clasificación y regresión.

Clasificación es una subcategoría de aprendizaje supervisado en la que el objetivo es predecir las clases categóricas (valores discretos, no ordenados, pertenencia a grupos). El ejemplo típico es la detección de correo spam, que es una clasificación binaria (un email es spam — valor “1”- o no lo es — valor “0” -). También hay clasificación multiclase, como el reconocimiento de caracteres escritos a mano (donde las clases van de 0 a 9) o el problema real propuesto de EDICOM que tratamos de resolver en este artículo ya que la salida será un número discreto del 1 al 5.

La regresión se utiliza en sistemas donde el valor que se predice cae en algún lugar de un espectro continuo. Estos sistemas nos ayudan con las preguntas “¿Cuánto?” o “¿Cuántos?”. En este tipo de aprendizaje tenemos un número de variables predictoras (explicativas) y una variable de respuesta continua (resultado), y se tratará de encontrar una relación entre dichas variables que nos proporcionen un resultado continuo.

Deep learning – redes neuronales

El aprendizaje profundo o deep learning es un subcampo de machine learning que se caracteriza por una gran cantidad de cálculos. Esta profundidad de cálculo, a través de redes neuronales artificiales, es lo que ha permitido que los modelos de aprendizaje profundo desentrañen los tipos de patrones complejos y jerárquicos que se encuentran en los conjuntos de datos más desafiantes del mundo real.

Las redes neuronales, a través de su poder y escalabilidad, se han convertido en el modelo definitorio del deep learning. Las redes neuronales están compuestas por neuronas, donde cada neurona individualmente realiza solo un cálculo simple. El poder de una red neuronal proviene, en cambio, de la complejidad de las conexiones que pueden formar estas neuronas.

Las redes neuronales se organizan en capas o layers compuestos por neuronas o units. Cada neurona de una capa está conectada con las neuronas de la capa anterior mediante pesos y produce un resultado que se le pasa a todas las neuronas de la capa siguiente.

La primera capa de la red neuronal toma datos en bruto como entrada, en nuestro caso, los datos de una tarea técnica, los procesa, extrae información y la transfiere a la siguiente capa como salida. Este proceso se repite en las siguientes capas. Cada capa procesa la información proporcionada por la capa anterior, y así sucesivamente hasta que los datos llegan a la capa final, que es donde se obtiene la predicción. Este movimiento de cálculos a través de la red se denomina propagación hacia adelante o forward propagation.

Si estamos en modo producción, la predicción obtenida será el resultado a devolver, si por el contrario todavía estamos en modo entrenamiento del modelo, esta predicción se compara con el resultado conocido y así identifica errores en las predicciones, les asigna pesos y sesgos, y los empuja a capas anteriores para entrenar o refinar el modelo. A este proceso se le llama retropropagación o backpropagation. En conjunto, la propagación hacia adelante y hacia atrás permiten que la red haga predicciones sobre la identidad o la clase del objeto mientras aprende de las inconsistencias en los resultados. El resultado es un sistema que aprende a medida que funciona y se vuelve más eficiente y preciso con el tiempo al procesar grandes cantidades de datos.

La unidad (neurona) lineal

El componente fundamental de una red neuronal es la neurona individual. Como diagrama, una neurona (o unit) con una entrada se ve así:

Unidad lineal: y=wx+b

La neurona sería el círculo con el “+”. La entrada es x, que correspondería a un atributo de nuestros datos reales. Su conexión con la neurona tiene un peso que es w. Siempre que un valor fluye a través de una conexión, multiplica el valor x por el peso w de la conexión. Para la entrada x, lo que llega a la neurona es w * x. Una red neuronal “aprende” modificando sus pesos en base a iteraciones. En la primera iteración se asignan pesos aleatorios.

La b es un tipo especial de ponderación que llamamos sesgo. El sesgo no tiene ningún dato de entrada asociado; en cambio, ponemos un 1 en el diagrama para que el valor que llegue a la neurona sea simplemente b (ya que 1 * b = b). El sesgo permite a la neurona modificar la salida independientemente de sus entradas.

La y es el valor que finalmente produce la neurona. Para obtener la salida, la neurona suma todos los valores que recibe a través de sus conexiones. La activación o fórmula de salida de esta neurona es y = w * x + b.

Si tenemos varias entradas (atributos) x0, x1, x2 para una neurona:

La fórmula para esta neurona sería y = w0x0 + w1x1 + w2x2 + b. A nivel gráfico, una unidad lineal con una entrada se representará como una línea (y= wx +b), con dos entradas encajará en un plano, y una unidad con más entradas encajará en un hiperplano.

Una unidad lineal calcula una función lineal. Ahora veremos cómo combinar y modificar estas unidades individuales para modelar relaciones más complejas: redes neuronales profundas.

Capas o layers

Las redes neuronales suelen organizar sus neuronas (units) en capas. Cuando reunimos unidades lineales que tienen un conjunto común de entradas, obtenemos una capa densa (dense layer).

Una capa densa de dos unidades lineales que reciben dos entradas y un sesgo.

Cada capa de una red neuronal realiza algún tipo de transformación relativamente simple. A través de una pila de capas, una red neuronal puede transformar sus entradas en formas más y más complejas. En una red neuronal bien entrenada, cada capa es una transformación que nos acerca un poco más a una solución.

La función de activación

Sin embargo, resulta que dos capas densas por sí mismas no son mejores que una sola capa densa. Las capas densas por sí mismas nunca pueden sacarnos del mundo de las líneas y los planos. Sin embargo, no todos los problemas los podemos resolver con aproximaciones lineales. Lo que necesitamos es algo no lineal. Lo que necesitamos son “funciones de activación”.

Sin funciones de activación, las redes neuronales solo pueden aprender relaciones lineales. Para ajustar las relaciones en forma de curvas, necesitaremos usar funciones de activación.

Una función de activación es simplemente la que aplicamos a cada una de las salidas de una capa. La más común es la función rectificadora: max(0,x). La función rectificadora tiene un gráfico que es una línea con la parte negativa “rectificada” a cero. Aplicar ésta función a las salidas de una neurona añadirá curvas a los datos, alejándonos de las líneas simples.

Cuando conectamos el rectificador a una unidad lineal, obtenemos una unidad lineal rectificada o ReLU. (Por esta razón, es común llamar a la función rectificadora la “función ReLU”.) Aplicar una activación ReLU a una unidad lineal significa que la salida se convierte en max (0, w * x + b).

Apilado de capas densas – capas ocultas

Ahora que tenemos algo de no linealidad, veamos cómo podemos apilar capas para obtener transformaciones de datos complejas:

Una pila de capas densas crea una red “completamente conectada”.

Las capas anteriores a la capa de salida a veces se llaman ocultas (hidden layers) ya que nunca vemos sus salidas directamente.

Ahora, en el dibujo podemos observar que la capa final (salida) es una unidad lineal (es decir, sin función de activación). Eso hace que esta red sea apropiada para una tarea de regresión, donde estamos tratando de predecir algún valor numérico arbitrario. Otras tareas (como la clasificación) pueden requerir una función de activación en la salida.

Cómo aprende una red neuronal

Cuando se crea por primera vez, todos los pesos de la red se establecen al azar; la red no “sabe” nada todavía.

Al igual que con todas las tareas de aprendizaje automático, comenzamos con un conjunto de datos de entrenamiento. Cada ejemplo en los datos de entrenamiento consta de algunas características o atributos (las entradas) junto con un objetivo esperado (la salida), que es otro atributo. Entrenar la red significa ajustar sus pesos de tal manera que pueda transformar las características en el objetivo.

Además de los datos de entrenamiento, necesitamos dos cosas más:

  • Una “función de pérdida” que mide qué tan buenas son las predicciones de la red.
  • Un “optimizador” que puede decirle a la red cómo cambiar sus pesos.

La función de pérdida

La función de pérdida mide la disparidad entre el valor real del objetivo y el valor que predice el modelo.

Una función de pérdida común para los problemas de regresión, donde la tarea es predecir algún valor numérico, es el error absoluto medio o MAE. Para cada predicción y_pred, MAE mide la disparidad del objetivo verdadero y_true por una diferencia absoluta abs (y_true – y_pred).

La pérdida total de MAE en un conjunto de datos es la media de todas estas diferencias absolutas.

Además de MAE, otras funciones de pérdida muy usadas para problemas de regresión son el error cuadrático medio (MSE) o la pérdida de Huber.

Durante el entrenamiento, el modelo utilizará la función de pérdida como guía para encontrar los valores correctos de sus pesos (una pérdida menor es mejor). En otras palabras, la función de pérdida le indica a la red su objetivo.

El optimizador – Descenso de gradiente estocástico (SGD)

El optimizador es un algoritmo que ajusta los pesos en la retropropagación o backpropagation para minimizar la pérdida.

Prácticamente todos los algoritmos de optimización utilizados en el deep learning pertenecen a una familia llamada descenso de gradiente estocástico (SGD). Son algoritmos iterativos que entrenan una red en pasos.

Un paso de entrenamiento o iteración sería así:

  1. Se extrae un subconjunto de datos de entrenamiento (minibatch o batch) y se pasan a través de la red para obtener un resultado (hacer predicciones).
  2. Se mide la pérdida entre las predicciones y los valores reales.
  3. Finalmente, se ajustan los pesos en una dirección que reduzca la pérdida, backpropagation.
  4. Luego, se repite este proceso hasta que la pérdida sea tan pequeña como se desee o hasta que no disminuya más.

Como pasar todo el conjunto de entrenamiento a una iteración puede ser demasiado pesado, se suele dividir este en varios lotes llamados minibatch o batch. Todos y cada uno de los batch obtenidos de la división del conjunto de entrenamiento lo sometemos a una iteración. A una ronda completa de iteraciones sobre todos los batch del conjunto de entrenamiento se denomina época. El número de épocas para las que entrena es la cantidad de veces que la red verá cada ejemplo de entrenamiento.

Cada vez que SGD ve un nuevo minibatch, cambiará los pesos (w y b) hacia sus valores correctos en ese batch.

Tasa de aprendizaje y tamaño de lote

Una tasa de aprendizaje menor significa que la red necesita ver más minibatches antes de que sus pesos converjan a sus mejores valores.

La tasa de aprendizaje y el tamaño de los minibatches son los dos parámetros que tienen el mayor efecto sobre cómo se desarrolla el entrenamiento de SGD. Su interacción es a menudo sutil y la elección correcta para estos parámetros no siempre es obvia.

Afortunadamente, para la mayoría de los trabajos no será necesario realizar una búsqueda extensa de hiperparámetros para obtener resultados satisfactorios. Adam es un algoritmo SGD que tiene una tasa de aprendizaje adaptativa que lo hace adecuado para la mayoría de los problemas sin ningún ajuste de parámetros (es “autoajuste”, en cierto sentido). Adam es un gran optimizador de uso general.

Bibliografía