导语

本文介绍了Text-to-Code领域最近的一篇数据集文章,这是由Huggingface发布的一个具有30种编程言语的3.1TB数据规模的代码预练习语料。

  • 会议:Arxiv 2022
  • 链接:arxiv.org/abs/2211.15…

1 简介

最近,研讨者们开端探究大型言语模型(Large Language Models (LLMs))在代码方面的运用,Code LLMs承受很多源代码集合的练习,并可以从自然言语描绘和其他代码片段中组成程序。

研讨Code LLM面对的挑战之一是这些体系的开发缺少开放性和透明度。尽管现已发表了一些论文,但它们并不总是对开发进程有全面的描绘。一些研讨小组经过付费API服务或商业产品供给了他们的Code LLM(如CodeX)。其他小组发布了模型权重(如InCoder),但没有发布练习数据。因而,研讨人员很难彻底重现这些模型。LLMs的一个重要预处理过程是练习数据的重复数据删去,由于据报道它可以进步模型功能。可是,模型的功能一般对这种预处理办法的超参数十分灵敏,作者以为,与其让研讨人员独立迭代预处理细节,不如从一开端就更广泛地共享由数据卡支撑的高质量数据集,社区的进展会更快。

作者以为,预练习数据的开放性也很重要。一些人以为,在版权答应的代码库(例如GPL)上练习的模型是对原始程序的修改,因而得到的模型应该在版权左答应下可用。其他人以为,Code LLM开发人员或许获益于版权法的例外情况,例如依据美国版权法,可以运用代码存储库用于模型练习。在LLM输出很多(或相关)第三方受版权保护代码的逐字副本的推理场景中,也应适当考虑。可是,即便现在的法规答应运用公共源代码来练习ML模型,也值得评论这些实践是否契合社会和更广泛的研讨界的品德价值观。例如,有人或许会说,代码创立者应该有权有意地控制他们的数据是否包含在练习会集。关于在练习数据中包含个人身份信息(PII)和歹意代码,人们也或许会有品德上的担忧,由于Code LLM或许会在部署进程中输出此类灵敏数据或不安全的程序。现在,如安在LLM数据集的规模上完结数据管理的进程是一个悬而未决的问题。

本文发布The Stack(一个答应源代码的大型数据集),向对Code LLM进行开放和负责任的研讨迈出了一步。本文描绘了怎么从GitHub搜集和处理代码存储库,并展现了小规模Code LLM的有前景的成果。详细而言,本文作出以下贡献:

  • 提出The Stack数据集,这是一个具有3.1TB的合法开源代码语料,具有30种编程言语(注:最新版The Stack v1.1现已拓展到了308种言语,6TB数据);
  • 练习了一个350M参数的Decoder-only的模型,并展现了只经过这些合法数据就可以取得与CodeX、CodeGen相似的功能体现;
  • 供给了一个从数据会集删去自己Repo的接口在www.bigcode-project.org/docs/about/….

2 相关作业

Code LLMs

越来越多的研讨机构在源代码上练习大型Transformer模型。几个小组现已探究了具有因果言语建模方针的纯解码器模型(如CodeX、PolyCoder、InCoder、CodeGen),而且一般发现更大的模型越来越有才能从自然言语描绘中组成程序。一些研讨经过因果掩码(causal masking)机制运用这种仅解码器模型来完结代码填充使命。研讨人员还研讨了编码器掩码言语模型(如CodeBERT)和具有各种练习方针的编码器-解码器架构(如CodeT5)。

论文笔记:The Stack:  3 TB of permissively licensed source code

Code LLM的预练习数据集

Github一直是最常用的数据集来源。Google BigQuery供给了GitHub上答应存储库的快照,可以经过SQL查询进行过滤。AlphaCode,BLOOM,InCoder、CodeGen)都在他们的预练习数据会集包含了这部分数据。这些GitHub数据的快照也在HuggingFace hub上作为CodeParrot项目下的GitHub-Code数据集揭露供给。PolyCoder经过抓取GitHub存储库搜集了一个代码数据集,并发布了他们下载的存储库和文件的目录。本文将咱们的作业与表1中的这些代码数据集进行比较,并在第3.2节中详细阐明这些差异。

