Ir al contenido

Descenso de gradiente

En simple: lee esto primero

Descenso de gradiente = ir bajando la montaña del error a pasitos, siempre hacia donde más baja, hasta llegar al fondo.

Imagínalo así

Estás en un cerro con neblina y quieres llegar al valle. No ves el camino, pero sí sientes la inclinación bajo tus pies: das un paso cuesta abajo, vuelves a sentir, otro paso… así hasta el fondo.

Lo que tienes que llevarte
  • Se usa cuando no hay fórmula directa o cuando los datos son demasiados para usarla.
  • La tasa de aprendizaje es el tamaño del paso: muy chica tarda una eternidad; muy grande te hace saltar de un lado a otro sin llegar.
  • Si las variables están en escalas muy distintas (metros vs. millones), el valle queda alargado y bajar es lento: por eso se escalan los datos.
Palabras raras de esta página
gradiente
la flecha que apunta hacia donde la función sube más rápido.
tasa de aprendizaje (η)
el tamaño de cada paso.
época
una pasada completa por todos los datos.
estocástico / mini-batch
en vez de mirar todos los datos en cada paso, mirar uno o un grupito: más rápido, pero más «tembloroso».

Más abajo viene la versión completa, con fórmulas. Si una palabra aparece subrayada con puntos, pasa el mouse (o tócala) para ver qué significa.

La solución cerrada necesita formar e invertir X⊤X\mathbf{X}^\top\mathbf{X} (d×dd\times d, costo ∼O(d3)\sim O(d^3)). Con dd o nn enormes es demasiado lento o no cabe en memoria, y la mayoría de los modelos no tienen forma cerrada (la logística ya no la tiene). Entonces caminamos cuesta abajo.

No ves el bowl completo, pero en tu w\mathbf{w} actual siempre puedes medir la pendiente local:

  • El gradiente ∇J\nabla J apunta en la dirección de máximo aumento (cuesta arriba).
  • Para bajar, paso en la dirección opuesta, −∇J-\nabla J.
  • Paso pequeño, volver a medir, repetir. Cerca del fondo la pendiente se aplana, así que los pasos se achican solos.

Un excursionista en neblina espesa: no ve el valle, pero siente con los pies hacia dónde baja el terreno.

Reutilizamos el mismo gradiente de las ecuaciones normales, ahora para dar un paso en vez de resolver:

∇wJ=2X⊤(Xw−y)=−2X⊤r,w←w−η ∇wJ\nabla_\mathbf{w}J = 2\mathbf{X}^\top(\mathbf{X}\mathbf{w}-\mathbf{y}) = -2\mathbf{X}^\top\mathbf{r},\qquad \boxed{\mathbf{w}\leftarrow\mathbf{w}-\eta\,\nabla_\mathbf{w}J}

η\eta es la tasa de aprendizaje (learning rate), un hiperparámetro delicado:

  • η=0\eta = 0: los pesos nunca cambian, no se aprende nada.
  • η\eta muy pequeño: se arrastra (convergencia lentísima).
  • η\eta muy grande: se pasa del valle, oscila o diverge.
  • El signo menos es esencial: el gradiente apunta cuesta arriba.

Rueda cuesta abajo: descenso de gradiente

Regla: w ← w − η·J′(w). Arrastra el punto de inicio con el slider y observa qué hace la tasa de aprendizaje η. Prueba los valores de la slide: 0.04, 0.3, 0.9 y 1.04.

-202402.557.510parámetro wcosto J(w)
iteración0
w actual-2.500
J(w)12.250
pendiente J′(w)-7.000
η = 0.3: buena: baja directo. Aquí cada paso multiplica la distancia al mínimo por (1 − 2η) = 0.40: converge si |1 − 2η| < 1, es decir 0 < η < 1. La línea roja es la tangente: su pendiente es el gradiente.
Tres pasos de descenso de gradiente a mano (datos reales)
  1. Datos (x,y)(x,y): (1,2),(2,3),(3,5)(1,2), (2,3), (3,5). Modelo y^=wx\hat y = wx (sin sesgo, para simplificar). Costo promedio J(w)=13∑i(yi−wxi)2J(w) = \frac13\sum_i (y_i - wx_i)^2.
  2. Gradiente: J′(w)=−23∑ixi(yi−wxi)J'(w) = -\frac23\sum_i x_i(y_i - wx_i). Con w0=0w_0 = 0: residuales (2,3,5)(2,3,5), ∑xiri=2+6+15=23\sum x_ir_i = 2+6+15 = 23, así que J′(0)=−15.33J'(0) = -15.33. Paso con η=0.05\eta = 0.05: w1=0+0.05⋅15.33=0.767w_1 = 0 + 0.05\cdot15.33 = 0.767.
  3. En w1=0.767w_1 = 0.767: residuales (1.233, 1.467, 2.70)(1.233,\ 1.467,\ 2.70), ∑xiri=1.233+2.933+8.10=12.27\sum x_ir_i = 1.233+2.933+8.10 = 12.27, J′=−8.18J' = -8.18. Nuevo w2=0.767+0.409=1.176w_2 = 0.767 + 0.409 = 1.176.
  4. En w2=1.176w_2 = 1.176: residuales (0.824, 0.648, 1.472)(0.824,\ 0.648,\ 1.472), ∑xiri=6.536\sum x_ir_i = 6.536, J′=−4.36J' = -4.36; w3=1.394w_3 = 1.394. Los pasos se achican solos porque la pendiente se aplana.
  5. La solución exacta es w⋆=∑xiyi∑xi2=2314=1.643w^\star = \frac{\sum x_iy_i}{\sum x_i^2} = \frac{23}{14} = 1.643. Cada paso multiplica la distancia al óptimo por 1−η⋅23∑xi2=1−0.05⋅9.33=0.5331 - \eta\cdot\frac23\sum x_i^2 = 1 - 0.05\cdot9.33 = 0.533: convergencia geométrica.
  6. ¿Y si η=0.25\eta = 0.25? El factor sería 1−2.33=−1.331 - 2.33 = -1.33: ∣−1.33∣>1|{-1.33}| > 1, diverge. El máximo estable aquí es η<2/9.33≈0.214\eta < 2/9.33 \approx 0.214.

