1. ¿Qué es una Red Neuronal?

Una red neuronal es un modelo computacional inspirado en la estructura y funcionamiento del cerebro humano. Está compuesta por unidades básicas llamadas neuronas o nodos, que están organizadas en capas. Las redes neuronales son capaces de aprender patrones complejos a partir de datos y se utilizan en una amplia variedad de aplicaciones, desde la clasificación de imágenes hasta el procesamiento del lenguaje natural.

Componentes Básicos de una Red Neuronal

  1. Neuronas: La unidad básica de una red neuronal. Cada neurona recibe una o más entradas, las procesa y produce una salida.
  2. Capas: Las neuronas están organizadas en capas:
    • Capa de Entrada: Recibe los datos de entrada.
    • Capas Ocultas: Procesan las entradas a través de múltiples transformaciones.
    • Capa de Salida: Produce el resultado final.
  3. Pesos y Sesgos: Cada conexión entre neuronas tiene un peso asociado, y cada neurona tiene un sesgo. Los pesos y sesgos se ajustan durante el entrenamiento para minimizar el error.
  4. Funciones de Activación: Determinan la salida de una neurona dada una entrada. Ejemplos comunes incluyen la función sigmoide, ReLU (Rectified Linear Unit), y tanh.

  1. Cómo Funciona una Red Neuronal

Propagación Hacia Adelante (Forward Propagation)

En la propagación hacia adelante, los datos de entrada se pasan a través de la red, capa por capa, hasta que se produce una salida. Este proceso implica:

  1. Cálculo de la Entrada Ponderada: Para cada neurona, se calcula la entrada ponderada como la suma de los productos de las entradas y sus pesos más el sesgo. \[ z = \sum_{i=1}^{n} (w_i \cdot x_i) + b \] Donde:

    • \( z \) es la entrada ponderada.
    • \( w_i \) son los pesos.
    • \( x_i \) son las entradas.
    • \( b \) es el sesgo.
  2. Aplicación de la Función de Activación: La entrada ponderada se pasa a través de una función de activación para producir la salida de la neurona. \[ a = \sigma(z) \] Donde \( \sigma \) es la función de activación.

Ejemplo de Propagación Hacia Adelante

import torch
import torch.nn as nn
import torch.nn.functional as F

# Definición de una red neuronal simple
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(3, 5)  # Capa oculta con 3 entradas y 5 salidas
        self.fc2 = nn.Linear(5, 1)  # Capa de salida con 5 entradas y 1 salida

    def forward(self, x):
        x = F.relu(self.fc1(x))  # Aplicación de ReLU en la capa oculta
        x = torch.sigmoid(self.fc2(x))  # Aplicación de Sigmoid en la capa de salida
        return x

# Creación de una instancia de la red y datos de entrada
model = SimpleNN()
input_data = torch.tensor([1.0, 2.0, 3.0])

# Propagación hacia adelante
output = model(input_data)
print(output)

Retropropagación (Backpropagation)

La retropropagación es el proceso mediante el cual la red ajusta sus pesos y sesgos para minimizar el error. Este proceso implica:

  1. Cálculo del Error: Se calcula el error entre la salida predicha y la salida real utilizando una función de pérdida.
  2. Cálculo del Gradiente: Se calcula el gradiente del error con respecto a cada peso y sesgo utilizando el algoritmo de retropropagación.
  3. Actualización de Pesos y Sesgos: Los pesos y sesgos se actualizan en la dirección opuesta al gradiente para reducir el error.

  1. Ejercicio Práctico

Ejercicio: Implementar una Red Neuronal Simple

Implementa una red neuronal simple con una capa oculta utilizando PyTorch. La red debe ser capaz de realizar una tarea de clasificación binaria.

Paso 1: Definir la Red Neuronal

import torch
import torch.nn as nn
import torch.optim as optim

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(2, 4)  # Capa oculta con 2 entradas y 4 salidas
        self.fc2 = nn.Linear(4, 1)  # Capa de salida con 4 entradas y 1 salida

    def forward(self, x):
        x = torch.relu(self.fc1(x))  # Aplicación de ReLU en la capa oculta
        x = torch.sigmoid(self.fc2(x))  # Aplicación de Sigmoid en la capa de salida
        return x

Paso 2: Crear Datos de Entrenamiento

# Datos de entrenamiento (XOR problem)
inputs = torch.tensor([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]])
labels = torch.tensor([[0.0], [1.0], [1.0], [0.0]])

Paso 3: Entrenar la Red Neuronal

# Crear una instancia de la red
model = SimpleNN()

# Definir la función de pérdida y el optimizador
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)

# Entrenamiento
for epoch in range(1000):
    optimizer.zero_grad()  # Limpiar los gradientes
    outputs = model(inputs)  # Propagación hacia adelante
    loss = criterion(outputs, labels)  # Calcular la pérdida
    loss.backward()  # Retropropagación
    optimizer.step()  # Actualizar los pesos

    if (epoch+1) % 100 == 0:
        print(f'Epoch [{epoch+1}/1000], Loss: {loss.item():.4f}')

Paso 4: Evaluar la Red Neuronal

# Evaluación
with torch.no_grad():
    outputs = model(inputs)
    predicted = (outputs > 0.5).float()
    accuracy = (predicted == labels).sum() / labels.size(0)
    print(f'Accuracy: {accuracy:.4f}')

Solución del Ejercicio

La red neuronal simple debería ser capaz de aprender la función XOR después de suficiente entrenamiento. La precisión debería acercarse a 1.0 (100%) después de 1000 épocas.

  1. Conclusión

En esta lección, hemos introducido los conceptos básicos de las redes neuronales, incluyendo su estructura y funcionamiento. Hemos aprendido sobre la propagación hacia adelante y la retropropagación, y hemos implementado una red neuronal simple utilizando PyTorch. En la próxima lección, profundizaremos en la creación de redes neuronales más complejas y exploraremos diferentes funciones de activación.

¡Felicidades por completar esta lección! Ahora estás listo para avanzar a la siguiente sección, donde crearás tu primera red neuronal simple en PyTorch.

© Copyright 2024. Todos los derechos reservados