论文笔记:Code Llama: Open Foundation Models for Code

news2024/11/18 13:49:20

导语

Code Llama是开源模型Llama 2在代码领域的一个专有模型,作者通过在代码数据集上进行进一步训练得到了了适用于该领域的专有模型,并在测试基准中超过了同等参数规模的其他公开模型。

  • 链接:https://arxiv.org/abs/2308.12950
  • 机构:Meta AI

1 引言

LLMs在自然语言处理方面已达到高水平,在代码领域能够执行多种任务(例如程序合成、代码完成、调试和生成文档)。本文介绍了Code Llama,这是一系列基于Llama 2的代码生成和填充的LLMs,并以自定义宽松许可发布。

Code Llama的训练和微调过程如下:

  • 从基础模型进行代码训练:与其他只在代码上训练的LLMs不同,Code Llama基于通用文本和代码数据的Llama 2预训练模型进行微调。
  • 填充功能:Code Llama的7B和13B模型采用自回归和因果填充预测的多任务目标,使得模型能够在完整上下文中填充缺失的文本。
  • 长输入上下文:Code Llama通过修改RoPE位置嵌入的参数,将最大上下文长度从4,096个标记扩展到100,000个标记。
  • 指令微调:Code Llama - Instruct变体通过混合专有指令数据和机器生成的自指令数据集进行了进一步微调,以提高安全性和实用性。

image.png

Code Llama的不同变体:提供了三种主要变体,每种变体有三种大小(7B、13B和34B参数):

  • Code Llama:基础代码生成模型。
  • Code Llama - Python:专为Python定制的版本。
  • Code Llama - Instruct:结合了人类指令和自生成代码合成数据的版本。

本文对模型在主要的代码生成基准测试(如HumanEval、MBPP、APPS以及多语言版本的HumanEval,即MultiPL-E)上进行了全面评估。Code Llama在这些测试中表现优异,建立了开源LLMs的新标准。

image.png

2 Code Llama: Specializing Llama 2 for code

2.1 Code Llama模型家族

  • Code Llama:基础模型,专注于代码生成。有三种规模:7B、13B和34B参数。7B和13B模型使用填充目标训练,适合在IDE中完成文件中间的代码。34B模型未使用填充目标。所有Code Llama模型均以Llama 2模型权重初始化,并在以代码为主的500Btoken数据集上训练,然后针对长上下文进行微调。
  • Code Llama - Python:专为Python代码生成定制,也有7B、13B和34B三种规模。从Llama 2模型初始化,使用Code Llama数据集中的500B token和额外的以Python为主的100B token数据集进行训练。所有Code Llama - Python模型都未使用填充训练,随后针对长上下文进行微调。
  • Code Llama - Instruct:基于Code Llama,增加了约5B token的训练以更好地遵循人类指令。具体细节见2.5节。

2.2 数据集

Code Llama在初始阶段使用500B token进行训练,起点为Llama 2。训练主要基于公开可用的近似去重代码数据集,同时包括8%的与代码相关的自然语言数据集。数据通过字节对编码(BPE)进行标记化,使用与Llama和Llama 2相同的Tokenizer。实验表明,从自然语言数据集中采样的批次可以提高模型在MBPP上的性能。

2.3 填充

代码填充是指在给定周围上下文的情况下预测程序缺失部分的任务。应用包括在代码IDE中完成光标位置的代码、类型推断和生成代码文档(如docstrings)。7B和13B通用模型采用填充目标进行训练。训练文档在字符级别被分割为前缀、中间部分和后缀,分割位置从文档长度的均匀分布中独立采样。Llama 2的Tokenizer增加了四个特殊标记,用于标记填充跨度的开始和结束。填充训练对下游生成任务的影响和填充模型在填充基准测试中的性能在第3.2节报告。

2.4 长上下文微调(Long context Fine-tuning)

有效处理长序列是基于Transformer的语言模型研究的主要课题。Code Llama提出了一个专门的长上下文微调(LCFT)阶段,模型处理的序列长度从4,096个token增加到16,384个token。这种策略类似于最近提出的基于位置插值的微调,我们证实了修改Llama 2基础模型中使用的旋转位置嵌入的旋转频率的重要性。实验证实,Code Llama模型不仅在微调期间使用的增加序列长度内有效,而且显示出对极长序列(高达100,000个token)的稳定行为(第3.3节报告)。

