论文笔记:SantaCoder : Don’t Reach For The Stars!

869 阅读7分钟

本文正在参加人工智能创作者扶持计划

导语

1 简介

最近几年,Code LLM相关的内容越来越吸引了研究者们的兴趣。然而,在研究社区中,代码LLM的开发通常缺乏透明度,部分原因是它们的商业价值以及围绕训练数据和模型的法律不确定性。BigCode是一个开放的科学合作组织,致力于负责任地开发大型代码语言模型,通过开放治理为机器学习和开源社区提供支持。早期的工作中,BigCode社区发布了The Stack v1.1,这是一个6.4 TB的数据集,包含384种编程语言的许可源代码。

本文总结了BigCode社区在开发SantaCoder模型方面的经验,这是一个具有1.1B参数的模型,在The Stack的Java、JavaScript和Python数据子集上进行训练,并在MultiPL-E上进行评估。本文的贡献如下:

  • 给出了一种了抹去隐私信息(PII,Personally Identifiable Information)的处理流程;并在此基础上过滤The Stack中的数据进行训练;
  • 使用多查询注意(MQA,Multi Query Attention)来加快模型推理速度;
  • 使用中间填充(FIM,Fill-in-the-Middle)机制,使得模型可以处理填充(In-Filling)任务;
  • 研究了4种训练数据预处理方法的影响,实验发现,如果过滤掉Github中Star低于5的数据,性能显著下降;
  • 在Python、JavaScript和Java上训练了一个最终的1.1B参数模型:SantaCoder。在代码生成和填充任务方面,该模型获得了与之前的开源多语言模型(InCoder-6.7B和CodeGenMulti-2.7B)相当或更强的性能。

2 相关工作

CodeLLM

现有的CodeLLM分为三大类:

  • Encoder-only:如CodeBERT、GraphCodeBERT等;
  • Decoder-only:如CodeX、InCoder、PolyCoder、CodeGen等;
  • Encoder-Decoder:如CodeT5、PLBART等。

评估text-to-code

目前使用最广泛的测试集为HumanEval和MBPP,它们由函数的自然语言描述和一组单元测试组成。以上两个测试集都是针对Python语言的,而MultiPL-E和MBXP则扩展了上述数据集到其他多种编程语言。

在其他任务上进行评估

代码生成模型也被用于解决各种任务。CodeXGLUE是一组14个用于评估代码生成模型的数据集。这些任务包括代码到代码的任务,如克隆检测、代码修复和代码翻译;文本到代码的任务,如代码搜索和代码生成;还有代码到文本的任务,比如生成文档。所包含的编程语言因任务而异;最常见的是Python和Java。

3 退出过程

如果软件开发人员不希望自己的代码被用于模型训练,作者提供了一个从数据集中删除自己数据的接口。

4 隐私信息处理

4.1 PII基准

作者首先通过从The Stack数据集中采样,标注其中的姓名、电子邮件、用户名、密码、IP地址、API密钥和SSH密钥构建了一个PII测试基准数据集。

4.2 PII识别与消除

  • 邮箱:使用正则表达式匹配,然后用随机字符替代原字符;
  • IP地址:使用正则表达式匹配IPv4和IPv6的地址,然后进行随机IP替换;
  • 密钥Key:使用detect-secrets工具来识别代码文件中的密钥。

4.3 性能分析

上图展示了PII工具在4.1中测试基准上的表现,可以看到所使用的处理方法对于邮箱和IP有着很好的识别性能,对于密钥key则差一些。同时,作者也分析了The Stack中的三种隐私信息的分布情况,可以看到邮箱占据了主要部分,而不同的编程语言其中的隐私信息也不尽相同。

5 实验

5.1 数据集、模型和训练细节

作者采用了The Stack v1.1中的Python、Java和JavaScript数据子集作为训练数据,共268GB文件。同时,将包含在HumanEval、APPS、MBPP和MultiPL-E中的测试数据从训练数据中剔除掉。

使用字节对编码(BPE)算法在词汇量训练一个Tokenizer。这个Tokenizer接受了600,000行(约2.6 GB)数据的训练——每种语言的200,000行数据。

基本模型是一个1.1B参数的Decoder-only Transformer,引入FIM和MQA机制,并采用float16训练。它有24层,16个Head,隐藏层大小为2048。使用Adam 对模型进行300K次迭代训练,总的Batch大小为192,权重衰减为0.1。训练中总共看到118B个Token。学习率设置为2×1042 × 10−4,并在warmup 2%的训练步骤后遵循余弦衰减。每次训练运行需要3.1天,在96个Tesla V100 gpu上完成。

5.2 架构消融

作者主要对比了是否使用MQA和FIM对最终结果的影响。

5.3 数据过滤消融

主要从以下四个维度进行数据过滤层面的消融实验:

  • Github的星数:去除Github Star小于5的数据
  • 代码-注释比例:去除没有注释或注释比例很低的数据;
  • 相似数据去重:使用一些相似性评估算法,去除类似的数据;
  • 分词器过滤:去除分词后单个字符太多的数据(即完整的单词比较少,语义性差)。

去除后的数据量统计如下表:

5.4 评估

作者主要评估两个任务的性能:

  • Text-to-Code:评估数据集为MultiPL-E,评价指标为pass@k;
  • Fill-in-the-middle:评估数据集为MultiPL-E,作者在其中随机mask掉一行代码,然后让模型给出预测,评价指标为single-line exact match。

6 实验结果

6.1 消融实验

作者主要的消融对比实验结论如下:

  1. MQA带来性能的轻微下降;
  2. FIM也会导致性能轻微下降;
  3. 近乎重复数据删除、注释和分词器过滤的影响适度;
  4. 使用Github的Star数目作为依据过滤数据会导致性能显著下降

6.2 最终模型

基于以上分析,作者训练了一个最终模型:SantaCoder,该模型使用MQA和FIM技术,并采用两种形式的数据过滤:相似数据删除和注释-代码比例过滤器。该模型进行600K次迭代(236B个token),并保持所有其他超参数相同。

提高text2code性能加倍的训练迭代会导致在MultiPL-E上更强的text2code性能,显著提高所有基准测试和编程语言的性能(参见图4)。查看整个训练的性能(图3),很可能更长的训练可以进一步提高性能。令人惊讶的是,最终的训练运行并没有改善中间填充评估(见表5),至少在这些单行填充任务上是这样。

与InCoder、CodeGen和Codex的比较表6将SantaCoder模型与之前在MultiPL-E基准测试中使用5.4节中描述的方法所做的类似规模的代码生成模型进行了比较。SantaCoder模型更小,但总体上优于以前的开源多语言代码生成模型,在跨语言的从左到右生成和中间单行填充方面都优于InCoder 6.7B模型,并获得与CodeGenmulti 2.7B相当或更强的性能。

7 总结

本文描述了BigCode项目到2022年12月的进展情况。社区在消除PII方面迈出了第一步,并证明正则表达式在检测电子邮件和IP地址方面相当有效。未来的工作应该集中在提高密钥的准确性和召回率,以及检测其他敏感信息,如姓名、用户名和密码。使用消除PII后的The Stack数据集,本文进行了一系列的架构和数据过滤消融。主要发现之一是,过滤Github Star数低的数据会显著降低最终性能。利用这些消融研究的结果,本文训练了一个最终的1.1B模型——称为SantaCoder。实验表明它能够在从左到右的生成和填充任务上优于以前的多语言代码模型(InCoder-6.7B和CodeGen-2.7B)。预计,更大的架构和更多的训练数据将能够产生更强大的多语言、填充能力强的模型,并计划继续扩大调查结果。