El gradiente −2X⊤r-2\mathbf{X}^\top\mathbf{r} es una suma sobre los puntos. Las variantes difieren en cuántos puntos usa cada paso:

VariantePuntos por pasoVentajaDesventaja
Batchlos nngradiente exacto, camino suavecada paso = una pasada completa por los datos
Estocástico (SGD)1 al azarpasos baratísimos, muchos por pasadaruidoso, tiembla alrededor del mínimo
Mini-batch32–256equilibrio; una multiplicación de matrices en GPUhay que elegir el tamaño

¿Por qué aceptar un gradiente ruidoso? Escala y memoria (millones de filas no caben), progreso más rápido (muchos pasos baratos por pasada), el ruido ayuda a escapar de mesetas en modelos no convexos, y hardware (un mini-batch es justo lo que acelera una GPU). Como la regresión lineal es convexa, las tres variantes llegan al mismo óptimo.

La curvatura del bowl la fija X⊤X\mathbf{X}^\top\mathbf{X}. Features en escalas muy distintas (metros² vs número de cuartos vs precio en millones) estiran el bowl en un valle largo y delgado: un solo η\eta no sirve para ambas direcciones y el descenso zigzaguea. Estandarizar cada feature (media 0, varianza 1) redondea el bowl y el descenso va casi derecho.

Curvas de nivel: por qué estandarizar

La forma del bowl la fija XᵀX. Con features en escalas muy distintas el valle es largo y fino (curvatura κ alta): un mismo η no sirve para ambas direcciones y el descenso zigzaguea. Con κ = 1 (features estandarizados) el bowl es redondo.

-4-2024-3-2-10123w₁w₂★
pasos hasta J < 0.0115
η máximo estable ≈ 2/κ0.250
J final0.0000
Con κ alto, η debe ser < 2/κ por la dirección empinada, pero entonces la dirección plana avanza lentísimo. Pon κ = 1: el mismo descenso va casi recto al ★. La solución cerrada no se entera del escalado; todo método iterativo sí.

J(w)=(w−1)2J(w) = (w-1)^2, w0=−2.5w_0 = -2.5. Haz dos pasos con η=0.3\eta = 0.3 y con η=1.04\eta = 1.04.

Solución

J′(w)=2(w−1)J'(w) = 2(w-1), así que wt+1=wt−2η(wt−1)w_{t+1} = w_t - 2\eta(w_t - 1), o bien wt+1−1=(1−2η)(wt−1)w_{t+1}-1 = (1-2\eta)(w_t-1).

  • η=0.3\eta = 0.3: factor 0.40.4. Distancia inicial −3.5→−1.4→−0.56-3.5 \to -1.4 \to -0.56; ww: −2.5→−0.4→0.44-2.5 \to -0.4 \to 0.44. Converge monótonamente.
  • η=1.04\eta = 1.04: factor −1.08-1.08. Distancia −3.5→3.78→−4.08-3.5 \to 3.78 \to -4.08; ww: −2.5→4.78→−3.08-2.5 \to 4.78 \to -3.08. Cambia de lado y crece: diverge.

Regla general para esta parábola: converge si ∣1−2η∣<1  ⟺  0<η<1|1-2\eta|<1 \iff 0<\eta<1; oscila si 0.5<η<10.5<\eta<1.

Autoevaluación

0/4 correctas · 0 respondidas
1. En w←w−η∇J\mathbf{w} \leftarrow \mathbf{w} - \eta\nabla J, fijar η=0\eta = 0…
2. ¿Qué variante usa un solo punto aleatorio por paso?
3. Features sin estandarizar provocan que el descenso de gradiente…
4. ¿Cuál NO depende del escalado de las features?
import numpy as np
def gd_linear(X, y, eta=0.1, epochs=100, batch=None, seed=0):
rng = np.random.default_rng(seed)
X1 = np.c_[np.ones(len(X)), X]
w = np.zeros(X1.shape[1])
n = len(y)
for _ in range(epochs):
idx = rng.permutation(n)
step = batch or n # batch=None → batch completo
for s in range(0, n, step):
b = idx[s:s + step]
r = y[b] - X1[b] @ w # residuales del mini-batch
grad = -2 * X1[b].T @ r / len(b) # ∇J promedio
w -= eta * grad
return w
Xs = (X - X.mean(0)) / X.std(0) # ¡estandarizar primero!
w_batch = gd_linear(Xs, y) # batch
w_mini = gd_linear(Xs, y, eta=0.05, batch=32) # mini-batch

Fuente ·ML_Course_Linear_Regression.pdf (slides 22–28) · ML_Course_Math_Foundations.pdf · ML_Course/session-02c-gradient-descent.ipynb