Método de descenso de gradiente -- bajar la montaña por la dirección más empinada

En este capítulo implementamos el descenso de gradiente desde cero y lo usamos para ajustar una regresión lineal.Este es el prototipo matemático de todo el bucle de entrenamiento de IA.


Análisis conceptual

Fórmulas centrales

\[ \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) \]

Ciclo de entrenamiento de cuatro pasos


Propagación hacia adelante
Predicción de la salida

Cálculo de la pérdida
Medición de la diferencia

Cálculo del gradiente
Retropropagación

Actualización de parámetros
θ -= η·∇J

Influencia de la tasa de aprendizaje

Tasa de aprendizajeEfecto
Demasiado pequeñaConverge muy lentamente, necesita muchos pasos
ModeradaConvergencia estable y rápida
Demasiado grandeOscila o incluso diverge

Ejemplo de la vida cotidiana

Bajar la montaña en un día de densa niebla

En un día de niebla tan densa que no puedes ver los dedos de tu mano, tienes que bajar la montaña. La estrategia para cada paso:

Siente la dirección más empinada bajo tus pies → da un pequeño paso en la dirección de mayor pendiente descendente → detente → vuelve a sentir → da otro pequeño paso → repite.

Esto es el descenso de gradiente: sentir = calcular el gradiente, dar un pequeño paso = actualizar los parámetros, detenerse = siguiente iteración.


Práctica en Python

Ejemplo

import numpy as np

# Generar datos y = 3x + 2 + noise
np.random.seed(42)
X = np.linspace(0, 10, 100)
y = 3 * X + 2 + np.random.normal(0, 2, 100)

# desdeCeroimplementa梯Gradoabajo降
w, b = 0.0, 0.0
lr, n_iter = 0.01, 200
losses = []

for i in range(n_iter):
    y_pred = w * X + b
    loss = np.mean((y_pred - y) ** 2)
    losses.append(loss)
    # Gradiente
    dw = 2 * np.mean((y_pred - y) * X)
    db = 2 * np.mean(y_pred - y)
    # Actualización
    w -= lr * dw
    b -= lr * db

print(fEJEMPLO resultado del descenso de gradiente:)
print(f"Verdadero: w=3.0, b=2.0")
print(f"Ajuste: w={w:.4f}, b={b:.4f}")
print(f"Pérdida inicial: {losses)
EJEMPLO 梯度下降结果:
真实: w=3.0, b=2.0
拟合: w=2.9874, b=2.2835
初始损失: 79.69 → 最终损失: 3.91

Curva de descenso de la pérdida


Escenarios de aplicación en IA

Prototipo matemático del bucle de entrenamiento de PyTorch

Todos los bucles de entrenamiento de aprendizaje profundo siguen el mismo patrón, que es el descenso de gradiente:

① optimizer.zero_grad() → limpiar la caché de gradientes; ② loss = model(x) → propagación hacia adelante; ③ loss.backward() → retropropagación para calcular el gradiente; ④ optimizer.step() → ejecutar la actualización de parámetros θ -= η·∇J.

Al comprender este ciclo de cuatro pasos, entiendes la lógica central de entrenamiento de todos los frameworks de aprendizaje profundo.

La tasa de aprendizaje es el hiperparámetro más importante

Tasa de aprendizaje demasiado grande → la pérdida oscila o incluso diverge; tasa de aprendizaje demasiado pequeña → converge muy lentamente y puede quedarse atrapada en un óptimo local. La programación de la tasa de aprendizaje (Step, Cosine Annealing, Warmup) es una técnica indispensable para entrenar modelos grandes: el entrenamiento de GPT-3 utilizó una estrategia de warmup lineal + cosine decay.

Compensación del tamaño de lote en SGD

GD completo: usa todos los datos para calcular el gradiente exacto, lento pero estable; SGD (batch_size=1): solo mira una muestra cada vez, rápido pero con gran ruido en la estimación del gradiente; Mini-batch SGD: solución intermedia (batch_size=32/64/128), con ruido moderado, que incluso ayuda a escapar de óptimos locales: es la práctica estándar en el entrenamiento real.

Limitaciones del descenso de gradiente

El descenso de gradiente encuentra puntos donde el gradiente es cero: pueden ser óptimos globales, óptimos locales o puntos de silla. En espacios de alta dimensión, los puntos de silla son mucho más comunes que los óptimos locales: un punto puede ser un mínimo en algunas direcciones y un máximo en otras. Los optimizadores adaptativos como Adam pueden escapar de los puntos de silla de manera más eficaz.


Otras extensiones