Machine learning desde cero · Lección 1.6 · 7 de 33 lecciones listas · 10 min
Descenso de gradiente: aprender a pequeños pasos
En pocas palabras
El descenso de gradiente busca buenos parámetros bajando paso a paso por el error. La tasa de aprendizaje decide entre avanzar y estallar.
Calentamiento Dos preguntas de lecciones anteriores. Un minuto, y no bloquea la lección.
En la lección anterior, una fórmula nos dio la mejor recta de una sola vez. Pero una red neuronal con millones de pesos no tiene una fórmula así. ¿Cómo puede una computadora encontrar buenos valores para millones de botones de ajuste si nadie puede decirle dónde está el mejor ajuste? La respuesta es casi vergonzosamente sencilla: nota hacia dónde baja el terreno y da un pequeño paso. Luego lo vuelve a hacer. Pruébalo tú mismo antes de leer la explicación.
Elige una respuesta y tu grado de seguridad.
Responde para desbloquear el experimento.
Experimento interactivo
Este experimento interactivo funciona en un navegador con JavaScript activado. El texto que lo rodea describe lo que muestra.
Ver la respuesta
Respuesta correcta: 0,8
Tras 5 pasos la pérdida es 24468 (η = 0,01), 6595 (0,1), 4043 (0,8) y 159823 (1,1); el mínimo es 3890. Con 0,8 el paso es grande, pero todavía no se salta el valle. Con 1,1 cada paso se lo salta con tanta fuerza que la pérdida crece.
Prueba esto
- Elige una tasa de aprendizaje pequeña y pulsa Paso unas cuantas veces. Mira cómo la recta se mueve un poco en cada paso y la curva de pérdida baja despacio.
- Pulsa Ejecutar y déjalo correr. ¿La recta acaba cerca de la recta de mínimos cuadrados de la lección anterior?
- Empieza de nuevo con la tasa de aprendizaje más grande y vuelve a pulsar Paso. Observa la curva de pérdida: en vez de bajar, sube, y la recta oscila sin control. Eso es la divergencia.
- Prueba las tasas intermedias y encuentra la más grande con la que la pérdida todavía baja de forma constante.
La idea en pocas palabras
Imagina que estás en la ladera de una montaña con una niebla espesa. Quieres llegar al valle, pero solo ves un metro a tu alrededor. Una estrategia sensata: tantear el suelo con los pies, encontrar la dirección en la que baja con más pendiente, dar un paso hacia allí y repetir. Nunca ves el paisaje completo y, sin embargo, paso a paso vas bajando.
En el aprendizaje automático, el «paisaje» es el error del modelo. Cada par posible de pendiente y ordenada en el origen es una posición en el mapa, y la altura en esa posición es el error cuadrático medio de la lección 3. El fondo del valle es la mejor recta. El descenso de gradiente es ese paseo entre la niebla: empezar en algún sitio, medir hacia dónde disminuye el error, mover un poco los parámetros en esa dirección y repetir hasta que el error deje de bajar.
Por qué funciona
La dirección de máximo ascenso de una función la da su gradiente: una lista de derivadas, una por parámetro, que dice cuánto crecería el error si ese parámetro subiera un poquito. Ve en sentido contrario y el error baja. Para cada parámetro w, un paso es:
w ← w − η · ∂L/∂w
Aquí L es la pérdida (el error que minimizamos), ∂L/∂w indica con cuánta fuerza reacciona la pérdida a w, y η (la letra griega eta) es la tasa de aprendizaje, que fija el tamaño del paso. Donde la pendiente es fuerte, los pasos son grandes; cerca del fondo la pendiente se suaviza y los pasos se acortan solos.
Todo depende de la tasa de aprendizaje. Si es demasiado pequeña, cada paso es minúsculo y el paseo dura una eternidad. Si es la adecuada, el error baja rápido y se asienta cerca del mínimo. Si es demasiado grande, cada paso se pasa del valle y aterriza más arriba en la ladera opuesta; el siguiente se pasa todavía más, y el error crece sin límite. Esto se llama divergencia, y es la causa más común de que un entrenamiento «explote».
La belleza del método es que solo necesita una cosa: poder calcular el gradiente en la posición actual. No necesita una fórmula para la respuesta, y funciona igual con dos parámetros que con dos mil millones. Por eso es el motor de casi todas las redes neuronales, incluidos los modelos de lenguaje de la lección 12. En la práctica, el gradiente suele estimarse con un pequeño lote aleatorio de ejemplos en lugar de con todos, lo que hace cada paso más barato y más ruidoso, pero funciona notablemente bien.
Error frecuente
Cuando la pérdida se dispara de repente o se convierte en «NaN» (not a number, «no es un número»), quien empieza suele sospechar de un fallo en su código. Mucho más a menudo, la tasa de aprendizaje es simplemente demasiado grande. La solución es bajarla, no reescribir el modelo. El error opuesto se ve menos: una tasa tan pequeña que la pérdida sigue bajando cuando se detiene el entrenamiento, así que el modelo parece peor de lo que podría ser. Una trampa relacionada son las características en escalas muy distintas —por ejemplo, la edad en años junto a los ingresos en euros—, que convierten el valle en un cañón largo y estrecho donde ninguna tasa de aprendizaje sirve para todas las direcciones. Escalar antes las características facilita mucho el paseo.
Ya tenemos las dos mitades de la receta del aprendizaje: una puntuación y una forma de mejorarla. En la próxima lección las usamos para un nuevo tipo de pregunta: no «¿cuánto?», sino «¿cuál?».
Test
Tres preguntas para comprobar lo aprendido. Elige una respuesta o despliega la solución bajo cada pregunta. Con el teclado: las flechas eligen, Enter o Espacio confirma.
Ideas clave
- El descenso de gradiente mejora los parámetros dando pasos repetidos en contra del gradiente de la pérdida.
- La tasa de aprendizaje fija el tamaño del paso: demasiado pequeña es lenta, demasiado grande diverge.
- Una pérdida que explota suele significar una tasa de aprendizaje demasiado alta, no un código roto.
- El método solo necesita el gradiente, así que escala de dos parámetros a miles de millones.
Más a fondo: fórmula, código, práctica
Las matemáticas
Toma la recta ŷ = b + w·z, con la pérdida L(w, b) = (1/n) · Σ (yᵢ − b − w·zᵢ)². Su gradiente es ∂L/∂w = −2 · mean(r · z) y ∂L/∂b = −2 · mean(r), donde r = y − ŷ son los residuos. Un paso es w ← w − η·∂L/∂w y b ← b − η·∂L/∂b.
Cuando la variable está estandarizada (mean(z) = 0, mean(z²) = 1), las dos direcciones no interfieren. Cada paso reduce entonces la distancia a los mejores w y b en el factor 1 − 2η.
0 < η < 1: la distancia se reduce y la pérdida baja hasta el mínimo. Cuanto más cerca estáηde 0,5, más rápido.η > 1: el factor1 − 2ηes menor que −1, así que su tamaño es mayor que 1, cada paso se pasa más lejos y la pérdida crece sin límite.- Sin estandarizar, el rango seguro de
ηdepende de la escala de la variable, así que un solo valor ya no sirve para todas las direcciones.
En código (Python)
La pérdida del lab tras 5 pasos desde w = b = 0, para cuatro tasas de aprendizaje, con el IMC estandarizado (datos de diabetes):
import numpy as np
from sklearn.datasets import load_diabetes
X, y = load_diabetes(return_X_y=True, as_frame=True, scaled=False)
bmi = X["bmi"].to_numpy()
z = (bmi - bmi.mean()) / bmi.std() # IMC estandarizado, como en el lab
mse = lambda w, b: np.mean((y - (b + w * z)) ** 2)
for lr in [0.01, 0.1, 0.8, 1.1]:
w, b = 0.0, 0.0 # empezar en el origen
for _ in range(5): # cinco pasos con todo el conjunto
r = y - (b + w * z)
w, b = w + lr * 2 * np.mean(r * z), b + lr * 2 * np.mean(r)
print(f"lr {lr}: loss after 5 steps {mse(w, b):.0f}")
w_best, b_best = np.polyfit(z, y, 1)
print(f"minimum: {mse(w_best, b_best):.0f}")
Resultado
lr 0.01: loss after 5 steps 24468
lr 0.1: loss after 5 steps 6595
lr 0.8: loss after 5 steps 4043
lr 1.1: loss after 5 steps 159823
minimum: 3890
El mínimo, 3890, es el MSE de la recta de mínimos cuadrados de la lección 3. Con lr = 0.8 el factor es |1 − 1.6| = 0.6 por paso, que supera al 0,9 de lr = 0.1. Con lr = 1.1 es 1,2, así que la pérdida crece.
Descargar el notebook (.ipynb). Ábrelo en Jupyter o súbelo a Google Colab; descarga por sí solo los datos que falten.
Para profesionales
- Estandariza las variables numéricas antes del descenso de gradiente. Así el cuenco de la pérdida se vuelve redondo y una sola tasa de aprendizaje sirve para todas las direcciones.
- Grafica siempre la pérdida contra el paso. Una bajada suave es sana. Una subida o un
NaNcasi siempre indican una tasa de aprendizaje demasiado grande: divídela por 10 y vuelve a probar. - No te detengas solo con un número fijo de pasos. Detente también cuando la pérdida apenas cambie, y comprueba que de verdad se haya aplanado y no que solo avance a paso de tortuga.
- Si escribes un gradiente a mano, compáralo con una estimación por diferencias finitas en unos pocos puntos antes de confiar en una ejecución larga.
- Cuando existe una forma cerrada, como en la regresión lineal, úsala. El descenso de gradiente se gana su lugar en los modelos que no tienen una fórmula así.
¿Te ha sido útil?
¡Gracias! Nos ayuda a mejorar.
Profundiza en el Atlas
Entradas de la enciclopedia sobre las ideas de esta lección: