视学算法报道  

编辑:LRS

【新智元导读】程序员的死对头就是各种bug!最近微软在NeurIPS 2021上带来了一个好消息,研究人员设计了一个类似GAN的网络,通过选择器和检测器来互相写和改bug,而且还不需要标注数据!

常言道,「一杯茶,一包烟,一个bug改一天」。

写代码是软件工程师们每天的工作,但当你辛辛苦苦写了一大堆代码,却发现无法运行的时候,内心一定是崩溃的。

找bug不仅费时费力,最关键的是还经常找不着,并且有时候改了一个bug又会引入更多bug,子子孙孙无穷尽也。

简直就是找bug找到吐血。

随着AI技术的发展,各大公司开发的代码助手如GitHub Copilot等也能帮你少写一些有bug的代码。

但这还远远不够!

深度学习要是能帮我把代码里的bug也给修了,我上班只负责摸鱼,岂不是美滋滋!

微软在NeurIPS 2021上还真发了一篇这样的论文,其中提出了一个新的深度学习模型BugLab,并通过自监督的学习方法,可以在不借助任何标注数据的情况下检测和修复代码中的bug,堪称程序员的救世主!

https://arxiv.org/pdf/2105.12787.pdf

修bug难在哪?

所谓的bug,就是代码的实际运行和自己的预期不符。

该运行的没运行,该输出a,结果却输出个b,这种代码故意找茬的行为都属于bug。

所以想要找到并修复代码中的bug,不仅需要对代码的结构进行推理,还需要理解软件开发者在代码注释、变量名称等方面留下的模糊的自然语言提示。

例如一段程序的意图是,如果名字的长度超过了22个字符,那就只截取前22个。但原始代码中错误地把大于号写成了小于号,导致条件判断错误,程序运行结果和预期不符。

这种小错误在写代码的过程也是太常见了,稍不注意就会把条件弄反。

还有一种bug就是使用了错误的变量,例如下面的例子里面write和read弄错了,就会导致条件判断失败,这种bug的修复只有在理解了变量名的意义后才能修复,传统的修复手段对此是无能为力。

这种错误看起来很简单,但往往盯着看代码的时候却很难发现,属于一改改一天的那种。

并且每个程序员有自己的编程风格,比如不同的命名、缩进、判断以及重构的方式,想让代码来给自己找bug,一个字,难!

对于微软来说,好在有GitHub代码库可以用来训练模型。但问题来了,GitHub上带bug的代码有那么多吗?有bug谁还commit啊?就算能找到代码,也没人来标注数据啊!

微软提出的BugLab使用了两个相互竞争的模型,通过玩躲猫猫(hide and seek)游戏来学习,主要的灵感来源就是生成对抗网络(GAN)。

由于有大量的代码实际上都是没有bug的,所以需要设计一个bug selector来决定是否修改正确的代码来引入一个bug,以及以何种方式引入bug(例如把减号改为加号等)。当选择器确定了bug的类别后,就通过编辑源代码的方式引入bug。

另一个用来对抗的是bug detector,用来判断一段代码是否存在bug,如果存在的话,它需要定位并修复这个bug。

选择器和检测器都能够在没有标记数据的情况下共同训练,也就是说整个训练过程都是以自监督的方式进行,并成功在数百万个代码片段上训练。

selector负责写bug,并把它藏(hide)起来,而detector负责找bug,并修复,整个过程就像躲猫猫一样。

随着训练的进行,selector写bug越来越熟练,而detector也能够应对更复杂的bug。

整个过程与GAN的训练大体相似,但目的却大不相同。GAN的目的是获得一个更好的生成器来修改图片,但BugLab的目的是找到一个更好的检测器(GAN中的判别器)。

并且整个训练也可以看作是一个teacher-student模型,选择器教会检测器如何定位并修复bug。

为开源社区修bug!

虽然从理论上来说,使用这种hide and seek的方式可以训练更复杂的selector来生成更多样的bug,从而detector的修bug能力也会更强。

但以目前的AI发展水平来说,还无法教会selector写更难的bug。

所以研究人员表示,我们需要集中精力关注那些更经常犯的错误,包括不正确的比较符,或者不正确的布尔运算符,错误的变量名引用等等其他一些简单的bug。并且为了简单起见,实验中只针对python代码进行研究训练。

虽然这些解释听起来都像是借口。

为了衡量模型的性能,研究人员从Python包索引中手动注释了一个小型bug数据集,和其他替代方案(例如随机插入bug的selector)相比,使用hide and seek方法训练的模型性能最多可以提高30%

并且实验表明大约26%的bug都可以被发现并自动修复。在检测器发现的bug中,有19个在现实生活中的开源GitHub代码中都属于是未知的bug。

但模型也会对正确的代码报告存在bug,所以这个模型在离实际部署上线还有一段距离。

如果更深入地研究selector和detector模型的话,就会引出那个老生常谈的问题:深度学习模型到底有没有,又怎么样去「理解」一段代码的作用?

过去的研究表明,将代码表示为一个token序列就能够产生次优的(suboptimal)效果。

但如果想要利用代码中的结构,例如语法、数据、控制流等等,就需要将代码中的语法节点、表达式、标识符、符号等等都表示为一个图上的节点,并用边来表示节点间的关系。

有了图以后就可以使用神经网络来训练detector和selector了。研究人员使用图神经网络(GNN)和relational transformer都进行了实验,结果发现GNN总体上优于relational transformer。

