¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Inteligencia artificial fácil
  3. La predicción con neuronas
Extrait - Inteligencia artificial fácil Machine Learning y Deep Learning prácticos
Extractos del libro
Inteligencia artificial fácil Machine Learning y Deep Learning prácticos
3 opiniones
Volver a la página de compra del libro

La predicción con neuronas

Lo que vamos a descubrir y requisitos

Hasta el momento, hemos descubierto y puesto en práctica los principios de Machine Learning mediante el uso de algoritmos procedentes de estadísticas. Ahora vamos a ver cómo puede aprender una máquina a partir de algoritmos imaginados y diseñados desde las ciencias cognitivas, es decir, las redes neuronales.

Requisitos necesarios para abordar este capítulo correctamente: haber leído los capítulos Los fundamentos del lenguaje Python, Estadísticas para comprender los datos, Principales algoritmos de Machine Learning y Albaricoques, cerezas y clustering.

El perceptrón de 1957

El perceptrón, creado en 1957 por Frank Rosenblatt, es un algoritmo de aprendizaje supervisado, que presenta una diferencia importante respecto a los que hemos estudiado y utilizado en el capítulo anterior su diseño, procedente de las ciencias cognitivas.

El perceptrón, que vamos a conocer en breve, bajo su forma más sencilla también se denomina neurona formal (resultado de los trabajos de McCulloch y Pitts en 1943) y su objetivo es separar las observaciones en dos clases (o grupos) distintos con la condición de que sus datos sean linealmente separables. Su función es clasificar.

1. Un poco de biología

Recordemos por un momento nuestras clases de biología del colegio o del instituto, cuando nuestro profesor nos explicaba el funcionamiento del cerebro. Nuestro cerebro está compuesto por una cantidad de neuronas que oscila entre los 86 000 y 100 000 millones, con la función de enviar y tratar mensajes en nuestro organismo. Algunas neuronas tienen una función dedicada a las percepciones de las sensaciones y a los movimientos, mientras que otras son responsables de las funciones automáticas de nuestro cuerpo (respiración, digestión…). 

Biológicamente, una neurona es una célula compuesta por los siguientes elementos:

  • Un cuerpo celular, también llamado pericarion.

  • Un núcleo.

  • Múltiples ramificaciones...

Datos linealmente separables

El perceptrón simple monocapa o neurona formal solo puede clasificar datos linealmente separables. Cuando los datos no sean linealmente separables utilizaremos un perceptrón multicapa. En el capítulo siguiente tendremos ocasión de descubrir sus principios y funcionamiento.

Como sabemos hasta ahora, los datos linealmente separables son los que se pueden separar mediante una recta. Para modelizar este concepto de manera sencilla, vamos a utilizar las funciones lógicas AND, OR y XOR (OR exclusivo). Consideremos dos elementos, A y B. Si un resultado dependiente de A y de B se calcula aplicando la lógica AND para A y B, entonces:

  • El resultado será VERDAD si A y B son VERDAD (su valor es igual 1).

AND

A

B

A AND B

0

0

FALSO

0

1

FALSO

1

0

FALSO

1

1

VERDAD

Ahora, si el resultado depende de A y de B con la lógica OR.

  • El resultado será VERDAD si A o B son VERDAD.

OR

A

B

A OR B

0

0

FALSO

0

1

VERDAD

1

0

VERDAD

1

1

VERDAD

Si representamos gráficamente estos dos casos, podemos comprobar que son linealmente separables.

images/Ch10_04.png

Representación gráfica de las funciones lógicas AND y OR

Ahora vamos a considerar la siguiente regla, denominada OR Exclusivo o XOR:

  • El resultado es VERDAD si uno de los valores A o B es VERDAD.

  • O si los valores A y B son distintos.

Entonces obtenemos la siguiente tabla:

OR EXCLUSIVO (XOR)

A

B

A XOR B

0

0

FALSO

0

1

VERDAD

1

0

VERDAD

1

1

FALSO

Si ahora representamos...

Funciones de activación, retropropagación y descenso del gradiente

Ahora vamos a ver en detalle el funcionamiento del perceptrón introduciendo conceptos con los que se encontrará cuando utilice las redes neuronales para realizar sus proyectos de clasificación.

1. Función de activación

