程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug( 二 )



程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
模型架构图拆解:
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图

程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
训练方法:自监督学习
本文使用的另外一种技术是自监督学习 。
带标签的程序Bug修复数据集很小 , 但在互联网上有大量未带标签的程序代码可用 。
例如 , GitHub上拥有超过3000万个公共存储仓库 。 使用大量免费的可用代码来改善学习程序的Bug修复 , 将大大增强系统的可伸缩性和稳定可靠性 。
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
本文的步骤如下:
1、从GitHub和Codeforce等在线资源中收集未带标签的有效程序(上图 左) 。
2、设计随机程序破坏程序代码(例如 , 删除/插入/替换token) , 并破坏未标记程序(上图 中) 。
3、损坏的程序会报错(上图 右) 。
这样 , 人们就可以创建许多新的程序修复示例<broken code, error message, fixed code>。
程序Bug修复模型
本文在两个基准任务上应用和评估的修复模型(称为DrRepair):

  • 纠正学生编写的C程序(DeepFix数据集)
  • 纠正C ++程序合成的输出(SPoC数据集)
结果如下图所示:

程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
3 应用
应用于DeepFix(修正学生程序)
在DeepFix中 , 任务是更正学生在入门编程课中编写的C程序 , 以便它们能通过编译 。 输入程序可能有多行报错 , 因此需要迭代应用修复模型 , 一次解决一个报错 。
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
例如 , 上图显示了DeepFix中的示例程序 , 该程序有一个编译器错误 , 指出“i未声明” 。
这时应用修复模型DrRepair就派上用场了 , 它通过插入以下声明来修复此错误:i在第5行中 。
完成此修复后 , 还有另外一个错误 , 该错误为

程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图

再次应用修复模型:这次 , DrRepair模型在第12行中插入了分号 , 程序编译成功!
这种方法也即是迭代优化的思想:逐步运行修复模型并逐步修复报错 。
使用报错信息 , 程序反馈图和自监督的预训练有什么影响?
在DeepFix上研究的现有修复系统未使用编译器报错信息 , 它们旨在直接将有Bug的代码转换为固定代码 。
为了首先查看使用报错信息的效果,本文尝试从系统中删除所有技术:使用编译器消息 , 程序反馈图和预训练 。
下图中没有编译器的模型版本在DeepFix上实现了34%的修复精度 , 与现有系统相当 。 现在将编译器提示信息添加到输入中 , 作者发现该模型实现了更好的性能提升和泛化性(准确度为62.5%) 。
这表明 , 通过访问报错信息 , 模型可以基于反馈学习正确的归纳偏差来修复代码 。
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
接下来 , 作者添加了程序反馈图和自监督的预训练 。 作者发现这两者都作出了进一步的性能提升(“ours: base+graph” 以及“ours: base+graph+pretrain”) , 并且本文的最终系统可以修复DeepFix中68.2%的含Bug程序!
应用于SPoC(自然语言编码)