Skip to content

Bootcamp-IA-P4/ia-f5-backpropagation

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 

Repository files navigation

El Algoritmo de Backpropagation

Una guía completa para el aprendizaje de redes neuronales


Introducción Histórica

Los Primeros Pasos (1940s-1960s)

  • 1943: McCulloch y Pitts proponen el primer modelo matemático de neurona artificial
  • 1957: Frank Rosenblatt desarrolla el Perceptrón, capaz de aprender tareas linealmente separables
  • Problema: El perceptrón solo podía resolver problemas linealmente separables (como la función AND, OR)
  • 1969: Minsky y Papert publican "Perceptrons", demostrando las limitaciones del perceptrón simple

El "Invierno de la IA" (1970s)

  • Las limitaciones del perceptrón llevaron a un período de desinterés en las redes neuronales
  • La comunidad científica se centró en otros enfoques de IA

El Renacimiento (1980s)

  • 1974-1982: Paul Werbos desarrolla las bases matemáticas del backpropagation en su tesis doctoral
  • 1986: Rumelhart, Hinton y Williams popularizan el algoritmo en "Learning representations by back-propagating errors"
  • Impacto: Permite entrenar redes neuronales multicapa, superando las limitaciones del perceptrón

¿Por qué fue revolucionario?

  • Resolvió el problema de cómo entrenar redes neuronales con capas ocultas
  • Hizo posible aproximar funciones no lineales complejas
  • Sentó las bases para el deep learning moderno

¿Qué es Backpropagation y para qué sirve?

Definición Simple

Backpropagation es un algoritmo que permite a las redes neuronales "aprender de sus errores" ajustando automáticamente sus pesos para mejorar sus predicciones.

El Problema que Resuelve

Imagina que tienes una red neuronal que debe predecir el precio de una casa. Inicialmente, sus predicciones son muy incorrectas. ¿Cómo sabe la red qué pesos debe ajustar y en qué cantidad?

La Función de Backpropagation

  1. Calcula el error: Compara la predicción con el valor real
  2. Propaga el error: Distribuye la "culpa" del error hacia atrás por toda la red
  3. Ajusta los pesos: Modifica cada peso en la dirección que reduce el error

Analogía: El Chef Perfeccionista

Imagina un chef que está aprendiendo una receta nueva:

  • Prueba el plato (predicción)
  • Nota que está muy salado (error)
  • Identifica que echó demasiada sal (backpropagation)
  • Reduce la sal en la próxima preparación (ajuste de pesos)
  • Repite hasta perfeccionar la receta (entrenamiento)

Relación con el Descenso del Gradiente

¿Qué es el Descenso del Gradiente?

El descenso del gradiente es la estrategia general para minimizar el error. Imagínalo como encontrar el punto más bajo de una montaña con los ojos vendados.

Analogía: Descender una Montaña

  • Objetivo: Llegar al valle más profundo (mínimo error)
  • Estrategia: Sentir la inclinación del terreno y dar pasos en la dirección más empinada hacia abajo
  • Problema: ¿Cómo saber la inclinación en cada punto?

El Papel de Backpropagation

Backpropagation es el GPS del descenso del gradiente:

  • Calcula exactamente cuánto contribuye cada peso al error total
  • Determina la "dirección de descenso" para cada parámetro
  • Proporciona la información necesaria para dar el "paso" correcto

La Relación Matemática

Nuevo_Peso = Peso_Actual - Tasa_Aprendizaje × Gradiente

Donde el gradiente es calculado por backpropagation.


Ejemplos y Analogías Intuitivas

Analogía 1: La Cadena de Responsabilidad

Imagina una empresa donde se comete un error en el producto final:

  • CEO: "Hay un problema con nuestro producto"
  • Gerente de Producción: "El error viene de mi departamento, pero no sé exactamente dónde"
  • Supervisor: "Creo que el problema está en la línea 3"
  • Operario: "Ah sí, ajusté mal esta máquina"

Backpropagation hace exactamente esto: rastrea el error desde la salida hasta encontrar exactamente qué "operarios" (pesos) necesitan ajustarse.

Analogía 2: El Efecto Dominó Inverso

  • Un dominó cae al final (error en la salida)
  • Para entender por qué cayó, miramos hacia atrás
  • Cada dominó anterior contribuyó al resultado final
  • Backpropagation calcula cuánto contribuyó cada "dominó" (neurona) al error

Analogía 3: El Teléfono Descompuesto

En el juego del teléfono descompuesto:

  • El mensaje original se distorsiona paso a paso
  • Backpropagation hace lo contrario: toma el "mensaje de error" final y lo propaga hacia atrás
  • Cada persona (neurona) recibe información sobre cuánto contribuyó a la distorsión

