Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Redes neuronales desde cero, Unidad 6 — Descenso por gradiente, 6.1 — Idea fundamental del gradiente ·

Dirección de mejora

Dirección de mejora

Introducción

El descenso por gradiente es uno de los fundamentos más importantes en la implementación de redes neuronales y modelos de aprendizaje profundo. Es a través de este proceso que las redes neuronalmente entrenadas pueden ajustar sus pesos para minimizar la función de pérdida. En esta unidad, exploraremos la idea fundamental del gradiente y cómo se utiliza para encontrar la dirección de mejora en el espacio de parámetros.

Explicación principal con ejemplos

La idea central detrás del descenso por gradiente es utilizar la derivada (o gradiente) de una función de pérdida respecto a los pesos de la red neuronal. Este gradiente nos indica la dirección en la que se incrementa más rápidamente la función de pérdida, y por lo tanto, el opuesto es la dirección en la cual disminuiría más rápido.

Visualización gráfica

Imagina un terreno con varias colinas y valles, donde nuestro objetivo es encontrar el punto más bajo (mínimo global) a partir de una posición inicial. Si nos movemos siempre en la dirección opuesta al gradiente del terreno en cada paso, eventualmente llegaríamos al punto más bajo.

Ejemplo matemático

Supongamos que tenemos una función simple de pérdida \(L(w)\), donde \(w\) son los pesos de nuestra red neuronal. El gradiente de esta función con respecto a \(w\) se denota como \(\nabla_w L\). La dirección del gradiente indica la dirección en la cual la función de pérdida crece más rápidamente.

\[ \text{Dirección de mejora} = -\nabla_w L(w) \]

Este concepto puede ser aplicado a una red neuronal con múltiples pesos y capas. Cada peso \(w_i\) tiene su propio gradiente, y la dirección de mejora para cada uno será:

\[ w_i^{(new)} = w_i^{(old)} - \eta \cdot \frac{\partial L}{\partial w_i} \]

donde \(\eta\) es el tasa de aprendizaje.

Bloque de código corto

import numpy as np

# Función de pérdida simple (por ejemplo, cuadrático)
def loss_function(weights):
    return sum([w**2 for w in weights])

# Gradientes a partir de la función de pérdida
def gradients(weights):
    return [2*w for w in weights]

weights = [1.0, 2.0, -3.0]
learning_rate = 0.1

# Calcular los nuevos pesos usando el descenso por gradiente
new_weights = [w - learning_rate * g for w, g in zip(weights, gradients(weights))]
print("Nuevos pesos:", new_weights)

Errores típicos / trampas

Trampa 1: Gradientes muy pequeños o cero

Cuando los gradientes se vuelven demasiado pequeños, el algoritmo de descenso por gradiente puede converger a una velocidad muy lenta. Esto se conoce como "gradientes estancados" y puede deberse a:

  • Pesos inicializados en valores muy grandes.
  • Uso de funciones de activación que limitan la magnitud del gradiente, como la tangente hiperbólica (tanh).

Trampa 2: Gradientes explotantes

En algunas redes neuronales, especialmente en aquellos con capas excesivamente profundas o con muchas unidades, los gradientes pueden crecer de forma descontrolada durante el backpropagation. Esto se llama "explotación del gradiente" y puede llevar a la divergencia del algoritmo.

Trampa 3: Tasa de aprendizaje incorrecta

Una tasa de aprendizaje demasiado alta puede provocar que los pesos oscilen o diverjan, mientras que una tasa muy baja hará que el entrenamiento se convierta en un proceso lento y tedioso. Es importante encontrar la tasa óptima a través del ajuste manual o mediante algoritmos como Adam.

Checklist accionable

  1. Inicialización de pesos: Asegúrate de inicializar los pesos con cuidado para evitar problemas de estancamiento.
  2. Funciones de activación: Elije funciones que no limiten excesivamente el gradiente, como ReLU en lugar de tanh.
  3. Tasa de aprendizaje: Comienza con una tasa moderada y ajusta según sea necesario.
  4. Regularización: Aplica regularización para prevenir la explotación del gradiente y mejorar la generalización.
  5. Escalado de características: Normaliza tus datos para que los gradientes se comporten de manera más constante durante el entrenamiento.

Cierre: Siguientes pasos

Ahora que comprendes mejor la dirección de mejora en el descenso por gradiente, aquí tienes algunos pasos siguientes:

  • Practica con problemas simples: Comienza a implementar redes neuronales básicas y aplicar descenso por gradiente manualmente.
  • Aprende sobre variantes del descenso por gradiente: Conoce las diferencias entre batch, mini-batch y stochastic descente por gradiente para optimizar el entrenamiento.
  • Entender la backpropagation: Asegúrate de comprender completamente cómo se calcula y aplica el gradientes durante la retropropagación.

Siguiendo estos pasos, podrás mejorar tu entendimiento y habilidades en el desarrollo de modelos de aprendizaje profundo.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).