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.
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é.
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.
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.
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.
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.
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.
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.
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
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.
Travaux voisins dans notre archive
L'archive est vide autour de ce travail : l'analyse la plus proche n'est qu'à 0.50, contre 0,64 d'ordinaire. Il semble qu'on ait peu foré à côté.
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.