更多专栏文章点击查看:
LLM 架构专栏
大模型架构专栏文章阅读指南
Agent系列
强化学习系列
欢迎加入大模型交流群:加群链接 https://docs.qq.com/doc/DS3VGS0NFVHNRR0Ru#
公众号【柏企阅文
知乎【柏企】
个人网站https://www.chenbaiqi.com

论文

Code Llama: Open Foundation Models for Code 2308.12950

Code Llama是基于Llama 2开发的一系列面向代码的大语言模型,在开源模型中性能卓越,具备代码填充能力、对大输入上下文的支持,以及针对编程任务的零样本指令跟随能力。

该系列模型有多种类型,以覆盖广泛的应用场景:基础模型(Code Llama)、Python专用模型(Code Llama — Python),以及指令跟随模型(Code Llama — Instruct),每个类型都有70亿、130亿和340亿参数的版本。所有模型均在16,000个标记的序列上进行训练,并且在处理多达100,000个标记的输入时表现出色。

Code Llama的专用化流程

微调的不同阶段标注了训练期间所处理的标记数量。具备填充能力的模型标有⇄符号。

数据集

Code Llama和Code Llama — Python的训练数据集

Code Llama在5000亿额外标记上进行训练,而Code Llama — Python则进一步在1000亿标记上进行训练。

Code Llama主要在一个几乎去重的公开可用代码数据集上进行训练。此外,我们8%的样本数据来自与代码相关的自然语言数据集。在这个数据集中,有许多关于代码的讨论,代码片段也包含在自然语言问题或答案中。为了保持模型的自然语言理解能力,我们也会从自然语言数据集中抽取一小部分批次数据。

数据使用字节对编码(BPE)进行标记化处理,采用与Llama和Llama 2相同的分词器。初步实验表明,通过从自然语言数据集中采样批次数据,我们的模型在MBPP(一个编程任务基准测试)上的性能有所提升。

代码填充

代码填充是指在给定程序上下文的情况下,预测程序中缺失部分的任务。为了训练代码填充能力,我们采用因果掩码概念,通过重新排列序列并按顺序进行预测。

长上下文微调

Code Llama引入了一个专门的微调阶段(LCFT),在这个阶段模型会接触更长的序列(16,384个标记),在不显著增加训练成本的情况下增强其长距离处理能力。这种方法类似于最近的位置插值微调方法,但对旋转位置嵌入中的旋转频率进行了调整。

对于旋转嵌入,位置n处的查询和键向量$x_n$要经过线性变换$R^d _Θ,nx_n$ ,其中$R^d _Θ,n$是一个块对角矩阵,其元素形式为:(此处原文档未给出具体形式,若后续有补充可完善)

d表示嵌入维度。旋转频率的计算公式为$θ_i = θ^{−2i/d}$。

在微调过程中,通过将这些嵌入的基本周期θ从10,000扩展到1,000,000,Code Llama模型在扩展序列长度、外推能力,以及处理长达100,000个标记的序列时的稳定性方面都展现出了良好的性能。

实验

为了进行对比,Code Llama — Python 340亿参数版本模型也使用与self-instruct数据集相同的提示,在15,000条非自然指令上进行了微调。这个模型并未发布,但在HumanEval和MBPP测试中可以明显观察到性能提升,这表明使用少量高质量的编码数据就可以实现性能的提升。

非自然指令是指非传统且多样的指令,通过使用模型生成的内容而非人工输入,以最小的人力成本获取。

Python代码生成

Code Llama在HumanEval和MBPP上的通过率得分。

Code Llama在APPS上的通过率得分。

模型的专用化显著提升了代码生成能力,从Llama 2到Code Llama,再到Code Llama — Python的性能提升中可以明显看出。

在来自代码密集型数据集的较小额外标记集上进行训练,在HumanEval和MBPP基准测试中能显著提升性能。

在HumanEval、MBPP和APPS基准测试中,针对编码进行优化的大型模型在各项指标上均优于小型模型。

根据Chinchilla缩放定律,增加参数数量对专用编码模型有积极影响,大型模型在编码任务上表现出显著的性能提升。

多语言评估

多语言HE(可能是某个测试的简称)的单样本通过率得分。

不同语言之间的相关性

Code Llama模型的表现优于Llama 2模型,有显著提升。Code Llama 70亿参数版本甚至超过了Llama 2 700亿参数版本。

与其他公开可用的模型,如CodeGen-Multi、StarCoder和Codex相比,Code Llama模型表现出色。

观察到模型在不同语言上的性能存在相关性,例如C++、C#、Java和PHP等语言之间相关性较高,而且Python和Bash之间也存在出乎意料的强相关性。

模型的规模和表达能力与在不同语言上的性能呈正相关,这表明更大、表达能力更强的模型在多语言场景中往往表现更好。

代码填充评估

对比经过FIM(fill-in-the-middle,中间填充)训练和未经过FIM训练的模型。

使用MultiPL-E进行多语言HumanEval单行代码填充。

先前的研究表明,在代码模型中使用填充目标可以替代传统的下一个标记预测,对从左到右的自回归测试损失影响最小,并且在下游评估性能中仅有轻微下降。

这些模型在基于HumanEval基准的代码填充基准测试中达到了最先进的性能,无论是在随机跨度填充还是在其他编程语言的测试中。

虽然这些模型表现优于其他模型,但结果表明,随机跨度填充在后缀 - 前缀 - 中间(SPM)格式下的表现比前缀 - 后缀 - 中间(PSM)格式差,这是由于未实现标记修复。

将基准测试转换为其他编程语言的测试也表明,包括Code Llama 70亿参数版本在内的模型在多种语言中优于开源填充模型,并且在SPM格式提示下性能有所提升。

长上下文评估

Code Llama在长序列上的表现。(a) 来自代码数据集验证数据中大型源文件(≥50 kB)的困惑度。虚线表示微调上下文长度。所有Code Llama模型在处理多达100,000个标记时困惑度都会下降。(b) 在16,000个标记的上下文环境下进行合成密钥检索任务的准确率,并与gpt-3.5-turbo进行对比。

在LCC-balanced上的平均单行代码补全性能

Code Llama模型在序列长度超过16,384个标记时,困惑度持续下降,这表明它能够有效地处理长序列,而不会像Transformer模型在进行外推时常见的那样出现困惑度大幅增加的情况。

Code Llama模型在密钥检索任务中表现良好,特别是在完成Python代码中的断言语句方面,在其训练的序列长度上表现出色。然而,在处理更长的序列时性能会有所下降,这凸显了处理扩展上下文时面临的挑战。

长上下文微调(LCFT)显著提高了长序列上的代码补全准确率。经过长上下文处理微调的模型生成的补全内容更有意义,这表明更长的上下文为代码补全任务提供了有价值的信息。

虽然LCFT增强了模型在长序列上的性能,但在标准代码合成基准测试中,它会使模型在短序列上的性能略有下降。在HumanEval的单样本通过率和MBPP指标上,准确率平均有所降低。
## 推荐阅读
1. DeepSeek-R1的顿悟时刻是如何出现的? 背后的数学原理
2. 微调 DeepSeek LLM:使用监督微调(SFT)与 Hugging Face 数据
3. 使用 DeepSeek-R1 等推理模型将 RAG 转换为 RAT
4. DeepSeek R1:了解GRPO和多阶段训练
5. 深度探索:DeepSeek-R1 如何从零开始训练
6. DeepSeek 发布 Janus Pro 7B 多模态模型,免费又强大!

本文由mdnice多平台发布


柏企科技圈
23 声望6 粉丝