Redes Neuronales: Qué son, el perceptrón y ejemplos

¿Qué son las redes neuronales?

En los últimos años el termino redes neuronales o neural networks ha ido ganando popularidad y ya es difícil encontrar productos o tecnologías que no hagan uso de ellas. A continuación explicamos lo que son, que pueden hacer, como aprenden, que tipos existen y mostraremos varios ejemplos sencillos.

La forma más básica de ver una red neuronal es hacerlo como si fuera una caja negra, lo que hace referencia a un sistema que tiene unas entradas y unas salidas, pero del que se desconoce lo que hay en el interior.

Es decir, tenemos unas entradas que son usadas de una manera determinada para proporcionar una salida. Una red neuronal es exactamente esto.

La caja negra puede realizar diferentes tareas, como por ejemplo reconocer si en una imagen tenemos un perro o un gato. Por lo que tendríamos:

  • La entrada sería la imagen. Algo muy común trabajando con imágenes es serializarla y convertir la imagen en píxeles, donde habría tantas entradas como píxeles.
  • La salida sería un simple 1 o 0, para indicar si se ha detectado un perro o un gato respectivamente. Se podría tener también un -1 para indicar que no se ha detectado ni un perro ni un gato.

De hecho si no nos queremos complicar la vida, podríamos usar un modelo ya entrenado para clasificar gatos y perros[1]. Una vez tengamos dicho modelo, basta con introducir la imagen y esperar a que se nos devuelva la salida con la etiqueta de perro o gato.

Se define como modelo al resultado de entrenar un determinado algoritmo con un conjunto de datos, y que puede ser usado para realizar una tarea concreta. En otras palabras, es nuestra caja negra. Existen modelos para aplicaciones de lo más diversas, desde clasificar gatos o perros a traductores de idiomas.

El proceso para obtener un modelo, sería lo siguiente grosso modo:

  • Tenemos un conjunto de datos clasificados, normalmente cuantos más mejor. En el ejemplo del clasificador de perros/gatos, serían imágenes de los animales indicando para cada imagen que hay en cada una de ellas, si es un perro o un gato.
  • Es normal realizar algún tipo de procesado antes de entrenar el modelo. Si por ejemplo tenemos imágenes de diferente tamaño podría ser conveniente convertirlas al mismo, o tal vez alguna corrección de color.
  • Con los datos listos podemos ya entrenar al modelo, lo que consiste en calcular los parámetros internos de nuestra caja negra, para que haga lo que queremos.
  • Es muy importante evaluar e iterar. Evaluando verificamos que la precisión de nuestro modelo es aceptable. Si no lo es debemos volver al primer paso y modificar diferentes parámetros o tal vez obtener un mayor o mejor dataset.
  • Por último una vez que nuestro modelo ha sido entrenado y estamos satisfechos con su performance estamos listos para usarlo.

Aplicaciones de las redes neuronales

Hemos visto ya un clasificador de gatos/perros, pero las aplicaciones de las redes neuronales van mucho más allá. Veamos algunas de ellas:

  • El modelo MNIST es uno de los más usados con fines didácticos. Se trata de una sencilla red neuronal convolucional que permite reconocer un dígito escrito a mano. Le pasas una foto de un número y te dice si es 0-9[2][3]

  • Otra aplicación sencilla es el modelo YOLO, que permite detectar en una imagen diferentes objetos como una bicicleta o un coche. Además de detectar el objeto, indica su posición[4][5] en la imagen.

  • El traductor de Google que seguramente hayas usado, usa redes neuronales[6].

  • La famosa compañía de tarjetas gráficas NVIDIA está cada vez más involucrada en este mundo, y una de sus últimas tecnologías permite cancelar el ruido de fondo de una manera muy efectiva[7].

  • El autopilot de Tesla usa redes neuronales[8] para detectar objetos, peatones o señales.

  • Lamentablemente no todos los modelos con redes neuronales en los que trabajan grandes empresas son abiertos, pero existen gran cantidad de modelos abiertos y gratis en diferentes campos como el procesado de voz, tratamiento de imagen, traducción de idiomas o síntesis de voz[9].

El perceptrón, la unidad básica

Vista ya una breve introducción y lo que pueden hacer, vamos a entrar dentro de la caja negra y ver lo que tenemos dentro. El punto de partida es el perceptrón conocido en Inglés como perceptron.

