Aprimorando Modelos de Código para Contextos Sem Símbolos
Um novo método treina modelos de código de forma eficaz sem depender de símbolos.
― 6 min ler
Índice
Modelos de código baseados na tecnologia Transformer têm mostrado um grande sucesso em tarefas de engenharia de software. No entanto, esses modelos enfrentam dificuldades quando encontram código sem símbolos ou informações úteis. Quando os símbolos estão faltando, fica difícil para os modelos reconhecerem as relações entre diferentes partes do código. Este trabalho apresenta uma nova forma de treinar esses modelos de maneira eficaz, mesmo em situações onde os símbolos não estão disponíveis.
Visão Geral do Problema
Quando o código é retirado de símbolos, ele frequentemente se assemelha a uma forma muito básica de linguagem de programação, sem contexto significativo. Isso dificulta tanto para humanos quanto para modelos decifrar o significado pretendido do código. Por exemplo, em código binário, variáveis podem ser representadas apenas por endereços de memória ou registradores, tornando desafiador rastrear Dependências ou entender como diferentes partes do código interagem.
Método Proposto
Para superar esses desafios, propomos um método que usa análise de programas para capturar contexto antes de treinar o modelo. Essa análise permite que o modelo se concentre nas relações relevantes, mesmo quando os símbolos estão ausentes. Em vez de depender de símbolos como em modelos tradicionais, nossa abordagem utiliza uma estratégia especial de máscara para ajudar o modelo a aprender quais partes do código são mais importantes.
Processo de Treinamento
A gente melhora a tokenização padrão e ajusta o design do modelo para funcionar melhor com nosso método. O treinamento envolve uma fase de pré-treinamento onde o modelo é exposto a um grande conjunto de dados contendo inúmeras funções binárias. No nosso caso, usamos 26 milhões de funções binárias para ajudar o modelo a aprender os padrões subjacentes dentro do código.
Durante o treinamento, o modelo aprende a reconhecer relações importantes no código, o que ajuda ele a ter um desempenho melhor em diferentes tarefas, como identificar binários semelhantes, inferir tipos e classificar malware. Nosso modelo mostrou melhorias significativas em relação aos métodos existentes, aumentando o desempenho em várias tarefas.
Arquitetura do Modelo
Nossa abordagem se baseia em um modelo Transformer semelhante ao BERT, mas inclui algumas modificações importantes. O modelo usa um mecanismo de atenção regularizado que foca em interações específicas no código. Ao direcionar a atenção apenas para tokens relevantes, conseguimos garantir que o modelo destaque relações significativas e ignore informações irrelevantes.
No núcleo do modelo, utilizamos blocos Transformer de várias camadas que processam sequências de tokens de entrada. Cada camada do modelo emprega as máscaras de atenção especiais que projetamos para regular o que o modelo se concentra. Essa arquitetura permite que o modelo entenda melhor a semântica do código, mesmo sem símbolos claros.
Regularização da Atenção
Uma parte importante da nossa metodologia é a regularização da atenção. Construímos máscaras que ditam quais tokens podem prestar atenção uns aos outros com base nas dependências do programa. Dessa forma, quando um token está processando seu contexto, ele considera apenas tokens que são relevantes de acordo com as regras de dependência que estabelecemos.
Dividimos a atenção em três contextos principais:
Contexto Global: Isso permite que os tokens tenham uma visão mais ampla de todos os tokens na entrada, para que o modelo consiga capturar relações gerais em todo o código.
Contexto Local: Isso se concentra nos tokens dentro da mesma instrução, garantindo que o modelo preste atenção ao significado de toda a instrução sem se distrair com outras instruções.
Contexto de Dependência: Isso permite que o modelo reconheça as relações entre instruções com base em suas dependências, garantindo que ele possa aprender como diferentes partes do código se relacionam.
Pré-treinamento e Ajuste Fino
O processo de pré-treinamento envolve dois objetivos principais: Modelagem de Linguagem Mascarada (MLM) e Modelagem de Dependência Mascarada (MDM). Na MLM, tokens aleatórios na entrada são mascarados, e o modelo aprende a prever esses tokens com base em seus contextos. A MDM, por outro lado, foca em prever dependências do programa enquanto mascara certas relações para prevenir correlações espúrias.
Após o pré-treinamento, nosso modelo pode ser ajustado para tarefas específicas. Essa flexibilidade permite que ele seja usado de maneira eficaz em várias aplicações sem precisar começar do zero toda vez.
Resultados
Nosso modelo foi testado em várias tarefas, incluindo análise de similaridade binária, classificação de famílias de malware e inferência de tipos para binários. Em cada caso, nosso modelo superou os modelos de ponta existentes, demonstrando a eficácia da nossa abordagem.
Para tarefas de similaridade binária, descobrimos que nosso modelo melhora significativamente as taxas de recall, ajudando a identificar corretamente funções semelhantes com maior precisão. Na classificação de malware, ele foi capaz de agrupar malware em famílias com base em seu comportamento, melhorando as taxas de detecção.
Na área de inferência de tipos, nosso modelo demonstrou uma forte capacidade em prever tipos de alto nível a partir do código binário, ajudando engenheiros reversos a entender a estrutura e o propósito do código.
Comparação com Outros Modelos
Quando comparado a outras técnicas como GraphCodeBERT e modelos tradicionais, nossa abordagem mostrou melhor adaptabilidade quando os símbolos estão faltando. Enquanto o GraphCodeBERT depende fortemente de símbolos, nosso método funciona mesmo sem eles, tornando-o mais versátil para aplicações do mundo real onde o código pode estar desprovido dessa informação.
Conclusão
Em resumo, nosso trabalho apresenta uma nova metodologia de treinamento para modelos de código baseados em Transformer que se destacam mesmo na ausência de símbolos. Ao aproveitar a análise de programas e a regulação cuidadosa da atenção, conseguimos fazer com que os modelos aprendam relações significativas no código, levando a um desempenho melhor em várias tarefas. Essa abordagem abre novos caminhos para entender e analisar código binário, tornando-se uma ferramenta valiosa para engenharia de software, segurança e além.
Com o desenvolvimento e testes contínuos, esperamos refinar ainda mais essas técnicas e explorar seu potencial em ainda mais aplicações.
Título: CodeArt: Better Code Models by Attention Regularization When Symbols Are Lacking
Resumo: Transformer based code models have impressive performance in many software engineering tasks. However, their effectiveness degrades when symbols are missing or not informative. The reason is that the model may not learn to pay attention to the right correlations/contexts without the help of symbols. We propose a new method to pre-train general code models when symbols are lacking. We observe that in such cases, programs degenerate to something written in a very primitive language. We hence propose to use program analysis to extract contexts a priori (instead of relying on symbols and masked language modeling as in vanilla models). We then leverage a novel attention masking method to only allow the model attending to these contexts, e.g., bi-directional program dependence transitive closures and token co-occurrences. In the meantime, the inherent self-attention mechanism is utilized to learn which of the allowed attentions are more important compared to others. To realize the idea, we enhance the vanilla tokenization and model architecture of a BERT model, construct and utilize attention masks, and introduce a new pre-training algorithm. We pre-train this BERT-like model from scratch, using a dataset of 26 million stripped binary functions with explicit program dependence information extracted by our tool. We apply the model in three downstream tasks: binary similarity, type inference, and malware family classification. Our pre-trained model can improve the SOTAs in these tasks from 53% to 64%, 49% to 60%, and 74% to 94%, respectively. It also substantially outperforms other general pre-training techniques of code understanding models.
Autores: Zian Su, Xiangzhe Xu, Ziyang Huang, Zhuo Zhang, Yapeng Ye, Jianjun Huang, Xiangyu Zhang
Última atualização: 2024-02-19 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2402.11842
Fonte PDF: https://arxiv.org/pdf/2402.11842
Licença: https://creativecommons.org/licenses/by-nc-sa/4.0/
Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.
Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.