另一个常用的资源是CodeSearchNet语料库。这个语料库首要从GitHub搜集了很多的公共和答应的存储库,然后用Treesitter进一步处理这些存储库,以提取函数(办法)和文档字符串对。该数据集包含了六种编程言语的配对:Go、Java、JavaScript、Python、PHP和Ruby。CodeBERT和CodeT5运用该数据集进行预练习。

一些研讨报告了在非公共数据集上练习的成果。CodeX从54M个GitHub公共库中搜集了179 GB的python文件,但没有发布数据,也没有发表有关答应的信息。CodeGen搜集了一个私人的GitHub数据集,包含217.3GB的答应python文件。他们在Pile和BigQuery上的GitHub快照上进行预练习后,对该数据集上的模型进行了微调。尽管CodeGen开源了模型权重,但他们没有发布私有的Python数据集。

去重

最近的研讨标明,练习会集的重复数据删去可以明显进步LLM的功能。Lee等人标明,言语模型的练习语料库包含许多挨近重复的词,当去掉长重复的子字符串时,LLM功能会进步。Hernandez等人还发现,即便重复一小部分练习数据也会严峻危害模型功能,这或许是由于数据回忆消耗了部分容量。数据复制在代码数据会集更为常见,由于重用和克隆其他代码存储库是常见的做法。事实上,Lopes等人观察到,GitHub数据中有很大一部分由克隆组成,导致准确和挨近重复的比例很高。Allamanis研讨了代码复制对机器学习模型的影响,并标明它会导致高度胀大的功能指标。可是,许多现有的代码LLMs只运用准确的重复数据删去,这在练习数据中留下了很多挨近重复的数据。

3 数据集

3.1 数据集创立

数据搜集

本文首要从GHArchive搜集了一组活泼的GitHub存储库称号,GHArchive是一个致力于归档和发布公共GitHub时间轴的开源项目。作者从2015年1月1日至2022年3月31日发布的事件档案中提取了唯一的存储库称号。这产生了一个包含22092万个唯一存储库称号的列表。接下来,运转了一个散布式核算集群花费几个月时间,克隆这个存储库列表。终究,成功下载了137.36万个存储库。一切存储库都在2021年11月至2022年6月期间下载。

论文笔记:The Stack:  3 TB of permissively licensed source code

答应查看

软件的开源协议有很多(可以参考www.runoob.com/w3cnote/ope… ),作者对这些Github项目的答应进行查看(如表2)。

答应答应的数据集

本文开发一个源代码数据集,只运用答应答应的数据,作者运用如下所示的答应预测列表,将单个存储库符号为答应的。最终,代码作者可以依照www.bigcodeproject.org/docs/about/… 上的阐明从该数据会集删去自己的数据。

论文笔记:The Stack:  3 TB of permissively licensed source code

Near-deduplication

在准确重复数据删去的基础上,本文在预处理流程中完结了近乎重复的数据删去。咱们首要依据非字母数字字符将文件拆分为单词/符号,并删去符号少于10个的文件。接下来,咱们用一切文档的256种排列核算MinHash ,并运用部分灵敏哈希(LSH)来找到重复的集群。经过确保原始集群中的每个文件与削减的集群中的至少一个文件相似,咱们进一步削减了这些集群。当两个文件的Jaccard相似度超越0.85时,咱们以为它们相似。咱们发现,在答应数据会集,38.6%的文件仅仅其他文件的近似副本并被删去,它们也代表了数据集体积的53.7%。每种编程言语的细目见表3。

3.2 数据集剖析

为了更深化地了解搜集的数据集,咱们首要剖析每种编程言语的数据量,然后与其他代码数据集进行比较,最终对python子集进行更广泛的剖析。

论文笔记:The Stack:  3 TB of permissively licensed source code

每种编程言语的数据

表3中列出了30种编程言语的可用数据量。可以看到全答应证数据集包含超越29 TB的数据。仅挑选答应文件将数据集削减到3.1 TB,即仅保存大约10%的数据集。关于某些编程言语(例如SQL, Batchfile, TypeScript),咱们发现只要不到4%的数据具有答应答应。咱们可以经过向答应答应列表中添加更多的答应来添加这一百分比(请参阅附录a)。假如进一步对答应答应数据集运用近似重复数据删去,终究将得到1.4 TB,削减了50%以上。例如,当不擅长这些数据时,只保存了37%的HTML。从图1中可以看出,少量几种编程言语构成了数据集的大部分。关于答应数据集,四种最大的言语——html (746 GB)、Javascript (486 GB)、Java (271 GB)和C (222 GB)——占用了数据集大小的55%以上。

