Inicio · Parte 12 — Optimización matemática y computacional
punto adelantado: x̃ = xₖ + β·vₖ
vₖ₊₁ = β·vₖ − lr·∇f(x̃)
cota O(1/k²) frente a O(1/k) del descenso simple
El gradiente acelerado de Nesterov introduce un cambio que parece menor y no lo es: evalúa el gradiente en el punto al que el momentum va a llevar, no en el punto actual. Primero se mira hacia dónde empuja la inercia, y allí se calcula la corrección.
La intuición es la de un conductor que frena antes de la curva en vez de al llegar a ella. Si el punto adelantado ya ha pasado el mínimo, el gradiente en él apunta hacia atrás y frena la velocidad antes de que el sobrepaso ocurra. Momentum clásico solo se entera del sobrepaso después de haberlo cometido.
El resultado no es solo empírico. Para funciones convexas suaves, Nesterov alcanza una tasa de convergencia O(1/k²) frente al O(1/k) del descenso simple, y esa tasa es óptima: ningún método de primer orden puede hacerlo mejor en esa clase de problemas. Es uno de los resultados más elegantes de la optimización convexa.
En aprendizaje profundo la ventaja es más modesta que en el caso convexo, pero real y gratuita: el coste computacional es idéntico al de momentum. Está disponible como opción en prácticamente todas las bibliotecas —nesterov=True— y activarla rara vez perjudica.
Momentum clásico frente a Nesterov, condiciones idénticas.
f(x,y) = x² + 20y² lr = 0,02 β = 0,9
momentum clásico:
x final = (1,741e-05 ; −6,475e-05)
f final = 8,4165e-08
Nesterov:
x final = (−5,6e-07 ; 0,0)
f final = 0,0 (por debajo de la precisión)
Diferencia de implementación:
clásico: ∇f evaluado en x
Nesterov: ∇f evaluado en x + β·v
Ventaja teórica en convexas suaves:
descenso simple O(1/k)
Nesterov O(1/k²) y es óptimo
NAG mira adelante antes de calcular el gradiente.
python classes/part-12-optimizacion-matematica-y-computacional/247-nesterov-accelerated-gradient/lab.py
compmath run 247
momentum_clasiconesterovdiferencianesterov_mejorventaja_teorica{
"momentum_clasico": {
"x_final": [
1.741e-05,
-6.475e-05
],
"f_final": 8.4165e-08,
"grad_norm_final": 0.002590407328,
"historial": [
{
"iter": 1,
"f": 10.8864,
"|∇f|": 24.3052586903
},
{
"iter": 10,
"f": 56.7808358661,
"|∇f|": 67.345167581
},
{
"iter": 50,
"f": 0.4289057376,
"|∇f|": 5.7359148553
},
{
"iter": 200,
"f": 8.42e-08,
"|∇f|": 0.0025904073
}
]
},
"nesterov": {
"x_final": [
-5.6e-07,
0.0
],
"f_final": 0.0,
"grad_norm_final": 1.112163e-06,
"historial": [
{
"iter": 1,
"f": 10.8864,
"|∇f|": 24.3052586903
},
{
"iter": 10,
"f": 0.0125117194,
"|∇f|": 0.2237135773
},
{
"iter": 50,
"f": 0.0028651236,
"|∇f|": 0.1070536994
},
{
"iter": 200,
"f": 0.0,
"|∇f|": 1.1122e-06
}
]
},
"diferencia": "NAG evalúa el gradiente en x + βv, no en x",
"nesterov_mejor": true,
"ventaja_teorica": "O(1/k²) frente a O(1/k) en funciones convexas suaves"
}
SGD con Nesterov en entrenamiento de redes, optimización convexa acelerada y métodos proximales acelerados.
AdamW es el optimizador por defecto del entrenamiento moderno; entender su actualización explica el weight decay, el warmup y el gradient clipping.