Simple Science

Ciência de ponta explicada de forma simples

# Informática# Computação e linguagem

Melhorias na Aprendizagem de Representação de Código Usando Grandes Conjuntos de Dados

Um novo método melhora a compreensão de código através de dados extensos e técnicas de treinamento.

― 7 min ler


Técnicas Avançadas deTécnicas Avançadas deAprendizado de Códigoextensos.código através de conjuntos de dadosNovos métodos elevam a compreensão de
Índice

Avanços recentes em inteligência artificial levaram à criação de modelos poderosos que conseguem entender e gerar código. Esses modelos são super úteis para tarefas como geração de código ou pra melhorar a nossa busca por trechos de código. Mas, a maioria dos métodos existentes usa uma quantidade limitada de dados para treinamento, o que pode prejudicar o desempenho deles. Nessa discussão, a gente foca em como usar um grande conjunto de dados pode melhorar a efectividade do aprendizado de representação de código, que é um método pra treinar modelos a entender melhor o código.

Desafios Atuais no Aprendizado de Representação de Código

Muitos modelos atuais são treinados com centenas de milhões de parâmetros, mas geralmente dependem de um pequeno volume de dados de pré-treinamento. Isso pode resultar em modelos que não têm um desempenho tão bom em várias tarefas. A gente propõe um método que usa um grande volume de dados de código pra treinar modelos em duas etapas.

Na primeira etapa, a gente treina os modelos pra entender a estrutura do código usando uma mistura de técnicas. Uma delas se chama Modelagem de Linguagem Mascarada, que ajuda o modelo a aprender a preencher partes faltando do código. A segunda etapa refina ainda mais esse entendimento através do aprendizado contrastivo. Esse método foca em distinguir entre pedaços de código semelhantes, permitindo que o modelo aprenda representações melhores.

O Processo de Treinamento em Duas Etapas

Na nossa abordagem, começamos usando muitos dados de código em um processo que chamamos de pré-treinamento em duas etapas. Isso envolve dois passos principais:

  1. Treinamento Inicial: Aqui, a gente usa várias técnicas pra treinar o modelo. Isso inclui experimentar com mascaramento aleatório de tokens, onde algumas partes do código são escondidas pra ver se o modelo consegue adivinhar o que são. Também prestamos atenção na estrutura das linguagens de programação pra tornar o treinamento mais eficaz.

  2. Refinamento: Nessa etapa, a gente melhora a habilidade do modelo usando aprendizado contrastivo. Esse processo envolve criar pares de códigos que estão muito relacionados, seja por serem semelhantes ou por terem significados semelhantes. Isso ajuda o modelo a distinguir entre diferenças sutis.

Importância do Tamanho dos Dados e Recursos

Pesquisas recentes mostraram que modelos de linguagem grandes treinados em conjuntos de dados extensos têm um desempenho significativamente melhor em tarefas envolvendo geração de código. Por exemplo, um conjunto de dados contendo 6TB de código-fonte é essencial pra empurrar os limites do que esses modelos conseguem fazer. Mas, só ter muitos dados não é o suficiente. A forma como treinamos os modelos com esses dados é igualmente importante.

O método tradicional de modelagem de linguagem mascarada geralmente não é ideal pra tarefas de programação. O esquema de mascaramento original 80-10-10, que substitui a maioria dos tokens pelo token [MASK], pode desvirtuar o significado do código. A gente descobriu que quando tokens como nomes de variáveis são substituídos aleatoriamente, isso pode levar a resultados de aprendizado piores. Em vez disso, recomendamos estratégias de mascaramento que mantenham a integridade da estrutura do código.

Aumentando o Poder de Discriminação

Enquanto o passo inicial de treinamento foca em criar representações contextuais de tokens, muitas aplicações práticas requerem que o modelo interprete e gere sequências de código. Quando se trata de aumentar a habilidade de discriminação do modelo para tarefas imediatas, o aprendizado contrastivo se torna crucial.

No aprendizado contrastivo, a gente cria pares de exemplos que estão muito relacionados (pares positivos) e aqueles que são diferentes (pares negativos). Isso ajuda o modelo a aprender a diferenciar entre tokens semelhantes e diferentes de forma eficaz.

Modelos de Representação Bidirecional para Código Fonte

A gente apresenta um novo modelo especificamente projetado pra entender código fonte, que chamamos de modelo de representação de codificador bidirecional. Esse modelo é pré-treinado usando um grande conjunto de dados e uma abordagem de treinamento em duas etapas, o que nos permite aproveitar ao máximo os dados disponíveis.

No primeiro passo de treinamento, o modelo aprende a identificar nomes significativos para nomes de variáveis ofuscados. Isso exige entender a semântica subjacente do código, como um programador humano faria. A gente combina isso com mascaramento para as partes restantes do código pra garantir que o modelo desenvolva um entendimento abrangente.