Podemos ver como a la izquierda tenemos las entradas y a la derecha la salida. En su interior, tenemos unos pesos w, un sumatorio y una función de activación. La salida se calcula multiplicando las entradas por los pesos.

Veamos un ejemplo. Vamos a crear una red neuronal que permita saber si un alumno ha aprobado o no una asignatura en base a 5 notas de diferentes exámenes.

El valor de los pesos w_1, w_2, w_3, w_4, w_5 será igual a 0.2 para todos, lo que nos permitirá calcular la media y la función de activación indicará si se ha aprobado, con una nota mayor que 5.

Tenemos ya por lo tanto nuestra red neuronal. La entrada son las 5 notas de los exámenes y la salida es 1 si el alumno ha aprobado y 0 si ha suspendido. Veamos dos ejemplos:

  • Notas: 7, 9, 4, 5, 10. El cálculo se realizaría de la siguiente manera 7*0.2 + 9*0.2 + 4*0.2 + 5*0.2 + 10*0.2 es 7, y como es mayor que 1, la función de activación es 1, lo que indica que el alumno ha aprobado.

  • Notas: 4, 3, 7, 5, 5. Para este caso el resultado es 4.8, y tras aplicar la función de activación tendríamos un 0, lo que significa que el alumno ha suspendido.

Tenemos por lo tanto un sistema que calcula la media de 5 valores, y aplica una función de activación, donde se considera que un 5 es aprobado.

El perceptrón multicapa, la red neuronal

El perceptrón multicapa o MLP Multi Layer Perceptron es una red neuronal artificial formada por múltiples perceptrones simples en diferentes capas. Se diferencian las siguientes partes:

  • Capa de entrada. Existe sólo una y tiene tantas neuronas como entradas tenga nuestro sistema.
  • Capas ocultas o hidden layers. Puede haber n capas ocultas, y típicamente cuando su número es muy elevado podemos hablar de deep learning.
  • Capa de salida. La capa de salida nos da el resultado del modelo tras propagar la entrada a través de la red.

De la misma forma que el perceptrón simple tenía unos pesos w_i asociados, un perceptrón multicapa tiene conjuntos de pesos para cada capa y por neurona y es común almacenarlos en matrices. Es decir, para cada flecha que ves en la imagen anterior existirá un peso w_i asociado, y en muchos casos pueden existir millones de ellos.

¿Cómo aprenden las redes neuronales?

Llegados a este punto ya sabemos algunas aplicaciones de las redes neuronales y como pueden ser por dentro. Como hemos indicado también, es posible usar redes neuronales ya entrenadas para una tarea concreta, pero ¿y si quisiéramos entrenar nuestra propia red neuronal?

Pues bien, tal vez queramos resolver un problema al que nunca nadie haya aplicado redes neuronales. De ser este el caso, tenemos que ser nosotros los que entrenemos el modelo.

Entrenar un modelo es simplemente dar con la combinación de esos pesos o weights w_i que hemos visto de tal forma que pueda predecir una salida para una determinada entrada de la forma más fidedigna posible.

Volviendo al ejemplo del clasificador de perros y gatos, podríamos tener un modelo con unos pesos determinados que clasificara los perros y gatos con un 60% de acierto, pero tal vez no sea muy útil al tener una precisión tan baja.

Entrenar una red neuronal es una especie de proceso de acierto y error, siguiendo los siguientes pasos:

  • Paso 1: Se empieza con unos valores para los pesos w_i.
  • Paso 2: Se prueba con una entrada conocida y se calcula la salida.
  • Paso 3: Se observa cuanto de distinta es la salida calculada de la que debería haber sido.
  • Paso 4: Se modifican los pesos de acuerdo a un determinado criterio y se vuelve al paso 2.

Este proceso se realiza de manera iterativa, y cuando se ve que tras un determinado número de intentos no se mejora la precisión, se para y se asume que el modelo es válido.

Por supuesto se trata de una simplificación ya que hay otros factores y parámetros a tener en cuenta, como los bias, arquitectura de la red o hyper-parameters entre otros.

