人工智能python实现-深度学习的未来

9.3 深度学习的未来
9.3.1 模型即程序
9.3.2 超越反向传播和可微层
9.3.3 自动化机器学习
9.3.4 终身学习与模块化子程序复用
9.3.5 长期愿景

9.3 深度学习的未来

本节的内容更加带有推测性,其目的在于为希望加入研究项目或开始独立研究的人开拓视野。根据已知的深度网络的工作原理、局限性及其研究现状,我们能否预测未来一段时间内事情的发展趋势?下面是一些纯个人想法。注意,我并没有水晶球,所以很多预测可能都无法实现。之所以分享这些预测,并不是因为我希望它们在未来被证明是完全正确的,而是因为这些预测很有趣,而且现在就可以付诸实践。

从较高层面来看,我认为下面这些重要方向很有前途。

  • 与通用的计算机程序更加接近的模型,它建立在比当前可微层要更加丰富的原语之上。这也是我们实现推理和抽象的方法,当前模型的致命弱点正是缺少推理和抽象。
  • 使上一点成为可能的新学习形式,这种学习形式能够让模型抛弃可微变换。
  • 需要更少人类工程师参与的模型。不停地调节模型不应该是我们的工作。
  • 更好地、系统性地重复使用之前学到的特征和架构,比如使用可复用和模块化子程序的元学习系统。

此外请注意,到目前为止,监督学习已成为深度学习的基本内容,这些思考并不仅针对于监督学习,而是适用于任何形式的机器学习,包括无监督学习、自监督学习和强化学习。标签来自哪里或训练循环是什么样子,这些都不重要,机器学习这些不同的分支是同一概念的不同方面。我们来具体看一下。

9.3.1 模型即程序

正如上一节所述,我们可以预测机器学习领域的一个必要转型是,抛弃只能进行纯模式识别并且只能实现局部泛化的模型,转而研究能够进行抽象和推理并且能够实现极端泛化的模型。目前的人工智能程序能够进行基本形式的推理,它们都是由人类程序员硬编码的,如依赖于搜索算法、图操作和形式逻辑的软件。比如 DeepMind的  AlphaGo,它所展示的大部分智能都是由专业程序员设计和硬编码的(如蒙特卡洛树搜索),从数据中进行学习只发生在专门的子模块中(价值网络与策略网络)。但在未来,这样的人工智能系统可以完全通过学习得到,不需要人类参与其中。

如何才能实现这一未来?我们来考虑一个众所周知的网络类型:循环神经网络(      RNN)。值得注意的是,RNN的局限性比前馈网络要略小。这是因为    RNN不仅仅是几何变换,它是在for循环内不断重复的几何变换。时序for循环本身就是由开发人员硬编码的,它是网络的内置假设。当然,RNN在能够表示的内容方面仍然非常有限,这主要是因为它执行的每一步都是一个可微的几何变换,从一步到另一步都是通过连续几何空间中的点(状态向量)来携带信息。现在想象一个神经网络,它用一种类似编程原语的方式得到了增强,但网络并不是单一硬编码的for循环,具有硬编码的几何记忆,而是包含大量的编程原语,模型可以自由地操作这些原语来扩展其处理功能,比如if分支、while语句、变量创建、长期记忆的磁盘存储、排序运算符、高级数据结构(如列表、图和散列表)等。这种网络能够表示的程序空间要远远大于当前深度学习模型的表示范围,其中某些程序还可以实现优秀的泛化能力。

一方面,我们将不再使用硬编码的算法智能(手工软件),另一方面,我们也不再使用学到的几何智能(深度学习)。相反,我们要将正式的算法模块和几何模块融合在一起,前者可以提供推理和抽象能力,后者可以提供非正式的直觉与模式识别能力。整个系统的学习过程只需要很少人参与,甚至不需要人参与。

我认为人工智能有一个与此相关的子领域即将迎来春天,它就是程序合成,特别是神经程序合成。程序合成是指利用搜索算法(在遗传编程中也可能是遗传搜索)来探索可能程序的巨大空间,从而自动生成简单的程序。如果找到了满足规格要求的程序(规格要求通常由一组输入 /输出对提供),那么搜索就会停止。这很容易让人联想到机器学习:给定输入  /输出对作为训练数据,我们找到一个程序,它能够将输入映射到输出,还能够泛化到新的输入。区别在于,我们通过离散的搜索过程来生成源代码,而不是在硬编码的程序(神经网络)中学习参数值。

