Introducción

Las redes neuronales son un conjunto de algoritmos inspirados en el funcionamiento del cerebro humano, diseñados para reconocer patrones. Son una de las técnicas más poderosas y versátiles en el campo del Machine Learning, especialmente útiles para tareas complejas como el reconocimiento de imágenes, el procesamiento del lenguaje natural y la predicción de series temporales.

Conceptos Clave

  1. Neuronas Artificiales: La unidad básica de una red neuronal, similar a una neurona biológica.
  2. Capas: Las redes neuronales están compuestas por capas de neuronas. Hay tres tipos principales de capas:
    • Capa de entrada: Recibe las características de los datos de entrada.
    • Capas ocultas: Procesan las entradas a través de una serie de transformaciones.
    • Capa de salida: Produce la predicción final.
  3. Pesos y Sesgos: Los pesos determinan la importancia de cada entrada, y los sesgos permiten ajustar la salida de la neurona.
  4. Función de Activación: Introduce no linealidad en el modelo, permitiendo a la red aprender relaciones complejas. Ejemplos comunes incluyen ReLU, Sigmoid y Tanh.
  5. Propagación hacia Adelante (Forward Propagation): El proceso de pasar las entradas a través de la red para obtener una salida.
  6. Propagación hacia Atrás (Backpropagation): El proceso de ajustar los pesos y sesgos de la red para minimizar el error de predicción.

Arquitectura de una Red Neuronal

Estructura Básica

Capa Descripción
Entrada Recibe los datos de entrada.
Oculta Realiza cálculos intermedios para transformar las entradas en salidas.
Salida Proporciona la predicción final del modelo.

Ejemplo de Red Neuronal

import numpy as np

# Función de activación Sigmoid
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# Derivada de la función Sigmoid
def sigmoid_derivative(x):
    return x * (1 - x)

# Datos de entrada (4 ejemplos con 3 características cada uno)
inputs = np.array([[0, 0, 1],
                   [1, 1, 1],
                   [1, 0, 1],
                   [0, 1, 1]])

# Salidas esperadas
outputs = np.array([[0], [1], [1], [0]])

# Inicialización de pesos aleatorios
np.random.seed(1)
weights = 2 * np.random.random((3, 1)) - 1

# Entrenamiento de la red neuronal
for epoch in range(10000):
    # Propagación hacia adelante
    input_layer = inputs
    outputs_pred = sigmoid(np.dot(input_layer, weights))
    
    # Cálculo del error
    error = outputs - outputs_pred
    
    # Ajuste de pesos mediante backpropagation
    adjustments = error * sigmoid_derivative(outputs_pred)
    weights += np.dot(input_layer.T, adjustments)

print("Pesos ajustados después del entrenamiento:")
print(weights)

print("Salida después del entrenamiento:")
print(outputs_pred)

Explicación del Código

  1. Función de Activación Sigmoid: Se utiliza para introducir no linealidad en la red.
  2. Datos de Entrada y Salida: Se definen los datos de entrada y las salidas esperadas.
  3. Inicialización de Pesos: Los pesos se inicializan aleatoriamente.
  4. Entrenamiento: Se realiza la propagación hacia adelante para calcular las salidas predichas y luego se ajustan los pesos utilizando backpropagation.

Ejercicio Práctico

Ejercicio

Implementa una red neuronal simple para resolver el problema XOR. El problema XOR es un problema clásico en el que la salida es 1 si una de las entradas es 1, pero no ambas.

Datos de Entrada y Salida

Entrada 1 Entrada 2 Salida
0 0 0
0 1 1
1 0 1
1 1 0

Solución

import numpy as np

# Función de activación Sigmoid
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# Derivada de la función Sigmoid
def sigmoid_derivative(x):
    return x * (1 - x)

# Datos de entrada (4 ejemplos con 2 características cada uno)
inputs = np.array([[0, 0],
                   [0, 1],
                   [1, 0],
                   [1, 1]])

# Salidas esperadas
outputs = np.array([[0], [1], [1], [0]])

# Inicialización de pesos aleatorios
np.random.seed(1)
weights_input_hidden = 2 * np.random.random((2, 2)) - 1
weights_hidden_output = 2 * np.random.random((2, 1)) - 1

# Entrenamiento de la red neuronal
for epoch in range(10000):
    # Propagación hacia adelante
    input_layer = inputs
    hidden_layer = sigmoid(np.dot(input_layer, weights_input_hidden))
    output_layer = sigmoid(np.dot(hidden_layer, weights_hidden_output))
    
    # Cálculo del error
    error_output_layer = outputs - output_layer
    error_hidden_layer = error_output_layer.dot(weights_hidden_output.T) * sigmoid_derivative(hidden_layer)
    
    # Ajuste de pesos mediante backpropagation
    adjustments_hidden_output = hidden_layer.T.dot(error_output_layer * sigmoid_derivative(output_layer))
    adjustments_input_hidden = input_layer.T.dot(error_hidden_layer)
    
    weights_hidden_output += adjustments_hidden_output
    weights_input_hidden += adjustments_input_hidden

print("Pesos ajustados después del entrenamiento:")
print("Pesos de entrada a capa oculta:")
print(weights_input_hidden)
print("Pesos de capa oculta a salida:")
print(weights_hidden_output)

print("Salida después del entrenamiento:")
print(output_layer)

Explicación del Código

  1. Datos de Entrada y Salida: Se definen los datos de entrada y las salidas esperadas para el problema XOR.
  2. Inicialización de Pesos: Los pesos se inicializan aleatoriamente para las conexiones entre la capa de entrada y la capa oculta, y entre la capa oculta y la capa de salida.
  3. Entrenamiento: Se realiza la propagación hacia adelante para calcular las salidas predichas y luego se ajustan los pesos utilizando backpropagation.

Conclusión

En esta sección, hemos cubierto los conceptos básicos de las redes neuronales, incluyendo su estructura y funcionamiento. También hemos implementado una red neuronal simple para resolver el problema XOR. Las redes neuronales son una herramienta poderosa en el Machine Learning y son la base de técnicas más avanzadas como el Deep Learning. En el siguiente módulo, exploraremos algoritmos de Machine Learning no supervisado, como el clustering y el análisis de componentes principales.

Curso de Machine Learning

Módulo 1: Introducción al Machine Learning

Módulo 2: Fundamentos de Estadística y Probabilidad

Módulo 3: Preprocesamiento de Datos

Módulo 4: Algoritmos de Machine Learning Supervisado

Módulo 5: Algoritmos de Machine Learning No Supervisado

Módulo 6: Evaluación y Validación de Modelos

Módulo 7: Técnicas Avanzadas y Optimización

Módulo 8: Implementación y Despliegue de Modelos

Módulo 9: Proyectos Prácticos

Módulo 10: Recursos Adicionales

© Copyright 2024. Todos los derechos reservados