林泽琦作者

NeurIPS 2020 | AI编程:如何从复制粘贴走向推理合成

编者按:AI 编程是人们对人工智能的一大期望,现在的 AI 编程技术虽然已经惠及了许多不会编程的普通用户,但还远没有达到满足人们预期的程度,一大痛点在于:现有 AI 只会进行机械地记忆与复制粘贴,难以灵活处理人们的需求。微软亚洲研究院提出的新型神经网络架构 LANE(Learning Analytical Expressions)能够模拟人类的抽象化思维,从而在 AI 编程中获得组合泛化能力。

从 AI 编程说起


让 AI 学会写程序,是人们的普遍预期:直接用自然语言描述想干什么,AI 就能自动生成相应的程序。现有的 AI 编程技术显然还远达不到这种预期,但相关技术已然在各种特定领域中以更为广泛的形式惠及了大量不会编程的普通用户。例如,微软在 Ignite 2019 大会上展示了Excel 中的一项新功能[1]——只需要向 Excel 提问题,它就能自动理解并进行智能数据分析,并通过可视化图表的方式将结果呈现在你的眼前(如图1所示)。这个超实用功能背后的技术支撑正是一系列将自然语言转换为数据分析程序的 AI 编程技术。而另一个例子是微软 Semantic Machines 团队研发的智能对话服务,其产品化方案正是基于程序合成的[2]。

图1:Excel 中的对话式数据分析,基于 AI 编程技术本文所讨论的“AI 编程技术”,指的是以一个自然语言句子作为输入,自动生成一段相应的机器可解释/可执行的程序作为输出。这里的程序通常是由一个已知的 DSL(Domain Specific Language,领域特定语言)所编写。自然语言处理领域的研究者可能更熟悉这一任务的另一称谓:语义解析(Semantic Parsing)。

然而,即使是在这样的限定下,现有的 AI 编程技术也并不总能让人满意。一大痛点在于,它们似乎只学会了从已知的代码库中进行机械地记忆与复制粘贴,却难以为人类灵活多变的需求生成真正合适的程序。

图2:AI 编程现状以图2漫画(改编自[3])为例,当用户提出的需求相对简单,且这个 AI 编程机器人可以在某个大代码库中找到能够实现这一需求的程序时,效果通常是不错的。但是如果用户提出的需求相对复杂,要求 AI 编程机器人具有一定的推理能力(所需的程序在已知代码库中并不存在,需要对一些已有的程序片段进行复合生成),在这种情况下的效果通常是比较糟糕的。

本文所介绍的研究工作正是以此为出发点,旨在探索如何让 AI 编程机器人不再只会”复制粘贴”,而是学会类人的推理能力,从而更为有效地合成所需的程序。

组合泛化能力是走向类人 AI 的关键

前文所讨论问题的核心可以归结为 AI 系统的“组合泛化”(Compositional Generalization)能力问题。更通俗地说,就是 AI 系统是否具备“举一反三”的能力:能够将已知的复杂对象(即本文中所讨论的“程序”)解构为多个已知简单对象的组合,并据此理解/生成这些已知简单对象的未知复杂组合。

人类天生具有组合泛化能力。例如,对于一个从没接触过“鸭嘴兽”这个概念的人,只要看一张鸭嘴兽的照片,他就认识它了,并可以在脑海中很有画面感地理解一些复杂句子,比如“三只鸭嘴兽抱着蛋并排坐着”、“两只鸭嘴兽在河里捕食完小鱼之后开始上岸掘土”等。这和深度学习是很不同的,即使是为了学会“鸭嘴兽”这样一个单独的概念,深度学习都需要大量的标注数据,更不用说学会这个概念的各种复杂组合了。

语言学的角度看,人类认知的组合泛化能力主要体现在系统性(Systematicity)和生产性(Productivity)上。系统性可以简单理解为对已知表达式的局部置换。比方说,一个人已经理解了“鸭嘴兽”和“狗在客厅里”,那么他一定能够理解“鸭嘴兽在客厅里”。生产性则可以简单理解为通过一些潜在的普适规律,用相对简单的表达式构造出更复杂的表达式。比方说,一个人已经理解了“鸭嘴兽”和“狗在客厅里”,那么他一定能够理解“鸭嘴兽和狗在客厅里”。

