http://mp.weixin.qq.com/s/snLSydwgKHZnQbm975PY7A
7月18日,第一文:
深度学习:从几何角度
深度学习最令人惊讶的是,它是多么的简单。十年前,没有人敢预计,通过使用梯度下降训练的简单参数模型,我们能够在机器感知问题上实现如此惊人的结果。现在,事实证明,我们需要的是,足够大的参数模型利用梯度下降训练足够多的样本。
在深度学习中,一切都是一个向量,即一切都是几何空间中的一个点。模型输入(它可以是文本、图像等)和目标首先被“向量化”,即变成一些初始输入向量空间和目标向量空间。深度学习模型中的每个层都对通过它的数据进行一个简单的几何变换。同时,模型的层链形成一个非常复杂的几何变换,分解成一系列简单的几何变换。这种复杂的转换尝试将输入空间映射到目标空间,一次一个点。该变换由层的权重进行参数化,这些层根据模型当前执行的程度进行迭代更新。这种几何变换的一个关键特征是,它必须是可微分的,这是为了使我们能够通过梯度下降,这是学习其参数所必需的。直观地讲,这意味着从输入到输出的几何变形必须是平滑和连续的——这是一个重要的约束。
将这种复杂的几何变换应用到输入数据的整个过程,可以通过想象一个试图弄平一张褶皱的纸球的人,在三维中的可视化进程:皱巴巴的纸是模型开始的输入数据的多余部分;由纸上的人操作的每个动作都与一层操作的简单几何变换相似;完整的手势的序列是整个模型的复杂变换;深度学习模型是用于解决高维数据的复杂流形的数学机器。
这就是深度学习的魔力:将意图转化为向量,转化为几何空间,然后逐步学习将一个空间映射到另一个空间的复杂几何变换。所有你需要的是,具有足够高维度的空间,以便捕获在原始数据中找到的关系的全部范围。
深度学习的局限性
可以通过这种简单的策略实现的应用空间几乎是无限的。然而,深度学习技术还有更多的应用是目前完全无法实现的,即使有大量的人为注释的数据。比方说,你可以组合一个数据,数十万甚至数百万的英文语言描述软件产品的功能,该说明由产品经理编写,同时由一个团队开发的相应的源代码工程师满足这些要求。即使有这些数据,你也无法训练一个深度学习模型,简单地读取产品描述,并生成相应的代码库。这只是其中的一个例子。一般来说,无论你投入多少数据,只要是任何需要推理的东西,比如编程,或应用科学方法,或是类似算法的数据操作,都无法使用深度学习模型。即使学习一个具有深度神经网络的分类算法也是非常困难的。
这是因为,一个深度学习模型是“简单的”连续的几何变换链,将一个向量空间映射到另一个空间。所有它会做的是,将一个数据流形X映射到另一个流形Y,假设存在从X到Y的可学习的连续变换,以及X:Y的密集采样的可用性作为训练数据。所以,即使一个深度学习模型可以被解释为一种程序,相反的是,大多数程序不能表示为深度学习模型——对于大多数任务,要么没有相应的实际大小的深度神经网络来解决任务,要么即使存在,它可能不可学习,即相应的几何变换可能太复杂,或者可能没有可用的数据来学习它。
通过堆叠更多层次、使用更多的训练数据,以扩展当前的深度学习技术,只能表面缓解其中的一些问题。深度学习模型可以表述的东西非常有限,而且大多数希望学习的程序不能被表达为数据流的连续的几何变形,这不能解决根本问题。
拟人机器学习模型的风险
人工智能目前具有的一个非常真实的风险——人们误解了深度学习模型,并高估了它们的能力。人类思想的一个根本特征是我们的“思想理论”,我们倾向于对我们周围的事物设计意向、信仰和知识。在岩石上画一个笑脸,突然让我们“开心”。应用于深度学习,这意味着,例如,当我们能够成功地训练一个模型以生成描述图片的说明时,我们误认为该模型“理解”了图片的内容以及图片它生成的内容。但是,当训练数据中存在的图像中轻微的偏离,使得模型开始生成完全荒谬的说明时,我们又非常惊讶。
案例:这个“男孩”正拿着一个“棒球棒”(正确说明应该是“这个女孩正拿着牙刷”)
特别需要说明的是,我们要强调一下“对抗样本”,它是深度学习网络的输入样本,旨在欺骗模型进行错误分类。你已经意识到,可以在输入空间中进行梯度上升,以生成最大限度地激活某些卷积网络过滤器的输入。类似地,通过梯度上升,可以稍微修改图像,以便最大化给定类的类预测。通过拍摄一只熊猫,并添加一个“长臂猿”梯度,我们可以得到一个神经网络将这只熊猫分类为长臂猿。这证明了这些模型的脆弱性,以及它们运行的输入到输出映射与我们自己的人类感知之间的深刻差异。
简而言之,深度学习模型对他们的输入没有任何理解,至少在任何人类意识层面上没有。我们对图像、声音和语言的理解基于我们的感觉运动经验。机器学习模型是无法获得这种经验的,因此不能以任何人为本的方式“理解”他们的输入。通过注释大量的训练示例,填充我们的模型,我们让他们学习几何变换,将数据映射到这个特定的一组示例上的人类概念,但是这个映射只是我们脑子中原始模型的简单草图,从我们的经验中开发出来的具体智能体——就像一面镜子中的一个昏暗的形象。
作为一名机器学习从业者,始终要注意这一点,而不要陷入陷阱,认为神经网络了解他们所执行的任务——他们不会的,至少不会对我们有什么意义。他们接受了不同于我们教给他们的、不同的、更有限的任务训练:仅将训练输入点对点地映射到训练目标。如何向他们展示任何偏离训练数据的东西,他们将以最荒谬的方式被打破。
局部泛化与极端泛化
在深度学习模型所做的输入与输出之间的简单的几何变形,以及人类思考和学习的方式之间似乎存在着根本的区别。人类不仅提供了具体的体验感,而且还提供了明确的训练实例。除了不同的学习过程之外,底层表征的性质存在着根本的区别。
人类的能力可远比应激反应,比如深度网络或者也许是昆虫复杂多了。他们对自己目前的状况,对自己的情况提取复杂、抽象的模型,并且可以使用这些模型预测未来不同的可能性,并执行长期规划。他们有能力将已知概念融合在一起,以代表以前从未经历过的事情——比如说想象穿牛仔裤的马,或想象如果他们赢得彩票,他们会做什么。这种处理假设的能力,扩展我们的心理模型空间远远超出了我们可以直接体验到的一切,执行抽象和推理过程,这可以说是人类认知的特征。我称之为“极端泛化”:适应异常的、在情境之前从未经历过、使用非常少的数据,甚至没有新数据得能力。
这与深度网络形成了鲜明的对比,我称之为“局部泛化”:如果新的输入与训练时间内的差异甚微,则从深度网络输入到输出的映射快速停止。例如,给定学习适当的发射参数,以使得火箭登陆月球的问题。如果你使用深度网络进行此项任务,无论是使用监督学习还是强化学习进行训练,都需要数千,甚至数百万次的启动试验样本,即你需要将其暴露给输入空间的密集采样,以便学习从输入空间到输出空间的可靠映射。相比之下,人类可以利用他们的抽象力来提出物理模型,并得出一个精确的解决方案,只需一次或几次试验即可成功试射火箭。同样,如果你开发出一个控制人体的深度网络,并希望它学会安全地通过一座城市,而不会受到汽车的撞击,那么该网络会导致该人体在多种情况下都要死亡数千次,直到可以推断出这辆车和危险的,并制定适当的回避行为。进入一个新城市,网络必须重新学习大部分的知识。另一方面,人类能够学习安全行为,而不必再次死亡,这要归功于假设情境的抽象建模。
简而言之,尽管我们在机器感知方面取得了进步,但我们仍然离类人AI非常远:我们的模型只能执行局部泛化,适应与过去数据非常相似的新情况,而人类认知能够极端泛化,迅速适应新奇的情况,或为长期未来的情况进行规划。
这就是你应该记住的:迄今为止,深度学习唯一真正的成功是,使用连续的几何变换将空间X映射到空间Y的能力,给出了大量的人为标注的数据。基本上,做好这一切,是改变每个行业的游戏规则,但从类人AI的角度来看,仍然有很长的路要走。
为了解决这些限制,并开始与人类大脑进行竞赛,我们需要简单的输入到输出的映射,以及推理和抽象能力上的进步。对各种情况和概念进行抽象建模的基础是计算机程序。我们以前说过,机器学习模型可以被定义为“可学习的程序”;目前,我们只能学习属于所有可能程序的一个非常狭窄和特定子集的程序。但是,如果我们可以以模块化和可重复使用的方式学习任何程序怎么办?让我们在下一篇文章中看到未来可能是什么样子的。
7月19日,第二篇
鉴于我们已经了解深度网络的工作方式,局限性以及目前的研究情况,我们是不是就可以预测中期的发展方向吗?这仅仅是些纯粹的个人想法。请注意,我没有水晶球,所以我预期的很多可能不会成为现实。这仅仅是一篇关于猜测的文章。我之所以分享这些预测,并不是因为我希望这些猜测在未来被证明是完全正确的,而是因为现如今的它们确实是非常有趣和可行的。
从一个高层次上来讲,我看到那些具有前景的主要方向是:
更接近于通用计算机程序的模型,建立在比目前可微层更丰富的原始数据层之上,这就是我们将推理和抽象的方式,而这也是当前模型的根本弱点。
新形式的学习,从而使上述模型成为可能——允许模型从简单可微转换中脱离。
几乎不需要人力工程师参与的模型——无休止地调整旋钮不应该是你的工作。
更好地、更系统地重用以前学习的特征和架构;基于可重用和模块化程序子程序的元学习系统。
此外,请注意,这些考量不是特定于监督学习的,它是深度学习的基础,而是适用于任何形式的机器学习,包括无监督学习、自监督学习和强化学习。你的标签来自哪里或你的训练回路看起来如何,这些都不是很重要,机器学习的这些不同的分支只是同一结构的不同方面罢了。
我们一起来深入探索吧
模型作为程序
正如我们在文章前一部分所指出的那样,我们在机器学习领域所期望的必要的转型发展,是从纯模式识别的模型中脱离出来的,且它只能实现局部泛化,而对于那些能够抽象和推理的模型,才能实现极端泛化。目前那些具有基本形式推理能力的AI程序都是由人类程序员通过硬编码实现的:例如那些依赖于搜索算法、图形处理、形式逻辑的软件。比如在DeepMind的AlphaGo中,显示器上的大部分“智能”是由专家程序员(例如蒙特卡罗树搜索)进行设计和硬编码的;从数据中进行学习只发生在专门的子模块(价值网络和策略网络)中。但是在未来,这样的AI系统可能会被充分学习,而且没有人为参与。
那么,使这种情况发生的途径是什么呢?可以将众所周知的网络类型:RNN。很重要的一点是,RNN的局限性要远小于前馈网络。这是因为RNN不仅仅是几何变换:它们是在for循环内重复应用的几何变换。时间循环本身是由人类程序开发人员通过硬编码实现的:它是网络的内置假设。当然,RNN在它们可以表征的方面仍然具有一定的局限性,主要是因为它们执行的每个步骤仍然只是一个可微的几何变换,并且它们从步骤到步骤中传递信息的方式是通过连续几何空间(状态向量)中的点实现的。现在,想象一下神经网络将以类似于编程基元的方式“增加”,诸如for循环,但不仅仅是一个带有硬编码几何存储器的硬编码循环,而是一组大量的编程原语,该模型可以自由地操纵以扩展其处理函数,例如分支、语句、变量创建、长期内存的磁盘存储、排序运算符、高级数据结构(如列表,图形)等等。像这样一个网络可以代表的程序空间将远大于当前深度学习模式所能表达的范围,且其中一些程序可以实现更高的泛化能力。
总而言之,我们将从具有“硬编码算法智能”(手动软件)且具有“学习几何智能”(深度学习)中脱离出来。而我们将会拥有一个提供推理和抽象能力的正式算法模块,以及一个提供非正式直觉和模式识别功能的几何模块。而整个系统将很少甚至没有人为参与。
在AI的相关子领域内,我认为可能要大规模腾飞的是程序合成,特别是神经程序合成。程序合成在于通过使用搜索算法(如遗传编程中的遗传搜索)自动生成简单的程序来探索可能程序的大空间。当找到符合所需规格的程序时,搜索便会停止,且通常作为一组输入—输出对的形式进行。正如你看到的那样,它是否高度让人联想到机器学习:它是否高度让人联想到机器学习:给出作为输入—输出对的“训练数据”,我们找到一个可以将输入与输出进行匹配的“程序”,并将其推广到新的输入。不同之处在于,我们不用在硬编码程序(神经网络)中学习参数值,而是通过离散搜索过程来生成源代码。
在未来几年内,我特别期望在这个子领域能够再次出现一些非常有趣的事情。特别是,我期望在深度学习和程序合成之间出现一个交叉子域,在这里我们不会以通用语言生成程序,而是生成神经网络(几何数据处理流)增加一组丰富的算法基元,如for循环等等。这应该比直接生成源代码要容易得多,而且它会大大扩展机器学习可以解决的问题的范围——我们可以自动生成给定适当训练数据的程序空间,符号AI和几何AI的混合。而当代RNN可以看作是这种混合算法—几何模型的史前祖先。
图:依赖于几何图元(图案识别、直觉)和算法原语(推理、搜索、存储)的学习程序。
超越反向传播和可微层
如果机器学习模型变得更像程序,那么它们将几乎不再是可区分的——当然,这些程序仍然会将连续的几何图层用作子程序,而这将是可以区分的,但是整个模型不会是这样。因此,使用反向传播来调整固定、硬编码网络中的权重值不能成为未来训练模型的首选方法——至少不能是全部。我们需要找出能够有效地训练不可微系统的方法。目前的方法包括遗传算法、“进化策略”、某些强化学习方法和ADMM(交替方向乘子算法)。当然,梯度下降不会在任何地方进行——梯度信息对于优化可微分参数函数将永远是有用的。但是,我们的模型肯定会变得越来越有野心,而不仅仅是可分辨的参数函数,因此它们的自动开发(“机器学习”中的“学习”)将不仅仅需要反向传播。
此外,反向传播是端到端的,这对于学习良好的链接变换来说是一件好事,但是计算效率较低,因为它不能充分利用深度网络的模块化。为了提高效率,可以考虑一个通用的配方:引入模块化和层次结构。因此,我们可以通过引入具有一些同步机制的解耦训练模块,以分级方式组织,从而使反向传播本身更具有效率。DeepMind最近在“合成梯度”方面的一些进展反映了这一策略。我希望在不久的将来在这方面将会有更多的进展。
人们可以想象,在未来,将有一个全局不可区分(但具有可差异性部分)的模型会被训练——使用的是无法利用梯度的有效搜索过程,而且可以更快地训练可微分部分,这一点可以通过通过使用一些更有效的反向传播版本的梯度来实现。
自动机器学习
未来,模型架构将被学习,而不是由工程师设计开发。学习架构自动与使用更丰富的原始图形和类似程序的机器学习模型配合使用。
目前,深入学习工程师的大部分工作就是用Python脚本发送数据,然后对深层网络的体系结构和超参数进行长时间的调优,以获得一个工作模型——甚至是获得最先进的模型,如果工程师如此雄心勃勃。不用说,这不是一个最佳的选择。但AI也可以帮助实现。不幸的是,数据修改部分很难自动化,因为它通常需要领域知识,以及对工程师想要实现的工作有明确的高层理解。然而,超参数调优是一个简单的搜索过程,我们已经知道工程师在这种情况下需要实现什么:它由被调谐的网络的损失函数定义。设置基本的“AutoML”系统已经是常见的做法,该系统将会照顾大部分的模型旋钮调谐。我甚至在几年前就建成了,甚至赢得Kaggle的比赛。
在最基本的层次上,这样的系统将简单地调整堆栈中的层的数量,包括它们的顺序以及每一层中的单元或过滤器的数量。这通常是使用诸如Hyperopt的库。但是我们也可以更加雄心勃勃,尝试从头开始学习一个适当的架构,尽可能少的约束。这可以通过加强学习,例如遗传算法。
另一个重要的AutoML方向是与模型权重一起学习模型架构。因为每次尝试一个稍微不同的架构时,都会从头开始训练一个新的模型,所以一个真正强大的AutoML系统将通过对训练数据的反馈来调整模型的特征,同时管理体系结构。消除所有计算冗余。这些方法已经开始出现,因为我正在写这些内容。
当这种情况开始发生时,机器学习工程师的工作不会消失,而是工程师将在价值创造链上走高。他们将开始更多地努力制定真正反映业务目标的复杂损失函数,并深入了解他们的模型如何影响其部署的数字生态系统(例如,消费模型预测并生成模型的培训数据的用户)——目前只有最大的公司才能考虑的问题。
终身学习和模块化子程序重用
如果模型变得更加复杂,并且建立在更丰富的算法原语之上,那么这种增加的复杂性将需要更高的任务之间的重用,而不是每当我们有一个新的任务或一个新的数据集从头开始训练一个新的模型。实际上,很多数据集不会包含足够的信息来从头开发新的复杂模型,而且有必要利用来自先前遇到的数据集的信息。就像你每次打开新书时都不会从头开始学习英语——这是不可能的。此外,由于当前任务与以前遇到的任务之间的重叠很大,每个新任务的训练模型都是非常低效的。
此外,近年来重复出现的一个明显的现象是,同一个模型同时进行多个松散连接的任务,结果是模型更好地执行每组任务。例如,训练相同的神经机器翻译模型来涵盖英语到德语的翻译,和法语到意大利语的翻译,将导致模型更好的翻译每组语言。与图像分割模型联合训练图像分类模型,共享相同的卷积基,形成两个任务更好的模型,等等。这是相当直观的:在这些看似断开连接的任务之间总是存在一些信息重叠,因此,联合模型可以访问比仅针对该特定任务训练的模型更多的关于每个单独任务的信息。
我们目前沿着跨任务的模型重用方式做的是将预先训练的权重用于执行常见功能的模型,如视觉特征提取。在将来,我期望这样的一般版本是常见的:我们不仅将利用以前学习的功能(子模型权重),还可以利用模型架构和培训程序。随着模型越来越像程序,我们将开始重用程序子程序,如人类编程语言中的功能和类。
想想今天的软件开发过程:一旦工程师解决了一个特定的问题(例如Python中的HTTP查询),他们将把它打包成一个抽象的和可重用的库。未来面临类似问题的工程师可以简单地搜索现有的库,下载并在自己的项目中使用它们。以类似的方式,将来,元学习系统将能够通过筛选高级可重用块的全局库来组装新程序。当系统发现自己为几个不同的任务开发类似的程序子程序时,如果会出现一个“抽象的”可重用的子程序版本,并将它存储在全局库中。这样的过程将实现抽象的能力,这是实现“极端泛化”的必要组件:被发现在不同任务和域中有用的子程序可以说是“抽象化”问题解决的一些方面。“抽象”的定义与软件工程中抽象的概念相似。这些子程序可以是几何的(具有预先训练的表示的深度学习模块)或算法(更靠近当代软件工程师操作的库)。
图:一个能够使用可重用原语(包括算法和几何)快速开发任务特定模型的元学习者,从而实现“极端泛化”。
总结:长远愿景
简而言之,这是我对机器学习的长远愿景:
模型将更像是程序,并且具有远远超出我们目前使用的输入数据的连续几何变换的能力。这些程序可以说是更接近于人类对周围环境和自身的抽象思维模式,而且由于其丰富的算法性质,它们将具有更强的泛化能力。
特别是,模型将混合提供正式推理、搜索和抽象能力的算法模块,几何模块提供非正式的直觉和模式识别功能。 AlphaGo(一个需要大量手动软件工程和人工设计决策的系统)提供了一个早期的例子,说明象征和几何AI之间的混合可能是什么样的。
它们将自行生长,而不是由人类工程师手动制作,使用存储在可重复使用子程序的全局库中的模块化部件,这是通过在数千个以前的任务和数据集上学习高性能模型而演变的库。由于常见的问题解决模式是通过元学习系统来识别的,它们将变成可重用的子程序,非常像当代软件工程中的功能和类,并被添加到全局库中。如此就实现了抽象的能力。
这个全局库和相关的模式增长系统将能够实现某种形式的人类“极端泛化”:给定一个新的任务,一个新的情况,该系统将使用非常少的数据组装适合于任务的新的工作模型,由于1)丰富的程序样的原语泛化很好,2)丰富的类似任务的经验。以同样的方式,人类可以学习使用很少的播放时间播放一个复杂的新视频游戏,因为他们有许多以前的游戏的经验,并且因为从以前的经验得出的模型是抽象和程序的,而不是促进和行动之间的一个基本映射。
因此,这种永久学习的模式增长系统可以被解释为AGI—通用人工智能。但不要指望任何奇异的机器人启示录即将发生:这是一个纯粹的幻想,来自长期的一系列对智力和技术的深刻误解。但是,这篇评论文章并不属于它。