Compilamos una vez, diferenciamos en todas partes ✛

Original: "Compile Once, Differentiate Everywhere: A Differentiable Meta-Circular Interpreter"
· Lucas Sheneman
arXiv:2606.09930 · 2026-06-07 · CC BY 4.0 · 3 min
Un intérprete de Scheme compilado a un grafo diferenciable permite optimizar cualquier programa como si fueran datos.

Contexto

La frontera entre la ejecución de programas y la optimización por gradientes ha limitado durante mucho tiempo el uso del código como modelo científico entrenable. Normalmente, cada modelo debía reescribirse manualmente en un marco diferenciable. Este trabajo se sitúa junto a investigaciones sobre intérpretes diferenciables y programación neurosimbólica, pero se distingue porque lo que se vuelve diferenciable es el propio intérprete, no los programas individuales. Esto abre el camino a la calibración automática de cualquier programa generado, por ejemplo, por modelos de lenguaje.

Métodos

Los autores desarrollaron un compilador que traduce el código fuente en Scheme a una representación intermedia llamada ComputeGraph y luego a módulos de PyTorch o JAX. La característica clave es un intérprete metacircular diferenciable: un intérprete de Scheme escrito en el propio Scheme se compila una vez y luego puede ejecutar programas arbitrarios pasados como datos. Todos los valores se representan como vectores de 14 dimensiones: un vector one-hot de 10 dimensiones para la etiqueta de tipo y una carga útil de 4 dimensiones. El montón se implementa como un diccionario de escritura única, lo que preserva la corrección de los gradientes. Para las llamadas en posición de cola se utiliza un trampolín.

Resultados

Los gradientes calculados a través del intérprete compilado coinciden con la compilación directa con una precisión de 7×10⁻⁷ en la función de pérdida sobre 171 pares (programa, valor inicial). En datos reales de degradación de baterías, la búsqueda conjunta de estructura y parámetros recuperó la estructura de degradación en forma de codo a partir de una aproximación inicial suave y mejoró la extrapolación en datos retenidos. En la tarea de modelado inverso de El Niño, el intérprete diferenciable permitió optimizar la función de verosimilitud del filtro de Kalman con 611 parámetros, donde la búsqueda sin gradientes no tuvo éxito. El procesamiento por lotes logró una aceleración de hasta 875 veces en el rendimiento.

Implicaciones

Este trabajo se diferencia de enfoques vecinos en que lo que se vuelve diferenciable es el propio intérprete, no los programas individuales. Esto elimina la necesidad de reescribir cada nuevo modelo en forma diferenciable. En comparación con la diferenciación automática a nivel de lenguaje (como en JAX o Zygote) y con intérpretes diferenciables creados manualmente (como TerpreT), aquí se logra una combinación de autoaplicabilidad, modo reverso y compilación. Esto amplía la regresión simbólica y la búsqueda neurosimbólica desde expresiones cerradas hasta programas ejecutables con estado.

Desarrollo futuro

Las direcciones posibles incluyen trasladar el intérprete a JAX reescribiendo el trampolín como un lax.scan de longitud fija con enmascaramiento. También es prometedor el uso de MLIR y Enzyme para reducir la sobrecarga en cálculos individuales. La investigación sobre el suavizado de ramificaciones (interpretación suave o DiscoGrad) podría resolver el problema de los gradientes nulos para parámetros que solo afectan las condiciones de ramificación. En un sentido más amplio, esto abre el camino hacia la auto-mejora gradual de programas.

Impacto

El método puede influir en el modelado científico automatizado, donde los modelos de lenguaje generan hipótesis en forma de código y el intérprete diferenciable calibra sus parámetros. También es útil para tareas de regresión simbólica y síntesis neurosimbólica de programas.

Próximos pasos

Los siguientes pasos incluyen implementar un intérprete diferenciable en JAX para aprovechar la compilación jit y vmap. También se debe investigar la escalabilidad a espacios de programas más grandes y la robustez ante una especificación incorrecta de los modelos.

Problemas abiertos clave

Este trabajo está directamente relacionado con el problema no resuelto de la síntesis automática de programas: cómo buscar eficientemente en el espacio discreto de estructuras utilizando una señal de gradiente. Muestra que diferenciar el intérprete resuelve el problema de la calibración de parámetros, pero no el problema de la búsqueda discreta de estructura, que sigue siendo difícil.

La mirada de la máquina del conocimiento

Esta sección está dirigida al autor del trabajo y a sus colegas. Los trabajos vecinos los encontró la búsqueda por significado en nuestro archivo, no por coincidencia de palabras. No evaluamos: mostramos el campo alrededor.

Qué hace el trabajo

El trabajo presenta un compilador que traduce un subconjunto de Scheme a grafos computacionales diferenciables. La idea clave es que se compila el propio intérprete, no programas individuales, lo que permite que cualquier programa presentado como datos reciba automáticamente la retropropagación de gradientes. Los autores demuestran la corrección de los gradientes en casi todas partes y muestran su aplicación para la búsqueda conjunta de la estructura de los programas y sus parámetros en problemas científicos reales.

Dónde está su fuerza

La fortaleza del trabajo reside en el intérprete diferenciable autoaplicable, que elimina la necesidad de reescribir manualmente cada modelo en forma diferenciable. Esto abre el camino a la calibración automática de cualquier programa, incluidos los generados por modelos de lenguaje.

Hacia dónde puede avanzar

Vale la pena probar

  • Probar si se puede usar la verificación formal para demostrar la corrección de las optimizaciones en el código compilado.
  • Investigar cómo un intérprete diferenciable podría transferir estructuras de programas entrenados entre diferentes problemas científicos.

Por qué puede importar

El trabajo extiende la diferenciación automática al nivel de programas ejecutables con estado, lo que podría acelerar el modelado científico y hacerlo más flexible, especialmente en combinación con la generación de código por modelos de lenguaje.

El intérprete de Scheme escrito en el propio Scheme ocupa solo 288 líneas de código. Aun así, soporta cierres, recursión, listas y llamadas en posición de cola, lo suficiente para ser autoaplicable.

La idea de un programa que puede modificarse y mejorarse a sí mismo a través de gradientes resuena con el concepto de máquinas de Gödel de Jürgen Schmidhuber, descrito en sus trabajos sobre auto-mejora universal.

\frac{\|\nabla_{\theta} L_{\text{DMCI}} - \nabla_{\theta} L_{\text{direct}}\|_2}{\|\nabla_{\theta} L_{\text{direct}}\|_2} \approx 0
El error relativo del gradiente es cercano a cero, lo que confirma su corrección.
\text{throughput speedup} = \frac{\text{time sequential}}{\text{time batched}}
Relación entre el tiempo de ejecución secuencial y el tiempo por lotes.
L(\theta) = \ell(\pi(\text{eval}(P(\theta), x)))
La pérdida se calcula como una función diferenciable de la salida del intérprete.

Cifras clave

  • error de gradiente: 0 (dentro de la precisión numérica)
  • diferencia de pérdida: menos de 7×10⁻⁷
  • aceleración del procesamiento por lotes: hasta 875×
  • parámetros en la tarea de El Niño: hasta 611
  • líneas de código del intérprete: 288
Científicos
Niels BohrPascual JordanWerner HeisenbergJoseph Fourier
Conceptos
clasificador autoencoder decodificador reconstrucción de datos con redes neuronales autocorrección de IA análisis de componentes independientes IA explicable cálculo modelo generativo interfaz cerebro-computadora xgboost red neuronal profunda procesamiento paralelo forma diferencial reducción de dimensionalidad procesamiento del lenguaje natural