500 papéis! A revisão mais completa do modelo de código está chegando

v.png

Em 14 de novembro, o Ant Group e a Shanghai Jiao Tong University lançaram uma revisão de 55 páginas de grandes modelos de código, cobrindo mais de 50 modelos, 30 tarefas downstream e 500 referências. Ele resume de forma abrangente o mais recente progresso e desenvolvimento de grandes modelos de linguagem em código aplicações relacionadas.desafio.

Link do artigo:  https://arxiv.org/abs/2311.07989

Repositório:  https://github.com/codefuse-ai/Awesome-Code-LLM

Postado novamente pelo grande V do Twitter:  https://twitter.com/_akhaliq/status/1724630901441585521

O Repo continuará a ser atualizado para adicionar os artigos mais recentes, todos podem prestar atenção.

 

1.  Introdução

Com o surgimento de grandes modelos de linguagem em todos os lugares, como combiná-los de forma eficaz com aplicações práticas, especialmente aplicações relacionadas à engenharia de software, tornou-se uma questão de preocupação crescente tanto para a academia quanto para a indústria. No entanto, estas aplicações ainda são muito limitadas no momento: as tarefas de geração de código representadas por HumanEval e MBPP são excelentes na PNL e em grandes comunidades de modelos, mas o desempenho nestes conjuntos de dados clássicos está próximo da saturação, enquanto outras tarefas, como tradução de código, anotação de código e tarefas unitárias, como geração de testes, raramente são abordadas. Por outro lado, na comunidade de engenharia de software, a aplicação de modelos de linguagem ainda é dominada pelo modelo somente codificador representado pelo CodeBERT e pelo modelo codificador-decodificador representado pelo CodeT5, enquanto as aplicações de nível industrial da série GPT de grandes modelos estão em ascensão.

 

Diferente de muitas revisões anteriores, este artigo parte de uma perspectiva interdisciplinar e investiga de forma abrangente o trabalho das duas comunidades disciplinares de PNL e Engenharia de Software (SE), abrangendo ambos os grandes modelos generativos representados pela série OpenAI GPT e pela série Meta LLaMA. tarefas de geração de código, também abrange pequenos modelos de código profissional, como CodeBERT e outras tarefas downstream, como tradução de código, e se concentra na tendência de desenvolvimento de integração de PNL e SE.

 

Este artigo está dividido em quatro partes: formação técnica, modelo de código, tarefas downstream, oportunidades e desafios. A primeira parte apresenta os princípios básicos e objetivos comuns de treinamento dos modelos de linguagem, bem como as melhorias mais recentes na arquitetura básica do Transformer. A segunda parte apresenta grandes modelos gerais, como Codex e PaLM, e modelos de código profissionais, como CodeGen e StarCoder, e inclui a aplicação de tecnologias de PNL, como ajuste fino de instruções e aprendizado por reforço, bem como recursos de programa como AST, DFG e IR. em modelos de código. A terceira parte apresenta brevemente mais de 30 tarefas downstream de código e lista conjuntos de dados comuns. A quarta parte apresenta as oportunidades e desafios dos atuais modelos de grandes códigos.

 

 2.Antecedentes técnicos

Embora a maioria dos grandes modelos generativos atuais sejam baseados no decodificador Transformer, sua arquitetura não permaneceu inalterada desde que foi proposta em 2017. Esta seção apresenta brevemente a regularização de pré-camada (pré-norma), atenção paralela (atenção paralela), codificação de posição de rotação (RoPE), atenção de recuperação múltipla e atenção de recuperação de grupo (MQA, GQA) e métodos baseados em atenção. otimização (FlashAttention), amigos familiares podem ignorá-la ~

2.1.  Autoatenção clássica do touro

No artigo de 2017, Atenção é tudo que você precisa, cada camada do Transformer é definida da seguinte forma:

Entre eles, LN é a normalização de camada (Normalização de camada), Atenção é a subcamada de autoatenção de múltiplas cabeças (MHA) e FFN é a subcamada totalmente conectada (Rede Feed-Forward).

 

2.2.  Regularização pré-camada

Em 2019, o GPT-2 moveu a regularização da camada para a entrada de cada subcamada:

O trabalho subsequente somente com decodificador seguiu basicamente essa arquitetura para tornar o treinamento mais estável.Em termos do modelo codificador-decodificador, a série T5 também adotou essa arquitetura.

 

2.3.  Atenção paralela

