Atrévete con el Deep Learning: Principios básicos al alcance de todos

Tuesday, November 20, 2018

Atrévete con el Deep Learning: Principios básicos al alcance de todos

¿Tienes una idea clara de lo que es el Deep Learning? Si no es así, no te preocupes, ya que, aunque está en boca de todos, es un concepto que genera mucha confusión. ¿Y por qué se habla tanto de algo de lo que se sabe tan poco? La respuesta es muy sencilla. El Deep Learning es una de las áreas de investigación más populares dentro del campo de la Inteligencia Artificial en los últimos años porque , gracias a estas técnicas, cosas como la visión artificial o el procesamiento del lenguaje natural han saltado del ámbito de la ciencia ficción a la realidad. Y porque es intrínseco a la naturaleza humana el querer comprender aquello que nos es significativo, que está en nuestro día a día. Y el Deep Learning lo está.



En esta nueva miniserie “Deep Learning para todos los públicos” vamos a intentar superar las barreras conceptuales, matemáticas o técnicas para lograr transmitir de forma intuitiva el significado de este concepto y el impacto tiene en nuestra vida presente y futura. En este primer post explicaremos:
  • La relación entre los conceptos de Inteligencia Artificial, Machine Learning y Deep Learning. 
  • Qué es un perceptrón y  veremos un ejemplo de cómo funciona
  • Qué son las redes neuronales y qué las caracteriza
  • Cómo funciona una red neuronal, comparándola con un Sistema Experto y otros algoritmos de Machine Learning
  • Por qué es tan potente el Deep Learning y el tipo de cosas que permite hacer

Por último, veremos un vídeo resumen de lo más interesante.

Deep Learning vs Machine Learning vs IA

En nuestro post Artificial Intelligence, Machine Learning y Deep Learning: ¿Conoces las diferencias? ya os contamos las principales diferencias entre los conceptos de IA, ML y DL, pero lo cierto es que pasamos un poco “de puntillas” por este último. Si recordamos, la idea principal que subyace al campo de la IA es conseguir que una computadora resuelva un problema complejo como lo haría un humano. A mediados de los años 60, la comunidad IA desarrolló los primeros sistemas expertos , en los que se creía que un potente ordenador y unas pocas reglas de razonamiento podrían emular expertos de rendimiento “superhumano” Sin embargo, claramente, los “recursos” no acompañaban.

Figura 1: De los Sistemas Expertos a las Redes Neuronales.
Figura 1: De los Sistemas Expertos a las Redes Neuronales.

Por este motivo, no fue hasta los años 80 que empezó a cobrar importancia el aprendizaje automático o Machine Learning. Se trata de una forma de IA que ya no necesita un programador que codifique reglas, sino que es capaz de establecer sus propias reglas y aprender por sí misma. Y fue en ese momento, casi 30 años después del los inicios de la Inteligencia Artificial, gracias al desarrollo de las tecnologías Big Data y de las mejoras en capacidad de procesamiento. 

Del Machine Learning al Deep Learning: redes neuronales


Cuando hablamos de Machine Learning, hablamos de algoritmos de aprendizaje. Hay muchos tipos de ellos. La elección del más adecuado, dependerá del tipo de tarea que se quiera resolver en cada caso. Por ejemplo, podemos hablar de algoritmos de clasificación como los árboles de decisión, o Naïve Bayes, algoritmos de regresión, de clustering, de análisis de componentes principales… Pero también podemos hablar de redes neuronales.

Las redes neuronales son un conjunto de algoritmos diseñados especialmente para reconocer patrones. Son muy potentes porque permiten que una computadora resuelva esos “problemas” que hasta entonces eran fáciles para un humano, pero muy complejos para una IA. Nos referimos a la percepción sensorial. Sí, el conocido ejemplo de “identificar un gato en una foto”, o “identificar un sonido”.

Origen de las redes neuronales: el perceptrón 


