Gradientes
El gradiente descendente es un método de optimización utilizado para minimizar funciones de costo o error, fundamentalmente en el entrenamiento de modelos de aprendizaje automático, como las redes neuronales. Funciona ajustando iterativamente los parámetros del modelo (pesos y bias en redes neuronales) en la dirección de la pendiente descendente de la función de costo, buscando reducir el error entre las predicciones del modelo y los valores reales.
Cómo funciona el Gradiente Descendente
El gradiente descendente calcula el gradiente de la función de costo con respecto a los parámetros del modelo. Este gradiente indica la dirección en la que la función de costo aumenta más rápidamente. Para minimizar la función, ajustamos los parámetros en la dirección opuesta del gradiente.
Paso a paso:
- Inicialización: Se asignan valores iniciales a los parámetros (pesos y bias).
- Calcular el Gradiente: Para cada iteración, se calcula el gradiente de la función de costo con respecto a cada parámetro.
- Actualizar Parámetros: Los parámetros se ajustan restando una fracción del gradiente, controlada por un hiperparámetro llamado tasa de aprendizaje ((\alpha)): [ \text{Nuevo parámetro} = \text{Parámetro actual} – \alpha \cdot \text{Gradiente} ]
- Repetición: Los pasos anteriores se repiten hasta que se alcance un mínimo aceptable de la función de costo, o el cambio en la función de costo entre iteraciones sea pequeño.
Tipos de Gradiente Descendente
- Gradiente Descendente en Batch (o Gradiente Completo)
- Calcula el gradiente utilizando todos los datos del conjunto de entrenamiento en cada iteración.
- Ventaja: Es más preciso ya que toma en cuenta todos los datos.
- Desventaja: Puede ser lento y costoso computacionalmente con grandes conjuntos de datos.
- Gradiente Descendente Estocástico (SGD)
- Calcula el gradiente usando una muestra aleatoria (un solo ejemplo) de datos en cada iteración.
- Ventaja: Es mucho más rápido y permite escapar de mínimos locales en ciertos casos.
- Desventaja: Su convergencia puede ser inestable debido a la variabilidad en cada paso.
- Gradiente Descendente en Mini-Batch
- Divide el conjunto de datos en pequeños lotes y calcula el gradiente usando cada lote por separado.
- Ventaja: Combinación de precisión y velocidad; reduce la variabilidad de SGD y es más rápido que el batch.
- Desventaja: Es menos preciso que el batch.
Ejemplos
- Regresión Lineal: En regresión lineal, el gradiente descendente se utiliza para minimizar la suma de los errores cuadráticos. Dado un conjunto de datos ((x, y)), se minimiza el costo: [ J(w, b) = \frac{1}{m} \sum_{i=1}^{m} (y^{(i)} – (wx^{(i)} + b))^2 ] donde (m) es el número de ejemplos, (w) y (b) son los parámetros a ajustar.
- Redes Neuronales: En redes neuronales, el gradiente descendente se aplica en cada iteración hacia atrás a través de la red, en un proceso llamado retropropagación. Ajusta los pesos de cada capa para minimizar el error entre la salida esperada y la salida del modelo.
Ejemplo en Código
import numpy as np
# Función de costo (error cuadrático medio)
def costo(X, y, w, b):
m = len(y)
predicciones = X.dot(w) + b
return (1 / (2 * m)) * np.sum((predicciones - y) ** 2)
# Gradiente descendente para regresión lineal simple
def gradiente_descendente(X, y, w_inicial, b_inicial, alpha, iteraciones):
m = len(y)
w, b = w_inicial, b_inicial
for _ in range(iteraciones):
# Predicciones
predicciones = X.dot(w) + b
# Cálculo del gradiente
dw = (1 / m) * X.T.dot(predicciones - y)
db = (1 / m) * np.sum(predicciones - y)
# Actualización de los parámetros
w = w - alpha * dw
b = b - alpha * db
return w, b
# Datos de ejemplo
X = np.array([[1], [2], [3], [4]])
y = np.array([3, 6, 7, 10])
# Parámetros iniciales y tasa de aprendizaje
w_inicial = np.array([0])
b_inicial = 0
alpha = 0.01
iteraciones = 1000
# Ejecución del gradiente descendente
w, b = gradiente_descendente(X, y, w_inicial, b_inicial, alpha, iteraciones)
print(f"Parámetro w optimizado: {w}")
print(f"Parámetro b optimizado: {b}")
Este ejemplo minimiza el error entre las predicciones y valores reales en un conjunto de datos sencillo, y encuentra los valores óptimos para (w) y (b) usando gradiente descendente.