破解「时尚奇迹的密码」

揭秘「时尚奇迹的密码」

代码LLM从RNN发展到Transformers的进展

Photo by Markus Spiske on Unsplash

介绍

近年来,随着Transformers的引入,语言模型经历了显著的演进,彻底改变了我们日常任务的执行方式,如写邮件、创建文档、搜索网页,甚至编写代码的方式。研究人员在代码智能任务中应用大型语言模型,涌现出了一个新领域——神经代码智能。该领域旨在通过解决代码摘要、生成和翻译等任务,提高编程效率,减少软件行业中的人为错误。

随着Meta AI发布的最新版Code Llama——用于代码生成和理解的最先进模型,本文回顾了大型语言模型(LLMs)在代码领域中的演进,从RNN到Transformers。

Fig-1: A timeline for Large Language Models For Code. Image by Author.

Code2Vec,2018年

这是语言模型理解代码的首次尝试之一。Code2Vec旨在将代码片段表示为嵌入。这些嵌入捕捉了代码的语义和结构信息,使它们对于各种软件工程任务(如代码分类、检索和理解)非常有用。

该模型试图从代码片段中预测方法名,通过对良好命名的标记和AST(抽象语法树)路径进行编码,并应用神经注意力进行聚合生成固定长度的向量表示。

Fig-2: Code2Vec Model Architecture: Program is first decomposed into Bag of Context which includes tokens and AST paths, then through fully connected layer and attention layer to generate code-vector.Image inspired from the original paper by Uri Alon et. al from Code2Vec

训练集:14M个Java程序示例模型架构:RNN + 前馈网络创新点:

  • 基于路径的注意力模型:作者提出了一种新颖的神经网络架构,它使用代码片段的抽象语法树(AST)中的句法路径作为输入特征。模型学会为每个路径分配不同的注意力权重,并将它们聚合成单个代码向量。然后可以使用代码向量来预测片段的标签分布,或者衡量片段之间的相似性和类比。

您可以在此处尝试该模型

CodeBERT,2020年

CodeBERT是由微软研究团队开发的,在代码的大型语言模型(LLMs)领域中引入了多模态数据预训练,将自然语言和编程语言(NL + PL)融合在基于Transformer的BERT模型中。该模型在多样化的数据集上进行训练,包括双模态数据点对和单模态数据点,用于遮蔽语言建模(MLM)和替代标记检测(RTD)任务。CodeBERT在各个领域表现出色,尤其在自然语言代码搜索和代码到文档生成方面表现突出。

图3:使用Replace Token Detection (RTD)任务进行CodeBERT模型预训练。自然语言生成和代码生成器将标记替换为不同的标记,并且CodeBERT模型经过训练,将每个标记分类为替换或原始。图像来自Feng等人的CodeBERT

训练数据集: Codesearch Net Dataset– 2.1M个双模态数据点(自然语言 + 编程语言),6.4M个单模态数据点(6种语言- Python、Java、Javascript、PHP、Ruby、Go)参数尺寸: 125M模型架构: RoBERTa-base新颖之处:

  • 双模态训练: CodeBERT引入了一种创新的训练方法,包含自然语言和编程语言标记。这种双模态训练技术增强了模型理解和生成代码的能力,考虑了人类可读描述和编程语言元素之间的复杂相互作用。
  • 代码替换标记检测(RTD)任务: CodeBERT的预训练使用了代码替换标记检测(RTD)而不是下一句预测(NSP),显示出更好的性能。

Codex, 2021

Codex是最早成功生成代码的Code LLM之一,可根据文档字符串或自然语言提示以高准确度生成代码,是广泛使用的Github Copilot的前身。Codex由OpenAI团队开发,使用GPT3架构和分词器,在大量的Github代码语料库上进行预训练。这个大型语言模型有120亿个参数,在2021年是最先进的模型,在human-eval数据集上通过一次尝试解决了28.8%的问题。

进一步在独立的Python函数上进行微调(而不是包括配置、类实现等完整代码),显示出显著的改进,并且能够解决37.7%的human-eval数据集问题

图4:Codex GPT模型使用的仅解码器Transformer架构。图像灵感来自Vaswani等人的原始Transformer论文

训练数据集: 54M个Github代码库中的159GB的Python文件。参数尺寸: 12B(Codex- 12B)模型架构: GPT3新颖之处:

  • 最早成功在自然语言提示下具备编写代码能力的模型之一。这个模型在大量的Github代码库上对GPT-3模型进行训练。
  • 该模型的作者还创建了一个名为HumanEval的新数据集,用于对代码生成任务进行基准测试。该数据集包含164个手写编程问题和单元测试。

在OpenAI Playground上尝试Codex模型

CodeT5, 2021

