Algoritmo de optimización basado en descenso de gradiente sobre un paisaje dinámico perturbado con ruido correlacionado espacialmente.

En lugar de dar saltos aleatorios para escapar de mínimos locales (como Simulated Annealing), se le da un terremoto al suelo. La pelota sigue haciendo lo único que sabe: rodar cuesta abajo. Pero como el suelo tiembla de forma coherente y multiescala, los mínimos locales se convierten temporalmente en cuestas y la pelota escapa sola.
f_total(x, t) = f_original(x) + A(t) * noise(x, t)
f_original — función objetivo realnoise(x, t) — ruido correlacionado espacialmente (Perlin en 2D, RFF en ND)A(t) = A0 * sin(t * freq(t)) — amplitud cíclica con frecuencia decrecientef_original, no contra el paisaje combinadoLa clave frente a SA: el ruido es correlacionado espacialmente — dos puntos cercanos tienen perturbaciones similares. La pelota se desliza hacia otro valle, no se teletransporta. Las octavas del ruido dan exploración gruesa y refinamiento fino en un solo mecanismo.
En 2D se usa Perlin noise directamente. En ND se aproxima un Gaussian Random Field via Random Fourier Features (Rahimi & Recht, 2007):
noise(x) ≈ sqrt(2/R) * A * Σ_r cos(ω_r · x + t*drift_r + φ_r)
donde ω_r ~ N(0, 1/l²·I) son vectores en R^D. Al ser vectores N-dimensionales
crean interferencia entre dimensiones y correlación espacial real en ND.
| Dimensión | Seismic media | SA media | CMA-ES media | Seismic vs SA |
|---|---|---|---|---|
| 2D (5k pasos) | 0.139 | 0.410 | 1.498 | ✅ gana |
| 5D | 10.3 | 10.0 | 6.7 | empate |
| 10D | 45.3 | 54.2 | 16.3 | ✅ gana |
| 20D | 134 | 171 | 32.5 | ✅ gana |
| Función | Seismic vs SA | Diagnóstico |
|---|---|---|
| Ackley | ❌ SA gana | Meseta exterior con gradiente ~0 paraliza el descenso |
| Schwefel | empate | Dominio enorme, todos los algoritmos fallan por igual |
Funciona bien cuando:
Falla cuando:
El desarrollo del algoritmo ha evolucionado superando importantes cuellos de botella:
abs() en la amplitud permitió que las montañas mutaran bruscamente en valles durante el ciclo, mejorando el escape radicalmente.numpy, evaluamos $N$ partículas paralelamente bajo un mismo campo RFF común. Reduce el tiempo de simulación un ~85% preservando resultados comparables.Un descubrimiento fundamental en el desarrollo del algoritmo (consolidado en la v19) es que la exploración generada por el ruido correlacionado debe ser ergódica.
En lugar de sacudir ciegamente a la partícula con “ruido blanco” de alta frecuencia, Seismic Descent genera paisajes topológicos completos y coherentes de baja y alta frecuencia (mediante octavas de RFF), y realiza un morphing (interpolación suave) de un paisaje a otro con el tiempo.
Esta mutación continua garantiza matemáticamente que una partícula, guiada puramente por el gradiente de este “suelo mutante”, acabará explorando y visitando la totalidad del espacio de búsqueda sin quedarse atascada en ciclos infinitos o mesetas. La ergodicidad es lo que permite que el enjambre fluya por el terreno como un líquido, garantizando el escape de los mínimos locales más profundos.
pip install numpy noise matplotlib cma
# Benchmark 2D original
python perlin_opt.py
# Benchmark N-dimensional con RFF (mejor versión)
python perlin_opt_nd_grf.py
# Benchmarks en otras funciones
python benchmark_ackley.py
python benchmark_schwefel.py
El algoritmo Seismic Descent ahora está disponible como un optimizador estándar de PyTorch. Esto permite entrenar redes neuronales con “temblores” correlacionados espacialmente para escapar de mínimos locales.
from seismic_optimizer import SeismicOptimizer
model = MyModel()
optimizer = SeismicOptimizer(
model.parameters(),
lr=0.01,
noise_amplitude=0.5,
n_cycles=10
)
Consulta benchmark_mnist.py para un ejemplo completo y docs/pytorch_optimizer.es.md para detalles técnicos.
| Optimizador | Precisión | Margen |
|---|---|---|
| SGD | 98.28% | Base |
| Adaptive Floored Seismic | 97.90% | ✅ Supera a Adam |
| Adam | 97.79% | - |
docs/
findings_v1.md — hallazgos sesión 2D, evolución del schedule A(t)
findings_v2_nd.md — extensión ND, diagnóstico del ruido
findings_v3_fairbench.md — benchmark con presupuesto igualado
findings_v4_rff.md — Random Fourier Features, resultados Rastrigin ND
findings_v5_ackley.md — benchmark Ackley, limitación en mesetas
findings_v6_schwefel.md — benchmark Schwefel, perfil completo del algoritmo
findings_v7_rastrigin_analytic.md — Benchmark Rastrigin con gradientes analíticos O(1)
findings_v8_no_abs.md — Efecto contundente de permitir amplitud negativa
findings_v9_no_abs_ackley_schwefel.md — Validación en mesetas y en hiper-espacios de Schwefel
findings_v10_lengthscale.md — Diagnóstico sobre la compresión de lengthscales
findings_v11_adam.md — Demostrando porqué Adam Optimizer asfixia el "terremoto"
findings_v12_swarm.md — Seismic Swarm: paralelización del muestreo sobre RFF analítico
findings_v13_swarm_d.md — Enjambre estricto N=D y descubrimiento de trade-off de presupuesto
findings_v14_cycles.md — Parametrización estricta de la oscilación sísmica a 10 ciclos
findings_v15_reactive.md — Terremotos desencadenados por estancamiento (Bang-Bang Control)
findings_v16_momentum.md — Momentum Crudo (Heavy-Ball) causando efecto honda y pérdida de octavas
findings_v17_temporal_octaves.md — Sismos Fractales: aplicación de Series de Fourier a las octavas de amplitud temporales
findings_budgets_scale.md — Evaluación masiva a gran escala (LOW, MEDIUM, HIGH) cruzando CMA-ES
summary_of_experiments.md — Historia completa del origen y métricas tras 24h de hackathon
chat_arena*.md — conversación original con la idea
chat_opus4.6.md — prototipo inicial
perlin_opt.py — implementación 2D original (Perlin noise)
perlin_opt_nd.py — extensión ND con value noise
perlin_opt_nd_fairbench.py — benchmark fair (presupuesto igualado)
perlin_opt_nd_grf.py — Seismic Descent con RFF (versión ND definitiva base)
perlin_opt_nd_grf_analytic*.py — Repositorio incremental de las versiones Analíticas y de Enjambre (v7 a v17)
benchmark_ackley.py — benchmark genérico, función Ackley
benchmark_schwefel.py — benchmark función Schwefel
benchmark_budgets.py — Herramienta CLI de simulación paramétrica Multi-Presupuesto (Scale Up)
noise_amplitude y $K$ (ciclos) cruzado por la varianza de Dimensión $D$.Seismic Optimizer en un problema real simple como MNIST, usando las iteraciones de Epoch en vez del budget.