Como hemos visto durante la presentación de la neurona biológica, su activación se produce cuando se sobrepasa un umbral de tensión eléctrica. En el caso de nuestra neurona artificial, su activación también se desencadenará en función de un umbral.

La primera etapa en la determinación de la activación de una neurona artificial es hacer la suma de los productos de los pesos sinápticos con los valores de entrada. Esta etapa se puede considerar como una preactivación de la neurona. Una vez hecha la suma, vamos a utilizar una función de activación que nos permitirá determinar si debe activarse la neurona. Esta activación será de hecho la predicción de nuestra neurona. Para calcular esta predicción, podemos utilizar varias funciones.

a. Función de umbral binario

La primera función que puede sernos útil es la función de umbral binario. Esta función devuelve un valor igual a 0 o 1. Tomamos como hipótesis que la suma ponderada de los distintos valores de cada entrada es 0,8 y que hemos definido un umbral a 0,5. Como 0,8 es mayor que 0,5, la función reenvía el valor 1 (la neurona se activa). Si el valor de esta suma ponderada fuera inferior a 0,5, la función de activación reenviaría 0.

Aquí podemos ver el ejemplo con números:

Valor en entrada...

La retropropagación del error

Ahora pasamos al concepto de retropropagación. La particularidad de las redes neuronales es que aprenden de sus errores. La fase que consiste en hacer la suma ponderada de las entradas y en utilizar una función de activación para obtener un valor de predicción se llama fase de propagación; para hacer estos cálculos partimos de los puntos de entrada de la neurona artificial hacia su punto de salida.

Una vez hecha la predicción, vamos a comparar la predicción realizada por la neurona artificial con la predicción esperada; obtendremos la diferencia entre el valor esperado y el valor predicho. Con esta operación acabamos de calcular el error de predicción.

Una vez obtenido este error, vamos a recorrer la neurona en sentido inverso (desde la salida hacia las entradas) para considerar el error cometido durante la predicción en el aprendizaje ajustando los valores de los distintos pesos (veremos cómo hacerlo un poco más adelante en este capítulo). Esta fase se llama retropropagación del error.

Funciones de pérdida (Loss function)

Pronto se familiarizará con este término durante sus diversas experiencias con las redes neuronales

Una función de pérdida, o Loss function, es una función que evalúa la desviación entre las predicciones realizadas por la red neuronal y los valores reales de las observaciones utilizadas durante el aprendizaje. Cuanto menor es el resultado de esta función, más eficiente es la red neuronal. Su minimización, es decir, reducir al mínimo la desviación entre el valor predicho y el valor real para una observación dada, se hace ajustando los distintos pesos de la red neuronal.

1. Error lineal o error local

Como acabamos de indicar, el error de aprendizaje, también llamado error local, se calcula obteniendo la diferencia entre el valor real que hay que predecir y el valor predicho por la neurona artificial.

Error = Prediccion_real - Prediccion_realizada 

Este es el error que buscaremos minimizar durante los aprendizajes.

Este error se puede considerar como error local porque se centra en una observación dada comparando el valor real y el valor predicho.

2. Error media cuadrática MSE o error global

El error cuadrático medio es una función de error global del aprendizaje. Es decir, que esta función nos permitirá conocer de manera global el porcentaje de error cometido por nuestra neurona artificial...

Descenso de gradiente

Ya abordamos el descenso de gradiente en el capítulo Principales algoritmos de Machine Learning dedicado a las estadísticas, pero estamos seguros de que es necesario volver a mencionarlo ahora porque se trata de un concepto importante para la comprensión del funcionamiento de las redes neuronales.

El objetivo del descenso de gradiente es minimizar la función de error ajustando poco a poco los parámetros de aprendizaje representados por los distintos pesos.

Retomamos la imagen del descenso de la montaña. Usted se sitúa en el punto más alto de la montaña y quiere alcanzar la llanura que se encuentra más abajo. Sin embargo, es una noche oscura y no puede ver a dónde va.

Entonces avanzará poco a poco con pasos cortos hasta alcanzar la parte inferior del valle.

El descenso del gradiente corresponde a esta metáfora y se lleva a cabo mediante el ajuste de los distintos pesos de la red neuronal hasta obtener una convergencia, es decir, un mínimo de errores. Este ajuste se hace mediante pasos cortos, usando un hiperparámetro denominado tasa de aprendizaje (learning rate). 

