Difusão em árvores sintáticas para síntese de programas
Visão geral
- Problema: grandes modelos de linguagem (LLMs) geram código um token de cada vez. Nesse processo, falta feedback da observação do resultado de execução do programa.
- Solução: é proposto um modelo de difusão neural que opera sobre árvores sintáticas. De forma semelhante aos modelos de difusão de imagem, ele reverte o ruído aplicado à árvore sintática.
- Método: em vez de gerar código, o modelo faz edições repetidas mantendo a validade sintática. Isso facilita a combinação com busca.
- Aplicação: aplicado a tarefas de gráficos inversos, convertendo imagens em programas que geram essas imagens. Combinado com busca, ele escreve programas gráficos, verifica os resultados de execução e faz depuração.
O que significa adicionar ruído a um programa?
- Adição de ruído: seleciona-se um nó aleatório da árvore sintática e esse nó é substituído por outro nó do tipo correto.
- Reversão do ruído: após adicionar ruído, ele é revertido para retornar ao estado original.
Geração de programas por meio de busca
- Uso de busca: o modelo usa busca para encontrar o programa ideal para gerar uma imagem-alvo fornecida.
- Eficiência: é possível encontrar o programa correto com apenas algumas camadas de busca.
Citação
- Artigo: "Diffusion On Syntax Trees For Program Synthesis"
- Autores: Shreyas Kapur, Erik Jenner, Stuart Russell
- Publicação: arXiv, 2024
Agradecimentos
- Apoio técnico: Kathy Jang, David Wu, Cam Allen, Sam Toyer, Eli Bronstein, Koushik Sen, Pieter Abbeel
Licença
- Creative Commons Attribution-ShareAlike 4.0 International License: o código-fonte deste site pode ser usado livremente, desde que um link seja adicionado no rodapé da página.
Opinião do GN⁺
- Ponto interessante: a abordagem de editar código refletindo o resultado de execução do programa é mais intuitiva do que a geração sequencial de código tradicional.
- Por que isso ajuda: é útil para tarefas de gráficos inversos e pode ser uma ferramenta poderosa especialmente para converter esboços desenhados à mão em programas.
- Visão crítica: o processo de adicionar e reverter ruído pode ser complexo, e são necessárias validações adicionais sobre desempenho e eficiência em aplicações reais.
- Recomendação de produtos relacionados: outros projetos com funcionalidade semelhante incluem modelos de geração de código como o Codex da OpenAI.
- Considerações para adoção da tecnologia: ao adotar essa tecnologia, é importante revisar cuidadosamente os dados de treinamento do modelo e seu desempenho no ambiente real de aplicação.
1 comentários
Comentários do Hacker News
Racket e geração de dicas para MOOC: Isso parece semelhante à forma como o Racket e a geração de dicas para MOOC funcionam. A abordagem consiste em transformar e analisar a árvore sintática para chegar à solução-alvo. Fico curioso se isso poderia ser combinado com abordagens modernas de machine learning.
Algoritmos genéticos e transformação de subárvores: Nos anos 90, Koza e Adami estudaram profundamente a transformação de subárvores como parte dos algoritmos genéticos. A função de otimização é um pouco diferente.
Geração de árvores de programas: Há uma referência bibliográfica de 2000 sobre geração de árvores de programas usando algoritmos genéticos. Faltam os pontos principais.
Markov Chain Monte Carlo: Markov Chain Monte Carlo não é novidade em síntese de programas. O trabalho de Josh Tenenbaum vem imediatamente à mente.
Demos em WebPPL: Há vários demos em WebPPL, incluindo síntese de naves espaciais 3D. Também recomendam livros relacionados e publicações do MIT Probabilistic Computing Project.
Otimização de compiladores/interpretadores: Fico curioso sobre como isso poderia ser aplicado à otimização de compiladores/interpretadores. Será que seria possível analisar as partes executadas no nível de assembly e derivar otimizações?
Mudança de tokens de programa: Em abordagens tradicionais, gera-se uma imagem aleatória e usam-se métodos de otimização. É difícil entender como a alteração de tokens de programa pode ser diferenciável.
Integração com GitHub e ferramentas de build: O GitHub poderia ser integrado com ferramentas de build comuns. Fico imaginando se seria possível compilar todos os projetos compilados com llvm e aplicar um modelo de difusão às representações intermediárias.
Modelos de difusão e binários: Fico curioso se modelos de difusão poderiam funcionar no nível binário. Com um prompt, seria possível gerar o binário final de um programa?
Integração com SDF: Gostaria de ver uma integração com SDF.
Velocidade de renderização de PDF: PDFs são lentos para renderizar por causa dos comandos de desenho gerados programaticamente. Dá uma sensação de artigo acadêmico, o que dá saudade.
Beam search e difusão reversa: A ideia de beam search é interessante. Fico curioso sobre como integrar difusão reversa e beam search. Será que amostram m > k nós em cada etapa da difusão reversa e expandem apenas os k melhores nós?