微软RobustFill:无需编程语言,让神经网络自动生成程序

By 李泽南2017年4月22日 14:14

长久以来,摆脱编程语言的束缚,让计算机自我生成程序一直是开发者们的梦想,最近微软研究者推出的RobustFill让梦想更近了一步,他们的研究成果即将在 ICLR 2017 大会上出现。


在过去几十年中,计算机科学有了长足的发展,但人们编写计算机软件的过程却没有发生根本的改变——程序员必须使用特定的程序语言一步步手工编写程序的精确算法逻辑。尽管编程语言近年来正在变得越来越友好,但这项工作仍然是绝大多数计算机用户未曾接触的事物。

在最近的一项研究中,微软发布了自己的深度学习程序生成研究。在该研究中,深度神经网络学会了遵从用户的意图来生成计算机程序。用户只需要提供一些简单的输入/输出(I/O)范例以表示自己希望获得的程序是什么形式的。系统就可以使用这些信息生成相应的程序。

例如:假设用户有一个名单,他/她希望将这个名单整理成特定格式,如下图所示。这名用户仅需要向系统提供一些输入-输出的例子,随后系统就会自动填充剩下的输出(在图中以灰色显示)。在一些数据量很大的工作中,这种方法可以为用户节约大量时间。

640.png

该系统通过域特定语言(domain specific language,DSL)生成用于执行任务的程序,用户不需要理解 DSL 的所有细节。事实上,在使用过程中,用户完全不会看到编程的过程。在微软的 DSL 中,对应于上个例子的正确程序是:

Concat(
   ToCase(
       GetToken(           input,
          Type=Word,
          Index=-1),
      Type=Proper),
  Const(", "),
  ToCase(
      SubString(
        GetToken(             input,
            Type=Word,
            Index=1),
        Start=0,
        End=1),
      Type=Proper),
  Const("."))

自动生成程序面临着两个重大挑战。第一、DSL 表达程序有数以亿计的可能性,而用户真正需要的程序可能完全未曾在系统中出现过;第二、因为 I/O 例子是由人类手动输入的,这意味着其中可能经常会出现噪音(例如错字)。如上例所示,第二个输出例子中的 Uesato 被错写为 Useato 了。

在此之前解决这些问题的方法——最为人所知的就是 Excel 中的快速填充(FlashFill)功能——是依靠程序员手动编写的规则和启发方式来引导和搜索用户所需的程序。这种方式显然不能满足 DSL——这意味着数年的手动规则编写,而且最终的结果仍然对 I/O 例子的噪音非常敏感。

微软提出的新系统 RobustFill 采用了最近发展迅猛的深度学习方式,通过数据驱动方法进行程序生成,不需要任何手工编写的规则。与快速填充相反,它使用曾被用于机器翻译的「attentional sequence-to-sequence 神经网络」来通过 I/O 范例生成所需的程序。下图展示了微软的神经网络架构:

640-13.jpeg

这个系统经过了数百万随机生成的 I/O 程序配对的训练,学会了 DSL 中的语义学规则,目前已经可以在真实情况下的数据中展示良好的性能。总体而言,该系统在一个真实世界任务基准测试中达到了 92% 的准确率。其中最令人兴奋的是,在测试中,I/O 范例包含了一些明显的噪音,而系统仍然保持了高精度。


编程新启示


训练神经网络架构来学习一种带有丰富功能的程序语言(FlashFill DSL)不仅是神经语言生成的重大突破,也是走向通用人工智能的坚实一步。它解决了可解释性的关键挑战,也将我们引向了分布式链接形式的知识符号表示问题。

微软正致力于扩展这些 DSL 程序学习架构,试图加入状态变量和控制流程以生成更多种类的程序。研究人员相信他们正走在正确的道路上,未来的研究将指向有关程序生成和归纳的一系列基础技术问题。

论文:RobustFill: Neural Program Learning under Noisy I/O


640-14.jpeg


摘要


在人工智能发展的初期,有关自动生成计算机程序用于一些特定任务的尝试就已开始了。最近有两个自动学习程序的方式受到了人们的关注:1)神经程序生成,其中神经网络基于输入/输出(I/O)范例进行学习,并生成程序;2)神经程序归纳,其中神经网络通过隐藏的程序表示直接生成输出。

在本文中,我们第一次在大体量真实世界学习任务中比较了两种方式,同时也将这些方法与基于给定规则的程序生成方法进行了对比。我们的神经网络模型使用特定的 attention RNN 来处理不同大小的 I/O 配对集。我们的生成模型在真实世界数据的测试中达到了 92% 的准确率,而此前最好的神经网络生成方法只有 34% 准确率。生成模型的性能在这一测试中也优于归纳模型,但更重要的是我们证明了每种方法的性能高度依赖于评价标准和客户端形式。最后,我们的研究证明了人们可以训练神经网络模型在充满噪音的真实世界数据(如包含错字)中具有鲁棒性,而手动编写规则的系统完全无法与之相比。 机器之心icon.png


扩展阅读


原文链接:https://www.microsoft.com/en-us/research/blog/deep-learning-program-synthesis/?wt.mc_id=MCR_378116_FB1

声明:本文由机器之心编译出品,原文来自Microsoft Research blog,作者Rishabh Singh等,转载请查看要求,机器之心对于违规侵权者保有法律追诉权。