Compiler une fois, différencier partout ✛

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 interpréteur Scheme compilé en graphe différenciable permet d'optimiser n'importe quel programme comme des données.

Contexte

La frontière entre l'exécution de programmes et l'optimisation par gradient a longtemps limité l'utilisation du code comme modèle scientifique entraînable. En général, chaque modèle devait être réécrit manuellement dans un framework différenciable. Ce travail se situe aux côtés des recherches sur les interpréteurs différenciables et la programmation neurosymbolique, mais il se distingue par le fait que c'est l'interpréteur lui-même qui devient différenciable, et non les programmes individuels. Cela ouvre la voie à l'étalonnage automatique de tout programme généré, par exemple, par des modèles de langage.

Méthodes

Les auteurs ont développé un compilateur qui traduit le code source Scheme en une représentation intermédiaire ComputeGraph, puis en modules PyTorch ou JAX. La caractéristique clé est un interpréteur métacirculaire différenciable : un interpréteur Scheme écrit en Scheme lui-même, compilé une seule fois, puis capable d'exécuter des programmes arbitraires fournis en tant que données. Toutes les valeurs sont représentées par des vecteurs de dimension 14 : un vecteur one-hot de 10 dimensions pour le type et une charge utile de 4 dimensions. Le tas est implémenté comme un dictionnaire à écriture unique, ce qui préserve la correction des gradients. Pour les appels terminaux, un trampoline est utilisé.

Résultats

Les gradients calculés via l'interpréteur compilé coïncident avec la compilation directe à une précision de 7×10⁻⁷ sur la fonction de perte, pour 171 paires (programme, valeur initiale). Sur des données réelles de dégradation de batteries, la recherche conjointe de la structure et des paramètres a restauré la structure en coude de la dégradation à partir d'une approximation initiale lisse et a amélioré l'extrapolation sur les données de test. Dans le problème de modélisation inverse d'El Niño, l'interpréteur différenciable a permis d'optimiser la vraisemblance du filtre de Kalman avec 611 paramètres, là où la recherche sans gradient a échoué. Le traitement par lots a donné une accélération allant jusqu'à 875 fois en débit.

Implications

Ce travail se distingue des approches voisines par le fait que c'est l'interpréteur lui-même qui devient différenciable, et non les programmes individuels. Cela élimine la nécessité de réécrire chaque nouveau modèle sous une forme différenciable. Par rapport à la différenciation automatique au niveau du langage (comme dans JAX ou Zygote) et aux interpréteurs différenciables créés manuellement (comme TerpreT), on obtient ici une combinaison d'auto-applicabilité, de mode inverse et de compilation. Cela étend la régression symbolique et la recherche neurosymbolique, des expressions fermées aux programmes exécutables avec état.

Développements futurs

Les directions possibles incluent le portage de l'interpréteur sur JAX via la réécriture du trampoline sous forme de lax.scan de longueur fixe avec masquage. L'utilisation de MLIR et Enzyme pour réduire les frais généraux sur les calculs individuels est également prometteuse. La recherche sur le lissage des branchements (interprétation lisse ou DiscoGrad) pourrait résoudre le problème des gradients nuls pour les paramètres qui n'affectent que les conditions de branchement. Plus largement, cela ouvre la voie à l'auto-amélioration des programmes par gradient.

Impact

La méthode pourrait influencer la modélisation scientifique automatisée, où les modèles de langage génèrent des hypothèses sous forme de code, et l'interpréteur différenciable étalonne leurs paramètres. Elle est également utile pour les tâches de régression symbolique et de synthèse neurosymbolique de programmes.

Prochaines étapes

Les prochaines étapes incluent l'implémentation d'un interpréteur différenciable sur JAX pour bénéficier de la compilation jit et de vmap. Il convient également d'étudier la mise à l'échelle vers des espaces de programmes plus vastes et de vérifier la robustesse en cas de spécification incorrecte des modèles.

Problèmes ouverts clés

Ce travail est directement lié au problème non résolu de la synthèse automatique de programmes : comment rechercher efficacement dans un espace discret de structures en utilisant un signal de gradient. Il montre que la différenciation de l'interpréteur résout le problème de l'étalonnage des paramètres, mais pas celui de la recherche discrète de structure, qui reste difficile.

Le regard de la machine du savoir

Cette section s'adresse à l'auteur du travail et à ses collègues. Les travaux voisins ont été trouvés par une recherche sémantique dans notre archive, et non par correspondance de mots. Nous n'évaluons pas : nous montrons le champ autour.

Ce que fait ce travail

Cet article présente un compilateur qui traduit un sous-ensemble de Scheme en graphes de calcul différentiables. L'idée clé est de compiler l'interpréteur lui-même, plutôt que des programmes individuels, ce qui permet à tout programme fourni comme donnée de bénéficier automatiquement de la rétropropagation des gradients. Les auteurs prouvent la correction des gradients presque partout et démontrent une application pour la recherche conjointe de la structure des programmes et de leurs paramètres sur des problèmes scientifiques réels.

Où est sa force

La force de ce travail réside dans l'interpréteur différentiable auto-applicatif, qui élimine la nécessité de réécrire manuellement chaque modèle sous une forme différentiable. Cela ouvre la voie à l'étalonnage automatique de tout programme, y compris ceux générés par des modèles de langage.

Vers où avancer

À essayer

  • Vérifier si la vérification formelle peut être utilisée pour prouver la correction des optimisations dans le code compilé.
  • Explorer comment un interpréteur différentiable pourrait transférer des structures de programmes entraînées entre différentes tâches scientifiques.

Pourquoi cela peut compter

Ce travail étend la différenciation automatique au niveau des programmes exécutables avec état, ce qui pourrait accélérer la modélisation scientifique et la rendre plus flexible, en particulier en combinaison avec la génération de code par des modèles de langage.

L'interpréteur Scheme écrit en Scheme lui-même ne compte que 288 lignes de code. Il prend en charge les fermetures, la récursivité, les listes et les appels terminaux, suffisamment pour l'auto-applicabilité.

L'idée d'un programme capable de se modifier et de s'améliorer lui-même par gradients fait écho au concept de machines gödeliennes de Jürgen Schmidhuber, décrit dans ses travaux sur l'auto-amélioration universelle.

\frac{\|\nabla_{\theta} L_{\text{DMCI}} - \nabla_{\theta} L_{\text{direct}}\|_2}{\|\nabla_{\theta} L_{\text{direct}}\|_2} \approx 0
L'erreur relative du gradient est proche de zéro, ce qui confirme la correction.
\text{throughput speedup} = \frac{\text{time sequential}}{\text{time batched}}
Rapport du temps d'exécution séquentielle au temps par lots.
L(\theta) = \ell(\pi(\text{eval}(P(\theta), x)))
La perte est calculée comme une fonction différenciable de la sortie de l'interpréteur.

Chiffres clés

  • erreur de gradient: 0 (dans les limites de la précision numérique)
  • différence de perte: moins de 7×10⁻⁷
  • accélération du traitement par lots: jusqu'à 875×
  • paramètres dans le problème d'El Niño: jusqu'à 611
  • lignes de code de l'interpréteur: 288
Scientifiques
Niels BohrPascual JordanWerner HeisenbergJoseph Fourier
Notions
classificateur autoencodeur décodeur reconstruction de données par réseaux de neurones auto-correction de l'IA analyse en composantes indépendantes IA explicable calcul modèle génératif interface cerveau-ordinateur xgboost réseau neuronal profond traitement parallèle forme différentielle réduction de dimensionnalité traitement automatique du langage naturel