La diferencia entre parámetros y hiperparámetros es que los primeros se definen a nivel del modelo de aprendizaje (valor de los pesos) y los segundos se definen a nivel del algoritmo (por ejemplo: tasa de aprendizaje o cantidad de capas de neuronas).

No obstante...

El sesgo, una neurona particular

Hemos visto que la red neuronal está compuesta por neuronas de entrada que corresponden a los datos de una observación, y que se atribuye un peso a cada entrada. Esta pareja entrada/peso permite realizar la fase de propagación usando una función de activación.

Ahora, si queremos «forzar» el valor de la predicción para algunos valores de entrada, podemos hacerlo con la ayuda de lo que se denomina un sesgo.

Tomamos un ejemplo sencillo cuya función de activación es del tipo ReLU.

Imaginamos que nuestra neurona artificial está compuesta por 2 entradas con los valores 1 y 2, 2 pesos con los valores -0,45 y 0,1, y una salida.

El valor de esta salida se calcula como se describe a continuación:

ReLU (1 * -0,45 + 2 * 0,1) = 0

En efecto, la suma ponderada es igual a -0,25, pero como utilizamos una función de activación del tipo ReLU que pone a 0 todo valor negativo, la predicción es igual a 0. La predicción es, pues, igual al 0 %.

Ahora, si a partir de los mismos valores de entrada, queremos que el valor de la predicción sea diferente y que se active la neurona, vamos a utilizar un sesgo que tomará la forma de una neurona que tiene su propio peso y que de alguna manera va a forzar la predicción.

Añadimos una neurona que tomará el valor 1 (es el valor que tomará siempre el sesgo) con un peso de 0,6...

Caso práctico para comprender el perceptrón

Ahora vamos a detallar de manera numérica un ejemplo que nos permitirá comprender bien los conceptos que hemos visto hasta el momento. Pero no se asuste, los cálculos no serán complicados y seguirán siendo accesibles en términos de comprensión.

Como hemos visto al principio de este capítulo, el objetivo del perceptrón es clasificar las observaciones. Nosotros le proponemos crear un modelo capaz de determinar si un estudiante, según criterios precisos, puede ser admitido en una universidad de prestigio: IA Academy.

La admisión en esta universidad depende de superar algunos exámenes de entrada. La tabla que aparece a continuación reagrupa los distintos casos de admisiones y rechazos en función de la superación de los exámenes de matemáticas e informática.

Superado el examen de matemáticas

Superado el examen de informática

Admitido

NO

NO

NO

NO

NO

NO

NO

Seguro que se ha dado cuenta de que la admisión en la universidad responde a la función lógica AND.

1. Inicialización del perceptrón

Vamos a inicializar nuestro perceptrón con una capa de 2 neuronas en la entrada, donde cada una de ellas corresponde a la superación de los exámenes, y una neurona de salida que permitirá clasificar al estudiante como admitido o rechazado en la universidad. Como complemento de las dos neuronas de entrada, vamos a añadir otra llamada sesgo (umbral), que tiene el objetivo de controlar la predisposición de la neurona a activarse o no y que siempre tomará el valor 1.

Ahora nuestro perceptrón está listo para aprender.

Observamos la notación particular de cada peso. W11, W21 y Wb. W significa Weight (Peso), seguida del número de la neurona y del número de la capa. Así, W11 se lee «peso de la primera neurona de la primera capa», W21, peso de la segunda neurona de la primera capa, y así sucesivamente. Wb significa peso (Weight) del sesgo (bias en inglés).

images/Ch10_17.png

Neurona formal

2. Etapas de aprendizaje

a. Etapa 1: Inicialización de los pesos

La primera etapa consiste en inicializar los pesos. Esta inicialización se hace de manera aleatoria dentro de un intervalo comprendido entre...

Programamos nuestra primera neurona formal «From Scratch»

Es muy probable que tenga que leer los párrafos anteriores varias veces para comprenderlos totalmente. Por eso vamos a programar nuestra primera neurona formal como complemento del ejemplo numérico que hemos realizado antes. El objetivo es comprender bien toda la mecánica del aprendizaje mediante un ejemplo concreto.

Como ya tiene práctica, dejamos que cree un proyecto nuevo en el editor Pycharm usted solo y que añada un archivo de script nuevo al que llamaremos perceptron.py.

