Algoritmos de optimización · Tema 33

Ascenso y descenso guiados por la derivada

Aprendé a convertir la pendiente en pasos iterativos, elegir una velocidad de aprendizaje y reconocer convergencia, oscilación, divergencia y mínimos locales.

01 · De la pendiente al movimiento

Optimizar mediante una sucesión de puntos

La derivada no solo permite localizar candidatos resolviendo f′(x)=0. También indica una dirección local de mejora. A partir de una posición inicial x₀, podemos generar valores x₁,x₂,… que intenten acercarse a un extremo.

Estos métodos son útiles cuando resolver la ecuación de la derivada resulta difícil, pero sí podemos evaluarla. Su versión multidimensional, el descenso por gradiente, es central en optimización y aprendizaje automático.

02 · Dos objetivos

Descenso para mínimos, ascenso para máximos

Para minimizar, avanzamos en sentido opuesto a la derivada:

xk+1 = xk − αf′(xk)

Para maximizar, avanzamos en el mismo sentido:

xk+1 = xk + αf′(xk)

α>0 es el tamaño de paso o velocidad de aprendizaje. Puede ser constante, cambiar con k o elegirse mediante una búsqueda en cada iteración.

03 · Lectura geométrica

El signo decide la dirección

En descenso:

  • si f′(xk)>0, la función crece hacia la derecha y el método se mueve a la izquierda;
  • si f′(xk)<0, la función decrece hacia la derecha y el método se mueve a la derecha;
  • si f′(xk)=0, el paso es cero.

La magnitud |f′(xk)| escala el desplazamiento. Una pendiente grande genera un paso mayor cuando α permanece fijo.

04 · Modelo de referencia

Descenso sobre una función cuadrática

Consideremos:

f(x) = (x−2)² + 1   ·   f′(x)=2(x−2)

El mínimo global está en x*=2. Con x₀=−3 y α=0,2:

kxkf′(xk)xk+1
0−3−10−1
1−1−60,2
20,2−3,60,92
30,92−2,161,352

Los puntos se acercan a 2 sin cruzarlo porque este paso contrae el error manteniendo su signo.

05 · Analizar la convergencia

Una recurrencia para la distancia al óptimo

Definimos el error ek=xk−2. Al sustituir la derivada en la regla de descenso:

xk+1 = xk − 2α(xk−2)
ek+1 = (1−2α)ek

Después de k pasos:

ek = (1−2α)ke₀

La sucesión converge a 2 exactamente cuando el factor tiene magnitud menor que uno:

|1−2α| < 1   ⇔   0 < α < 1

06 · Elegir α

Convergencia, oscilación y divergencia

Valor de αFactor 1−2αComportamiento en el ejemplo
0<α<0,5entre 0 y 1convergencia sin cruzar el mínimo
α=0,50llega al mínimo en un paso
0,5<α<1entre −1 y 0convergencia oscilatoria
α=1−1oscila sin acercarse
α>1menor que −1diverge oscilando

Estos límites pertenecen a esta cuadrática. En otra función, la escala de la curvatura cambia el rango seguro de pasos.

07 · El papel de la segunda derivada

Curvas pronunciadas requieren pasos menores

Para la cuadrática general:

f(x) = (c/2)(x−x*)²,   c>0

se cumple f′(x)=c(x−x*) y:

ek+1 = (1−αc)ek

La convergencia exige 0<α<2/c. Una curvatura c grande reduce el rango estable. Por eso una misma velocidad de aprendizaje puede funcionar en una escala y divergir en otra.

En funciones más generales se buscan cotas sobre cómo cambia la derivada. No basta con que la función tenga un mínimo.

08 · Cuándo terminar

Criterios de convergencia

Un programa no puede iterar indefinidamente. Los criterios más comunes son:

  • gradiente pequeño: |f′(xk)|≤εg;
  • paso pequeño: |xk+1−xk|≤εx;
  • mejora pequeña: |f(xk+1)−f(xk)|≤εf;
  • máximo de iteraciones o evaluaciones.

Conviene combinar varios. Un paso pequeño puede deberse a un α diminuto, no a estar cerca del óptimo; una mejora pequeña puede ser producto del redondeo o del ruido.

09 · Mantener la factibilidad

Descenso proyectado sobre un intervalo

Si solo se admiten valores L≤x≤U, una actualización puede salir del dominio. La proyección recorta el candidato:

xk+1 = min(U, max(L, xk−αf′(xk)))

Un mínimo restringido puede quedar en una frontera aun cuando allí la derivada no sea cero. Si la proyección repite el mismo valor, debemos distinguir entre una solución de frontera y un paso bloqueado por una elección incorrecta de dirección.