我非常期待未来几年人们对这个子领域重新燃起兴趣。我特别期待在深度学习和程序合成之间出现一个交叉子领域,这一子领域不是用通用语言来生成程序,而是生成被大量丰富的算法原语(如for循环等)所增强的神经网络(几何数据处理流程),见图   9-5。与直接生成源代码相比,这种方法应该更加容易处理,也更加有用,它将大大扩展机器学习所能解决问题的范围(即给定适当的训练数据,我们能够自动生成的程序空间的范围)。当代 RNN可以看作这种算法  – 几何混合模型的鼻祖。

图 9-5 一个依赖于几何原语(模式识别、直觉)和算法原语(推理、搜索、记忆)的学习程序

9.3.2 超越反向传播和可微层

如果机器学习模型变得更像程序,那么通常就不再是可微的了。这些程序仍然使用连续的几何层作为子程序,这些子程序是可微的,但整个模型是不可微的。因此,使用反向传播在固定的硬编码的网络中调节权重值,可能不是未来训练模型的首选方法,至少不会只用这种方法。我们需要找到能够有效地训练不可微系统的方法。目前的方法包括遗传算法、进化策略、某些强化学习方法和交替方向乘子法(ADMM)。当然,梯度下降也不会被淘汰,梯度信息对于可微的参数化函数的最优化总是很有用的。但我们的模型会变得越来越不满足于可微的参数化函数,因此模型的自动开发(即机器学习中的学习)需要的也不仅仅是反向传播。

此外,反向传播是端到端的,这对于学习良好的链式变换是很有用的,但它没有充分利用深度网络的模块化,所以计算效率很低。为了提高效率,有一个通用的策略:引入模块化和层次结构。因此,我们可以引入解耦的训练模块以及训练模块之间的同步机制,并用一种层次化的方式来组织,从而使反向传播更加高效。  DeepMind最近关于合成梯度的工作就稍稍反映了这种策略。我希望在不远的将来,人们在这一方向上能走得更远。我可以设想的一个未来就是,模型在全局上是不可微的(但部分是可微的),我们使用一种有效的搜索过程(不使用梯度)来训练(生长)模型,而可微的部分则利用更高效版本的反向传播得到的梯度进行训练,其训练速度更快。

9.3.3 自动化机器学习

未来,模型架构将是通过学习得到的,而不是由工程师人为设计的。学习架构与使用更丰富的原语、类似程序的机器学习模型是密切相关的。

目前,深度学习工程师的大部分工作都是用 Python脚本整理数据,然后花很长时间调节深度网络的架构和超参数,以得到一个有效模型。如果这名工程师有野心,他可能还想得到一个最先进的模型。毫无疑问,这种方法肯定不是最佳的,但人工智能可以提供帮助。只是数据整理很难实现自动化,因为这一步通常需要领域知识,还需要对工程师想要实现的目标有一个清晰、深刻的理解。但是,超参数调节是一个简单的搜索过程,我们也知道在这种情况下工程师想要实现的目标,它由所调节网络的损失函数来定义。建立基本的自动化机器学习(AutoML)系统已经是很常见的做法。多年前我甚至也建立过自己的 AutoML系统,用来赢得 Kaggle竞赛。

在最基本的层面上,这样的自动化机器学习系统可以调节堆叠的层数、层的顺序以及每一层中单元或过滤器的个数。这通常使用 Hyperopt等库来实现,我们在第  7章介绍过。但我们还可以更有野心,尝试从头开始学习合适的架构,让约束尽可能少,比如可以通过强化学习或遗传算法来实现。

另一个重要的自动化机器学习方向是联合学习模型架构和模型权重。我们每次尝试一个略有不同的架构,都要从头训练一个新模型,这种方法是极其低效的,因此,真正强大的自动化机器学习系统,在训练数据上进行反向传播来调节模型特征的同时,还能够不断调节其模型架构。在我写到本节内容时,这种方法已经开始出现了。

这种方法出现之后,机器学习工程师的工作并不会消失;相反,工程师会做更多具有创造价值的工作。他们开始投入更多精力来设计可以真实反映业务目标的复杂的损失函数,还可以深入理解模型如何影响它们所部署的数字生态系统(比如,消费模型预测并生成模型训练数据的用户),目前只有那些最大的公司才有精力考虑这些问题。

9.3.4 终身学习与模块化子程序复用