Para que la identificación de imágenes llegara a ser una realidad, hubo que recorrer un largo camino. El origen de la historia se remonta a 1943, cuando McCulloch y Pitts crearon el primer modelo de neurona artificial.  Casi 20 años después, en 1962,  Rosenblatt retomó la idea, creó una estructura llamada “Perceptrón” y el mecanismo de “Backpropagation”, que es el que permite a la neurona “aprender por sí misma” y descubrir la información oculta en los datos de entrada con los que la “entrenamos” .

¿Cómo funciona el perceptrón?


La idea es sencilla. Dados unos datos de entrada n1, n2 etc, existe una combinación de parámetros o coeficientes, que llamaremos función peso (w0, w1, etc), que combinados con ellos ofrecen un determinado resultado. El problema consiste en averiguar qué valores han de tener esos coeficientes wi para obtener el resultado que mejor se ajusta a la realidad. Para ello, lo que se hace es “entrenar” la red neuronal (en este caso, el perceptrón, una red de una única neurona). 

Figura 2; Representación de un perceptrón.
Figura 2; Representación de un perceptrón.

Por tanto, entrenar una red neuronal es averiguar qué combinación de valores wi, aplicados (=multiplicados) a los valores ni de los datos de entrada, dan como resultado los valores de salida que conocemos. Por ejemplo, si lo que queremos en entrenar una red neuronal para detectar imágenes de gatos, los datos de entrada son las imágenes, los datos de salida indican si hay o no un gato en esa imagen, y mediante el entrenamiento, la red neuronal ajustará los parámetros para detectar cuáles son los patrones ocultos en los datos de entrada que permiten identificar si, efectivamente, en esa imagen hay un gato. (tamaño, número de extremidades, aspecto peludo etc).

Para entenderlo mejor, tomamos prestado un ejemplo muy claro de este artículo de Xataka. En este ejemplo, los datos de entrada son las notas de dos exámenes n1 y n2. Si la suma de estos datos de entrada, multiplicadas por su peso correspondiente wi es mayor que un determinado umbral, la salida del perceptrón nf=1, que significa que el alumno ha aprobado. Si es menor que ese valor umbral, la salida del perceptrón tiene un valor nf=0 y significa que el alumno ha suspendido. Matemáticamente es tan sencillo como escribir: 

Figura 3: Fórmula simplificada de la entrada del perceptrón.
Figura 3: Fórmula simplificada de la entrada del perceptrón.

Para encontrar el valor de los pesos, wi, entrenamos la red neuronal y empezamos asignando a estos coeficientes wi un valor aleatorio. Por ejemplo, podemos elegir dar el mismo peso a cada examen y asignar un valor 0,5. Entonces vemos qué resultado da la red neuronal para cada alumno. Como tenemos un conjunto de datos de entrenamiento etiquetados, (lo datos de notas de exámenes, pareados con la nota final de curso correspondiente para cada alumno), sabemos qué resultado final es el que tiene que salir y esto nos permite ir ajustando los pesos en cada interacción. Con estos ajustes, la red neuronal va extrayendo información oculta en los datos de entrenamiento, aprende a detectar patrones. Por ejemplo, si un alumno ha sacado muy buena nota en el segundo examen, pero sin embargo ha suspendido, significa que ese examen influye poco en la nota final y por tanto hay que reducir su peso (w2).


Definición de red neuronal


Una red neuronal no es más que una superposición de perceptrones de distintos tipos conectados unos con otros en estructuras complejas. La estructura más sencilla se conforma de tres capas, una capa de entrada, una capa intermedia u oculta y una capa de salida.


Figura 4: Esquema de una red neuronal.
Figura 4: Esquema de una red neuronal.



¿Cómo funciona una red neuronal?

La idea es sencilla. Los datos de entrada viajan a través de las conexiones entre neuronas. La fortaleza de esos enlaces entre neuronas se representa por los pesos. Si la señal es lo suficientemente fuerte, se activará una determinada neurona. De esa manera el sistema “aprende” a distinguir las características de los datos de entrada que influyen más en el resultado, de las que no lo hacen, es decir, aprende a interpretar los patrones ocultos en los datos.