与其他数据集的比较

表1展现了The Stack和CodeParrot、AlphaCode、CodeGen、PolyCoder进行比较。留意,AlphaCode和CodeGen没有发布他们的数据,但供给了每种编程言语的数据量的统计数据。值得一提的是,CodeParrot包含具有copyleft答应证(例如GPL)的文件,而咱们的答应答应证数据集则没有。PolyCoder不过滤答应信息,也或许包含copyleft答应的文件。Stack和CodeParrot供给了30种编程言语的源代码,而AlphaCode、PolyCoder和CodeGen别离只供给其间12种、12种和6种言语的数据。此外,咱们观察到咱们的数据集是CodeParrot(第二大揭露可用的代码数据集)的3倍多。咱们还看到,关于每种编程言语,咱们的数据集比CodeParrot更大。

论文笔记:The Stack:  3 TB of permissively licensed source code

Python子集剖析

首要,作者研讨答应数据集的Python子会集有多少配置文件和测验文件。这些配置文件在GitHub存储库中十分丰富,但没有捕获源代码的杂乱功能。

接下来,对数据会集的10,000个样本运用py_compile模块来估量有效Python文件的数量。咱们发现只要0.7%的文件由于语法过错而无法编译。详细来说,作者发现大约0.1%的Python文件存在符号化过错(例如,由于制表符和空格的不一致运用)。

最终,剖析文件中的文档字符串和注释。这些数据关于文档生成和自然言语代码翻译等运用程序至关重要。咱们剖析10,000个文件中的一个子集。首要运用ast和tokenize模块来提取文档字符串和注释,作者发现它们占子集容量的18%,20%的文件只要很少(少于20个字符)或没有自然文本。

为了辨认提取的文档字符串和注释的言语,作者运用fasttext库中的模型。作者发现94%的文件是英文的。在其他言语中,汉语和法语最受欢迎,有100多个样本。图2中展现了自然言语的完好散布。需要留意的是,这种言语检测并不完美,由于文档字符串一般包含带有英文要害字的代码示例。

4 试验

为了更好地了解搜集的数据集的质量,本文研讨了在几个版别的python子集上从头练习的transformer模型的功能。作者评价了HumanEval和MBPP上的模型,并与相似规模的CodeGen、InCoder和Codex模型进行了比较。作者在研讨进程的后期发现,一些预练习集受到了来自评价基准的示例的污染。由于运转试验成本高且耗时长,本文只从头运转几个试验来查询数据污染的影响。

论文笔记:The Stack:  3 TB of permissively licensed source code

4.1 试验设置

数据集

作者试验了自己的python数据集的4个版别,以及CodeParrot的Python子集。关于自己的数据集,咱们要么运用来自一切存储库(all-license)的python文件,要么运用来自具有答应答应(permissive-license)的存储库的python文件。关于这些数据,要么运用近重复数据删去(near-dedup),要么不进行进一步过滤(none)。值得着重的是,挨近重复数据删去的进程是在咱们在数据集搜集期间运用的重复数据删去之上的。关于CodeParrot,咱们只试验了挨近重复数据删去的版别12。

关于一切数据集,遵从Codex的过滤办法,并运用以下办法删去文件:

  • 平均行长大于100个字符;
  • 最大行长度超越1000个字符;
  • 少于25%的字符是字母数字字符;
  • 文件前几行中的要害字标明该文件或许是自动生成的。

数据包含

在练习模型之后,作者发现一些练习集包含了来自评价基准的示例。本文经过搜索HumanEval和MBPP的自然言语提示符的准确字符串匹配来检测这种污染问题。表4显现了每个子会集发现的受污染文件的数量。一切子集都包含HumanEval示例,但只要python-all-license子集包含MBPP示例。为了查询数据污染的影响,咱们在简直重复数据删去的python-all-license和python-permission-license数据集上从头运转试验。为此,咱们从这些数据会集删去了受污染的文件。请留意,咱们只删去了提示符的准确副本,因而不检测转述。