10 · Dependencia del inicio

El método es local

En una función con varios valles, distintos puntos iniciales pueden converger a mínimos diferentes. La derivada describe el entorno actual, no compara todas las regiones del dominio.

Además, iniciar exactamente en un punto con f′(x)=0 produce un paso nulo aunque ese punto sea un máximo local o un estacionario sin extremo.

Para buscar soluciones globales se pueden usar varios inicios, una exploración previa en grilla o conocimiento adicional sobre convexidad. Si f es convexa y las condiciones del método se cumplen, cualquier mínimo local es global.

11 · Buscar máximos

Ascenso por la pendiente

Para maximizar g(x) usamos xk+1=xk+αg′(xk). Esto equivale a aplicar descenso a −g(x).

Por ejemplo, para g(x)=5−(x−3)²:

g′(x)=−2(x−3)
xk+1=xk−2α(xk−3)

La recurrencia alrededor del máximo x*=3 tiene la misma forma que el descenso de la cuadrática convexa.

12 · No fijar α de antemano

Reducir el paso cuando no hay mejora

Una búsqueda hacia atrás comienza con un paso propuesto y lo reduce, por ejemplo multiplicándolo por 0,5, hasta que el nuevo punto disminuya la función.

  1. Calcular la dirección d=−f′(x).
  2. Probar xnuevo=x+αd.
  3. Si no mejora, reemplazar α por βα, con 0<β<1.
  4. Detener si mejora o si el paso resulta demasiado pequeño.

Exigir solo f(xnuevo)<f(x) es una versión pedagógica. Métodos profesionales usan condiciones más precisas para garantizar una disminución suficiente.

13 · Cuando f′ no está disponible

Aproximar la pendiente tiene un costo

Una diferencia central aproxima la derivada:

f′(x) ≈ [f(x+h)−f(x−h)]/(2h)

Un h grande introduce error de truncamiento; uno extremadamente pequeño amplifica el redondeo y el ruido. Además, cada pendiente requiere al menos dos evaluaciones de la función.

Si la función proviene de mediciones ruidosas, el cociente puede ser muy inestable. En ese caso una búsqueda sin derivadas, un ajuste local o promedios repetidos pueden ser preferibles.

14 · Exploración interactiva

Laboratorio: trayectoria y tamaño de paso

Modificá α, el punto inicial y la cantidad de iteraciones. Las líneas unen la sucesión generada por descenso sobre f(x)=(x−2)²+1.

EXPERIMENTO 33

Descenso iterativo

xₖ₊₁ = xₖ − 0,2 · 2(xₖ−2)

Los resultados de las iteraciones aparecen debajo.
Posición finalx₈ = 1,916
Valor finalf(x₈) = 1,0071
Gradientef′(x₈) = −0,168
Factor del error1−2α = 0,6

Convergencia sin oscilación: el error conserva su signo y disminuye.

La parábola representa la función; los marcadores y segmentos muestran las posiciones visitadas por el algoritmo.

Preguntas para explorar

  1. Compará α=0,2, α=0,5 y α=0,8.
  2. ¿Qué sucede en α=1 y por encima de ese valor?
  3. Cambiá x₀. ¿Se modifica el rango estable de α?
  4. Con α=0,05, ¿un paso final pequeño demuestra que ya alcanzamos el mínimo?

15 · Implementación

Descenso con validaciones y criterios de parada

function descenso(fn, derivada, inicio, {
  paso = 0.1,
  toleranciaGradiente = 1e-8,
  maxIteraciones = 1000
} = {}) {
  if (typeof fn !== "function" || typeof derivada !== "function") {
    throw new TypeError("fn y derivada deben ser funciones");
  }
  if (!(paso > 0) || !(toleranciaGradiente > 0) ||
      !Number.isInteger(maxIteraciones) || maxIteraciones < 1) {
    throw new RangeError("Opciones inválidas");
  }

  let x = inicio;
  const historial = [{ x, valor: fn(x) }];
  let convergio = false;

  for (let k = 0; k < maxIteraciones; k++) {
    const gradiente = derivada(x);
    if (!Number.isFinite(gradiente)) throw new Error("Gradiente no finito");
    if (Math.abs(gradiente) <= toleranciaGradiente) {
      convergio = true;
      break;
    }

    const siguiente = x - paso * gradiente;
    const valor = fn(siguiente);
    if (!Number.isFinite(siguiente) || !Number.isFinite(valor)) {
      throw new Error("La iteración divergió");
    }
    x = siguiente;
    historial.push({ x, valor });
  }

  return { x, valor: fn(x), convergio, iteraciones: historial.length - 1, historial };
}