El Deep Learning o aprendizaje profundo es, por tanto, un subcampo dentro del Machine Learning que utiliza redes neuronales para obtener representaciones cada vez más significativas de los datos mediante el aprendizaje por capas. Cada una de estas capas va extrayendo características de un nivel cada vez más alto hasta llegar a su respuesta final.

Por ejemplo, una red neuronal diseñada para identificar rostros humanos empieza buscando relaciones simples entre los datos, como identificar bordes. Según vamos profundizando en la red, estas funciones más simples se van combinado para buscar relaciones más complejas,  como puedan ser partes concretas de la cara (ojos, boca, nariz). En un siguiente paso se identificaría la cara completa y por último se identificaría a la persona a la que corresponde esa cara. Así las sucesivas capas de abstracción serían:

Imagen-- Bordes--Partes de la cara -- Cara--Identificar a la persona por su rostro.

Las redes neuronales van "aprendiendo" características de los datos de forma progresiva de menor a mayor nivel, evitando el costoso trabajo previo de selección de características necesario en el Machine Learning tradicional.
Figura 6: Las redes neuronales van "aprendiendo" características de los datos de forma progresiva de menor a mayor nivel, evitando el costoso trabajo previo de selección de características necesario en el Machine Learning tradicional.


Para entenderlo mejor, vamos a comparar cómo realizar una tarea de clasificación típica usando un sistema experto, un algoritmo de Machine Learning clásico, y una red neuronal.


Figura 5: ejemplo de tarea de clasificación.
Figura 6: ejemplo de tarea de clasificación.



  • Sistema Experto: Usando sentencias tipo “IF- THEN”. Si es redonda y de color naranja, entonces es una naranja
  • Algoritmo ML. El algoritmo ML no usa reglas, sino que “aprende” a identificar una nueva fruta mediante el entrenamiento con un amplio conjunto de datos “etiquetados”. Son datos etiquetados, porque sabemos de antemano cuál el resultado correcto de la clasificación. El objetivo del entrenamiento es que algoritmo “aprenda” a identificar el conjunto de características que corresponden a una respuesta correcta determinada, para que cuando se le pida clasificar una fruta desconocida con características forma=redonda, color=naranja, la clasifique correctamente como “naranja”
  • Red Neuronal: Cada entrada de la red neuronal representa una característica del objeto. Se diseña la red para que, por ejemplo, la entrada uno se active cuando el color sea naranja, y la entrada dos cuando la forma sea alargada. Entrenamos el algoritmo con ejemplos para los cuales, cuando se activa la entrada uno, la respuesta correcta sea naranja, y cuando se active la dos, pera. Así el algoritmo aprende a distinguir una fruta de otra. Esta activación se realiza por medio de una operación que realizan todas las capas salvo la capa de entrada, antes de continuar multiplicando sus valores por las conexiones salientes. La función de activación recibe como entrada la suma de todos los números que llegan por las conexiones entrantes, transforma el valor mediante una fórmula, y produce un nuevo número. Existen varias opciones, (funciónes lineales, logísticas, hiperbólicas) lo cual le otorga una gran flexibilidad a las redes neuronales, pero una de las funciones más habituales es la función sigmoide. Esta función transforma los datos de entrada en valores de salida consistentes "0" o "1", ya que estamos hablando de probabilidad. Después, el proceso se automatiza por medido de algoritmos de propagación del error. Compara el valor de salida ofrecido por la red neuronal con el valor real (los datos de entrenamiento están etiquetados), calcula la diferencia entre ambos resultados y la toma como error. A continuación, varía los pesos de las neuronas de forma que en la siguiente interacción se minimice este error. De esta forma, mediante múltiples interacciones, encuentra los valores de wi que ofrecen  el mejor resultado.


¿Por qué es tan potente el Deep Learning?


