代码AI:IBM的Codenet数据集旨在培训AI应对编程挑战

535 阅读7分钟

软件渗透到了我们生存的每一个部分。光是谷歌的服务就有20亿行代码,而一辆车大约有1亿行代码。创建、调试、维护和更新这些复杂的软件系统是一个巨大的挑战。

一个快速增长的学科被称为 "代码人工智能",旨在帮助软件开发人员通过软件工程过程的自动化来提高他们的生产力。代码人工智能研究人员一直在利用自然语言处理等技术,并通过代码分析和编译技术对其进行增强,以执行无数的实际任务,如代码搜索、总结和完成,以及代码到代码的翻译。而且,这门学科并不限于学术研究。IBM研究院的首席研究科学家Ruchir Puri在最近的一个播客中讨论了来自AI for Code的技术是如何被用来实现传统软件的现代化,帮助IBM企业客户将单体应用迁移到微服务。为了达到这一目的,IBM人工智能研究部门已经发布了一个新的数据集,称为Project CodeNet。

什么是Project CodeNet?

Project CodeNet是一个大规模的数据集,有大约14M的代码样本和55种不同的编程语言的大约500行代码,每一个都是4000个编码问题中的一个的预期解决方案。CodeNet还提供了超过7M的代码样本的输入和输出测试集。CodeNet数据集包含了问题、提交物和元数据,这些数据是从两个在线评审网站上下载提交物得到的。AIZU Online JudgeAtCoder

该数据集伴随着GitHub仓库,在那里我们提供了一套工具,用于根据用户标准汇总代码样本,并将代码样本转化为标记序列、简化解析树和其他代码图。关于Project CodeNet的详细讨论可参见本文。

最重要的是,Project CodeNet推动了深度学习和机器学习模型在代码分类和代码相似性方面的创新。为了加快使用图神经网络的代码AI研究,CodeNet研究人员还提供了四个基准数据集中代码样本的简化解析树(SPT)表示。据悉,Project CodeNet是一个 "非常大规模、多样化和高质量的数据集,可以加速AI for Code的算法进展"。

Project CodeNet如何帮助机器学习任务

下面的例子显示了源自CodeNet的机器学习模型在哪里可以帮助改善编程任务。

  • 编程语言检测和翻译。你可以利用Project CodeNet数据集,建立一个深度学习模型来检测一段源代码的语言。这个笔记本展示了如何在TensorFlow中使用Keras模型进行语言分类。此外,在未来的数据集发布中,我们计划更好地支持更多的用例,例如,丰富数据集,帮助你创建机器学习模型,将编程语言从一种语言翻译成另一种语言。这为工程师节省了很多老式的努力,对于团队将旧的代码转化为新的编程语言,以便能够被新的开发工具所使用,这将是非常有用的。

  • 源自CodeNet的模型可以帮助代码推荐。通过运行聚类方法,你可以建立推荐工具,将简单的一行代码自动完成为代码块,甚至是一个完整的功能。

  • 在源代码上使用屏蔽语言模型(MLM)。其目的是为源代码文本中任意位置的被遮蔽的标记推断出正确的标记。IBM研究人员创建了一个笔记本来完成这个实验。

是什么让Project CodeNet变得出色

在与相关数据集的比较中,Project CodeNet有两个很大的特点。

  • 数据集的巨大规模和写在其中的全面的编程语言以及带有丰富信息注释的代码样本,如其代码大小、内存占用、CPU运行时间和状态,表示接受或错误类型。90%以上的问题都有各自的问题描述,其中包括简明的问题陈述、输入格式的说明和输出格式。如果有的话,输入和输出的样本也会从问题描述中提取出来,作为数据集的一部分提供。你可以运行已接受的代码样本来提取额外的元数据,并验证生成性人工智能模型的输出是否正确。

  • CodeNet项目解决了数据样本的质量问题。通常,大量经常使用的AI for Code数据集有重复的代码样本,这可能使性能指标膨胀到100%。此外,来自在线评审系统的问题提交式数据集可能包含相同的问题集群,这也会使性能指标发生偏差。然而,在Project CodeNet中,研究人员为了您的利益,已经识别了近乎重复的问题和相同的问题集群等问题。

图1.相关数据集比较

数据集统计

让我们来看看数据集的统计数据。该数据集包括13,916,868份提交材料,分为4053个问题。在这些提交的问题中,53.6%(7,460,588)被接受,29.5%被标记为错误答案,剩下的则是可能被拒绝的原因之一。

图2.每种状态下提交的百分比

数据包含了55种不同语言的提交,尽管其中95%是用六种最常见的语言编码的。C++,Python,Java编程,C,Ruby,和C#。C++是最常见的语言,有8,008,527份提交(占总数的57%),其中4,353,049被接受。

图3.每种编程语言提交的百分比

总结

丰富的元数据和语言的多样性使Project CodeNet能够帮助解决各种使用情况。你可以利用CodeNet中的问题-提交关系进行代码搜索和克隆检测。Project CodeNet中的代码样本都标有它们的接受状态,你可以探索AI技术来区分正确的代码和有问题的代码。Project CodeNet的元数据还可以跟踪一个提交的代码如何从有问题到被接受的演变过程,这可以用于探索自动代码纠正。每个代码样本都有CPU运行时间和内存足迹的标签,可用于回归研究和预测。鉴于CodeNet项目收集了大量用不同语言编写的程序,它也可用于程序翻译。神经机器翻译的一个相当大的挑战是,模型的训练取决于大型的平行语料库,而Project CodeNet涵盖了丰富的语言,有充足的训练实例。

总之,Project CodeNet是一个首创的、大规模的、多样化的、高质量的数据集,可以加速AI for Code的算法进步。这个数据集不仅在规模上是独一无二的,而且在它可以帮助基准的编码任务的多样性上也是独一无二的,从代码相似性和分类到代码推荐算法的进步,以及大量编程语言之间的代码翻译到代码性能改进技术和代码质量的进步。Project CodeNet丰富的注释使代码搜索、代码补全、代码-代码翻译以及其他无数的用例的研究成为可能。

我们还提取了几个特定语言的数据集,用于Python、Java编程和C++的基准测试,以推动深度学习和机器学习模型在代码分类和代码相似度方面的创新。为了加快使用图形神经网络的代码人工智能研究,我们提供了四个基准数据集中代码样本的简化解析树表示。

资源