# Descenso de gradiente

> El método que ajusta los pesos de un modelo dando pasitos cuesta abajo en su error.

- Nivel: Avanzado
- Temas: IA
- URL: https://tidbit.legios.com.ar/es/gradient-descent/
- En inglés: [Gradient descent](https://tidbit.legios.com.ar/gradient-descent/)

Entrenar una red neuronal es encontrar pesos que hagan chicos sus errores. Esos errores se resumen en una **función de pérdida**: un solo número que dice qué tan mal le va al modelo con un lote de ejemplos. El **descenso de gradiente** es la forma estándar de bajarlo. El **gradiente** es la lista de derivadas parciales de la pérdida respecto de cada peso, y apunta hacia donde la pérdida crece más rápido. Entonces das un paso para el otro lado: `w = w - lr * grad`, para cada peso, y repetís, muchas veces millones de veces.

La **tasa de aprendizaje** (learning rate, `lr`) fija el largo del paso y es la perilla más delicada. Si es muy grande, la pérdida rebota o se dispara; si es muy chica, el entrenamiento avanza a paso de tortuga. Es común arrancar con un calentamiento y bajarla a medida que avanza el entrenamiento. Calcular el gradiente exacto sobre todo el dataset en cada paso sería lentísimo, así que el **descenso de gradiente estocástico** (SGD) lo estima con un mini-lote chico elegido al azar. La estimación tiene ruido, pero es barata, y ese ruido hasta ayuda a no quedarse trabado en zonas malas.

Los modelos grandes casi nunca usan SGD a secas. Optimizadores como Adam y AdamW llevan promedios de los gradientes anteriores (momentum) y ajustan el paso de cada peso según qué tan grandes vinieron siendo sus gradientes, lo que vuelve el entrenamiento mucho menos caprichoso. Esa contabilidad cuesta memoria: AdamW guarda dos números extra por cada peso, una de las razones por las que entrenar necesita varias veces la memoria que hace falta para solo usar el modelo.

El paisaje de pérdida de una red grande no es un bol prolijo. Tiene una cantidad enorme de dimensiones, mesetas planas y puntos de silla, y el descenso de gradiente no garantiza encontrar el punto más bajo. En la práctica encuentra, de forma confiable, pesos que andan bien con datos nuevos, y por eso entrena prácticamente todos los modelos actuales. Los gradientes salen de la retropropagación; el descenso de gradiente decide qué hacer con ellos. La idea es vieja: el matemático Augustin-Louis Cauchy la describió en 1847.

## Una analogía

Bajar una montaña con niebla cerrada. No ves el valle, pero sentís para qué lado se inclina el piso bajo tus pies, así que das un paso cuesta abajo, volvés a tantear y repetís. Los pasos largos te bajan más rápido, pero también te pueden hacer cruzar el valle y subir por la otra ladera.

## Para quedarse

- Regla de actualización: cada peso menos la tasa de aprendizaje por su gradiente.
- El SGD estima el gradiente con mini-lotes chicos elegidos al azar.
- Adam y AdamW suman momentum y pasos por peso, a costa de memoria.
- No garantiza el mejor mínimo, pero en la práctica funciona bien.

## Para seguir leyendo

- [Descenso del gradiente en Wikipedia](https://es.wikipedia.org/wiki/Descenso_del_gradiente)
- [Descenso de gradientes (Curso intensivo de aprendizaje automático de Google)](https://developers.google.com/machine-learning/crash-course/linear-regression/gradient-descent?hl=es-419)

## Términos relacionados

- [Red neuronal](https://tidbit.legios.com.ar/es/neural-network/): Una pila de unidades matemáticas chiquitas que aprende patrones a partir de ejemplos.
- [Función de pérdida](https://tidbit.legios.com.ar/es/loss-function/): El número que dice cuánto se equivoca un modelo, para que entrenar sea bajarlo.
- [Tasa de aprendizaje](https://tidbit.legios.com.ar/es/learning-rate/): El largo del paso que da un modelo cada vez que el entrenamiento ajusta sus pesos.
- [Entrenamiento e inferencia](https://tidbit.legios.com.ar/es/training-and-inference/): Entrenar construye el modelo una vez; inferir es usarlo, millones de veces por día.
- [Retropropagación](https://tidbit.legios.com.ar/es/backpropagation/): El algoritmo que calcula cuánto contribuyó cada peso al error de una red neuronal.
