程序员的死敌就是各种bug!近日,微软在NeurIPS2021上带来了好消息,研究人员设计了一个类似GAN的网络,通过选择器和检测器相互编写和纠错,而且不需要标注数据! 俗话说,“一杯茶,一包烟,一只虫子,可以改变一天。” 写代码是软件工程师的日常工作,但是当你努力写了一大堆代码,却发现无法运行时,你的心一定是碎了。 找BUG不仅费时费力,最重要的是经常找不到,而且有时候换一个BUG会引入更多的BUG,子子孙孙无穷无尽。 简直就是找虫子吐血。 随着AI技术的发展,GitHubCopilot等大公司开发的代码助手也可以帮你写出更少的bug代码。 但这还不够! 如果深度学习能帮我修复代码中的bug,我上班只负责打鱼,岂不妙哉! 微软居然在NeurIPS2021上发表了这样一篇论文,提出了一种新的深度学习模型BugLab,通过自监督学习的方式,可以在没有任何标记数据的情况下进行检测和修复。代码中的Bug堪称程序员的救星! 修bug有什么难的? 所谓bug,就是代码的实际运行与你的预期不符。 该运行的没有运行,本该输出a,结果却是b。这种故意在代码中找茬的行为就是bug。 所以查找和修复代码中的错误,不仅需要对代码的结构进行推理,还需要理解软件开发人员在代码注释、变量名等中留下的模糊的自然语言提示。 例如,意图一个程序的特点是,如果名字的长度超过22个字符,则只截取前22个字符。但是在原来的代码中,将大于号错误的写成了小于号,导致条件判断错误,程序运行的结果与预期不符。 这种小错误在写代码的过程中太常见了,一不留神,条件就会反过来。 另一种错误是使用了错误的变量。比如下面的例子,write和read写错了,会导致条件判断失败。这种bug只有理解了变量名的含义后才能修复。传统的修复方法对此无能为力。 这种错误看起来很简单,但是盯着代码往往很难发现。属于每天都在变化的那种。 而且每个程序员都有自己的编程风格,比如不同的命名、缩进、判断、重构方式等。想让代码自己找bug,一个字难! 对微软来说幸运的是,有一个GitHub代码库可以用来训练模型。但是问题来了,GitHub上有那么多有bug的代码吗?如果有错误,谁来犯?就算能找到代码,也没有人会标注数据! 微软的BugLab使用两个相互竞争的模型通过玩捉迷藏游戏来学习,主要灵感来源是生成对抗网络(GAN)。 因为有很多代码实际上是没有bug的,所以需要设计一个bug选择器来决定是否修改正确的代码来引入bug,以及如何引入bug(例如,更改减号到加号等待)。一旦选择器确定了错误的类别,就可以通过编辑源代码来引入错误。 另外一个要对抗的就是bugdetector,它用来判断一段代码是否有bug,如果有就需要定位并修复bug。 选择器和检测器都可以在没有标记数据的情况下进行共同训练,这意味着整个训练过程以自我监督的方式进行,并成功训练了数百万个代码片段。 selector负责编写bug并隐藏,detector负责发现bug并修复。整个过程就像捉迷藏一样。 随着训练的进行,selector写bug越来越熟练,detector也能处理更复杂的bug。 整个过程和GAN的训练大致相似,但是目的却大相径庭。GAN的目的是得到一个更好的生成器来修改图片,而BugLab的目的是找到一个更好的检测器(GAN中的判别器)。 而整个训练也可以看成是师生模式,选择器教会检测器如何定位和修复bug。 为开源社区修复错误! 虽然从理论上讲,使用这种捉迷藏的方法可以训练出更复杂的选择器来生成更多种类的bug,因此检测器修复bug的能力也会更强。 但以目前AI的发展水平,教selector写出更难的bug还是不可能的。 因此研究人员表示,我们需要关注更常犯的错误,包括不正确的比较器,或不正确的布尔运算符,不正确的变量名引用,以及其他简单的错误。并且为了简单起见,实验中只使用python代码进行研究和训练。 尽管这些解释听起来像是借口。 为了衡量模型的性能,研究人员从Python包索引中手动注释了一个小错误数据集,与其他替代方法(例如随机插入错误的选择器)相比,使用捉迷藏方法训练的模型表现最好)可以提高30% ,实验表明大约26%的bug可以被发现并自动修复。在检测器发现的错误中,有19个是真实开源GitHub代码中的未知错误。 但是模型也会报错给正确的代码,所以这个模型离实际部署还有很长的路要走。 如果你更深入地研究选择器和检测器模型,你会引出一个老生常谈的问题:是否存在深度学习模型,以及如何“理解”一段代码的作用? 过去的研究表明,将代码表示为标记序列可能会产生次优结果。 但是如果要在代码中使用语法、数据、控制流等结构,则需要将代码中的语法节点、表达式、标识符、符号等表示为节点上图,并用边来表示节点之间的关系。 有了图,就可以用神经网络训练检测器和选择器了。研究人员使用图神经网络(GNN)和关系转换器进行了实验,发现GNN通常优于关系转换器。 如何让AI帮助人类编写代码和修复bug一直是人工智能研究的基础课题。任务过程中,AI模型需要理解人类提供给程序代码的上下文线索、变量名和注释,从而理解代码的意图。 虽然BugLab离真正解放程序员修改bug还很遥远,但总算离消除bug又近了一步!