2.5 指令微调

基于Code Llama的指令微调模型(Code Llama - Instruct)旨在适当回答问题。它们在三种不同类型的数据上进行训练。

  1. 专有数据集:使用为Llama 2收集的指令调整数据集,包含有助于提高安全性和有用性的数据。
  2. Self-instruct:自指令数据集包含大约14,000个问题-测试-解决方案三元组,由Llama 2生成的编程问题和Code Llama生成的单元测试和解决方案组成。
  3. 数据混合:为防止模型在一般编码和语言理解能力上退化,Code Llama - Instruct还使用了来自代码数据集的小比例数据(6%)和自然语言数据集(2%)进行训练。

2.6 训练细节

  • 使用AdamW优化器,批大小为4M个token,表示为4,096个token的序列。对于Python微调,初始学习率设为1e-4。Code Llama - Instruct的训练使用524,288个token的批大小,总共训练约5B个token。
  • 长上下文微调阶段使用2e-5的学习率,序列长度为16,384,重置RoPE频率的基本值为θ = 10^6。7B和13B模型的批大小设为2M个token,34B模型为1M个token。根据不同配置调整梯度步数。

3 结果

3.1 代码生成

3.1.1 Python代码生成

实验结果如下图,可以看到模型参数的增加对于专门用于编码的模型很重要,规模更大的模型在各项指标上表现更优。

image.png

3.1.2 多语言评估

Code Llama和Code Llama Python的性能相当,细节见附录B的表11。

image.png

3.2 填充评估

模型在代码填充基准测试中达到同规模模型中的最佳性能。

image.png

image.png

3.3 长上下文评估

  • 复杂性和关键检索:测试了Code Llama处理长序列的能力,包括困惑度、关键检索准确性和在代码完成任务中的性能。
  • 长序列的性能影响:LCFT对短序列的标准代码合成基准测试有轻微负面影响,但对于真实应用中的长序列处理潜力更重要。

image.png

3.4 消融研究

3.4.1 微调Llama 2 vs. 从头开始训练代码

作者比较了从Llama 2微调的7B模型与从头开始训练的同等模型。从头开始训练的模型在相同训练token数下性能较差。

3.4.2 指令微调:普遍帮助性 vs. 编码能力
  • Self-instruct数据的价值:使用自生成的单元测试进行的Self-instruct训练提高了模型在如HumanEval和MBPP等基准测试上的性能。
  • 非自然模型:对Code Llama - Python 34B进行了非自然指令的微调,以用作比较。尽管没有发布此模型,但其在HumanEval和MBPP上的改进表明了使用高质量编码数据的潜在优势。

image.png

3.4.3 Pass@k评估

研究了采样温度对Pass@k性能的影响:报告了在不同温度下的Pass@1、10和100的性能。随着温度的升高,Pass@1分数变差,而Pass@10和Pass@100则改善。

image.png

4 负责任的人工智能与安全

大型语言模型可能产生错误信息、有害或冒犯性内容,以及复制或放大训练数据中的偏见。Code Llama - Instruct通过微调Llama 2的输出,包括安全响应的对抗性提示和代码特定风险的提示,提高了安全性。

安全性评估包括以下几个方面:

  • 真实性:使用TruthfulQA基准测试模型对事实和常识的处理能力。
  • 有毒性:使用ToxiGen基准测试模型生成有关各种人群的有毒和仇恨言论的能力。
  • 偏见:使用BOLD基准测试模型输出中基于人口属性的情感差异。

image.png

Code Llama - Instruct在真实性和有毒性方面相比未微调的Code Llama有显著提升。在BOLD测试中,Code Llama - Instruct倾向于对许多人口群体表现出更多的积极情感。

image.png