Em 2021, o GPT-J mudou o cálculo sequencial de autoatenção e camadas totalmente conectadas para paralelo para melhorar a eficiência do treinamento:

No experimento do artigo PaLM, descobriu-se que o uso dessa arquitetura pode aumentar a velocidade de treinamento em 15%, o que prejudicará levemente o desempenho no modelo 8B, mas basicamente não terá impacto no modelo 62B.

 

2.4.  Codificação de posição

Como a autoatenção não consegue distinguir o relacionamento posicional entre os tokens de entrada, a codificação posicional é uma parte importante da arquitetura do Transformer, e sua capacidade de extrapolação também determina o comprimento da sequência que o modelo pode processar.

 

O Transformer clássico usa codificação de cosseno que não pode ser aprendida, que é adicionada à palavra entrada do vetor na parte inferior do modelo. GPT e BERT mudaram para codificação de posição absoluta que pode ser aprendida e continuaram a usar modelos clássicos como RoBERTa, BART, GPT-2 e GPT-3. Transformer-XL e XLNet usam codificação de posição relativa e adicionam o vetor aprendível correspondente a k de acordo com a relação de posição relativa entre k e q na autoatenção, enquanto T5 simplifica isso e usa a codificação de cada posição relativa como O escalar aprendível é adicionado ao produto escalar de k e q.

 

RoPE (Rotary Position Embedding) e ALiBi (Attention with Linear Biases) são as duas mais recentes tecnologias de codificação de posição. RoPE multiplica q e k pela matriz de rotação diagonal do bloco para injetar informações de posição:

Papel RoPE de origem da figura, m na figura é o subscrito da posição. Grandes modelos convencionais, como PaLM e LLaMA, usam RoPE.

 

ALiBi atenua diretamente a matriz de atenção antecipadamente:

Fonte de imagem em papel ALiBi. BLOOM usa ALiBi como codificação de localização.

 

2.5.  MQA, GQA, FlashAttention

Um grande desafio da arquitetura do Transformer é a complexidade quadrada da autoatenção em relação ao comprimento da sequência de entrada. Muitos trabalhos simulam a autoatenção e simultaneamente reduzem a complexidade através de métodos de aproximação, como Sparse Transformer, Reformer, Longformer, Linformer, Performer, Sinkformer, cosFormer, Sliceformer, etc., mas esses métodos não foram testados em modelos grandes. Além disso, muitos desses métodos são baseados na relação entre o comprimento da sequência e a latitude da camada oculta n<<d, o que não é verdadeiro em grandes modelos existentes (por exemplo, o comprimento da sequência do GPT-3 175B é 2048, e o a latitude da camada oculta é 12288).

 

Portanto, o ponto de partida para a otimização acelerada da autoatenção em modelos grandes geralmente não é o processo de cálculo da atenção, mas a leitura e escrita do hardware. O MQA é baseado nesta ideia, permitindo que diferentes cabeças compartilhem K e V na autoatenção de múltiplas cabeças, enquanto cada cabeça mantém seu próprio Q. Essa otimização quase não tem impacto na velocidade de treinamento, mas aumenta diretamente a velocidade de inferência em h vezes (h é o número de cabeças de atenção, como BERT-grande é 16, GPT-3 175B é 96). A fonte dessa aceleração é que todos os elementos da palavra no estágio de inferência precisam ser gerados autoregressivamente, e o cálculo de cada etapa do processo de geração envolve o q e k de todos os elementos da palavra anteriores. O processo de carregar esses q e k da memória de vídeo para o núcleo de computação da GPU constitui um gargalo de desempenho.

 

Já o GQA, como o nome sugere, é um produto intermediário entre o MHA e o MQA:

Fonte de imagem, papel GQA.

 

Entre os grandes modelos convencionais, o PaLM usa MQA, enquanto o LLaMA 2 e sua variante Code LLaMA usam GQA.

 

Outra tecnologia relacionada é o FlashAttention. Esta tecnologia otimiza o cálculo da matriz de atenção por meio da tecnologia lado a lado na computação distribuída. Vale ressaltar que diferentemente de outras técnicas de otimização, FlashAttention não é um método de aproximação e não altera os resultados do cálculo.

3.  Modelo de código