图3:组合泛化能力主要体现在系统性(Systematicity)和生产性(Productivity)上(图片来源:https://arxiv.org/pdf/1908.08351.pdf)正如语言学家、哲学家乔姆斯基所说,“有限资源,作无穷运用(infinite use of finite means)”。正是依靠组合泛化能力,人类智能才能够从一些最基础的元素出发,一步一步创造出复杂甚至无限的语义世界。可以说,组合泛化是类人智能体必须具备的基本能力。

深度学习缺乏组合泛化能力

程序是具有组合性的,即使是一个很小的 DSL(领域很限定,语法很简单,预定义的函数很有限),也能够产生一个指数爆炸式的巨大程序空间。任何一个训练数据集中所包含的程序,都只是这个指数级程序空间中的冰山一角。因此,若一个 AI 编程机器人缺乏组合泛化能力,则必然会导致如前面漫画所体现的“人工智障”情况。

从这个角度出发,越来越多的研究工作开始重新审视现有的基于深度学习的 AI 编程解决方案。当前主流的解决方案大多基于深度编解码架构(Neural Encoder-Decoder Architectures)。纽约大学教授 Brenden Lake 和 Facebook AI 科学家 Marco Baroni 的一系列研究表明,现有的深度学习模型并不具有组合泛化能力[4]。图4简单展示了他们的研究方法。实验任务是将诸如“run after walk”这样的自然语言句子翻译成诸如“WALK RUN”这样的指令序列(程序)。

图4:即使是简单的任务,现有的深度学习模型也难以泛化到训练集之外的组合上表面上看,这是个非常简单的序列到序列生成任务。在收集到大量自然语言句子以及它们所对应的指令序列之后,随机划分成训练集和测试集,用现有的深度学习模型进行训练,即可在测试集上达到99.8%的准确率。然而,一旦从组合性的角度对训练集和测试集的划分方式加以约束,深度学习模型就不再有效。例如,为了验证模型的系统性,可以让模型在训练阶段除了“jump -> JUMP”之外不再接触任何与 jump 有关的样例,而在测试阶段去看模型是否能够在包含 jump 的句子(例如:“jump around left”)上做对。实验结果表明,在这样的设定下,深度学习模型仅能达到1.2%的准确率

另一方面,为了验证模型的生产性,则可以让模型在训练阶段只接触指令序列长度小于24的样例,而在测试阶段去看模型是否能够正确地生成长度不小于24的指令序列。实验结果表明,在这样的设定下,深度编解码网络仅能达到20.8%的准确率。诸如此类的一系列研究表明,现有的深度学习模型在语义解析任务上不具备组合泛化能力[4][5]。

在当前的工业实践中,从业者主要通过深度学习与人工规则的混合系统来缓解这一瓶颈(数据增广也可以归入其中,因为需要增广哪些数据通常也需要人工归纳)。本文想要探讨一种更有趣的思路:是否能够在深度学习中引入合适的归纳偏置,使之摆脱简单的记忆与模仿,也不需要引入人工规则,而是自动地探索、发现并归纳出数据集中内在的组合性规律,从而使端到端的深度神经网络具备组合泛化能力。

深度神经网络模拟人脑的抽象化思维

人类的认知之所以具备组合泛化能力,关键在于抽象化(Abstraction),即省略事物的具体细节,以减少其中所含的信息量,从而更有利于发现事物间的共性(规律)。

这种抽象化能力是一种代数能力,而这正是现有的深度神经网络所缺乏的。如图5左侧所示,对于 AI 编程任务,现有的深度神经网络更倾向于“死记硬背”:自然语言和程序语言被看作是两个集合,那么学习到的只能是具体的自然语言句子和具体的程序之间的简单映射关系,这样自然是难以做到组合泛化的。对于这一问题,关键思路在于,将自然语言和程序语言看作是两个代数结构,且需要让深度神经网络倾向于学习这两个代数结构之间的同态(如图5右侧所示)。

图5:不要学习集合之间的映射,改为学习代数结构之间的同态更形象地来说,如果训练数据中已经包含“run opposite walk”、“run after left”、 “walk twice”等样例,现在面对如下样例:

INPUT: “run opposite left after walk twice”

OUTPUT: “WALK WALK LTURN LTURN RUN”

深度学习模型的实质是记住诸如此类输入输出对之间的映射关系,而人类的认知则倾向于做出如图6所示的抽象化:

图6:相比于深度学习的直接记忆与模仿,人类思维更倾向于将具体对象层次化地抽象为具有共性的解析表达式图6的左侧自下而上地给出了对于作为输入的自然语言句子的抽象化过程。在第1、2、4步,分别剥离掉“run”、“left”和“walk”这三个单词的具体属性,将它们抽象为变量;在第3、5、6步,分别剥离掉“$x opposite $y”、“$y twice”和“$x after $y”这三个子句属性,也将它们抽象为变量。人类记住的并非输入与输出之间的直接映射,而是这一抽象化过程中每一步所产生的局部映射(如图6右侧所示)的集合。例如,在第1步中,将单词“run”映射到了程序“RUN”上;在第3步中,将抽象子句“$x opposite $y”映射到了程序“$Y $Y $X”。此处的“$X”是一个程序中的变量,指代自然语言中的变量“$x”所对应的程序;同样地,$Y$亦是一个程序中的变量,指代自然语言中的变量“$y”所对应的程序。

上述例子说明了,相比于直接记住相对复杂的具体映射,人类更倾向于从中归纳出相对简单的共性抽象映射,从而获得组合泛化能力。因此,为了让深度学习也获得组合泛化能力,需要设计一种能够模拟人类认知中的抽象化过程的新型神经网络架构。

将输入/输出的各个具体对象形式化,称为源域表达式(Source Expression, SrcExp)/目标域表达式(Destination Expression, DstExp),统称为表达式(Expression, Exp)。若表达式中的某个/某些子部分被替换为变量,则称这些带变量的表达式为解析表达式(Analytical Expression, AE)。同样地,解析表达式也可分为源域解析表达式(SrcAE)和目标域解析表达式(DstAE)。

对于每个输入的 SrcExp,神经网络架构需要通过若干次抽象化操作逐渐地将其转换为更简单的 SrcAE(如图6左侧所示)。在这一抽象化过程中,每个被置换为变量的 SrcAE 将被解析为一个 DstAE,最终由这些 DstAE 组合形成一个 DstExp 作为输出(如图6右侧所示)。模型需要以这种抽象化过程作为一种归纳偏置,在不依赖任何人工预定义的抽象/映射规则的前提下,完全自动化地完成对具体的抽象化过程与表达式映射的探索与学习。

LANE 的模型实现

新型的神经网络架构 LANE(Learning Analytical Expressions)能够在语义解析任务中模拟人类的抽象化思维,从而获得组合泛化能力。在之前的神经网络学习框架中,神经网络是直接被用来学习一个从具体的源字串(Source Token Sequence)到具体的目标串(Destination Token Sequence)的映射函数。而在 LANE 中,需要学习的是一个定义域和值域分别是由源字串抽象化后导出的解析表达式和目标串解析表达式的函数。

LANE 由两个神经网络模块构成:一个模块称为 Composer,由一个 TreeLSTM 模型实现,负责对输入的 SrcExp 进行隐式树状归纳(Latent Tree Induction),从而得到逐渐抽象简化的中间 SrcAE;另一个模块称为 Solver,负责在每次抽象发生时进行局部语义解析,将语义细节剥离并保留在记忆单元(Memory)中,从而使得后续处理过程中这些细节被简化为一个变量。

图7:LANE: 用神经网络学习隐式的解析表达式,以模拟人类的抽象化思维图7解释了 LANE 的工作流程,也展示了 LANE 如何处理图6中的第5步和第6步抽象。在第5步抽象化过程中,对于当前的 SrcAE “$x after $y twice”,Composer 基于树状 LSTM 输出下一步抽象动作:应该对“$y twice”这个局部进行抽象化。Solver 则使用一个深度编解码网络将“$y twice”解释为 DstAE “$Y $Y”,与原 Memory 中的“$Y = WALK”结合得到新变量所对应的 DstExp “WALK WALK”,并以此更新 Memory。经过这一过程,“$x after $y twice”中的“$y twice”这部分细节被剥离掉了,形成了一个抽象程度更高的 SrcAE “$x after $y”,进而可以开始第6步抽象。通过这样的方式,Composer 与 Solver 协同工作,LANE 将输入的 SrcExp 逐渐抽象为简化程度越来越高的 SrcAE,直到形成一个由单变量构成的最简 SrcAE。该变量在 Memory 中对应的取值即为最终输出的 DstExp。

由于 LANE 中包含不可求导的离散操作,因此可以基于强化学习(Reinforcement Learning)来实现模型的训练。模型训练有如下三个关键点:

1.    奖励(Reward)设计 。Reward 分为两部分:一部分是基于相似度的奖励,即模型生成的 DstExp 与真实的 DstExp 之间的序列相似度;另一部分是基于简洁度的奖励,它是受奥卡姆剃刀原则启发,用于鼓励模型生成更通用/简洁的解析表达式。由于这两个奖励的设计都没有刻意引入任务相关的特别知识,表明 LANE 应该具有很大的普适性。

2.    分层强化学习(Hierarchical Reinforcement Learning)。Composer 和 Solver 协同工作,但地位并不相同:Solver 的决策依赖于 Composer 的决策。因此,将 Composer 和 Solver 分别视作高层代理(High-level Agent)和底层代理(Low-level Agent),应用分层强化学习联合训练这两个模块。

3.    课程学习(Curriculum Learning)。为了加强探索效率,根据 SrcExp 的长度将数据划分为从易到难的多个课程。模型先在最简单的课程上进行训练,而后逐渐将更难的课程加入训练。

实验结果

Lake 等人建立了一套基准数据集 SCAN,用于评测语义解析系统的组合泛化能力[4]。该数据集上衍生出了多个子任务,用于度量不同方面的组合泛化能力。例如,ADD_JUMP 子任务用于度量模型是否能够处理新引入元素的组合;LENGTH 子任务用于度量模型是否能够生成超出训练数据中已知长度的组合。研究实验结果表明,LANE 在这些子任务上均达到了100%的准确度。

图8:LANE 在 SCAN 的各个子任务上均达到100%的准确度图9展示了 LANE 中的 Composer (TreeLSTM)学习得到的两个隐式树结构作为示例。TreeLSTM 在具体实现时是二叉化的,将具体进行抽象动作的结点着黑色。可以看到,即使并未引入任意人工预定义的抽象/映射规则,LANE 也能够自动化地探索出符合人类思维的抽象化过程。

图9:示例:LANE 学习得到的两个隐式树结构新型的端到端神经网络架构 LANE 能够模拟人类的抽象化思维能力,以此学习到数据中潜在的解析表达式映射,从而在 AI 编程(语义解析)任务中获得组合泛化能力。微软亚洲研究院的研究员们希望以此作为一个出发点,探讨深度学习如何由 “鹦鹉范式”(记忆与模仿)走向“乌鸦范式”(探索与归纳),从而延伸其能力边界。不过目前这还是初步的理论研究,想要应用到更复杂的任务中还需要很多后续工作(例如,提高训练效率、提高容错学习能力、与无监督方法结合等)。

论文:https://arxiv.org/abs/2006.10627

代码:https://github.com/microsoft/ContextualSP

参考文献

[1] 《智能数据分析技术,解锁Excel“对话”新功能》<https://www.msra.cn/zh-cn/news/features/conversational-data-analysis>

[2] 《对话即数据流:智能对话的新方法》<https://www.msra.cn/zh-cn/news/features/dialogue-as-dataflow>

[3] 《朋友送了我一个会编程的机器人,说程序员可以下岗了!!!》<http://dwz.date/dgNY>

[4] Brenden Lake, Marco Baroni. Generalization without Systematicity: On the Compositional Skills of Sequence-to-Sequence Recurrent Networks. 2018. <https://arxiv.org/abs/1711.00350>.

[5] Daniel Keysers, et al. Measuring Compositional Generalization: A Comprehensive Method on Realistic Data. 2019. <https://arxiv.org/abs/1912.09713>

微软研究院AI头条
微软研究院AI头条

专注科研19年,盛产黑科技

理论NeurIPS 2020
相关数据
微软亚洲研究院机构

微软亚洲研究院于1998年在北京成立,是微软公司在亚太地区设立的基础及应用研究机构,也是微软在美国本土以外规模最大的一个研究院。微软亚洲研究院从事自然用户界面、智能多媒体、大数据与知识挖掘、人工智能、云和边缘计算、计算机科学基础等领域的研究,致力于推动计算机科学前沿发展,着眼下一代革命性技术的创新,助力微软实现长远发展战略。通过与微软产品部门紧密合作,微软亚洲研究院将众多创新技术转移到了微软的核心产品中,如Office、Windows、Azure、Bing、Visual Studio、Xbox Kinect以及小冰、Cortana和Microsoft Translator等人工智能产品。

https://www.msra.cn/
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

分层强化学习技术

分层强化学习是强化学习领域中的一个分支。传统强化学习通过与环境的交互,进行试错(trial-and-error),从而不断优化策略(policy)。但是强化学习的一个重要不足就是维数灾难 (curse of dimensionality),当系统状态(state)的维度增加时,需要训练的参数数量会随之进行指数增长,这会消耗大量的计算和存储资源。 分层强化学习将复杂问题分解成若干子问题(sub-problem),通过分而治之(divide and conquer)的方法,逐个解决子问题从而最终解决一个复杂问题。这里的子问题分解有两种方法:①所有的子问题都是共同解决被分解的任务(share tasks);②不断把前一个子问题的结果加入到下一个子问题解决方案中(reuse tasks)。分层强化学习核心思想是通过算法结构设计对策略(policy)和价值函数(value function)施加各种限制(constraints),或者使用本身就可以开发这种限制的算法。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

奥卡姆剃刀技术

奥卡姆剃刀,又称“奥坎的剃刀”,拉丁文为lex parsimoniae,意思是简约之法则,是由14世纪逻辑学家、圣方济各会修士奥卡姆的威廉提出的一个解决问题的法则,他在《箴言书注》2卷15题说“切勿浪费较多东西,去做‘用较少的东西,同样可以做好的事情’。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

序列到序列技术

强化学习技术

强化学习是一种试错方法,其目标是让软件智能体在特定环境中能够采取回报最大化的行为。强化学习在马尔可夫决策过程环境中主要使用的技术是动态规划(Dynamic Programming)。流行的强化学习方法包括自适应动态规划(ADP)、时间差分(TD)学习、状态-动作-回报-状态-动作(SARSA)算法、Q 学习、深度强化学习(DQN);其应用包括下棋类游戏、机器人控制和工作调度等。

深度神经网络技术

深度神经网络(DNN)是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。

语言学技术

每种人类语言都是知识和能力的复合体,语言的使用者能够相互交流,表达想法,假设,情感,欲望以及所有其他需要表达的事物。语言学是对这些知识体系各方面的研究:如何构建这样的知识体系,如何获取,如何在消息的制作和理解中使用它,它是如何随时间变化的?语言学家因此关注语言本质的一些特殊问题。比如: 所有人类语言都有哪些共同属性?语言如何不同,系统的差异程度如何,我们能否在差异中找到模式?孩子如何在短时间内获得如此完整的语言知识?语言随时间变化的方式有哪些,语言变化的局限性是什么?当我们产生和理解语言时,认知过程的本质是什么?语言学研究的就是这些最本质的问题。

程序合成技术

在计算机科学中,程序合成是自动构建满足给定高级规范的程序的任务。

暂无评论
暂无评论~