选自MicrosoftResearchblog作者:RishabhSingh等参与:李泽南
长久以来,摆脱编程语言的束缚,让计算机自我生成程序一直是开发者们的梦想,最近微软研究者推出的RobustFill让梦想更近了一步,他们的研究成果即将在ICLR大会上出现。
在过去几十年中,计算机科学有了长足的发展,但人们编写计算机软件的过程却没有发生根本的改变——程序员必须使用特定的程序语言一步步手工编写程序的精确算法逻辑。尽管编程语言近年来正在变得越来越友好,但这项工作仍然是绝大多数计算机用户未曾接触的事物。
在最近的一项研究中,微软发布了自己的深度学习程序生成研究。在该研究中,深度神经网络学会了遵从用户的意图来生成计算机程序。用户只需要提供一些简单的输入/输出(I/O)范例以表示自己希望获得的程序是什么形式的。系统就可以使用这些信息生成相应的程序。
例如:假设用户有一个名单,他/她希望将这个名单整理成特定格式,如下图所示。这名用户仅需要向系统提供一些输入-输出的例子,随后系统就会自动填充剩下的输出(在图中以灰色显示)。在一些数据量很大的工作中,这种方法可以为用户节约大量时间。
该系统通过域特定语言(domainspecificlanguage,DSL)生成用于执行任务的程序,用户不需要理解DSL的所有细节。事实上,在使用过程中,用户完全不会看到编程的过程。在微软的DSL中,对应于上个例子的正确程序是:
自动生成程序面临着两个重大挑战。第一、DSL表达程序有数以亿计的可能性,而用户真正需要的程序可能完全未曾在系统中出现过;第二、因为I/O例子是由人类手动输入的,这意味着其中可能经常会出现噪音(例如错字)。如上例所示,第二个输出例子中的Uesato被错写为Useato了。
在此之前解决这些问题的方法——最为人所知的就是Excel中的快速填充(FlashFill)功能——是依靠程序员手动编写的规则和启发方式来引导和搜索用户所需的程序。这种方式显然不能满足DSL——这意味着数年的手动规则编写,而且最终的结果仍然对I/O例子的噪音非常敏感。
微软提出的新系统RobustFill采用了最近发展迅猛的深度学习方式,通过数据驱动方法进行程序生成,不需要任何手工编写的规则。与快速填充相反,它使用曾被用于机器翻译的「attentionalsequence-to-sequence神经网络」来通过I/O范例生成所需的程序。下图展示了微软的神经网络架构:
这个系统经过了数百万随机生成的I/O程序配对的训练,学会了DSL中的语义学规则,目前已经可以在真实情况下的数据中展示良好的性能。总体而言,该系统在一个真实世界任务基准测试中达到了92%的准确率。其中最令人兴奋的是,在测试中,I/O范例包含了一些明显的噪音,而系统仍然保持了高精度。
编程新启示
训练神经网络架构来学习一种带有丰富功能的程序语言(FlashFillDSL)不仅是神经语言生成的重大突破,也是走向通用人工智能的坚实一步。它解决了可解释性的关键挑战,也将我们引向了分布式链接形式的知识符号表示问题。
微软正致力于扩展这些DSL程序学习架构,试图加入状态变量和控制流程以生成更多种类的程序。研究人员相信他们正走在正确的道路上,未来的研究将指向有关程序生成和归纳的一系列基础技术问题。
论文:RobustFill:NeuralProgramLearningunderNoisyI/O
摘要
在人工智能发展的初期,有关自动生成计算机程序用于一些特定任务的尝试就已开始了。最近有两个自动学习程序的方式受到了人们的