El Deep Learning es tan importante porque está permitiendo resolver de forma más fácil y eficiente un gran número de problemas. Por una parte, realiza de forma automática una de las tareas más complejas del proceso de trabajo de Machine Learning: la ingeniería de atributos. Las redes neuronales seleccionan de forma automática qué atributos son los relevantes y cuáles se pueden desechar. 

Otra de las grandes ventajas de trabajar con redes neuronales es que permiten trabajar con cualquier tipo de input. Cualquiera: números, imágenes, sonidos, textos, series temporales. Teniendo en cuenta que los datos no estructurados, aquellos que no encajan en la estructura tradicional filas/columnas de las bases de datos relacionales, suponen más de un 90% de todos los datos generados, es fácil comprender la importancia de poder manejarlos de forma eficiente. Estamos hablando de datos como mensajes de correo, vídeos, ficheros de audio, páginas web, mensajes en redes sociales etc.

¿Y cómo lo consiguen? Convirtiéndolos en valores numéricos y expresándolos con un formato matemático en el que resulta mucho más fácil identificar patrones: en forma de tensor. De hecho, uno de los hitos más importantes en el desarrollo del Deep Learning fue la creación de la librería Tensorflow, de la que hablaremos en otro post.

Así, una red neuronal entrenada con datos etiquetados, también se puede aplicar a datos no estructurados, lo cual les da a los algoritmos de Deep Learning una gran ventaja respecto a otros algoritmos al poner a su disposición un volumen de datos de entrenamiento mucho mayor. Algoritmos no muy buenos entrenados con enormes conjuntos de datos pueden dar mejores resultados que buenos algoritmos entrenemos con conjuntos de datos reducidos. De hecho, mientras en el caso de los algoritmos tradicionales usados en Machine Learning llega un momento en el un mayor volumen de datos no implica un mejor rendimiento, en el caso del Deep Learning no ocurre así. El rendimiento no deja de crecer, según lo hacen el volumen de datos y el número de capas del modelo.

Figura 6: Evolución del rendimiento del algoritmo según el volumen de datos disponibles.
Figura 6: Evolución del rendimiento del algoritmo según el volumen de datos disponibles.

Así, gracias al desarrollo de la computación paralela masiva con GPUs (las redes neuronales son en realidad un enorme número de cálculos que se ejecutan en paralelo), la disponibilidad de volúmenes masivos de datos, las nuevas plataformas de software como TensorFlow, Theano, Keras, CNTK, PyTorch, Chainer, y mxnet, y los avances matemáticos (optimizadores más robustos, mejores funciones de activación etc), se ha conseguido que una IA pueda hacer cosas tan sorprendentes como (del libro de  François Chollet book sobre DL):
  • Clasificar imágenes de forma similar a como lo haría un humano
  • Reconocimiento de voz de forma similar a como lo haría un humano
  • Reconocimiento de texto escrito de forma similar a como lo haría un humano
  • Mejores sistemas de traducción automática
  • Mejoras en la conversión texto-audio-texto
  • Asistentes digitales
  • Conducción autónoma de forma similar a como lo haría un humano 
  • Mejores anuncios personalizados, como hacen Google, Baidu y Bing
  • Mejores resultados de búsquedas en la web
  • Procesamiento de lenguaje natural
  • Ganar al campeón mundial de Go etc

Para terminar, os proponemos ver este interesante vídeo de la red de divulgación scenio, perteneciente a la Cátedra de Cultura Científica de la Universidad del País Vasco, en el cual, en menos de 10 minutos, cuentan de forma muy amena cómo funciona una neurona.



No te pierdas los siguientes post de esta miniserie, donde hablaremos de los distintos tipos de redes neuronales que existen y para que se utilizan, de cómo se consiguen la redes neuronales trabajar con datos no estructurados y multidimensionales y haremos nuestros pinitos con código.

Otras miniseries de nuestro blog que pueden interesarte:

Para mantenerte al día con LUCA visita nuestra página web, y no olvides seguirnos en TwitterLinkedIn YouTube.