作者还进行了红队测试,通过25名Meta员工进行了3次红队练习,包括负责任的AI、恶意软件开发和攻击性安全工程等领域的专家。专家对可能用于恶意目的的代码请求进行了评估。专家对通过LLMs生成恶意代码的最终风险提出了疑问。作者发现,过于安全的LLMs可能会过度拒绝有效请求。红队测试发现了一些有限的错误拒绝证据。指令微调集合优先考虑安全性,较长的微调倾向于降低编码性能。Code Llama - Instruct模型在安全性方面优于ChatGPT。

5 相关工作

6 讨论

本文发布了一系列专门针对代码的Llama 2模型,称为Code Llama,包括三个主要变体,每个变体有三种规模(7B、13B和34B参数):Code Llama、Code Llama - Python、Code Llama - Instruct。考虑到实际应用,作者训练了我们的7B和13B模型以支持填充,并训练所有模型以处理大型上下文。本文测试了它们在推理中处理高达100K token的稳定性(图4a)。长上下文微调和填充对标准基准左向右代码生成基准测试(表10)来说是有成本的,这些基准测试都基于短序列(即函数级别)。尽管如此,30B模型在标准Python完成基准测试中是公开模型中的最佳,并且提出的其他模型与参数数量相似的模型相比也具有竞争力。在多语言基准测试中,即使是最小的模型(Code Llama 7B)也超过了其他所有公开模型。

Code Llama - Instruct模型经过训练,为Code Llama提供零样本指令能力。在这一进一步的微调中,不仅专注于提供更直接的帮助(图5c),也寻求提供更安全的使用和部署模型(第4节)。遵循指令和过度安全可能会在评估中失去一些分数(例如,在表2中的34B模型的HumanEval上),如图14所示。LLMs需要进一步的工作来理解其指令中的上下文和细微差别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS创建项目和应用—设置数据处理位置

项目和应用介绍 关于项目 项目是资源、应用的组织实体。资源包括服务器、数据库、存储,以及您的应用、终端用户的数据等。在您使用部分服务时,您是数据的控制者,数据将按照您设置的数据处理位置来存储在指定区域。 通常,您不需…

【C++】继续学习 string类 吧

开始使用 string类 吧 1 继续学习1.1 扩容机制1.2 string类对象的访问及遍历操作1.3 string类对象的修改操作1.4 其他一些成员函数 2 实践解决问题:Thanks♪(・ω・)ノ谢谢阅读!!!下一篇文章见&…

计算机网络(4)----局域网与广域网

目录 1.局域网 (1)局域网拓扑结构 (2)局域网的传输介质 (3)局域网介质访问控制方法 (4)局域网的分类 (5)IEEE 802标准 (6)MAC子层与LLC子层 (7)常用的局域网技术---以太网 (8)以太网传输介质与拓扑结构的发展 (9)常用的以太网---10BASE-T以太网 (10)适配器与MAC地址…

数据库 与 数据仓库

OLTP 与 OLAP OLTP(On Line Transaction Processing,联机事务处理) 系统主要针对具体业务在数据库联机下的日常操作,适合对少数记录进行查询、修改,例如财务管理系统、ERP系统、交易管理系统等。该类系统侧重于基本的、日常的事务处理&#…

Batch Normalization和Layer Normalization和Group normalization

文章目录 前言一、Group normalization二、批量规范化(Batch Normalization)三、层规范化(Layer Normalization) 前言 批量规范化和层规范化在神经网络中的每个批次或每个层上进行规范化,而GroupNorm将特征分成多个组,并在每个组内…

【AGI】大模型 深度学习入门学习路径

【AGI】大模型 深度学习入门学习路径 1. 深度学习入门学习路径可以从以下几个方面入手:2. 深度学习中的基本概念和算法有哪些?3. Python在深度学习中的应用和库有哪些?4. PyTorch的基本计算结构和应用教程推荐?5. 如何通过实战项目加深对深度学习模型训练的理解?6. 参考资…

Linux运维:在线/离线安装Telnet客户端和Telnet服务

Linux运维:在线/离线安装Telnet客户端和Telnet服务 前言1.1 在线安装Telnet1.2 离线安装Telnet1.3 Telnet服务有关的命令 💖The Begin💖点点关注,收藏不迷路💖 前言 Telnet是一种用于远程登录到其他计算机的协议&…

springboot+jsp汽车配件管理系统idea maven 项目lw