Code-T5是基于T5架构的编码器-解码器模型,与CodeBERT(仅编码器)和Codex(仅解码器)模型不同。它引入了一种独特的标识符感知去噪预训练任务,帮助模型区分和恢复代码中的标识符,增强了对结构的理解。

Code-T5在Code缺陷检测、克隆检测、代码翻译和细化等各种任务中表现出色,通过多任务学习,需要更少的数据进行快速微调。然而,它使用的是CodeBleu评分进行评估,而不是与HumanEval数据集进行基准对比。

图5:展示CodeT5在各种代码理解和生成任务中的优势。图片摘自王等人的论文《CodeT5》

训练数据集Codesearch Net Dataset(与CodeBERT相同)参数尺寸:220M模型架构T5(编码器-解码器结构)创新点

  • 编码器-解码器模型:首个支持代码理解和代码生成任务的编码器-解码器Code LLM之一。
  • 提出了一种新的预训练目标标识符感知去噪,该目标学习了代码的标记类型信息和结构。该方法使模型能够区分标识符(变量名、函数名)和PL关键字(如if、while等),并在掩蔽时恢复它们。
  • 在微调阶段进行多任务学习:同时在代码缺陷检测、克隆检测、代码翻译、细化等方面进行模型微调。

PLBart, 2021

PLBART, 或者Program and Language BART,模型利用BART模型架构自动化了一系列软件工程任务,涵盖了代码摘要、生成和翻译等PLUG(程序和语言理解与生成)的范围。

它引入了一种去噪序列到序列建模方法,以增强程序和语言的理解,策略性地结合了BERT和GPT模型的优势。通过将双向编码器与自回归解码器结合,允许更全面地把握上下文和多功能的生成过程。该模型采用了三种去噪策略,包括标记掩码、标记删除和标记填充,以有效训练和微调其能力。

图6:可视化BART模型(也用于PLBART)结构的插图,具有双向编码器和自回归解码器。图片来自原始BART论文(作者:Lewis等人)

训练数据集:来自Github、Stackoverflow的2M个Java和Python函数及其自然语言描述(code参数尺寸:140M(6个编码器层+6个解码器层+额外的编码器和解码器规范层)模型架构BART创新点

  • 去噪自编码器方法:采用去噪自编码器方法,通过有效利用编码器和解码器的双向和自回归特性,结合BERT和GPT模型的优势,增强代码理解和生成。
  • 多样的去噪策略:提出了多种去噪策略,比如标记掩码、标记删除和标记填充。这种多样性的去噪技术增强了模型对噪声数据的鲁棒性和学习效果,有助于改进代码理解和生成。

并非所有的模型都使用相同的基准来评估性能。PLBART的作者不通过HumanEval来评估模型性能,而HumanEval是大多数其他模型用于基准测试的数据集。

Code Llama, 2023

Code Llama是Meta发布的最新Code LLM,它在多个基准数据集上击败了所有现有的开源模型。它在HumanEval数据集上得分为53%,在MBPP数据集上得分为55%(仅GPT-4的性能更好)。这些增益可以归功于更长的上下文长度(16K,是Llama2的4倍),以及使用程序和自然语言中额外的500B令牌对预训练的Llama 2进行训练。

该模型最适合代码生成和填充任务,并且在基于IDE的软件开发过程中可作为最佳副驾驶员。Code Llama模型系列有3种类型的模型:

  1. Code Llama
  2. Code Llama Python
  3. Code Llama-Instruct

每种类型都有3种规模 – 7B、13B、34B

Fig-7: Code Llama training and fine-tuning pipeline taking pre-trained Llama-2 model as input. Image from original Code Llama paper by Rozière et. al.

训练数据集:公开可用代码上的500B个令牌 + 为Code Llama Python提供的额外100B个令牌模型架构:Llama 2参数尺寸:有3种规模可用 – 7B、13B、34B。新颖之处

  • 提出了一种称为长上下文微调的微调步骤,用于处理长序列,将上下文长度增加到16,384(相对于Llama 2的上下文长度增加了4倍,即4096)
  • 指令微调和自指:是少数几个在微调过程中执行指令微调的模型之一。作者提出了一种新颖的执行反馈方法来构建自指令数据集,而不是创建昂贵的人工反馈数据。

结论

Open AI的创始人之一Andrej Karapathy最近称Transformers为AI领域的最佳创意。他补充说,Transformer就像一台通用可微分的计算机,即同时具有表现力、可优化性和高效性(X帖子)。正如在过去的3-4年中所展现的,Transformer模型有巨大的潜力进一步改变我们作为软件工程师编码的方式,我认为这只是开始。

关注更多信息!

我是LinkedIn的一名机器学习工程师。您可以在LinkedInTwitter关注我。您可以通过Topmate.io与我进行快速聊天。