Descifrando la Magia del Perceptrón Multicapa: Desafíos XOR y la Elegancia de Backpropagation

Perceptrón Multicapa (XOR, Backpropagation):

En esta entrega, nos sumergiremos en el mundo más complejo del Perceptrón Multicapa (MLP), una estructura que permite abordar problemas que el Perceptrón Simple no puede resolver, como el famoso problema XOR. Exploraremos cómo el MLP organiza capas de neuronas para aprender patrones más abstractos y realizar operaciones lógicas más avanzadas.

Además, introduciremos el algoritmo de Backpropagation, una técnica fundamental en el aprendizaje profundo. Comprenderemos cómo este algoritmo ajusta los pesos de manera inteligente, permitiendo que la red aprenda de sus errores y mejore sus predicciones con cada iteración.

Perceptrón multicapa: 

Es un tipo de red neuronal artificial con dos o más capas de neuronas, de tal manera que tiene capacidad para resolver problemas que no son linealmente separables, lo cual es la principal limitación del perpectrón simple. 

El perceptrón multicapa puede estar totalmente o localmente conectado. En el primer caso cada salida de una neurona de la capa "i" es entrada de todas las neuronas de la capa "i+1", mientras que en el segundo cada neurona de la capa "i" es entrada de una serie de neuronas (región) de la capa "i+1".



 

 

 

 

Las capas pueden clasificarse en tres tipos:

  • Capa de entrada: Constituida por aquellas neuronas que introducen los patrones de entrada en la red. En estas neuronas no se produce procesamiento.
  • Capas ocultas: Formada por aquellas neuronas cuyas entradas provienen de capas anteriores y cuyas salidas pasan a neuronas de capas posteriores.
  • Capa de salida: Neuronas cuyos valores de salida se corresponden con las salidas de toda la red.

Función XOR: 

Una función booleana que devuelve True si solo uno de sus dos inputs es True.

 

Entrada

XOR

0, 0

0

0, 1

1

1, 0

1

1, 1

0

Según la gráfica, cómo podemos clasificar los datos de salida?, con un perceptrón es imposible, este problema no tiene solución y es que se trata de una de las limitaciones de utilizar una única neurona, para codificar este modelo es imposible separar linealmente ambas clases de salidas (0, 1). 

La solución a este problema es muy sencilla, se debe añadir una segunda neurona, ya que con dos neuronas tendríamos dos rectas que podríamos usar para separar a ambos grupos de salida. como se ve en la siguiente imagen:

 

El código que nos resuelve el problema es el siguiente: 

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# Definición del modelo para XOR
model_xor = Sequential([
    Dense(units=2, input_shape=(2,), activation='sigmoid'),  # Capa oculta con 2 neuronas
    Dense(units=1, activation='sigmoid')  # Capa de salida con 1 neurona
])

# Compilar el modelo con optimizador 'adam' y pérdida 'binary_crossentropy'
model_xor.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# Datos de entrada y salida para XOR
input_data_xor = tf.constant([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=tf.float32)
labels_xor = tf.constant([[0], [1], [1], [0]], dtype=tf.float32)

# Entrenar el modelo
model_xor.fit(input_data_xor, labels_xor, epochs=5000, verbose=0)

# Probar el modelo con datos XOR
result_xor = model_xor.predict(input_data_xor).round()

# Mostrar resultados
for i in range(len(input_data_xor)):
    print(f"Resultado para XOR({input_data_xor[i]}): {result_xor[i][0]}"

El resultado es:

Resultado para XOR([0. 0.]): 0.0
Resultado para XOR([0. 1.]): 1.0
Resultado para XOR([1. 0.]): 1.0
Resultado para XOR([1. 1.]): 0.0

El modelo ha aprendido correctamente

Backpropagation: 

Un algoritmo para entrenar redes neuronales multicapa.

¿Qué ventaja clave del algoritmo de backpropagation es destacable? La eficiencia en el cálculo de errores con una sola pasada hacia atrás. Se resalta que backpropagation permite calcular los errores de cada neurona en una sola pasada hacia atrás, lo que lo hace un método eficiente.

Una única neurona sólo es capaz de resolver problemas lineables, siendo necesario juntar mas neuronas para abarcas problemas no lineales más complejos.

Este nuevo algoritmo de aprendizaje consigue que la red neuronal autoajuste sus parámetros para así aprender una representación interna de la información que estaba procesando. Este algoritmo es clave dentro de la arquitectura de la red neuronal.

Este algoritmo consiste en lo siguiente:

  • Propagación hacia adelante (forward propagation): los datos de entrada se propagan a través de las distintas capas de la red neuronal, desde la capa de entrada hasta la capa de salida. En cada capa se aplica una transformación lineal seguida de una función de activación para producir los valores de salida.
  • Cálculo del error: se compara la salida obtenida con la salida deseada y se calcula un valor de error.
  • Propagación hacia atrás (backpropagation): el error se propaga en sentido inverso, desde la capa de salida hasta la capa de entrada. En cada capa se calcula la contribución de sus neuronas al error total utilizando la derivada de la función de activación.
  • Actualización de pesos: los pesos de cada conexión neuronal se ajustan proporcionalmente a su contribución al error total, minimizando el error y acercando el modelo a la salida deseada. Esto se logra aplicando algún algoritmo de descenso de gradiente (gradient descent).

Este proceso se repite iterativamente sobre el conjunto de datos de entrenamiento para minimizar el error, hasta que la red neuronal converge a una solución óptima. Así, backpropagation permite entrenar redes neuronales multicapa de forma eficiente mediante la propagación de errores y gradientes.

Conclusión

  • Los perceptrones multicapa son una herramienta poderosa para resolver problemas no lineales.
  • El backpropagation es un algoritmo efectivo para entrenar perceptrones multicapa.
  • Es importante comprender los fundamentos del aprendizaje profundo para poder utilizarlo de forma efectiva.

Al concluir esta etapa, destacaremos la capacidad del Perceptrón Multicapa para abordar problemas más complejos y cómo el Backpropagation permite que la red mejore su rendimiento iteración tras iteración. Fomentaremos una actitud perseverante, ya que la comprensión de estos conceptos es clave para explorar arquitecturas más avanzadas y emocionantes en el aprendizaje profundo.

Aquí dejo un enlace para jugar un poco con la red neuronal Multicapa.

Aquí un video que amplía la comprensión del algoritmo Backpropagation.

 

Comentarios

Entradas más populares de este blog

Perceptrón Simple (Not, AND, OR):