5 comments:

  1. Mola mucho este Blog, y esta miniserie de atreverse con el Deep Learning es muy asequible de entender. Además, me ha hecho meditar un poco sobre un proyecto iniciático que tengo en mente, de Inteligencia Artificial con Python, y que estoy desarrollando poco a poco implementando nuevas características a un proyecto existente previo de la AIML Foundation

    https://code.google.com/archive/p/aiml-en-us-foundation-alice2/source/default/source

    Por otro lado, una duda que me ha surgido este fin de semana después de haber leído este post, y es el tema de los perceptrones y las redes neuronales: ¿cómo hacer que una propia red neuronal básica, se desarrolle asímisma con un buen algoritmo o varios relacionados? Puesto que el aprendizaje de una máquina (por software) puede aumentar su propia base de datos, pienso yo también (como máquina biológica programada por mi ADN y mi experiencia vital, es decir, en conjunto, mi Fenotipo), que podría aumentarse la complejidad de la propia red neuronal inicial, básica, con su propio aprendizaje y reprogramación (al igual que la plasticidad neuronal biológica, y el crecimiento de los tejidos a partir de un mismo código genético, y de las células madre iniciales, que se diferenciarán después, según lo que se exprese del código, en unas u otras células, y por tanto en unos u otros tejidos...).

    Vamos, que lo que quiero expresar es si una red neuronal puede autocrearse o autorecrearse, o recrear otras mejoradas, a partir de un código inicial. El caso es cómo programarlo bien, y por supuesto, programar un mecanismo de autoapagado, o mejor quizá, de "freno" (igual que en las células, que cuando falla da lugar a los tumores o al contrario, a la muerte celular precoz...), por si acaso al "ciber bicho" se le acaba "yendo la olla" y no lo podemos controlar...

    Por cierto, esto ya es auténticamente una Revolución de la Informática, de la Física, y de la Biología (pues en parte se basa en ella, y debe seguir siendo así para que todo concuerde). Ahí va un enlace muy potente:

    http://www.physicscentral.com/explore/pictures/quantummachinelearn.cfm

    Saludos

    Alfonso J.

    ReplyDelete
    Replies
    1. Hola Alfonso,
      Muchas gracias por tus comentarios. Para nosotros resulta muy inspirador saber que nuestros contenidos os gustan, os son útiles y os llevan a plantearos nuevas preguntas.

      Sobre lo que planteas, lo he comentado con Enrique Blanco, que ha se ha adentrado en temas más profundos sobre Deep Learning en nuestro Blog (si no conoces su serie, te la recomiendo, en el siguiente post la enlazamos), y me ha enviado la siguiente reflexión para responderte.

      Actualmente los modelos de red neuronales cuentan con topologías fijadas. A pesar de que este tipo de arquitecturas nacieron con la intención de emular el comportamiento de un cerebro, el funcionamiento actual de las mismas dista sustancialmente por el hecho de que las conexiones entre neuronas suelen ser fijas y están reguladas tanto por pesos como por funciones de activación. Sin embargo, parece que recientemente se están desarrollando nuevas aproximaciones generativas y auto-organizadas de redes neuronales, que permiten aprender distribuciones de probabilidad de entrada a través de un conjunto finito de vectores de referencia asociados con las neuronas. Esto permite a la arquitectura adaptarse mediante la creación de nuevos nodos en el caso de que reciba una entrada que no esté bien representada en el modelo.

      Un ejemplo de este tipo de investigaciones lo puedes encontrar en Mici et al. A self-organizing neural network architecture for learning
      human-object interactions https://arxiv.org/pdf/1710.01916.pdf

      De momento parece que los intentos de incorporar generación de nodos a redes neuronales se reducen a procesos simples de reconocimiento de imágenes o movimientos en datasets bien conocidos. Cuando estos algoritmos se incorporen a productos de reconocimiento facial, conducción autónoma, etc… habrá que ver qué performances se obtienen y qué problemas derivados de la mutabilidad de la arquitectura se encuentran.

      Saludos,

      Paloma R

      Delete
  2. Hola Paloma, muchas gracias a ti también por la respuesta. Es impresionante la cantidad de Información que hay que procesar, a nivel Humano, para poder llegar a tener cierta idea de qué es lo que tenemos entre manos...



    Supongo que todo es cuestión de feedback positivo y/o negativo, a nivel de unidad neuronal; cuantificando todo, se llegaría a una respuesta final (el impulso nervioso). Un pequeño ejemplo en este enlace, para entender la complejidad del entramado del Sistema Nervioso Humano. Creo que no sólo se trata de diseñar una buena arquitectura a nivel "cibernético", sino de diseñar una buena "neurona" y a partir de ella, las conexiones posibles para que desarrolle por evolución una buena red neuronal... En definitiva, creo que la clave de las puertas lógicas las tenemos en las sinapsis y en los efectores, y a partir de ahí, el Universo...



    https://www.psicoactiva.com/blog/la-sinapsis-neuronal-tipos-sinapsis/



    https://es.wikipedia.org/wiki/Efector



    Un abrazo a tod@s



    Alfonso J.



    ReplyDelete
    Replies
    1. Pues seguiremos "haciendo sinapsis", Alfonso ;-) Una de las cosas que mantiene vivo nuestro cerebro, y por ende, a nosotros, es no dejar nunca de aprender cosas, no perder la curiosidad. Ser "aprendices para toda la vida"... y disfrutar del conocimiento.

      Delete
  3. Totalmente de acuerdo, me considero un eterno aprendiz y me encanta disfrutar aprendiendo y aplicando lo que descubro o me descubren. Me siento vivo cuando siento lo que pienso y pienso lo que siento, y siento que siento, y pienso que pienso...

    Por cierto, parece que nuestras "sinapsis" están creciendo en el sentido correcto, y creo que nos hemos anticipado un poco (un día) a este post en la Web de Quanta Magazine (brutal, se la recomiendo a toda la Comunidad y seguidor@s de LUCA):

    https://www.quantamagazine.org/computer-science-and-biology-explore-algorithmic-evolution-20181129/

    Creo que he encontrado un paralelismo en algo que ya se estaba conjeturando hace años, después del auge de la Teoría de la Información de Shannon y la convergencia con l@s Biólog@s moleculares tras el descubrimiento del Código Genético del ADN (altamente recomendable también, aunque es especialmente denso, pero sin desperdicio alguno, el Libro "La Información: Historia y Realidad", de James Gleick. Y también, para comprender todo, en plan Holístico, iniciarse con el libro "El Gen Egoísta: Las Bases Biológicas de nuestra Conducta", de Richard Dawkins).

    Vamos, que como "máquinas biológicas" que somos ("robots orgánicos", para hacer una analogía con lo que escribe Dawkins), el código máquina (Información y además unidireccional) estaría escrito en el ADN, a mi entender. El ARN mensajero sería el transcriptor, una especie de "intérprete de órdenes". El ARN ribosomal, el traductor, formaría parte de la "maquinaria de compilación" del código, que daría lugar a los "binarios ejecutables", las proteínas, que serían las efectoras (es mucho más complejo, pero para tener una perspectiva mental asequible y rápida, podría servir a l@s Personas especializadas en Programación).

    Y aunque, haciendo ingeniería inversa podría entenderse el funcionamiento del ADN, lo que está claro es que las proteínas permiten replicar la Información del Código del ADN, pero no replicar la información de las propias proteínas por sí mismas (de ahí que la Información que porta el ADN es unidireccional). Aunque esta es otra cuestión...

    Ahí os lo dejo.

    Me encanta LUCA!!! Ha sido todo un descubrimiento, y vaya desde aquí un guiño a Fran Ramírez, jeje, él tiene una de las llaves de esta historia ;-)

    Somos materia orgánica pensante, una Maravilla de miles de millones de años de Evolución del Universo que ahora le permite, al menos en este riconcito del Cosmos, preguntarse sobre sí, a través de l@s Human@s...

    Abrazos

    Alfonso J.

    ReplyDelete