Geração automática de código: leitura e aprendizado de literatura "Um modelo de aprendizado profundo para geração de código-fonte"

Geração Automática de Código: Leitura e Aprendizagem
de Literatura Nome: "Um Modelo de Aprendizagem Profunda para Geração de Código Fonte"
Autores: Raymond Tiwang, Timothy Oladunni, Weifeng Xu

PS: O blogueiro acabou de entrar em contato com este campo, e muito conteúdo ainda não está claro. Se o conteúdo da postagem do blog estiver errado, por favor, critique e corrija~


Abstract : Inspirado em modelos como n-grams, um modelo é desenvolvido para análise de código-fonte via Abstract Syntax Trees (AST). O modelo é construído em arquiteturas Long Short-Term Memory (LSTM) e Multi-Layer Perceptron (MLP) baseadas em aprendizagem profunda. Por meio da avaliação, ele pode prever efetivamente a sequência de tokens (tokens) do código-fonte com base na linguagem python.

1. Introdução

Neste modelo, usamos dois métodos para melhorar a repetibilidade do conjunto de dados: 1) gerar a árvore de sintaxe abstrata AST a partir do código-fonte; 2) usar o arquivo dump (este arquivo é a travessia de pré-ordem do AST). Em seguida, use LSTM e MLP para treinar o modelo.

2. Trabalho relacionado

2.1 Revisão da Literatura

As informações que são mais úteis para mim:
1) Roos[7] propôs um método de modelo de linguagem N-gram para completar códigos de API com rapidez e precisão. Segundo ele, o modelo pode trabalhar em tempo real e concluir o trabalho de conclusão de código em segundos.

2) Li e outros [13] usaram atenção neural e redes pioneiras para estudar a conclusão do código. Eles desenvolveram um mecanismo de atenção capaz de explorar informações estruturadas na árvore de sintaxe abstrata de um programa.

3) Ginzberg e outros [14] implementaram um modelo LSTM comum para completar a tarefa de geração de código.

2.2 Sentenças como probabilidade

Como calcular a probabilidade de uma frase aparecer?
Suponha que a sentença S = "o carro corre rápido". As palavras s1-s4 são "the", "car", "runs" e "fast", respectivamente. O artigo é derivado assim (P significa probabilidade):
insira a descrição da imagem aqui

De acordo com a regra da cadeia, a fórmula acima pode ser transformada em:
insira a descrição da imagem aqui

Agora mesmo:
insira a descrição da imagem aqui

No entanto, como a metade direita da fórmula 4, é muito difícil de calcular. Portanto, simplifique esta fórmula de acordo com a suposição de Markov. Simplificado nas seguintes partes:

insira a descrição da imagem aqui

3. FUNDAMENTAÇÃO TEÓRICA

Este estudo é essencialmente um estudo multicategoria, e o número de categorias é o número de tokens diferentes no vocabulário. Este classificador é representado por um conjunto de funções discriminantes: gi(x). Dentre eles, i representa a categoria, x representa o vetor de atributos e gi(x) representa a atribuição do vetor de atributos x a uma determinada classe i. (Eu realmente não entendo este lugar)

Função de perda usada:
função de ativação de entropia cruzada categórica usada: sigmoid/softmax

4. METODOLOGIA

4.1 Abordagem de Processamento de Linguagem Natural

Primeiro treine e teste com uma rede LSTM simples.
Origem do conjunto de dados : um repositório github contendo 1274 códigos-fonte python.

Fase de pré-processamento : os arquivos individuais contendo o código-fonte são unidos em um arquivo grande. Limpe os dados (remova espaços, caracteres sem sentido), então tokenize e organize os dados em sequências de comprimento fixo (tokenize e organize o conjunto de dados em
sequências de comprimento fixo). Essas sequências são então alimentadas na camada de incorporação do modelo.

Treinamento e teste : 15 épocas foram treinadas, a precisão foi de 53,43% e a perda foi de 3,0,82. Treinando por 30 épocas, a precisão é de 53,36% e a perda é de 3,3532.

Conclusão : A precisão deste método para prever o próximo token do código é muito baixa, indicando que o método NLP tradicional tem alcance de aplicação limitado no reconhecimento de padrões de código-fonte ou descoberta de conhecimento.

4.2 Abordagem Proposta

Tendo em vista as deficiências dos métodos acima, a árvore de sintaxe abstrata AST é aplicada.
Conjunto de dados : Igual ao conjunto de dados em 4.1.

Pré-processamento de dados : Pré-processamento do conjunto de dados com uma árvore de sintaxe abstrata. Esses dados pré-processados ​​são então carregados para definir um dicionário de referência para todos os tokens no vocabulário, que é armazenado em uma lista onde cada linha é um único token. Como o modelo aceita apenas valores inteiros como entrada, o autor usa um codificador personalizado para codificar o token. Por fim, divida-o em taxas de entrada-saída usando sklearn

4.3 Desenho Experimental

Divida o conjunto de dados de treinamento em janelas de tamanho n, cada janela contém n tokens, onde os primeiros n-1 tokens são usados ​​como entrada e o enésimo token é usado como saída.