Funcionamiento Paso a Paso (Conceptual)

Paso 1: Propagación Hacia Adelante (Forward Pass)

  1. La información entra por las neuronas de entrada
  2. Se procesa capa por capa hasta llegar a la salida
  3. Se genera una predicción

Paso 2: Cálculo del Error

  1. Se compara la predicción con el valor real
  2. Se calcula una medida del error (ej: error cuadrático medio)

Paso 3: Propagación Hacia Atrás (Backward Pass)

  1. El error se propaga desde la salida hacia las capas anteriores
  2. Cada neurona recibe información sobre su contribución al error
  3. Los pesos se ajustan proporcionalmente a su responsabilidad

Paso 4: Repetición

El proceso se repite miles de veces hasta que la red aprende a hacer predicciones precisas.


Fundamentos Matemáticos

Notación Básica

  • $w_{ij}^{(l)}$: peso de la neurona $i$ en la capa $l$ hacia la neurona $j$ en la capa $l+1$
  • $a_j^{(l)}$: activación de la neurona $j$ en la capa $l$
  • $z_j^{(l)}$: entrada ponderada de la neurona $j$ en la capa $l$
  • $\sigma(z)$: función de activación (ej: sigmoide, ReLU)
  • $C$: función de costo (error total)

Ecuaciones Fundamentales

1. Propagación Hacia Adelante

$$z_j^{(l)} = \sum_k w_{jk}^{(l-1)} a_k^{(l-1)} + b_j^{(l)}$$

$$a_j^{(l)} = \sigma(z_j^{(l)})$$

2. Función de Costo (Error Cuadrático Medio)

$$C = \frac{1}{2n} \sum_x |y(x) - a^{(L)}(x)|^2$$

Donde:

  • $n$: número de ejemplos de entrenamiento
  • $y(x)$: salida deseada
  • $a^{(L)}(x)$: salida actual de la red
  • $L$: última capa

Las Cuatro Ecuaciones de Backpropagation

Ecuación 1: Error en la Capa de Salida

$$\delta_j^{(L)} = \frac{\partial C}{\partial a_j^{(L)}} \sigma'(z_j^{(L)})$$

Interpretación: El error en la última capa depende de cuánto afecta esa neurona al costo total y de qué tan sensible es la función de activación.

Ecuación 2: Propagación del Error

$$\delta_j^{(l)} = \left[\sum_k w_{kj}^{(l+1)} \delta_k^{(l+1)}\right] \sigma'(z_j^{(l)})$$

Interpretación: El error de una neurona es la suma ponderada de los errores de las neuronas de la siguiente capa, multiplicada por la derivada de la función de activación.

Ecuación 3: Gradiente respecto a los Sesgos

$$\frac{\partial C}{\partial b_j^{(l)}} = \delta_j^{(l)}$$

Interpretación: El gradiente del sesgo es directamente el error de esa neurona.

Ecuación 4: Gradiente respecto a los Pesos

$$\frac{\partial C}{\partial w_{jk}^{(l)}} = a_k^{(l-1)} \delta_j^{(l)}$$

Interpretación: El gradiente del peso es el producto de la activación de entrada y el error de salida.


Ejemplo Numérico Simplificado

Red Simple: 2 → 2 → 1

Consideremos una red con:

  • 2 neuronas de entrada
  • 2 neuronas en capa oculta
  • 1 neurona de salida
  • Función de activación: sigmoide $\sigma(z) = \frac{1}{1+e^{-z}}$

Datos de Ejemplo

  • Entrada: $x_1 = 0.5, x_2 = 0.3$
  • Salida deseada: $y = 0.8$
  • Pesos iniciales (aleatorios):
    • $w_{11}^{(1)} = 0.2, w_{12}^{(1)} = 0.4$
    • $w_{21}^{(1)} = -0.1, w_{22}^{(1)} = 0.6$
    • $w_{11}^{(2)} = 0.3, w_{21}^{(2)} = -0.2$

Paso 1: Forward Pass

Capa oculta: $$z_1^{(2)} = 0.2 \times 0.5 + (-0.1) \times 0.3 = 0.1 - 0.03 = 0.07$$ $$a_1^{(2)} = \sigma(0.07) = \frac{1}{1+e^{-0.07}} \approx 0.517$$

$$z_2^{(2)} = 0.4 \times 0.5 + 0.6 \times 0.3 = 0.2 + 0.18 = 0.38$$ $$a_2^{(2)} = \sigma(0.38) \approx 0.594$$