const f = x => (x - 2) ** 2 + 1;
const df = x => 2 * (x - 2);
const resultado = descenso(f, df, -3, { paso: 0.2 });
const { historial, ...resumen } = resultado;
console.log(resumen);
console.log("Primeros pasos:", historial.slice(0, 5));

Descenso con reducción automática del paso

function pasoConRetroceso(fn, derivada, x, pasoInicial = 1, factor = 0.5) {
  if (!(pasoInicial > 0) || !(factor > 0 && factor < 1)) {
    throw new RangeError("Paso o factor inválido");
  }
  const gradiente = derivada(x);
  const valorActual = fn(x);
  let paso = pasoInicial;

  while (paso > Number.EPSILON * Math.max(1, Math.abs(x))) {
    const candidato = x - paso * gradiente;
    if (fn(candidato) < valorActual) {
      return { x: candidato, paso, mejoro: true };
    }
    paso *= factor;
  }
  return { x, paso: 0, mejoro: false };
}

const f = x => (x - 2) ** 4 + (x - 2) ** 2 + 1;
const df = x => 4 * (x - 2) ** 3 + 2 * (x - 2);
console.log(pasoConRetroceso(f, df, -1));

16 · Leer una ejecución

Señales para diagnosticar el método

ObservaciónCausa posibleAcción
avance muy lentopaso demasiado pequeño o zona planaaumentar con cautela o adaptar α
oscila y se acercapaso estable pero grandeaceptar o reducir α
valores crecen rápidamentepaso inestablereducir α y reiniciar
se detiene lejos de un mínimopunto estacionario o criterio débilclasificar y probar otros inicios
trayectoria erráticaderivada ruidosapromediar o usar otro método

Registrar xk, f(xk), f′(xk) y el paso efectivo convierte un fallo opaco en un comportamiento analizable.

17 · Comprensión

Confusiones frecuentes

«Siempre hay que moverse en el sentido de la derivada»

Eso produce ascenso. Para minimizar se utiliza el sentido opuesto.

«Un α mayor siempre converge más rápido»

Puede oscilar, saltar la región óptima o divergir. El rango estable depende de la curvatura.

«Gradiente cero garantiza un mínimo»

También aparece en máximos y otros puntos estacionarios. Hay que clasificar el resultado.

«Si f disminuye en un paso, el algoritmo convergerá»

Una mejora aislada no garantiza el comportamiento futuro ni la optimalidad global.

«El resultado no depende del punto inicial»

En funciones no convexas, diferentes inicios pueden terminar en extremos distintos.

«Un cambio pequeño en x demuestra convergencia»

También puede deberse a un tamaño de paso minúsculo o a límites de precisión.

18 · Práctica guiada

Ejercicios de aplicación

Ejercicio 1: una iteración

Para f(x)=x², x₀=3 y α=0,1, calculá x₁.

Ver solución

f′(x)=2x. Entonces x₁=3−0,1·6=2,4.

Ejercicio 2: determinar estabilidad

En f(x)=(x−2)²+1, ¿qué ocurre con α=0,75?

Ver respuesta

El factor es 1−2α=−0,5. El error cambia de signo y reduce su magnitud a la mitad: converge oscilando.

Ejercicio 3: curvatura diferente

Para f(x)=5(x−1)², hallá el intervalo de pasos constantes que converge.

Ver solución

La derivada es 10(x−1), por lo que el factor es 1−10α. Se exige |1−10α|<1, es decir, 0<α<0,2.

Ejercicio 4: ascenso

Para maximizar g(x)=4−(x−1)² desde x₀=0 con α=0,25, calculá x₁.

Ver solución

g′(x)=−2(x−1) y g′(0)=2. En ascenso, x₁=0+0,25·2=0,5.

Ejercicio 5: proyección

El dominio es [0,4] y una actualización de descenso propone x=−1,2. ¿Cuál es el punto proyectado?

Ver respuesta

min(4,max(0,−1,2))=0. La iteración queda en la frontera izquierda.

19 · Síntesis

Ideas para recordar

  • El descenso resta una fracción de la derivada; el ascenso la suma.
  • El tamaño de paso controla rapidez y estabilidad.
  • La curvatura determina qué pasos constantes pueden converger.
  • Conviene combinar tolerancias con un máximo de iteraciones.
  • Las restricciones pueden incorporarse mediante proyección.
  • El método es local y depende del punto inicial en funciones no convexas.
  • Una búsqueda hacia atrás reduce pasos que no mejoran el objetivo.
  • Registrar la trayectoria permite diagnosticar oscilación y divergencia.

En el próximo tema integraremos modelado, análisis y algoritmos en un proyecto completo de optimización y verificación.