O projeto experimental consiste principalmente em três etapas: estágio de processamento de dados, estágio de estrutura de dados, treinamento e estágio de teste.
Fase de processamento de dados : O código-fonte (dados) é carregado no modelo. Para maior eficiência, o arquivo carregado é transferido para um grande objeto python f. AST é gerado a partir de um arquivo único f.
Fase de estruturação de dados : organize o texto em tokens e crie dicionários para cada token exclusivo.
Fase de treinamento e teste : divida o texto em dados de treinamento e dados de teste e alimente-os no modelo.

Não entendo muito bem o estágio da estrutura de dados. De acordo com o artigo, aqui estão algumas etapas da estrutura de dados:
①codificar sequências de tokens.
②carregar dados processados
​​③definir um dicionário de referência para todos os tokens exclusivos
④organizar arquivos em uma sequência de tokens para converter arquivos Para sequência de tokens
⑤divida cada linha em tokens individuais
insira a descrição da imagem aqui

4.4 Processamento AST

No código-fonte processado por AST, cada nó da árvore possui uma estrutura predeterminada, dependendo do tipo de palavras-chave ou operações envolvidas. Por exemplo, os nós folha são geralmente nomes de funções, nomes de objetos ou nomes de parâmetros. Cada nó folha é identificado por um identificador (id) e um contexto (ctx).
id pode ser uma variável de string, um literal numérico ou uma função nativa, enquanto ctx indica a tarefa executada pelo nome. Os possíveis valores de ctx são Load, Store, Del, etc.
Como a estrutura dos nós é fixa, é mais fácil prever usando AST do que o método em 4.1. O uso da árvore AST em vez do código-fonte de texto simples para representar o programa pode prever facilmente a estrutura do programa, garantindo assim uma melhor precisão da próxima geração de token.

4.4.1 Aprendizagem RNN-LSTM

Os tokens codificados com inteiros anteriores são alimentados na camada de incorporação do modelo keras. A sequência de saída incorporada é então alimentada na camada LSTM.

4.4.2 Aprendizagem MLP

Continue treinando com MLP

5. RESULTADO

insira a descrição da imagem aqui

Conforme mostrado na Figura 9, a precisão do modelo LSTM é de 90,32% e a perda é de 0,3505.
Além de usar dumps AST para treinar os dados, os autores também usam regularização. Executar o modelo com uma regularização L2 de 0,1 pode evitar o overfitting até certo ponto.

insira a descrição da imagem aqui

Conforme mostrado na Figura 10, a taxa de precisão é de 90,11% e a perda é de 0,314.

6. DESEMPENHO DO MODELO

Comparação deste modelo com outros modelos.
insira a descrição da imagem aqui

7. CONCLUSÃO

Principais contribuições:
1. Desenho, desenvolvimento e avaliação do modelo de autocompletação de código ASTLSTM/MLP.
2. Códigos-fonte python 1274 tokenizados.
3. Em comparação com os métodos NLP e Pointer Mixture Network, aumentou 69,5% e 29%, respectivamente.
4. As taxas de precisão de LSTM e MLP são 90,3% e 90,1%, respectivamente.

A importância deste estudo é a seguinte:
1. Os métodos tradicionais de processamento de linguagem natural têm escopo limitado de aplicação no reconhecimento de padrões de código-fonte ou descoberta de conhecimento.
2. Os algoritmos de aprendizado LSTM e MLP têm alta conclusão de código ou precisão de geração.
3. AST-LSTM é um mecanismo eficaz para conclusão ou geração de código python. Embora tanto o MLP quanto o LSTM tenham uma taxa de precisão acima de 90%, o LSTM é superior ao MLP em tarefas de conclusão de código porque aprende muito mais rápido que o algoritmo MLP.

Resumir

Este post implementa a geração de código python. No estágio de pré-processamento de dados, a árvore de sintaxe abstrata AST é introduzida para analisar o código-fonte e, em seguida, dois métodos de LSTM e MLP são usados ​​para treinamento. Este modelo pode efetivamente prever a sequência de tokens (tokens) do código-fonte e, finalmente, usar o módulo astunparse ou astor para converter o AST de volta ao código-fonte em uma comunicação um-para-um.

dúvida

  1. A parte da estrutura de dados do projeto experimental não é bem compreendida. Eu sinto que a introdução no artigo também é muito vaga. O que exatamente essa parte faz? Por que você não pode pular diretamente do pré-processamento de dados para treinamento e teste?
  2. Eu realmente não sei muito sobre AST ainda. Como um programa é convertido de código para árvore de sintaxe abstrata? Como executar a travessia de pré-ordem em um AST? (ou seja: como são geradas a figura 5 e a figura 6 no artigo?)
  3. Então, este artigo só pode alcançar extensão e geração de código? Não tem a função da descrição ao código? (Por exemplo: como copiloto, escreva um comentário e você pode formar um código recomendado após digitar tab)

Acho que você gosta

Origin blog.csdn.net/rellvera/article/details/129838485
Recomendado
Clasificación