过去几十年间计算科学领域取得了长足进展,但编写计算机软件的实操过程却没有根本性转变——程序员必须使用专门的编程语言,以手工方式一步一步地精确编写程序中各项算法逻辑。尽管多年来编程语言变得越来越友好,但是学习如何编程仍然令大多数计算机用户望而却步。
在一篇新近发表的论文中,我们展示了将深度学习用于程序合成的最新研究成果,试图让深层神经网络学习根据用户意图生成计算机程序。用户只需提供几个输入/输出(I/O)示例来指定所期望的程序行为,系统则据此生成相应的程序。
假设用户希望以特定方式对名单进行格式整理(如下所示)。他只需提供几个输入/输出示例,系统就会自动填充剩余的输出(以浅灰色显示)。如果用户需要处理成百上千个输入字符串,这个程序可以节省大量时间。
该系统采用领域专用语言(DSL)来生成程序。用户无需了解DSL的细节——实际上他根本看不到程序的内容。在我们的DSL中,对应于上述示例的正确程序是:
程序合成中存在两大关键性难点。首先,在我们的表达性DSL中存在数以万计种可能的程序,而其中的正确程序可能是系统从未见过的。其次,由于I/O示例是由真人手工生成的,所以它们通常包含噪声(例如拼写错误等),如上例所示(在第二个输出示例中,Useato被拼错为Uesato)。
以前,解决这个问题的方法(其中最著名的要数微软Excel的FlashFill系统)是依靠手工编写的规则来引导启发式搜索。然而,这种方法使得DSL的能力很难扩展,不仅需要数年积累的手动规则编写,而且对I/O示例中的任何噪声都非常敏感。
而我们的系统RobustFill则利用了深度学习的最新成果,以数据驱动的方式进行程序合成,无需任何手工编写的规则。相反,它借助最先用于语言翻译的注意力型序列到序列神经网络 (attentionalsequence-to-sequence neuRal netwoRk),以I/O示例为依据生成程序。我们所用神经网络的草图如下,图中提供了详细信息。
我们用了数百万个随机生成的I/O+程序对来对系统加以训练,而且由于能够学习DSL语义,它在现实世界的数据上也有着良好表现。总体而言,我们的系统在一系列真实基准上实现了92%的准确性。特别令人鼓舞的是,即使I/O示例包含显著的噪音,系统也能够保持较高的精确度。
对编程的启示
训练神经网络学习用复杂的函数式语言(FlashFill DSL)进行编程取得成功,这一突破也是朝着实现更为通用的人工智能迈出了虽小却值得关注的一步。它解决这不仅标志着神经程序合成方面一个令人兴奋了纳入可解释性这一关键挑战,而且还触及到将知识的分布式表达与符号式表达相关联的重要课题。
我们目前正在扩展这些神经网络,学习用包含状态变量和控制流的DSL所编写的程序,以期生成更丰富的程序类别。我们认为,沿着这个方向进一步研究,将要求我们去进一步了解和处理程序合成及归纳方面所涉及的最基础的技术问题。