如果模型变得更加复杂,并且构建于更加丰富的算法原语之上,对于这种增加的复杂度,需要在不同的任务之间实现更多的复用,而不是每次面对一个新任务或新数据集时,都从头开始训练一个新模型。许多数据集包含的信息都不足以让我们从头开发一个复杂的新模型,利用以往数据集中包含的信息是很必要的(就像你每次打开一本新书时,也不会从头开始学习英语——那是不可能的)。每开始一个新任务都从头训练模型也是非常低效的,因为当前任务与之前遇到的任务有很多重复之处。

近年来有一个反复出现的观察结果值得注意:训练同一个模型同时完成几个几乎没有联系的任务,这样得到的模型在每个任务上的效果都更好。例如,训练同一个神经机器翻译模型来实现英语到德语的翻译和法语到意大利语的翻译,这样得到的模型在两组语言上的表现都变得更好。同样,联合训练一个图像分类模型和一个图像分割模型,二者共享相同的卷积基,这样得到的模型在两个任务上的表现都变得更好。这是很符合直觉的:看似无关的任务之间总是存在一些信息重叠,与仅在特定任务上训练的模型相比,联合模型可以获取关于每项任务的更多信息。

目前,对于不同任务之间的模型复用,我们使用执行通用功能(比如视觉特征提取)的模型的预训练权重。第 5章介绍过这种用法。未来我希望这种方法的更一般的版本能够更加常见:我们不仅重复使用之前学到的特征(子模型权重),还会重复使用模型架构和训练过程。随着模型变得越来越像程序,我们将开始重复使用程序的子程序(program  subroutine),就像重复使用人类编程语言中的函数和类那样。

想想如今的软件开发过程:每当工程师解决了一个具体问题(比如 Python中的  HTTP查询),他们就会将其打包成一个抽象的、可复用的库。日后面临类似问题的工程师可以搜索现有的库,然后下载,并在自己的项目中使用。同样,在未来,元学习系统能够在高级可复用模块的全局库中筛选,从而组合成新程序。如果系统发现自己对几个不同的任务都开发出了类似的子程序,那么它可以对这个子程序提出一个抽象的、可复用的版本,并将其存储在全局库中(见图 9-6)。这一过程可以实现抽象,抽象是实现极端泛化的必要组件。如果一个子程序在不同任务和不同领域中都很有用,我们可以说它对解决问题的某些方面进行了抽象化(abstract)。这个抽象的定义与软件工程中的抽象概念类似。这些子程序可能是几何子程序(带有预训练表示的深度学习模块),也可能是算法子程序(更接近于当代软件工程师所操作的库)。

图 9-6 元学习器能够使用可复用原语(包括算法原语和几何原语)来快速开发针对任务特定的模型,从而实现极端泛化

9.3.5 长期愿景

简而言之,以下是我对机器学习的长期愿景。

  • 模型将变得更像程序,其能力将远远超出我们目前对输入数据所做的连续几何变换。这些程序可以说是更加接近于人类关于周围环境和自身的抽象心智模型。因为它们具有丰富的算法特性,所以还具有更强的泛化能力。
  • 具体而言,模型将会融合算法模块与几何模块,前者提供正式的推理、搜索和抽象能力,后者提供非正式的直觉和模式识别能力。 AlphaGo(这个系统需要大量的手动软件工程和人为设计决策)就是这种符号人工智能和几何人工智能融合的一个早期例子。
  • 通过使用存储在可复用子程序的全局库(这个库随着在数千个先前任务和数据集上学习高性能模型而不断进化)中的模块化部件,这种模型可以自动成长(grow),而不需要人类工程师对其硬编码。随着元学习系统识别出经常出现的问题解决模式,这些模式将会被转化为可复用的子程序(正如软件工程中的函数和类),并被添加到全局库中。这样就可以实现抽象。
  • 这个全局库和相关的模型成长系统能够实现某种形式的与人类类似的极端泛化:给定一个新任务或新情况,系统使用很少的数据就能组合出一个适用于该任务的新的有效模型,这要归功于丰富的类似程序的原语,它具有很好的泛化能力,还要归功于在类似任务上的大量经验。按照同样的方法,如果一个人具有很多以前的游戏经验,那么他可以很快学会玩一个复杂的新视频游戏,因为从先前经验得到的模型是抽象的、类似程序的,而不是刺激与行动之间的简单映射。
  • 因此,这种永久学习的模型生长系统可以被看作一种通用人工智能(AGI,artificial  general intelligence)。但是,不要指望会出现奇点式的机器人灾难,那纯粹只是幻想,来自于人们对智能和技术的一系列深刻误解。不过对这种观点的批判不属于本书的范畴。

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表评论

邮箱地址不会被公开。