评价

本文在HumanEval和MBBP 基准上评价模型。HumanEval是一个包含164个编程问题的text2python基准测验。每个问题都由函数签名、文档字符串、主体和一些测验用例组成,这些测验用例答应验证生成程序的正确性。运用pass@k衡量对模型进行评价:为每个问题生成k个样本,假如至少有一个样本经过测验用例,则处理了一个问题,而且测量了处理问题的总比例。在实践中,咱们对每个问题取样200个程序,并依照Chen等人提出的估量pass@k。咱们运用top-p = 0.95,温度T∈{0.2,0.8}T∈\{0.2,0.8\}的核采样,并报告pass@k为最佳温度。

作者还对MBPP进行了评价,这是一个由众包编程问题组成的text2python基准测验。每个问题由一个简短的自然言语描绘和3个单元测验组成。咱们在500个样本的测验集上进行评价。Austin等人在提示符中包含了一切三个单元测验,Fried等人只包含了一个单元测验,由于他们观察到较小的言语模型(即具有数十亿个参数)没有从更多的单元测验中获益。咱们遵从Fried等人的做法,只将第一个单元测验添加到自然言语提示符中。除了pass@1,咱们还对pass@10和pass@100进行了评价,每个问题抽样200个程序。与HumanEval相似,咱们运用top-p = 0.95,温度T∈{0.2,0.8}T∈\{0.2,0.8\}的核采样,并报告最佳温度的分数。

练习细节

咱们对经过因果言语建模方针练习的Decoder-only模型进行了试验。作者挑选350M参数模型,24层,隐藏维1024,16个留意头,序列长度2048。运用Adam练习模型进行300K次迭代,Batch大小为384,1=0.9,2=0.95,=10−8_1 = 0.9, _2 = 0.95,\epsilon = 10−8,权值衰减为0.1。学习率设置为310−43 10^{−4}并进行175个step的warmup,然后遵从余弦衰减。模型在练习进程中处理235.9B个token。字节对编码符号器是在The Pile和The Stack中的Python文件的50-50混合数据上练习的。咱们fork了Megatron-LM的分支进行练习。

试验成果的评论

表5和表6中报告HumanEval和MBPP成果。之后,作者给出了几点评论。

论文笔记:The Stack:  3 TB of permissively licensed source code

论文笔记:The Stack:  3 TB of permissively licensed source code

删去近似重复的数据对功能有提高

对练习数据运用近似重复数据删去会在全答应证和答应答应证数据集上产生明显改善。在permission-license数据集上,近似重复数据删去将HumanEval功能从27.21%进步到37.00% pass@100,将MBPP功能从44.99%进步到54.69% pass@100。咱们看到全答应证数据集的成果也有相似的提高,其间HumanEval功能从36.67%进步到44.00% pass@100, MBPP功能从53.59%进步到61.00% pass@100。

运用答应数据就可以复现(CodeX等)功能

咱们可以复现text2python的成果,曾经的作业只答应答应的源代码。在HumanEval上,咱们观察到,在没有简直重复数据删去的情况下,答应答应数据集(27.21% pass@100)的功能明显低于Codex (36.27% pass@100)和CodeGen(35.19% pass@100)。可是,在运用近似重复数据删去后,Codex和CodeGen的功能到达了一致(37.00% pass@100)。在MBPP上,咱们观察到相似的成果。假如没有近似重复数据删去,python答应数据集(44.99% pass@100)的功能明显低于CodeGen (51.80% pass@100)。可是,近似重复数据删去的版别(54.69% pass@100)超越了CodeGen的成果。

与CodeParrot的比较

在Codeparrot(另一个发布的代码数据集)上的练习在HumanEval上到达30.37% pass@100,这明显低于咱们发布的数据集的功能(37.00% pass@100)。在MBPP上,CodeParrot的体现也低于咱们发布的数据集(45.44% vs 54.69% pass@100)。CodeParrot由从BigQuery中提取的数据组成,不足以取得HumanEval和MBPP上的竞赛模型。

数据污染的影响