Dividimos os modelos de código em grandes modelos de uso geral, grandes modelos de treinamento com código adicionado e modelos profissionais pré-treinados do zero com base em campos de pré-treinamento, e a última categoria é dividida em codificador de transformador, decodificador e codificador-decodificador baseado em arquitetura de modelo. Além do UniLM, também prestamos atenção especial ao trabalho que surgiu este ano no ajuste fino de instruções no código, usando feedback do compilador para aprendizado por reforço e integrando recursos específicos do programa, como árvores de sintaxe e fluxos de dados no modelo:

 

3.1.  Modelo grande geral e modelo grande de treinamento adicional

Quando se trata de modelos de código grandes, aquele com o qual a maioria das pessoas está mais familiarizada é o Codex. Codex é um modelo obtido por treinamento autosupervisionado de 100 bilhões de palavras em dados Python baseado em GPT-3. Semelhante ao Codex, existem o PaLM Coder, que adicionou 39 bilhões de palavras ao PaLM, e o Code LLaMA, que adicionou mais de 500 bilhões de palavras ao LLaMA 2.

 

É claro que modelos grandes não requerem necessariamente treinamento adicional para lidar com código. Os grandes dados de pré-treinamento do modelo atual geralmente equivalem a trilhões de palavras, o que geralmente inclui código. Por exemplo, Pile, um dos conjuntos de dados públicos de pré-treinamento mais comumente usados, inclui 95 GB de código, enquanto o conjunto de dados de pré-treinamento ROOTS do BLOOM também inclui 163 GB de código em 13 linguagens de programação.

 

Desempenho do grande modelo geral em HumanEval e MBPP:

 

3.2.  Modelo específico de código

Desde que GPT e BERT iniciaram a mania dos modelos de pré-treinamento, tem havido muito trabalho na área de engenharia de software para reproduzir esses modelos em código.

Diferente da revisão anterior, não nos concentramos apenas no design de alto nível dos objetivos e dados de treinamento de cada modelo, mas também discutimos detalhadamente os detalhes técnicos, incluindo codificação de posição e implementação de atenção, e os resumimos em uma visão geral para sua referência:

 

3.2.1.  Codificador

CodeBERT é um dos modelos mais influentes na área de engenharia de software. Ele é inicializado a partir de RoBERTa e treinado no código com o objetivo de MLM + RTD (RTD é o alvo de pré-treinamento da detecção de token substituído). Como pode ser visto na tabela acima, vários modelos de código de codificador desde então, incluindo GraphCodeBERT, SynCoBERT e Code-MVP, foram todos desenvolvidos com base no CodeBERT.

 

Na PNL, a tarefa NSP (Next-Sentence Prediction) também é usada no pré-treinamento do BERT. Embora a maior parte do trabalho posterior representado por RoBERTa acreditasse que esta tarefa não era útil, o formato desta tarefa também abriu ideias para o pré-treinamento do codificador e gerou muitas variantes no modelo de código. Como o código é diferente da linguagem natural, recursos de acompanhamento, como árvores de sintaxe abstrata (AST) e comentários, podem ser extraídos por meio de métodos automatizados.A aprendizagem comparativa no formato NSP tornou-se um método comum. SynCoBERT conduz aprendizado comparativo entre diferentes recursos, como código-AST, código de anotação-AST, etc. DISCO usa injeção de bug e transformação de preservação semântica para construir amostras positivas e negativas, respectivamente, enquanto Code-MVP também adiciona informações de fluxo de controle (CFG). .

 

3.2.2.  Decodificador

Falando em decodificador, a primeira coisa que vem à mente é, claro, o pré-treinamento autorregressivo no modo GPT. Na verdade, desde 2020, muitos decodificadores autorregressivos apareceram, incluindo GPT-C, CodeGPT, PolyCoder, CodeGen, PyCodeGPT, PanGu-Coder, CodeGeeX, Phi-1, CodeFuse, CodeShell, DeepSeek Coder, com tamanhos variando de 100M a 16B.

 

No entanto, alguns trabalhos representados por InCoder, FIM, SantaCoder e StarCoder também exploram a possibilidade de utilizar objetivos autorregressivos não tradicionais para treinar o decodificador. Esses trabalhos primeiro convertem os dados de entrada em um formulário para preencher as lacunas: dividem aleatoriamente toda a entrada em três segmentos: prefixo-médio-sufixo e reordenam-nos em prefixo-sufixo-médio (formato PSM) ou sufixo-prefixo -middle (formato SPM) e, em seguida, envie os dados para o modelo para treinamento autorregressivo. Deve-se notar que após a conversão dos dados, todas as três etapas participam do pré-treinamento autorregressivo.

 

3.2.3.  Codificador-Decodificador

