导语
DS-1000是专注于数据科学领域的NL2Code数据集,也是最近发布的新文章,这里简要记录。
- 会议:Arxiv 2022
- 链接:arxiv.org/abs/2211.11…
- 项目网站:ds1000-code-gen.github.io/
1 简介
数据科学在许多领域都很重要,但需要用户熟悉特定的第三方库(如torch,numpy),因此对非专业用户构成了很大的障碍。现有的NL2Code研究领域缺乏这样一个测试基准:1)关注日常数据科学应用,2)包括更加自然的用户意图和上下文,3)具有可靠的基于执行的评估指标。
为了填补这一空白,本文发布了DS-1000,这是一个包含1000个问题的基准测试,涵盖了7个广泛使用的Python数据科学库:NumPy、Pandas、TensorFlow、PyTorch、SciPy、Scikit-learn和Matplotlib。它具备三个核心特征:
- 它包含了不同背景下的现实问题,
- 它实现了可靠的基于多标准执行的评估指标,
- 它能有效避免模型记忆训练数据带来的性能虚高。
2 数据集构建
DS-1000的构建pipeline包含五个阶段,如图2所示:
- 从StackOverflow中抓取并选择了高质量的问题;
- 重写问题和参考解决方案,使问题明确,参考解决方案是可执行的;
- 为每个问题实现了一个多标准自动评估,其中包括测试用例和表面形式约束;
- 进行了一个案例研究,表明Codex可以通过记忆预训练语料库来回答问题,并主动采取措施,通过扰动DS-1000中的问题及其参考解决方案来防止这种情况
5。 改进多标准评估,要求它拒绝一小部分我们通过人工审查认为不正确的样本预测,然后在更大的样本预测集上计算我们指标的错误发现率。
五位计算机科学专业的学生和熟悉数据科学的作者总共花了大约1200个小时构建DS-1000(包括从问题选择到质量审查的步骤)。
这里特别提一点的是作者为了防止模型记忆训练时的数据,对数据集做了扰动(Perturbation),如上表所示,主要有以下几种方式(原文附录里有很多图,展示了一些例子,比较直观,建议去看一下):
- 文字表面形式干扰:如将一个完整的代码封装进一个函数体,对原始问题描述进行同义转述,改变输入输出等;
- 语义干扰:用同类词代替代码中的原始词,改变下标index,颠倒list、string或dataframe的顺序,改变所需结果的数据类型等;
- 困难问题重写:结合多种上述表面形式和语义形式的干扰等。
作者证明(表2),这种重写会增加数据集的难度,也有效避免了模型记忆训练数据带来的性能虚高。
3 数据集统计
数据集的整体统计指标如下表所示:
DS-1000包含1000个问题,源自451个独特的StackOverflow问题。为了避免模型记忆训练数据带来的性能虚高,超过一半的DS-1000问题是由原来的StackOverflow问题修改的;它们包括152个表面形式干扰,235个语义干扰和162个困难重写。
表4比较了DS-1000与其他数据集。值得注意的是,DS-1000中每个问题的平均字数远远大于其他数据科学相关数据集(例如DSP和CoNaLa)。更重要的是,DS-1000中的问题代表了在任何其他数据集中都看不到的更多样化和更自然的意图和上下文格式。与通用的Python代码生成基准测试(MBPP和HumanEval)不同,数据科学代码生成基准测试有更少的测试用例,因为注释者需要用复杂的对象(如方阵、分类器或数据帧)定义程序输入,而不是简单的原语(如浮点数或列表)。
4 对目前的SOTA模型进行基准测试
4.1 Prompt格式
图1显示了一个Prompt的例子:每个提示符以自然语言描述开始,然后提供了一个代码上下文;代码上下文使用类似html的标记来指示模型需要填充的缺失代码的位置,并为缺失的代码段提供左右上下文。
本文使用填充作为我们的正式格式,因为正确的上下文对于指定程序预测的行为很重要(例如,结果的变量名)。另一方面,考虑到目前许多基于代码训练的语言模型还不具备填充能力,作者还提供了一个将右侧上下文信息转移到左侧上下文(图25)的版本以适应那些自回归式模型。
4.2 实验设置
本文实验了三种预训练模型:Codex、InCoder 和CodeGen。对于InCoder和CodeGen,使用6B参数模型进行实验。在这些模型中,Codex和CodeGen模型被训练为预测正确的上下文,而InCoder模型则被训练为从左到右生成和填充。此外,Codex-002也支持填充,尽管具体的模型训练细节没有透露。
实现上,作者为每个问题生成40个样本,温度设置为0.2,top-p截止设置为0.95,最大生成长度设置为1024。将停止序列令牌设置为“< / code>”和“# SOLUTION END”。这些样本用于pass@1的无偏估计。对于DS-1000,计算生成的代码不需要像gpu这样的特殊计算资源。
4.3 主要结果
表5显示了DS-1000上的pass@1精度。最好的模型Codex-002达到了43.3%的平均精度,这表明有很大的改进空间。相比之下,其他模型(如CodeGen-6B或incode – 6b)的整体性能要差得多,在一些库上的准确率低于5%。定性地说,这些较小的模型通常不能正确地遵循提示指令,生成额外的注释而不是所需的代码。未来的消融需要了解造成这种性能差距的根本原因,这可能是模型大小的差异,缺乏指令调整,或预训练数据的差异。
此外,作者发现插入格式通常会带来更好的性能。相同的Codex-002模型在使用插入格式时比使用补全格式时平均精度提高了4.1%。这显示了填充能力对于数据科学代码完成的重要性。
4.4 扰动的结果
表6显示了结果。在受到扰动后,Codex-002的性能下降了(表面扰动3.4%,语义扰动9.0%),但下降比在numpy-100上观察到的要轻得多。这间接地表明,Codex-002可能已经记住了一些StackOverflow问题的解决方案,但影响不那么严重,因为它们不像numpy-100那样经常在互联网上重复出现。作者相信问题扰动是一种有效的策略,可以主动防御未来模型的记忆。
此外,作者重写了一些问题,故意让它们对人类程序员来说更难,从而创建了更多的DS-1000问题。正如预期的那样,Codex-002在重写后表现得更差了,本文计划将这些问题作为未来模型的挑战。
5 相关工作
略
6 总结
本文提出DS-1000,一个为数据分析生成代码的基准。该基准测试1)包含现实问题,2)实现可靠的自动度量,3)有效避免模型记忆训练数据带来的性能虚高。DS-1000能够跟踪这一研究领域的进展,促进模型之间的公平比较,它的构建方法也可以启发其他任务。