令人惊讶的是,咱们发现删去受污染的文件对text2python成果的影响很小。在HumanEval上,答应-答应证数据集有很小的下降(37.00% vs 36.01% pass@100),而全答应证数据集有很小的增长(44.00% vs 45.52% pass@100)。咱们还看到MBPP上的全答应证数据集受到了较小的影响(61.00% vs 58.28% pass@100)。咱们估测数据污染的影响是最小的,由于(1)小模型不太或许记住练习数据,(2)污染文件很少。

5 总结和未来作业

本文介绍了The Stack,这是一个具有超越3Tb答应源代码的大型数据集。本文描绘了数据集搜集的细节,给出了一个简单的数据集剖析,并在HumanEval基准测验上展现了有希望的成果。试验成果标明,近似重复数据删去是在text2code基准测验中取得有竞赛力成果的重要预处理过程。本文发布了30种常见编程言语的一切答应文件,以及一个近乎重复数据删去的版别。在未来的作业中,咱们希望进一步改善已发布的数据集。咱们对发布其他编程言语的数据持开放态度,方案研讨删去PII和歹意代码的办法,并开端尝试让开发人员有或许从数据会集删去他们的数据。咱们希望Stack将成为开放和负责任的Code LLM研讨的有用资源。

6 局限性

数据集带来的社会影响

The Stack是BigCode项目的一个输出。BigCode的方针是在设计和默许情况下负责任。该项目是在开放科学的精神下进行的,专心于负责任的Code LLM开发。

随着The Stack的发布,咱们的方针是在研讨社区中添加Code LLM的可拜访性、可重复性和透明度。在各个BigCode作业组中开展了下降风险和改善Code LLM品德最佳实践的作业。法律、品德和管理作业组探讨了比如答应(包含copyleft和答应代码的预期运用)、生成的代码归属于原始代码、约束处理的权利、个人身份信息(PII)的包含以及歹意代码的风险等主题。这项作业正在进行中。

咱们希望Code LLM可以让来自不同布景的人编写更高质量的代码并开发低代码运用程序。当代码生成体系辅导专业开发人员怎么编写更强健和有效的代码时,要害使命软件将变得更容易保护。尽管社会影响是积极的,但代码llm的可拜访性的添加也带来了必定的风险,例如过度依赖生成的代码以及对软件开发工作商场的长时间影响。

咱们主张读者参考Chen等人(即CodeX)的第7节,以取得对Code LLMs更广泛的影响剖析,以及Khlaaf等人对这种新兴技术进行深化的风险评价和危害剖析。

数据会集的偏见

从GitHub搜集的代码不包含人口统计信息或关于人口统计的署理信息。可是,这并不是没有风险,由于代码中的注释或许包含有害或冒犯性的言语,这可以从模型中学习到。

与Julia和Scala等小众编程言语相比,C和Javascript等被广泛采用的编程言语过多。咱们发现一些编程言语,如SQL, Batchfile, TypeScript不太或许被答应(4% vs平均10%)。这或许导致对这些言语的描绘有偏见。答应文件也往往较长。

咱们还发现,英言语语在文档字符串和注释中被过度表明,由于它占Python文件数据的96%。

HTML not WCAG-compliant

The Stack现在的一个约束是为网站抓取HTML或许不契合Web内容可拜访性攻略(WCAG)。这或许会对html生成的代码产生影响,或许会引入web可拜访性问题。

个人身份信息

咱们留意到数据中包含名字和电子邮件地址等个人身份信息(Personally Identifiable Information,PII)。这个PII现已在GitHub上向公众揭露,可是,咱们方案在未来的作业中删去PII。

歹意代码

少量存储库被删去了,由于它们在下载阶段触发了内部安全东西。可是,咱们没有彻底扫描数据集的歹意软件,因而,或许依然存在着歹意代码。

数据答应

尽管咱们尽力筛选答应源代码,可是答应检测器或许过错地对许多存储库进行了分类。假如您遇到没有答应答应证的文件,请联系contact@bigcode-project.org。咱们还着重,The Stack是以数据集的形式编译源文件(包含特点和答应告诉)。堆栈中的每个源文件都带有自己的答应答应,数据集的用户应该尊重这些答应答应。

模型局限

咱们在python数据集上展现了较小模型的text2code成果。有必要进行更多的研讨,以确认是否可以为更大的模型和其他编程言语(而不是Python)取得强有力的成果。