Atlasingeniería

Aprendizaje automáticoOptimizaciónTema 1

Descenso por gradiente: bajar la colina

El algoritmo que entrena casi todo el aprendizaje automático moderno cabe en una línea: moverse en la dirección opuesta al gradiente. Lo difícil es cuánto moverse.

Para este tema conviene tener claro:El gradiente: la dirección de máxima subida

Estás en una montaña con niebla y querés bajar. No ves el valle, pero sí la pendiente bajo tus pies. Das un paso en la dirección más empinada hacia abajo y repetís. Eso es el descenso por gradiente, y es cómo se entrena desde una regresión logística hasta un modelo de lenguaje.

El gradiente apunta para arriba: hay que ir al revés

El gradiente de una función de varias variables es el vector de sus derivadas parciales, y apunta en la dirección de máximo crecimiento. Para minimizar, se va en sentido contrario:

wwηL(w).w \leftarrow w - \eta \, \nabla L(w).

Donde η\eta es la tasa de aprendizaje: cuánto se avanza en cada paso. Es información local: dice hacia dónde bajar acá, sin saber nada sobre el terreno más allá.

Movete por la curva: la pendiente que dice el número es lo único que conoce el algoritmo en cada paso. Donde es grande, el paso siguiente es grande; cerca del mínimo se achica sola.f(x) = a * (x - 1) ^ 2 + 0.5

Antes de seguir, predecí

Una tasa de aprendizaje demasiado grande. ¿Qué se ve en la curva de costo?

La tasa de aprendizaje, el hiperparámetro que más arruina

La tasa de aprendizaje es el hiperparámetro que más arruina entrenamientos. Muy chica, converge tan lento que no termina nunca. Muy grande, el paso se pasa del mínimo y puede rebotar o divergir hasta dar infinitos.

El síntoma se lee en la curva de costo: si baja lentísimo y de forma pareja, la tasa es chica; si oscila o explota, es grande. Lo habitual es empezar con un valor razonable y reducirlo a medida que avanza el entrenamiento: pasos grandes para acercarse, chicos para afinar.

Con un solo valle hay garantías; sin él, no

Si la función es convexa —un solo valle, como en regresión lineal o logística— el método llega al mínimo global. Ahí hay garantías teóricas sólidas.

Las redes neuronales no son convexas: hay muchos mínimos locales, mesetas y puntos de ensilladura. La intuición decía que eso sería fatal, y resultó que no: en alta dimensión, los mínimos locales suelen ser casi tan buenos como el global, y el problema real son las ensilladuras, donde el gradiente casi se anula sin estar en un mínimo.

Tocá el lienzo para soltar una partícula, o enfocalo con el tabulador, movete con las flechas y soltala con Enter.

El campo es menos el gradiente de un costo cuadrático: cada flecha es la dirección que tomaría el algoritmo parado ahí. Soltá partículas en distintos puntos y después desbalanceá las curvaturas: con a y b muy distintos aparece el zigzag clásico de un valle angosto, que es lo que el momento viene a corregir.(0 - a * x, 0 - b * y)

Nadie deriva a mano: diferenciación automática

Calcular el gradiente a mano es inviable para un modelo grande. Lo que se usa es diferenciación automática: la biblioteca registra las operaciones del cálculo y aplica la regla de la cadena hacia atrás, obteniendo derivadas exactas —no aproximaciones numéricas— con un costo comparable al de la pasada hacia adelante.

Eso es lo que hace PyTorch o JAX por detrás, y es lo que permite que uno escriba el modelo y no la derivada.

La geometría del problema importa

La geometría del problema importa mucho. Si un atributo va de 0 a 1 y otro de 0 a 100.000, las curvas de nivel del costo forman un valle largo y angosto, y el gradiente apunta hacia las paredes en vez de hacia el fondo: el descenso zigzaguea y tarda muchísimo.

Estandarizar los atributos redondea esas curvas de nivel y el descenso va derecho. Es la explicación concreta de por qué escalar los datos acelera el entrenamiento, y no una recomendación de manual.

Diagnosticar mirando la curva de costo

Para diagnosticar alcanza con graficar el costo por época. Debe bajar de forma consistente; si sube, la tasa es alta. Si se aplana muy arriba, puede ser tasa baja, mala inicialización o un problema de escala.

Y siempre conviene mirar el costo de entrenamiento junto al de validación: el primero dice si la optimización funciona, el segundo si el modelo generaliza. Son preguntas distintas y se confunden seguido.

El ciclo completo, sin biblioteca

import numpy as np

def entrenar(X, y, tasa=0.01, epocas=100):
    n, d = X.shape
    pesos = np.zeros(d)
    sesgo = 0.0

    for _ in range(epocas):
        z = X @ pesos + sesgo
        p = 1 / (1 + np.exp(-z))          # sigmoide
        error = p - y                      # el gradiente de la entropía cruzada se simplifica a esto

        grad_pesos = (X.T @ error) / n
        grad_sesgo = error.mean()

        pesos -= tasa * grad_pesos         # el paso: contra el gradiente
        sesgo -= tasa * grad_sesgo

    return pesos, sesgo

Son cinco líneas y están todas las piezas: calcular la predicción, medir el error, derivar, y mover los parámetros en contra del gradiente. El signo menos es lo único que separa minimizar de maximizar.

La simplificación de p - y no es casualidad: combinar sigmoide con entropía cruzada hace que el gradiente se reduzca a la diferencia entre lo predicho y lo real. Esa cancelación es la razón matemática de por qué esas dos se usan juntas.

Lo que hace falta además del gradiente

SíntomaCausa probableQué hacer
El costo subetasa demasiado altabajarla un orden de magnitud
El costo no se muevetasa muy baja, o gradiente que se desvanecesubirla, o revisar la activación
Oscila mucholote demasiado chico o tasa altasubir el lote, bajar la tasa
Baja y se estanca altoel modelo no da: sesgomás capacidad o mejores atributos
Entrena bien y valida malsobreajusteregularizar, más datos, parada temprana
Las cinco filas se diagnostican con el mismo gráfico: el costo de entrenamiento y el de validación por época. Es lo primero que hay que mirar y lo que más veces contesta solo.

Cierre

Restar el gradiente multiplicado por la tasa de aprendizaje, y repetir. La tasa decide entre no avanzar y divergir; la convexidad da garantías que las redes no tienen pero igual funcionan; la diferenciación automática calcula las derivadas; y estandarizar arregla la geometría del valle.

Autoevaluación

¿Lo entendiste?

La curva de costo baja pero oscila hacia arriba y hacia abajo en cada paso. ¿Qué conviene probar primero?
¿Qué sabe el algoritmo sobre la función que está minimizando?
En una red neuronal, ¿cuál resultó ser el problema más real en la práctica?