springbootweb汽车配件销售业绩管理系统服务于汽车配件公司业务,实现了客户管理,主要负责对客户相关数据的增删改查方面、渠道管理,主要对渠道信息也就是设备的供应商渠道信息进行管理、项目管理,主要是一些项目信息的记录与整理、销售数据管…

深入探索Docker数据卷:实现容器持久化存储的完美方案(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《Docker入门到精通》 《k8s入门到实战》🏅 🔖行路有良友,便是天堂🔖 目录 四、Docker数据卷的高级管理 1、数据卷的生命周期管理 2、数据…

基于巨控GRM561/562/563Y西门子1200PLC发邮件

巨控GRM560,GRM600系列同比之前的GRM530,除短信,微信,电话语音播报增加了邮件发送功能,简单介绍一下PLC发邮件。 1在博途中建立好DB块 2.打开GRMDEV6,新建工程,做好数据采集,这里以DB4.D0&#…

【笔记】React-Native React DevTools

/** * 官网文档:https://reactnative.dev/docs/next/react-devtools */ 1、本想在Demo项目中添加依赖(npx react-devtools),但其他项目就需要再操作一次,所以全局安装就好了 yarn global add react-devtools 或 npm install -g react-devto…

linux 将 api_key设置环境变量里

vi ~/.bashrc在最后添加api_key的环境变量 export GEMINI_API_KEYAIza**********WvpX7FwbdM刷新配置 source ~/.bashrc使用python 读取环境变量 import os gemini_api_key os.getenv(GEMINI_API_KEY) print(gemini_api_key)

实战解析:打造风控特征变量平台,赋能数据驱动决策

金融业务产品授信准入、交易营销等环节存在广泛的风控诉求,随着业务种类增多,传统的专家规则、评分卡模型难以应付日趋复杂的风控场景。 在传统风控以专家规则系统为主流应用的语境下,规则模型的入参习惯被称为“变量”。基于专家规则的风险…

每日好题3.5

前缀和 这个题目巨妙,打的时候没写出来,后面补题发现太牛了 思路:当前区间左端点 L L L ,当我们向右移动一次,就相当于,原式 - f ( L ) f ( L 1 e 18 ) f(L) f(L 1e18) f(L)f(L1e18),值就…

列车调度——典型的验证栈的出栈合不合法的问题,值得一看

题目描述 有n列火车按照1,2,3...n的顺序排列,现所有的火车需要掉头,所以需要火车先驶入一个调度站,再开出来。 由于只有一根铁轨,所以要么最前面的一辆火车进去调度站,要么调度栈内最上面一辆火车开出调度栈。 现给…

go并发模式之----工作池/协程池模式

常见模式之四:工作池/协程池模式 定义 顾名思义,就是有固定数量的工人(协程),去执行批量的任务 使用场景 适用于需要限制并发执行任务数量的情况 创建一个固定大小的 goroutine 池,将任务分发给池中的 g…

如何用VisualVM工具查看堆内存文件

1.找到安装JDK的bin目录,找到 jvisualvm.exe可执行文件运行即可; 2.然后导入堆内存文件 .hprof文件,看类; 3.分析是哪些对象占了多少内存。

七大 排序算法(一篇文章梳理)

一、引言 排序算法是计算机科学中不可或缺的一部分,它们在数据处理、数据库管理、搜索引擎、数据分析等多个领域都有广泛的应用。排序算法的主要任务是将一组数据元素按照某种特定的顺序(如升序或降序)进行排列。本文将对一些常见的排序算法…

Altium Designer 22 性能优化

目录 AD22 使用起来很卡,完全受不了,卡到我的快捷鼠标宏都无法使用,来试着优化一下它。 每点完一步,都需要点击应用,否则不下心关掉了会很难受 打开右上角齿轮进入设置,取消勾选这几个勾: 接…

不同用户同时编辑商品资料导致的db并发覆盖

背景 这个问题的背景来源于有用户反馈,他在商品系统中对商品打的标签不见了,影响到了前端页面上商品的资料显示 不同用户编辑同一商品导致的数据覆盖问题分析 查询操作日志发现用户B确实编辑过商品资料,并且日志显示确实打上了标签&#x…