回顾LLM的发展历程

2023年11月15日 由 alex 发表 596 0

介绍

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


随着Meta AI最新发布的状态艺术模型Code Llama——一个用于代码生成和理解的模型,本文回顾了从循环神经网络(RNNs)到变压器的大型语言模型(LLMs)在代码领域的发展历程。


7


代码2Vec,2018

Code2Vec是早期尝试让语言模型理解代码的一次尝试。Code2Vec旨在将代码片段转换为嵌入向量。这些嵌入向量捕捉了代码中的语义和结构信息,使它们对于各种软件工程任务如代码分类、检索和理解等都非常有用。


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


8


训练集:14MJava程序示例

模型架构:循环神经网络(RNN) + 前馈网络

新颖性

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


代码BERT,2020

由微软研究团队开发的CodeBERT在代码大型语言模型(LLM)领域代表了一个重大进步,它引入了多模态数据的预训练,结合自然语言和编程语言(NL + PL)在基于Transformer的BERT模型上。该模型训练了包含双模态数据点对和单模态数据点的多样化数据集,用于掩蔽语言建模(MLM)和替换令牌检测(RTD)任务。CodeBERT在多种领域表现出卓越的性能,特别是在自然语言代码搜索和代码生成文档方面表现突出。


9


训练数据集:

CodeSearchNet 数据集 - 2.1M条双模态数据点(NL+PL),6.4M条单模态数据点(包括6种语言 - Python、Java、Javascript、PHP、Ruby、Go)

参数大小:125M

模型架构:RoBERTa-base

新颖性

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


Codex,2021

Codex 是首批成功的代码生成大型语言模型之一,它能够通过文档字符串或自然语言提示,以高准确性生成代码,是广泛使用的 GitHub Copilot 的前身。由 OpenAI 团队开发,Codex 使用了 GPT3 架构和词分器,并在大量的 GitHub 代码上进行了预训练。这个大型语言模型拥有120亿参数,在2021年是一款最先进的模型,在人类评估数据集上通过第一次尝试解决了28.8%的问题。


对模型进行进一步的微调,专注于独立的Python函数(而非包括配置、类实现等的整体代码),显示出显著的改善,能够解决37.7%的人类评估数据集问题。


10


训练数据集:159GB的Python文件,来自于54M个Github仓库。

参数大小:12B(Codex-12B)

模型架构:GPT3

新颖性

  • 这是首批在从自然语言提示生成代码能力上表现突出的模型之一。该模型在大量Github仓库代码的基础上训练GPT-3模型。
  • 该模型的作者还创建了一个新的数据集“HumanEval”,用于基准测试代码生成任务的模型。该数据集包含164个手写编程问题及其单元测试。


Code-T5,2021

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


Code-T5在多项任务上表现出色,例如代码缺陷检测、克隆检测、代码翻译和改善,通过多任务学习能够要求较少的数据进行更快的微调。然而,它使用CodeBleu分数进行评估,而不是针对HumanEval数据集进行基准测试。


11



训练数据集:Codesearch Net 数据集(与CodeBERT相同)

参数大小:220M

模型架构:T5(编码器-解码器架构)

新颖性

  • 编码器-解码器模型:该模型是首批支持代码理解和代码生成任务的编码器-解码器代码长期记忆(LLM)之一。
  • 提出了一种新颖的预训练目标“标识符感知去噪”,通过学习令牌类型信息和代码结构。这种方法训练模型区分标识符(变量名、函数名)与程序语言(PL)关键字(例如 if、while 等),并在掩码时恢复它们。
  • 在微调阶段的多任务学习:在不同的代码相关任务上同时进行微调,如代码缺陷检测、克隆检测、代码翻译、精炼等。


PLBart,2021

PLBART(程序和语言BART)模型利用BART模型架构来自动化一系列软件工程任务,包括代码总结、生成和翻译,它属于PLUG(程序和语言理解与生成)的范畴。


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


12


训练数据集:从Github, Stackoverflow 收集的2M个Java和Python函数及其自然语言描述(代码)。

参数大小:1.4亿(6个编码器层 + 6个解码器层 + 在编码器和解码器上的额外规范层)

模型架构:BART

新颖性

  • 去噪自编码器方法:采用去噪自编码器方法,通过有效利用编码器和解码器的双向和自回归属性,结合了BERT和GPT模型的优点,提高了代码理解和生成的效果。
  • 多样化去噪策略:提出了多种去噪策略,如令牌掩蔽、令牌删除和令牌填充。这种在去噪技术上的多样性增强了模型在从噪声数据中学习时的鲁棒性和有效性,有助于改善代码理解和生成。


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


Code Llama,2023

Code Llama 是 Meta 最新发布的代码语言模型(LLM),在几个基准数据集中战胜了所有现有的开源模型。它在HumanEval数据集上的得分为53%,在MBPP数据集上的得分为55%(仅有GPT-4的表现更好)。这些成绩可以归功于更长的上下文长度16K(是Llama2的4倍)以及在程序和自然语言的额外5000亿令牌上训练预训练的Llama 2。


该模型最适合用于代码生成和填充任务,在基于IDE的软件开发中可以作为最好的助手。Code Llama模型家族有三种类型的模型:


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


每种都有三种大小 — 7B、13B 和 34B。


13


训练数据集:500B 令牌加上额外的 100B 令牌,用于公开可获得的代码上的Llama Python

模型架构Llama 2

参数大小:提供三种尺寸 —— 7B、13B 和 34B。

新颖性

  • 提出了一个名为“长上下文微调”的步骤,用以处理长序列,它将上下文长度增加到 16,384(是羊驼 2 上下文长度的 4 倍,即 4096)
  • 指令微调与自我指导:这是少数几个执行指令微调的模型之一,该模型在微调过程中使用明确指令或提示。作者提出了一种新颖的执行反馈方法来构建自我指令数据集,而不是创建昂贵的人类反馈数据。


结论

Open AI 的联合创始人之一 Andrej Karapathy 最近称 Transformers 为 AI 中的最佳创意。他补充说,变换器就像是一个通用的、可微分的计算机,它同时具有表达性、可优化性和效率性(X post)。



文章来源:https://medium.com/towards-data-science/cracking-the-code-llms-354505c53295
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消