Na PNL, o modelo codificador-decodificador representado por BART e T5 ainda ocupa um lugar mesmo na era dos grandes modelos de hoje, e sua presença é naturalmente indispensável no processamento de código.

 

Como a arquitetura do codificador-decodificador pode lidar naturalmente com problemas de modelagem sequência a sequência, no processo de treinamento do modelo de código, além das duas tarefas padrão do DAE (Denoising Auto-Encoding) do BART e Span Corruption do T5, muitos códigos- tarefas específicas Os recursos também são usados ​​para aprendizado de pré-treinamento sequência a sequência. Por exemplo, DOBF usa tarefas de desofuscação para treinar o modelo para converter código ofuscado em código original. Da mesma forma, a NatGen propõe a tarefa de “naturalização” de recuperação do código original a partir de código não natural produzido por transformação artificial.

 

A previsão de identificadores também é outra tarefa comum no pré-treinamento de código. CodeT5 usa anotação de sequência para saber se cada token é um identificador durante o processo de pré-treinamento, enquanto o SPT-Code prevê diretamente nomes de métodos na forma de geração sequência a sequência.

 

Além disso, como o UL2 na PNL unifica o pré-treinamento autoregressivo e o pré-treinamento com eliminação de ruído na arquitetura do codificador-decodificador, o mais recente modelo de código do codificador-decodificador CodeT5 + também adota um método de pré-treinamento semelhante.

 

3.3.  Ajuste fino de instruções e aprendizagem por reforço

Na PNL, o ajuste fino de instruções e a aprendizagem por reforço com feedback humano (RLHF) desempenham um papel essencial no processo de alinhamento humano de modelos de diálogo como o ChatGPT. O ajuste fino de instruções desbloqueia a capacidade de generalização entre tarefas, treinando o modelo em um conjunto diversificado de instruções, enquanto o aprendizado por reforço treina o modelo de acordo com as preferências humanas (como utilidade, segurança, etc.), recompensando o modelo com feedback automatizado. .

 

Ambas as técnicas também são usadas no processamento de código. Tanto o WizardCoder quanto o PanGu-Coder 2 usam o método Evol-Instruct proposto pelo modelo WizardLM em PNL, usam modelos como ChatGPT para desenvolver conjuntos de instruções mais diversos a partir de dados de instruções existentes e usam as instruções geradas para ajustar o StarCoder. OctoCoder e OctoGeeX não usam instruções geradas por modelos grandes. Em vez disso, eles usam registros de commit e pré e pós-código no GitHub como instruções para ajustar StarCoder e CodeGeeX. Recentemente, a estrutura MFTCoder de código aberto do Ant Group também adicionou explicitamente uma variedade de tarefas downstream aos dados de instrução para melhorar o desempenho do modelo de ajuste fino nessas tarefas.

 

Em termos de aprendizagem por reforço, o processamento de código tem uma vantagem natural sobre o processamento de linguagem natural - o compilador pode gerar automaticamente feedback preciso em vez de humanos. CompCoder, CodeRL, PPOCoder, RLTF e outros trabalhos aproveitaram esse recurso para ajustar CodeGPT ou CodeT5. PanGu-Coder 2 também aplica aprendizado de reforço ao StarCoder maior.

 

4.  Tarefas posteriores

Com o surgimento de grandes modelos de código representados pelo Codex, a tarefa de geração de código de geração de códigos correspondentes com base em descrições de linguagem natural tornou-se o foco de grandes modelos.HumanEval também se tornou um benchmark de teste obrigatório para os grandes modelos mais recentes:

