Diffusion sur des arbres de syntaxe pour la synthèse de programmes
Vue d’ensemble
- Problème : les grands modèles de langage (LLM) génèrent le code un token à la fois. Dans ce processus, le retour d’information provenant du résultat d’exécution du programme est insuffisant.
- Solution : proposition d’un modèle de diffusion neuronal opérant sur des arbres de syntaxe. Comme les modèles de diffusion d’images, il inverse le bruit appliqué à l’arbre de syntaxe.
- Méthode : au lieu de générer du code, le modèle effectue des éditions répétées tout en conservant la validité syntaxique. Cela facilite son couplage avec la recherche.
- Application : appliqué aux tâches de graphisme inverse, il convertit une image en programme capable de générer cette image. Combiné à la recherche, il écrit des programmes graphiques, vérifie les résultats d’exécution et les débogue.
Que signifie ajouter du bruit à un programme ?
- Ajout de bruit : sélection d’un nœud arbitraire dans l’arbre de syntaxe, puis remplacement de ce nœud par un autre nœud du type correct.
- Inversion du bruit : après avoir ajouté du bruit, le modèle effectue le processus inverse pour revenir à l’état d’origine.
Génération de programmes par recherche
- Usage de la recherche : le modèle utilise la recherche pour trouver le programme optimal capable de générer l’image cible donnée.
- Efficacité : quelques couches de recherche suffisent pour trouver le bon programme.
Citation
- Article : "Diffusion On Syntax Trees For Program Synthesis"
- Auteurs : Shreyas Kapur, Erik Jenner, Stuart Russell
- Publication : arXiv, 2024
Remerciements
- Support technique : Kathy Jang, David Wu, Cam Allen, Sam Toyer, Eli Bronstein, Koushik Sen, Pieter Abbeel
Licence
- Creative Commons Attribution-ShareAlike 4.0 International License : le code source de ce site web peut être utilisé librement, à condition d’ajouter un lien en bas de page.
L’avis de GN⁺
- Point intéressant : l’approche consistant à éditer le code en tenant compte du résultat d’exécution du programme paraît plus intuitive que la génération séquentielle classique du code.
- Pourquoi c’est utile : c’est pertinent pour les tâches de graphisme inverse, et cela pourrait devenir un outil puissant pour convertir notamment des croquis dessinés à la main en programmes.
- Regard critique : le processus d’ajout et d’inversion du bruit peut être complexe, et il faudra davantage de validation sur les performances et l’efficacité en conditions réelles.
- Produit connexe recommandé : parmi les projets proposant des fonctionnalités similaires, on peut citer des modèles de génération de code comme Codex d’OpenAI.
- Points à considérer pour l’adoption : avant d’adopter cette technologie, il convient d’examiner attentivement les données d’entraînement du modèle ainsi que ses performances dans l’environnement réel d’utilisation.
1 commentaires
Avis Hacker News
Racket et génération d’indices pour les MOOC : Cela ressemble à Racket et à la manière de générer des indices pour les MOOC. Il s’agit de transformer et d’analyser des arbres syntaxiques pour atteindre la solution cible. Je me demande s’il serait possible de combiner cela avec des approches modernes de machine learning.
Algorithmes génétiques et transformations de sous-arbres : Dans les années 90, Koza et Adami ont beaucoup étudié les transformations de sous-arbres dans le cadre des algorithmes génétiques. La fonction d’optimisation est légèrement différente.
Génération d’arbres de programme : Il existe une référence bibliographique de 2000 sur la génération d’arbres de programme à l’aide d’algorithmes génétiques. L’essentiel manque.
Markov Chain Monte Carlo : Markov Chain Monte Carlo n’est pas nouveau en synthèse de programmes. Les travaux de Josh Tenenbaum me viennent immédiatement à l’esprit.
Démo WebPPL : Il existe diverses démos dans WebPPL, notamment sur la synthèse de vaisseaux spatiaux 3D. Les ouvrages associés et les publications du MIT Probabilistic Computing Project sont aussi recommandés.
Optimisation de compilateurs/interpréteurs : Je me demande comment cela pourrait s’appliquer à l’optimisation de compilateurs/interpréteurs. Peut-on analyser les parties exécutées au niveau assembleur et en déduire des optimisations ?
Modification des tokens de programme : Dans l’approche traditionnelle, on génère des images aléatoires puis on utilise des méthodes d’optimisation. J’ai du mal à comprendre comment la modification de tokens de programme peut être différentiable.
Intégration GitHub et outils de build : GitHub pourrait être intégré à des outils de build génériques. Je me demande s’il serait possible de compiler tous les projets compilés avec llvm et d’appliquer un modèle de diffusion aux représentations intermédiaires.
Modèles de diffusion et binaires : Je me demande si les modèles de diffusion pourraient fonctionner au niveau binaire. En donnant un prompt, serait-il possible de générer le binaire final d’un programme ?
Intégration avec SDF : J’aimerais voir une intégration avec SDF.
Vitesse de rendu PDF : Les PDF sont lents à afficher à cause des commandes de dessin générées par programme. Cela donne une impression d’article académique, et cela me manque.
Beam search et diffusion inverse : L’idée de beam search est intéressante. Je me demande comment intégrer la diffusion inverse et le beam search. À l’étape de diffusion inverse, échantillonne-t-on m > k nœuds puis n’étend-on que les k meilleurs ?