Es importante también entender los conceptos de forward propagation y backward propagation:

  • La forward propagation hace referencia al uso de la red neuronal, es decir, calcular la salida para una entrada determinada. Se llama así porque los valores de la entrada se propagan hasta la salida (de izquierda a derecha). Esto es también llamado inferencia o inference.
  • Por lo contrario la backward propagation hace referencia al proceso inverso, donde el error obtenido en la salida se propaga por la red neuronal de salida a entrada, modificando los pesos para buscar un menor error. A este proceso se le conoce como aprendizaje o learning.

Tipos de redes neuronales

Hasta ahora hemos visto los pilares fundamentales de las redes neuronales, un conjunto de neuronas o perceptrones conectados entre si con unos pesos que indican como de importante es una entrada.

Conectando dichas neuronas de diferente manera con otros bloques y otros tipo de de capas, surgen gran cantidad de tipos de redes neuronales. Nombramos algunas de las más relevantes:

  • Multi Layer Perceptron: Es una de las más básicas que hemos visto anteriormente. Es usada para clasificar datos que no pueden ser separados linealmente.
  • Convolutional Neural Network: También conocida como CNN o red convolucional, es un tipo de red que contiene una o varias capas convolucionales. Son muy usadas para tratamiento de imágenes.
  • Recurrent Neural Network: Conocidas como RNN o redes neuronales recurrentes, donde la salida de una determinada capa es guardada y realimentada a la capa anterior, por lo que tienen memoria. Son usadas en síntesis de voz o aprendizaje gramatical entre otros.

Un poco de matemáticas

Aunque pueda parecer complicado, la forward propagation mencionada anteriormente es en realidad bastante simple desde un punto de vista matemático. Tan solo necesitamos realizar sumas y multiplicaciones, que en ciertas aplicaciones prácticas, pueden ser del orden de millones.

Veamos con un ejemplo como se pueden realizar los cálculos. Tenemos una red neuronal simple con la siguiente arquitectura:

  • Tenemos dos entradas.
  • Una capa oculta o hidden layer con tres neuronas.
  • Y una única salida.

Podemos ver que existen diferentes pesos w_{ij} y b_i llamados bias. Todos estos valores pueden ser organizados en matrices ya que resultan más fáciles de operar, pero veamos como podríamos calcular la salida para una entrada concreta.

Vamos a suponer que tenemos dos entradas i_1=3, i_2=2. En una aplicación real tendríamos más entradas y podrían ser los píxeles de una imagen, una señal de audio o cualquier otra característica relevante.

Por lo tanto la salida se calcularía de la siguiente manera. Ver imagen para los pesos:

  • Calculamos el valor de la primera neurona de la capa intermedia o capa oculta. Para ello se multiplican las entradas por los pesos de cada conexión, y se suman todos. i_1 * w_{11} + i_2 * w_{21}. Por último se suma el valor de b_1. El resultado sería 3 * 1 + 2 * 2 + 5 = 12.
  • A continuación calculamos el valor de la segunda neurona de la capa intermedia. De la misma manera 3*2+2*2+3 = 13.
  • Y lo mismo para la tercera neurona. 3*1+2*2+3 = 10.

Ya tenemos por lo tanto los valores de la capa intermedia, 12, 13 y 10. El último paso sería realizar lo mismo propagando esos valores a la capa de salida. Para ello usamos los pesos de esa capa, 5,1 y 2. Es decir 12*5 + 13*1 + 10*2 = 93. Por lo tanto la salida de nuestra red neuronal sería 93.

Es importante notar lo siguiente:

  • Hemos realizado varias simplificaciones, como por ejemplo no usar ninguna función de activación.
  • El ejemplo muestra únicamente la forma de calcular la salida para una determinada entrada. El proceso de entrenamiento es mucho más complejo.
  • Nos hemos centrado en la matemática existente por detrás, pero es necesario darle algún sentido a esas entradas y salidas.

Expresado con matrices, podríamos describir el cálculo realizado en la capa intermedia de la siguiente manera. Esto realizaría la misma operación que hemos hecho antes pero de manera matricial.

\left(\begin{matrix}w_{11} & w_{21} \\ w_{12} & w_{22}\\ w_{13} & w_{23}\end{matrix}\right) * \left(\begin{matrix}i_{1} \\ i_{2} \end{matrix}\right) + \left(\begin{matrix}b_1  \\ b_2 \\ b_3\end{matrix}\right)

¡Deja un comentario!

avatar
  Subscribe  
Notify of