Mas, além da geração de código, também compilamos 30 outras tarefas downstream do SE:

  • Geração SQL: Gere instruções SQL a partir de consultas em linguagem natural
  • Programação matemática: gere código para resolver tarefas matemáticas como GSM8K
  • Recuperação de código: combine o código de um pool de códigos existente que melhor corresponda a uma consulta em linguagem natural
  • Pesquisa de código: combine o código de um pool de códigos existente que tenha funcionalidade igual ou semelhante ao código de entrada
  • Conclusão de código: complete as partes restantes com base no fragmento de código, frequentemente usado em plug-ins IDE
  • Tradução de código: traduzindo código de uma linguagem de programação para outra
  • Correção de código: corrija bugs no código
  • Preenchimento de código: semelhante ao preenchimento de código, mas pode referir-se ao contexto de ambos os lados em vez de apenas um lado
  • Desofuscação de código: recupere o código original do código ofuscado (ou seja, nomes de identificadores alterados)
  • Tarefas relacionadas a testes de software: geração de testes unitários, geração de asserções, geração de variantes, geração de entradas de teste, avaliação de código
  • Previsão de classe: prever tipos de variáveis ​​ou parâmetros de função e retornar tipos de valores em código de linguagem de programação dinâmica (como Python)
  • Resumo de código: gere explicação ou documentação em linguagem natural correspondente para o código
  • Previsão de identificador: prever nomes de identificadores significativos (variável, função, classe, etc.) no código
  • Detecção de defeitos: detecte se o código de entrada contém defeitos ou vulnerabilidades
  • Detecção de clone: ​​detecta se duas partes do código de entrada são semanticamente equivalentes
  • Raciocínio de código: avalie o domínio do grande modelo sobre o conhecimento relacionado ao código (como funções de código, conceitos, algoritmos, etc.) na forma de perguntas e respostas
  • Classificação do código: Determine a função do código em categorias pré-definidas, ou o autor do código.
  • Tradução de documentos: traduza documentação relacionada ao código de uma linguagem natural para outra
  • Análise de registros: Analise os registros gerados durante a operação do sistema de software, produza tabelas formais ou detecte problemas automaticamente.

 

No artigo, também listamos conjuntos de dados padrão existentes para algumas tarefas:

Os links de URL desses conjuntos de dados são fornecidos no repositório GitHub. Para outras tarefas, especialmente tarefas relacionadas a testes de software, como geração de testes de unidade, geração de asserções, desofuscação de código, etc., atualmente não há conjunto de dados padrão em grande escala, e grandes modelos de linguagem estão em Também há poucas aplicações entre eles, e é uma direção que a PNL e a SE podem focar em trabalhos futuros.

 

5.  Oportunidades e desafios

Não muito tempo atrás, no Github Universe 2023, a Microsoft lançou algumas atualizações para GitHub Copilot, incluindo Copilot Workspace, que lidera o setor: começando com um problema, alcançando implementação de requisitos em nível de armazém, testes, construção e espera de iterações. Isso também nos deu uma grande inspiração. Com base na análise anterior e na inspiração de explorações pioneiras relacionadas, este artigo também resume os desafios atuais na aplicação de modelos de linguagem na engenharia de software:

  • Construir um referencial de avaliação mais realista para substituir o quase esgotado HumanEval
  • Obtenha dados de maior qualidade e compreenda e reflita sobre modelos como Phi-1 "usando dados de IA para treinar IA"
  • Conecte perfeitamente recursos exclusivos do código e que podem ser obtidos automaticamente, como árvores de sintaxe abstratas, fluxos de dados e fluxos de controle, em grandes modelos de linguagem.
  • Aplicar grandes modelos de linguagem em mais tarefas downstream de SE, especialmente tarefas relacionadas a testes de software
  • Arquitetura de modelo não tradicional e objetivos de treinamento, como o modelo Diffusion representado pelo Microsoft CodeFusion, etc.
  • Construa um ecossistema em torno de grandes modelos de linguagem para todo o processo de desenvolvimento de software, quebrando a limitação atual de que a maioria dos grandes modelos são usados ​​como plug-ins IDE.
  • Monitore e gerencie melhor o código gerado por grandes modelos para evitar riscos relacionados

Contate-nos

Além desta revisão, nossos outros trabalhos, incluindo modelos e conjuntos de dados, também estão sendo de código aberto. Se você gosta do nosso trabalho, fique à vontade para experimentá-lo, corrigir erros e contribuir com código. Se puder, adicione estrelas ao nosso projeto para nos apoiar.

O Alibaba Cloud sofreu uma falha grave, afetando todos os produtos (foi restaurado). O sistema operacional russo Aurora OS 5.0, uma nova UI, foi revelado no Tumblr. Muitas empresas de Internet recrutaram urgentemente programadores Hongmeng . .NET 8 é oficialmente GA, o mais recente Versão LTS Tempo UNIX Está prestes a entrar na era de 1,7 bilhão (já entrou). A Xiaomi anunciou oficialmente que o Xiaomi Vela é totalmente de código aberto. O kernel subjacente é .NET 8 no NuttX Linux. O tamanho independente é reduzido em 50%. FFmpeg 6.1 "Heaviside" é lançado. Microsoft lança um novo "Windows App"
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/u/6942768/blog/10143941
Recomendado
Clasificación