如何让AI帮助人类来写代码和改bug一直都是人工智能研究中的一项基础任务,任务过程中AI模型需要理解人类对程序代码、变量名称和注释提供的上下文线索来理解代码的意图。

虽然BugLab离真正解放程序员改bug还很遥远,但距离我们消灭bug总算又向前走了一步!

参考资料:

https://www.microsoft.com/en-us/research/blog/finding-and-fixing-bugs-with-deep-learning/

点个在看 paper不断!

灭霸来了!微软发布BugLab:无需标注,GAN掉bug相关推荐

  1. visual studio无法更新_微软发布 VS Code Python 四月更新

    微软发布了 4 月的 Visual Studio Code Python 扩展更新,该版本包括 Jypyter Notebooks 中的 ipywidgets 支持以及 Django 和 Flask ...

  2. 微软发布架构师期刊阅读器

    微软发布架构师期刊阅读器 转载:http://www.infoq.com/cn/news/2007/11/aj-reader 作者 Hartmut Wilms译者 胡键 发布于 2007年11月29日 ...

  3. 【软件周刊】微软发布 Mac 版 Visual Studio,SQL Server 2016 SP1 紧跟节奏

    2019独角兽企业重金招聘Python工程师标准>>> 上周有不少关于微软的新闻,而且隔三差五就弄个大新闻.先是宣布推出针对苹果 Mac 环境的 Visual Studio for ...

  4. vscode kite插件_微软发布 VS Code Python 插件 7 月更新

    微软发布了 7 月的 Visual Studio Code Python 扩展更新,此版本总共修复了 51 个问题,其中包括: 支持新的语言服务器:Pylance Gather 扩展 将 Notebo ...

  5. 微软发布VS Code Jupyter插件!不止Python!多语言的Jupyter Notebook支持来了!

    北京时间 2020 年 11 月 12 日,微软发布了全新的 VS Code Jupyter 插件!Jupyter 插件将 Jupyter Notebook 的功能引入 VS Code,并且将会支持更 ...

  6. 微软发布 Power BI 2020 上半年发行计划

    微软官方与日前发布了 Power BI 在2020上半年的发行计划.本文将在 2020.9 之前都有用,建议收藏查看.从今年开始,我们除了客观描述 Power BI 的特性外,还将加入大量主观观点态度 ...

  7. 微软私有云解决方案_微软发布电信云平台 ,互联网巨头争夺5G网络商机

    微软发布电信云平台 ,互联网巨头争夺5G网络商机 微软公司周一发布了全新的云平台,能够帮助电信运营商更快地构建5G网络,降低成本并向企业客户出售定制服务. 这一5G的新平台将在微软云Azure上运行, ...

  8. 微软发布 VS Code Jupyter 插件!不止 Python,多语言的 Jupyter Notebook支持来了!

    作者 | formulahendry 来源 | 玩转VS Code(ID:vs_code) 头图 |  CSDN 下载自东方IC 北京时间 2020 年 11 月 12 日,微软发布了全新的 VS C ...

  9. 微软发布 .Net Core 3.0 版重大更新,对开发者来说意味着什么?

    随着时间的推移,.Net Core 不断的尝试新的办法给用户最好的体验,那么3.0的到来会给我们带来怎样的效果呢? 作者 | Simon BIsson 译者 | 弯月,责编 | 刘静 出品 | CSD ...

最新文章

  1. bzoj1108[POI2007]天然气管道Gaz*
  2. 程序员在很多人心里的作用...
  3. php接受post接受不到数据,PHP $_POST接受不到数据,但$_GET可以接受数据
  4. Apache NIO 框架 Mina 使用中出现 too many open files 有关...
  5. react div 事件优先级_React 架构的演变 更新机制
  6. OpenStack —— DevStack配置安装
  7. c语言选择结构程序if,C语言的选择结构 (if 语句 和 switch 语句)
  8. Go VSCode配置编译task
  9. 谈谈机器视觉的那点事儿!
  10. 论语之泰伯第八、子罕第九、乡党第十
  11. 计算机科学技术的广告语,十大经典深入人心科技类广告语
  12. python 面向对象编程;(搬家具)
  13. luoguP4313 文理分科
  14. 单realm模式下前后端分离实现springboot+shiro+jwt+vue整合
  15. Airflow基础架构简介
  16. 什么是敏捷开发,敏捷开发落地指南之迭代排期
  17. Linux下Mysql 5.7的安装及远程连接配置
  18. 安卓学习底层开发学习方法?
  19. 2020大学生安全教育网课课后答案
  20. 【JAVA8】Set排序四种写法-倒序

热门文章

  1. 刻意练习:LeetCode实战 -- Task18. 正则表达式匹配
  2. 思谋科技A轮融资超1亿美元 ,成为最年轻“准独角兽”AI企业
  3. 罗永浩力荐,丁磊豪送的学习神器:手机查词真不如这支AI词典笔?
  4. 华为诺亚、北大提出GhostNet​,使用线性变换生成特征图,准确率超MobileNet v3 | CVPR 2020...
  5. 机器学习中的线性回归,你理解多少?
  6. AI如何赋能金融行业?百度、图灵深视等同台分享技术实践
  7. NLP被英语统治?打破成见,英语不应是「自然语言」同义词
  8. 如果三十年前有这些AI技术,可可西里的悲剧不会发生
  9. 拯救老电影——详解爱奇艺ZoomAI视频增强技术的应用
  10. 佩奇扑街、外星人疯狂!Python 告诉你大年初二应该看哪部电影