🧮 Computational Mathematics

Inicio · Parte 12 — Optimización matemática y computacional

247 — Nesterov accelerated gradient

avanzado clase 7 de 20 4 horas demostración nesterov

Nesterov calcula el gradiente donde va a estar, no donde está.

Fórmulas

punto adelantado: x̃ = xₖ + β·vₖ
vₖ₊₁ = β·vₖ − lr·∇f(x̃)
cota O(1/k²) frente a O(1/k) del descenso simple

Desarrollo

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.

Ejemplo trabajado

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

Qué calcula el laboratorio

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

Salidas del laboratorio (5)

Muestra de la ejecución real

{
  "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"
}

Errores comunes

Dónde se usa

SGD con Nesterov en entrenamiento de redes, optimización convexa acelerada y métodos proximales acelerados.

Idea rectora de la parte

El learning rate es el hiperparámetro que más veces explica una divergencia.

Error a evitar

Comparar optimizadores sin fijar semilla ni presupuesto de iteraciones.

Conexión con IA

AdamW es el optimizador por defecto del entrenamiento moderno; entender su actualización explica el weight decay, el warmup y el gradient clipping.

Bibliografía de la clase

Archivos de la clase