破解「时尚奇迹的密码」
揭秘「时尚奇迹的密码」代码LLM从RNN发展到Transformers的进展
介绍
近年来,随着Transformers的引入,语言模型经历了显著的演进,彻底改变了我们日常任务的执行方式,如写邮件、创建文档、搜索网页,甚至编写代码的方式。研究人员在代码智能任务中应用大型语言模型,涌现出了一个新领域——神经代码智能。该领域旨在通过解决代码摘要、生成和翻译等任务,提高编程效率,减少软件行业中的人为错误。
随着Meta AI发布的最新版Code Llama——用于代码生成和理解的最先进模型,本文回顾了大型语言模型(LLMs)在代码领域中的演进,从RNN到Transformers。

Code2Vec,2018年
这是语言模型理解代码的首次尝试之一。Code2Vec旨在将代码片段表示为嵌入。这些嵌入捕捉了代码的语义和结构信息,使它们对于各种软件工程任务(如代码分类、检索和理解)非常有用。
该模型试图从代码片段中预测方法名,通过对良好命名的标记和AST(抽象语法树)路径进行编码,并应用神经注意力进行聚合生成固定长度的向量表示。

训练集:14M个Java程序示例模型架构:RNN + 前馈网络创新点:
- 基于路径的注意力模型:作者提出了一种新颖的神经网络架构,它使用代码片段的抽象语法树(AST)中的句法路径作为输入特征。模型学会为每个路径分配不同的注意力权重,并将它们聚合成单个代码向量。然后可以使用代码向量来预测片段的标签分布,或者衡量片段之间的相似性和类比。
您可以在此处尝试该模型
CodeBERT,2020年
CodeBERT是由微软研究团队开发的,在代码的大型语言模型(LLMs)领域中引入了多模态数据预训练,将自然语言和编程语言(NL + PL)融合在基于Transformer的BERT模型中。该模型在多样化的数据集上进行训练,包括双模态数据点对和单模态数据点,用于遮蔽语言建模(MLM)和替代标记检测(RTD)任务。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数据集问题。

训练数据集: 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数据集进行基准对比。

训练数据集:Codesearch Net Dataset(与CodeBERT相同)参数尺寸:220M模型架构:T5(编码器-解码器结构)创新点:
- 编码器-解码器模型:首个支持代码理解和代码生成任务的编码器-解码器Code LLM之一。
- 提出了一种新的预训练目标标识符感知去噪,该目标学习了代码的标记类型信息和结构。该方法使模型能够区分标识符(变量名、函数名)和PL关键字(如if、while等),并在掩蔽时恢复它们。
- 在微调阶段进行多任务学习:同时在代码缺陷检测、克隆检测、代码翻译、细化等方面进行模型微调。
PLBart, 2021
PLBART, 或者Program and Language BART,模型利用BART模型架构自动化了一系列软件工程任务,涵盖了代码摘要、生成和翻译等PLUG(程序和语言理解与生成)的范围。
它引入了一种去噪序列到序列建模方法,以增强程序和语言的理解,策略性地结合了BERT和GPT模型的优势。通过将双向编码器与自回归解码器结合,允许更全面地把握上下文和多功能的生成过程。该模型采用了三种去噪策略,包括标记掩码、标记删除和标记填充,以有效训练和微调其能力。

训练数据集:来自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种类型的模型:
- Code Llama
- Code Llama Python
- Code Llama-Instruct
每种类型都有3种规模 – 7B、13B、34B

训练数据集:公开可用代码上的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的一名机器学习工程师。您可以在LinkedIn或Twitter关注我。您可以通过Topmate.io与我进行快速聊天。