Aprendizado Contrastivo com Negativos Difíceis e Positivos Difíceis

O segundo passo envolve criar pares positivos a partir de relações de texto e código que ocorrem naturalmente. Por exemplo, combinar definições de funções com comentários relacionados pode ajudar a alinhar ainda mais o entendimento do modelo de código e linguagem natural.

No entanto, criar pares negativos é mais complicado. A gente utiliza um método baseado em distância pra identificar exemplos que não são idênticos, mas ainda compartilham semelhanças semânticas. Esse processo ajuda o modelo a aprender a focar nas diferenças sutis.

Métodos de Treinamento e Avaliação

A gente treina nossos modelos em um conjunto diversificado de linguagens de programação, incluindo Python, Java e JavaScript, entre outras. Fazendo isso, a gente garante que nossos modelos sejam versáteis e aplicáveis a várias tarefas de codificação.

Pra avaliar como nosso modelo se sai, usamos duas categorias principais: busca de código e tarefas de classificação. Por exemplo, a busca de código2código nos permite recuperar trechos de código relevantes, enquanto a busca NL2Código foca no uso de consultas em linguagem natural pra encontrar o código associado.

Resultados de Desempenho

De acordo com as nossas expectativas, nosso modelo demonstra uma melhora notável em relação a modelos anteriores em várias tarefas. Ao participar da busca semântica de código2código, nosso modelo consistentemente supera outros com tamanhos conhecidos, mostrando uma melhoria significativa no desempenho médio.

Na busca NL2Código, nossa abordagem também mostra resultados superiores em comparação com modelos anteriores. Uma parte importante desse sucesso pode ser atribuída aos nossos métodos de treinamento inovadores, que aproveitam grandes conjuntos de dados e estratégias de mascaramento eficazes pra enriquecer o processo de treinamento.

O Papel da Distribuição de Tokens e Taxa de Mascaramento

A distribuição de tokens desempenha um papel significativo na eficácia do nosso modelo. Em muitas linguagens de programação, há uma presença substancial de tokens de linguagem natural misturados com tokens de linguagem de programação. Essa mistura pode complicar o processo de treinamento, especialmente ao usar estratégias de mascaramento aleatórias.

A gente explorou diferentes taxas de mascaramento e descobriu que uma taxa fixa de 15% funciona melhor pra nossos propósitos. Garantir uma taxa ideal nos permite mitigar qualquer impacto negativo no processo de aprendizado.

Vantagens da Desofuscação de Identificadores

Uma das inovações-chave na nossa abordagem é o uso da desofuscação de identificadores durante o treinamento. Permitindo que o modelo preveja os nomes dos identificadores, ele pode construir uma melhor compreensão da estrutura e semântica do código. Esse processo se destaca dos outros que podem depender apenas do reconhecimento de padrões.

Conclusão

Os avanços descritos aqui destacam a importância de ter uma abordagem robusta para o aprendizado de representação de código. Ao utilizar grandes conjuntos de dados, métodos de treinamento inovadores e um foco no aprendizado contrastivo, nosso modelo proposto oferece uma compreensão mais substancial do código, permitindo que ele performe melhor em uma variedade de tarefas.

Esse trabalho serve como base pra futuras pesquisas, abrindo caminho pra métodos ainda mais eficazes em aprendizado de representação de código que aproveitem a vasta quantidade de dados de código disponíveis publicamente.

Fonte original

Título: Code Representation Learning At Scale

Resumo: Recent studies have shown that code language models at scale demonstrate significant performance gains on downstream tasks, i.e., code generation. However, most of the existing works on code representation learning train models at a hundred million parameter scale using very limited pretraining corpora. In this work, we fuel code representation learning with a vast amount of code data via a two-stage pretraining scheme. We first train the encoders via a mix that leverages both randomness in masking language modeling and the structure aspect of programming language. We then enhance the representations via contrastive learning with hard negative and hard positive constructed in an unsupervised manner. We establish an off-the-shelf encoder model that persistently outperforms the existing models on a wide variety of downstream tasks by large margins. To comprehend the factors contributing to successful code representation learning, we conduct detailed ablations and share our findings on (i) a customized and effective token-level denoising scheme for source code; (ii) the importance of hard negatives and hard positives; (iii) how the proposed bimodal contrastive learning boost the cross-lingual semantic search performance; and (iv) how the pretraining schemes decide the downstream task performance scales with the model size.

Autores: Dejiao Zhang, Wasi Ahmad, Ming Tan, Hantian Ding, Ramesh Nallapati, Dan Roth, Xiaofei Ma, Bing Xiang

Última atualização: 2024-02-02 00:00:00

Idioma: English

Fonte URL: https://arxiv.org/abs/2402.01935

Fonte PDF: https://arxiv.org/pdf/2402.01935

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.

Mais de autores

Artigos semelhantes