Descenso del gradiente
¿Cómo encuentra una máquina los números correctos sin que nadie se los diga?
Lección completa
Si quieres:
Ya tenemos un modelo con un número por ajustar, el peso, y una forma de medir cuánto se equivoca. Falta lo central: ¿cómo encontrar el peso que se equivoca menos?
Sin voz: la lección avanza sola con subtítulos.
La voz de esta lección está en preparación: por ahora avanza sola con subtítulos.
Modo revisiónComentar este pasoTerminé la lección
Qué lograrás
- Explicar qué es la pendiente de la curva de error en un punto (su derivada) y qué indica su signo.
- Calcular un paso del descenso del gradiente con la regla peso nuevo = peso actual − tasa × pendiente.
- Predecir el efecto de una tasa de aprendizaje muy pequeña o muy grande, y reconocer el gradiente como la lista de pendientes, una por peso.
Ideas clave
- Entrenar es buscar el peso que deja el error más bajo. La máquina no ve la curva completa: solo conoce el error y la pendiente donde está.
- La pendiente, o derivada, dice cuánto cambia el error al mover un poco el peso. Negativa: baja hacia la derecha. Positiva: sube. Cero: es el fondo.
- La regla es peso nuevo = peso actual − η × pendiente. El signo menos lleva cuesta abajo desde cualquier lado, y los pasos se acortan solos al aplanarse la pendiente.
- La tasa de aprendizaje η fija el tamaño del paso: muy pequeña es lenta; muy grande rebota o diverge.
- Con muchos pesos, el gradiente es la lista de pendientes, una por peso. El mismo bucle, con variantes como Adam, entrena modelos de cientos de miles de millones de pesos, sin garantía de llegar al mejor valle.
Lo que mucha gente cree
Creencia común La IA «ve» todo el paisaje de errores y salta directamente al mejor punto.
Lo correcto Solo conoce la pendiente justo donde está. Llega al fondo tanteando, paso a paso, y puede terminar en un valle distinto según dónde empiece.
Compruébalo
Cuatro preguntas. Sin nota ni cuenta: sirven para ver si la idea quedó.
Por dentroPara quien quiere las fórmulas y el código. No hace falta para seguir el curso.
La pendiente y la derivada
Para medir la pendiente de una curva en un punto se mueve el peso una cantidad pequeña y se divide el cambio del error entre ese movimiento:
La derivada es el valor al que se acerca ese cociente cuando se hace cada vez más pequeño. Por eso : la derivada dice por cuánto hay que multiplicar un cambio pequeño del peso para obtener el cambio del error, y es la pendiente de la recta tangente en ese punto (Goodfellow et al., 2016, §4.3).
En la lección, , así que . En , con el error pasa de 9 a 8.605 y el cociente es ; con , ; en el límite, . En esta curva el cociente vale exactamente . En el peso 6 la derivada es y en el 3, el fondo, es .
Ojo con el nombre: en la lección 3, el peso era la pendiente de la recta del modelo. Aquí la pendiente es otra: la de la curva del error respecto al peso. Y en la práctica no se tantea con un : la derivada se calcula con fórmulas exactas y, en una red profunda, con la retropropagación (lección 8).
La regla de actualización
Con un peso, el descenso del gradiente repite
donde es la tasa de aprendizaje. Como es menor que si es suficientemente pequeño, moverse en pasos pequeños con el signo contrario al de la derivada hace bajar el error (Goodfellow et al., 2016, §4.3). En la lección, con : La distancia al fondo se reduce a la mitad en cada paso y los pasos (2, 1, 0.5, 0.25, …) se acortan solos porque la pendiente se aplana.
Con muchos pesos, , cada derivada parcial mide cómo cambia el error cuando solo aumenta , y el gradiente es el vector que las contiene todas:
El gradiente apunta cuesta arriba porque, entre todas las direcciones de longitud 1, es la que más hace crecer a ; por eso se resta (Goodfellow et al., 2016, §4.3).
El método se atribuye a Cauchy, que lo expuso en la sesión del 18 de octubre de 1847 de la Academia de Ciencias de París para resolver sistemas de ecuaciones: cambiaba el sistema por una sola ecuación, la suma de los cuadrados igualada a cero, y hacía bajar esa función paso a paso. El tamaño del paso lo fijaba resolviendo una ecuación de una variable o tomando un valor «suficientemente pequeño» (Cauchy, 1847; Lemaréchal, 2012).
Por qué existe un umbral para la tasa
Para un error cuadrático de una variable, con curvatura , el gradiente es y la distancia al fondo se multiplica por un factor constante en cada paso:
- si , el peso se acerca al fondo sin cruzarlo;
- si , llega al fondo de un salto;
- si , lo cruza en cada paso pero converge (oscila);
- si , rebota entre dos puntos a la misma distancia del fondo, sin acercarse;
- si , la distancia crece en cada paso: diverge.
Es el análisis clásico de LeCun et al. (1998, §5.1): la tasa óptima de una variable es , y se diverge si la tasa pasa del doble de la óptima. En la lección . Las cuatro tasas de la escena son un caso lento (0.05: tras 12 pasos sigue a 2.16 del fondo, que estaba a 4), uno que oscila (1.7: cruza el fondo en cada paso, pero se acerca), uno que diverge (2.05: cada salto cae más lejos y el error pasa de 9 a 12.82 en 4 pasos) y uno bueno (0.8: a 0.03 del fondo en 3 pasos). El turno interactivo pide llegar a menos de 0.08 del fondo en diez pasos o menos sin cruzarlo: lo cumplen las tasas de 0.33 a 1.
Una tasa muy pequeña no es del todo inocua en una red real: además de lenta, puede dejar el entrenamiento atascado con un error alto, un efecto que no ocurriría con una función convexa y que se entiende poco (Goodfellow et al., 2016, §11.4.1).
Varias dimensiones: el condicionamiento
En varias dimensiones la curvatura es la matriz hessiana . En una cuadrática, : en cada dirección propia la distancia se multiplica por . Para converger hace falta (LeCun et al., 1998), pero el avance en la dirección más plana depende de . Con el número de condición grande, el error cae despacio y el camino zigzaguea, como en la figura. Con la mejor tasa fija () la distancia al fondo se reduce por un factor por paso (Goh, 2017).
En la figura, y (), y : en la dirección plana la distancia se multiplica por en cada paso, y en la empinada por (cambia de lado: el zigzag). La mejor tasa fija sería , con factor . En el punto de partida, , las dos pendientes son y : el gradiente apunta arriba a la izquierda, cuesta arriba, y el camino sale hacia abajo a la derecha.
Paisajes reales
Las curvas de la lección son de juguete: , el cuenco de dos pesos con curvaturas 1 y 7, y , con dos valles de errores mínimos 0.38 y 1.35. El error de una red real no es convexo: tiene mínimos locales, mesetas y puntos de silla (gradiente cero, pero baja en una dirección y sube en otra). En redes grandes se sospecha hoy que la mayoría de los mínimos locales tienen un error cercano al mejor y que las mesetas y los puntos de silla estorban más que los malos mínimos (Goodfellow et al., 2016, §8.2; Dauphin et al., 2014). El punto de partida importa: puede decidir si el entrenamiento converge, a qué costo y con qué capacidad de generalizar (Goodfellow et al., 2016, §8.4), y cambiar solo la semilla aleatoria puede dar resultados muy distintos, como al ajustar BERT (Dodge et al., 2020).
En código
def descenso(pendiente, w0, eta, pasos):
w = w0
historial = [w]
for _ in range(pasos):
w = w - eta * pendiente(w) # peso nuevo = peso actual − tasa × pendiente
historial.append(w)
return historial
# error L(w) = 0.5 * (w - 3)**2 + 1 -> pendiente (derivada): w - 3
print(descenso(lambda w: w - 3, w0=-1.0, eta=0.5, pasos=5))
# [-1.0, 1.0, 2.0, 2.5, 2.75, 2.875]
Lo que viene
En modelos reales el gradiente se calcula sobre un subconjunto de los datos (descenso del gradiente estocástico; Bottou et al., 2018) y se usan optimizadores como Adam (Kingma y Ba, 2015); ambos aparecen en la lección 9. Así se entrenó GPT-3 (175 mil millones de pesos): con Adam, lotes de hasta 3.2 millones de tokens y, en el modelo grande, una tasa de aprendizaje de con calentamiento y caída gradual (Brown et al., 2020, tabla 2.1 y apéndice B). El cálculo eficiente de en redes profundas es la retropropagación (lección 8).
Lente de decisión
Qué significa esta idea si tu trabajo es decidir, no programar.
- Entrenar es optimización iterativa: el cómputo crece con el número de pasos, el tamaño del modelo y el tamaño del lote. Cada paso adicional es dinero en cómputo.
- Si un equipo dice que «el entrenamiento no converge», la primera pregunta es por la tasa de aprendizaje (quizá el hiperparámetro más importante) y por los datos, no por «más GPUs».
- El resultado depende del punto de partida y de decisiones de entrenamiento: dos corridas con la misma receta pueden dar modelos distintos. Pide que se reporte esa variabilidad.
- No hay garantía de haber llegado al mejor punto posible: «suficientemente bueno» se comprueba con datos que el modelo no vio (lección 10).
Términos de la lección
- Descenso del gradiente Método que ajusta los pesos paso a paso, siempre en contra de la pendiente del error (el gradiente), hasta llegar a un fondo.
- Gradiente La lista de las pendientes del error, una por cada peso. Vista como flecha, apunta hacia donde el error sube más rápido.
- Derivada El nombre matemático de la pendiente de una curva en un punto: cuánto cambia una cantidad por cada pequeño cambio de otra.
- Tasa de aprendizaje Número (η) que multiplica la pendiente y fija el tamaño de cada paso. Muy pequeño es lento; muy grande rebota o diverge.
- Peso (w) En un modelo lineal, el número que multiplica a la entrada: la pendiente de la recta. Indica cuánto sube la predicción por cada unidad que aumenta la entrada.
- Función de pérdida Un único número que resume qué tan equivocado está un modelo con sus datos. Entrenar es buscar los parámetros que lo hacen lo más pequeño posible.
- Modelo Una forma de regla con números ajustables. Una vez entrenado, es la regla aprendida.
- Parámetro Cada uno de los números que un modelo ajusta al entrenarse y en los que guarda lo aprendido.
Transcripción completa
Fuentes
- Cauchy, A. (1847). Méthode générale pour la résolution des systèmes d’équations simultanées (Comptes rendus de l’Académie des sciences, t. 25, pp. 536–538; sesión del 18 de octubre de 1847)
- Lemaréchal, C. (2012). Cauchy and the gradient method (Documenta Mathematica, Extra Volume ISMP, pp. 251–254)
- LeCun, Y., Bottou, L., Orr, G. B., Müller, K.-R. (1998). Efficient BackProp (Neural Networks: Tricks of the Trade, LNCS 1524, pp. 9–50; §5.1: convergencia del descenso del gradiente)
- Goh, G. (2017). Why Momentum Really Works (Distill 2(4); mejor tasa fija y factor (κ−1)/(κ+1) en una cuadrática)
- Goodfellow, I., Bengio, Y., Courville, A. (2016). Deep Learning, capítulo 4: Numerical Computation (§4.3: la derivada como pendiente, el gradiente y el descenso del gradiente)
- Goodfellow, I., Bengio, Y., Courville, A. (2016). Deep Learning, capítulo 8: Optimization for Training Deep Models (§8.2: mínimos locales, mesetas y puntos de silla; §8.4: inicialización)
- Goodfellow, I., Bengio, Y., Courville, A. (2016). Deep Learning, capítulo 11: Practical Methodology (§11.4.1: la tasa de aprendizaje)
- Dauphin, Y., Pascanu, R., Gulcehre, C., Cho, K., Ganguli, S., Bengio, Y. (2014). Identifying and attacking the saddle point problem in high-dimensional non-convex optimization
- Dodge, J., Ilharco, G., Schwartz, R., Farhadi, A., Hajishirzi, H., Smith, N. (2020). Fine-Tuning Pretrained Language Models: Weight Initializations, Data Orders, and Early Stopping
- Bottou, L., Curtis, F. E., Nocedal, J. (2018). Optimization Methods for Large-Scale Machine Learning
- Kingma, D. P., Ba, J. (2015). Adam: A Method for Stochastic Optimization
- Brown, T. B., et al. (2020). Language Models are Few-Shot Learners (GPT-3: 175 mil millones de parámetros; tabla 2.1 y apéndice B)
- Grattafiori, A., et al. (Llama Team, Meta) (2024). The Llama 3 Herd of Models (el mayor, de 405 mil millones de parámetros)
- Kaplan, J., McCandlish, S., Henighan, T., et al. (2020). Scaling Laws for Neural Language Models (el cómputo de entrenamiento ≈ 6·N·B·S)
ComentariosConversación pública de esta lección: dudas, datos por revisar, ideas.
Los comentarios viven en GitHub Discussions, en el repositorio público del curso; para escribir se necesita una cuenta de GitHub. Se cargan desde giscus.app al abrir esta sección. Las personas que revisan el curso los leen, y si un cambio se acepta, se aplica en los dos idiomas. Abrir el hilo en GitHub