Para realizar el proyecto necesitaremos las bibliotecas matplotlib y numpy.

1. Datos de aprendizaje

Lo primero que vamos a hacer es crear nuestros datos de aprendizaje y definir la tasa de aprendizaje:

#-------------------------------------  
#    OBSERVACIONES Y PREDICCIONES  
#-------------------------------------  
  
observaciones_entradas = array([  
                             [1, 0],  
                             [1, 1],  
                             [0, 1],  
                             [1, 0]])  
  
  
predicciones = array([[0],[1], [0],[0]]) 

2. Definición de los pesos

Ahora pasamos a la generación de los pesos de forma aleatoria, contenidos en el intervalo de valor [-1,1]:

#Generación de los pesos en el intervalo [-1;1]  
random.seed(1)  
limiteMin = -1  
limiteMax = 1  
  
w11 = (limiteMax-limiteMin) * random.random() + limiteMin  
w21 = (limiteMax-limiteMin) * random.random() + limiteMin  
w31 = (limiteMax-limiteMin) * random.random() + limiteMin 

No olvidamos el sesgo, que tendrá valor 1 y peso igual a 0.

#El sesgo  
sesgo = 1  
wb = 0 

3. Gestión de los hiperparámetros

Ahora vamos a definir los hiperparámetros, que representan la cantidad de epoch y la tasa de aprendizaje.

#Tasa de aprendizaje  
tsAprendizaje = 0.1  
  
#Cantidad de epoch  
epochs = 300 

4. Programación...

Una neurona artificial con TensorFlow

Después de programar nuestra neurona artificial de manera «artesanal», ahora vamos a ver cómo utilizar el módulo TensorFlow para crear esta misma neurona artificial.

1. Breve resumen de TensorFlow

Actualmente, cuando les pedimos a los desarrolladores que nos recomienden una herramienta de Machine Learning y de Deep Learning, suelen respondernos con el framework «TensorFlow» desarrollado por Google.

En 2011, el proyecto Google Brain vio la luz con el objetivo de mejorar los rendimientos comerciales y las experiencias de los usuarios de Google, con ayuda de Deep Learning. En efecto, teniendo en cuenta la cantidad de datos acumulados por Google a través de sus productos Gmail, Google Fotos y su motor de búsqueda, Deep Learning parecía lo más adecuado para mejorar los rendimientos comerciales de Google a partir de estos datos... sin olvidar la faceta de investigación científica. De esta actividad nació el producto interno de Google llamado DistBielef, que fue modificado para hacerlo más rápido y más sólido bajo el nombre de TensorFlow. En 2015, Google decidió hacer pública la biblioteca TensorFlow, con una versión reconocida como estable en 2017.

TensorFlow se articula alrededor de una arquitectura compuesta por tres componentes, que son:

  • El pretratamiento de los datos.

  • La construcción de los modelos de predicciones.

  • La evaluación de los modelos.

TensorFlow toma su nombre del término matemático Tensor, que expresa la facultad de tratar tablas en múltiples dimensiones, y de Flow (Proceso), que permite representar todas las etapas necesarias en la creación de un módulo.

Ahora que sabemos un poco más sobre el módulo TensorFlow, podemos añadirlo a nuestro proyecto para descubrir cómo usarlo en nuestro caso práctico.

La instalación del módulo TensorFlow en la herramienta de desarrollo PyCharm es idéntica a la de los otros módulos que ya está acostumbrado a instalar.

2. Datos de aprendizaje y de pruebas

Una vez instalado el módulo TensorFlow, le invitamos a crear un archivo de script de Python nuevo en su proyecto y a escribir algunas líneas:

import tensorflow as tf  
  
  
#-------------------------------------  ...

El primer paso hacia Deep Learning

Ya hemos llegado al final de este capítulo, que nos ha permitido comprender el funcionamiento de una neurona normal que, recordémoslo, solo es capaz de clasificar los datos linealmente separables. Sin embargo, durante los distintos ejemplos que hemos usado hasta ahora hemos visto que este concepto de separación lineal no se adapta a todos los problemas de clasificación.

Por lo tanto, en el capítulo siguiente vamos a ver que, añadiendo capas de neuronas suplementarias a nuestra neurona formal, vamos a poder clasificar datos que no son linealmente separables.