Capa de salida: $$z_1^{(3)} = 0.3 \times 0.517 + (-0.2) \times 0.594 = 0.155 - 0.119 = 0.036$$ $$a_1^{(3)} = \sigma(0.036) \approx 0.509$$

Paso 2: Cálculo del Error

$$C = \frac{1}{2}(0.8 - 0.509)^2 = \frac{1}{2}(0.291)^2 \approx 0.042$$

Paso 3: Backward Pass

Error en capa de salida: $$\delta_1^{(3)} = (0.509 - 0.8) \times 0.509 \times (1-0.509) = -0.291 \times 0.25 \approx -0.073$$

Propagación a capa oculta: $$\delta_1^{(2)} = 0.3 \times (-0.073) \times 0.517 \times (1-0.517) \approx -0.005$$ $$\delta_2^{(2)} = (-0.2) \times (-0.073) \times 0.594 \times (1-0.594) \approx 0.004$$

Paso 4: Actualización de Pesos

Con tasa de aprendizaje $\alpha = 0.1$:

$$w_{11}^{(2)} = 0.3 - 0.1 \times 0.517 \times (-0.073) = 0.3 + 0.004 = 0.304$$ $$w_{21}^{(2)} = -0.2 - 0.1 \times 0.594 \times (-0.073) = -0.2 + 0.004 = -0.196$$


Variaciones y Optimizaciones

Problemas del Backpropagation Básico

  1. Desvanecimiento del Gradiente: En redes profundas, los gradientes se vuelven muy pequeños
  2. Explosión del Gradiente: Los gradientes pueden volverse muy grandes
  3. Mínimos Locales: El algoritmo puede quedarse atascado en soluciones subóptimas

Mejoras Modernas

  1. Funciones de Activación Mejoradas: ReLU, Leaky ReLU, ELU
  2. Normalización: Batch Normalization, Layer Normalization
  3. Optimizadores Avanzados: Adam, RMSprop, AdaGrad
  4. Técnicas de Regularización: Dropout, Weight Decay

Implementación Conceptual en Pseudocódigo

def backpropagation(red, datos_entrenamiento, epochs, tasa_aprendizaje):
    for epoch in range(epochs):
        for (entrada, salida_deseada) in datos_entrenamiento:

            # Forward Pass
            activaciones = forward_pass(red, entrada)

            # Calcular error
            error = calcular_error(activaciones[-1], salida_deseada)

            # Backward Pass
            gradientes = []
            delta = error * derivada_activacion(activaciones[-1])

            # Propagar error hacia atrás
            for capa in reversed(red.capas):
                gradiente_pesos = calcular_gradiente_pesos(delta, activaciones)
                gradiente_sesgos = delta
                gradientes.append((gradiente_pesos, gradiente_sesgos))

                # Calcular delta para capa anterior
                delta = propagar_delta(delta, capa.pesos, activaciones)

            # Actualizar pesos
            actualizar_parametros(red, gradientes, tasa_aprendizaje)

Aplicaciones Prácticas

Ejemplos de Uso

  1. Reconocimiento de Imágenes: Clasificar fotos de gatos vs perros
  2. Procesamiento de Lenguaje Natural: Traducción automática, chatbots
  3. Juegos: Entrenar agentes para jugar ajedrez, Go, videojuegos
  4. Medicina: Diagnóstico por imágenes médicas
  5. Finanzas: Predicción de precios de acciones, detección de fraude

Ejemplo Concreto: Reconocimiento de Dígitos

  • Entrada: Imagen de 28×28 píxeles (784 valores)
  • Capas ocultas: 2-3 capas de 100-500 neuronas cada una
  • Salida: 10 neuronas (una por cada dígito 0-9)
  • Proceso: Backpropagation ajusta ~50,000 pesos para minimizar errores de clasificación

Conclusiones y Perspectivas

Importancia Histórica

  • Hizo posible el entrenamiento de redes neuronales profundas
  • Sentó las bases para la revolución del deep learning
  • Sigue siendo fundamental en la mayoría de algoritmos modernos

Limitaciones Actuales

  • Requiere diferenciabilidad de las funciones
  • Puede ser lento para redes muy grandes
  • Sensible a la inicialización de pesos

El Futuro

  • Nuevos Algoritmos: Investigación en alternativas al backpropagation
  • Hardware Especializado: GPUs, TPUs optimizados para estas operaciones
  • Aplicaciones Emergentes: IA generativa, robótica avanzada, medicina personalizada

Mensaje Final

Backpropagation transformó una idea matemática elegante en la herramienta que impulsa la inteligencia artificial moderna. Entender sus principios es clave para cualquier profesional que trabaje con IA, independientemente de su background técnico.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published