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 aprendizaje | Efecto |
|---|---|
| Demasiado pequeña | Converge muy lentamente, necesita muchos pasos |
| Moderada | Convergencia estable y rápida |
| Demasiado grande | Oscila 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
# 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