Keras作者Chollet谈深度学习的未来:自动调参,极端泛化

2018-03-28 15:33:22 浏览数 (1)

王小新 编译自 Keras Blog 量子位 出品 | 公众号 QbitAI

Francois Chollet是深度学习框架Keras库的作者和谷歌人工智能研究员。近期,他在博客上连发两文,分别讨论了深度学习的理论局限和未来发展方向。

量子位昨天推送了第一篇《 Keras作者、谷歌研究员Chollet:深度学习的理论局限 》。

本文为第二篇,Chollet结合他的深度学习书Deep Learning with Python第9章第3节,在下文细致地讨论了深度学习的未来发展方向。

《深度学习的理论局限》一文加深了我们对深度神经网络机理的理解,进一步了解目前的技术局限性和研究现状,那么我们能预测到深度学习在短期内的可能发展方向吗?

下面纯粹是一些个人见解。需要注意的是,以下内容是根据现有技术进行的一些思考,所以很多猜测可能不会成为现实。这只是一个猜测未来的文章。

我之所以和大家分享这些想法,并不是因为我希望在将来这些猜测能被证明是正确的,而是因为就现在来看,这些方向非常有趣,且具有一定可行性。

从研究层面上讲,我认为有前景的主要方向为:

1.更贴近通用计算机程序的模型,建立在比当前的可微分网络层更加丰富的基元上。我们可能会借此进行推理和抽象,克服当前模型中的根本弱点。

2.能实现上述功能的新型学习方式,允许模型具有更多功能,而不局限于仅能实现微分变换。

3.构建出不需要人类工程师过多参与的模型,工程师的任务不应该是无休止地调参。

4. 更好地系统性再利用先前学习到的特征和架构;基于可再利用的模块化子程序来构建元学习系统。

此外,需要注意这些猜测并不是只针对深度学习中基础的有监督学习,它们适用于任何形式的机器学习,包括无监督学习、自监督学习和强化学习等。样本标签从何而来或者训练流程是怎么样的,这些都不是很重要。机器学习的这些不同分支只是同一结构的不同方面。

以下是深度分析。

把模型作为程序

正如在上一篇文章中所指出的那样,在机器学习领域,我们期待有一定的转变和发展,必须从单一的模式识别模型中脱离出来,从只能实现局部泛化,到能够实现抽象和推理的模型,这会向极端泛化迈进一大步。

在当前AI程序中,基本推理能力的实现都是靠人类程序员硬编码完成的,依赖于搜索算法、图形操作和形式逻辑等方式。

例如DeepMind的AlphaGo,它所展示出的大多数“智能”力都是由专业程序员通过蒙特卡洛树搜索等算法来设计和编码的。仅在特定的子模块,比如价值网络和策略网络中,实现了从数据中学习的能力。

但是,未来的AI系统或许能够在没有任何人工参与的情况下,进行完全学习。

要想实现这一猜想,有哪些方法?

比如说广为人知的RNN网络,它的局限性比前馈网络少得多。因为RNN作为一种几何变换,能在for循环内重复使用。开发人员通过硬编码实现时间维度上的for循环,是网络的内置假设。

当然,RNN网络在这些方面的表现仍然很有限,主要因为它所执行的每个步骤仍然只是一个可微的几何变换,并且它们在每个步骤之间传递信息的方式是通过连续几何空间(状态向量)中的点来完成的。

现在,想象一下神经网络以类似于编程基元(如for循环)的方式“增强”,但不仅仅是一个带有硬编码几何存储器的硬编码for循环,而是一组大规模的编程基元,模型可以自由地操纵这组编程基元来扩展其处理功能,如if分支、while语句、变量创建、长期内存的磁盘存储、排序运算符和高级数据结构(如列表、图形和哈希表)等等。

这样的网络可以代表的程序空间将远大于当前深度学习模型所能实现的功能范围,其中一些程序可以实现更高的泛化能力。

总而言之,我们将不再需要一方面用人工编写的程序实现“硬编码算法智能”,同时用深度学习来实现“学习几何智能”。我们将会推出形式算法模块和集合模块的混合提,其中形式算法模块提供推理和抽象能力,几何模块提供非正式直觉和模式识别功能。

这样,整个系统能在极少人工参与或是无人工参与的情况下进行学习。

我认为,接下来可能会大幅发展的与此相关的人工智能子领域,是程序合成(program synthesis),特别是神经网络程序合成

程序合成是通过使用搜索算法(例如与遗传编程相似的遗传搜索)自动生成简单的程序,进而探索更大的可能程序空间。当找到符合要求的程序时,搜索会停止,通常会以一组输入-输出对的形式呈现。

如你所见,这种方式和机器学习非常相似:给出作为输入-输出对的“训练数据”,我们找到一个将输入与输出进行匹配的“程序”,并将其扩展到新的输入。不同之处在于,我们已经不需要在硬编码程序(如神经网络)中学习参数值,而是通过离散搜索过程来生成源代码。

我特别希望,在未来几年内,这个子领域能引发一股新的研究热潮,也特别希望在深度学习和程序合成之间出现一个交叉的研究字领域。

在这个交叉领域中,我们不是生成程序,而是生成神经网络(几何数据处理流),并用for循环等丰富的算法基元来增强它。这应该比直接生成源代码要容易得多,又能大大扩展机器学习可解决问题的范围。

在给定合适的训练数据后,我们可以自动生成相应的程序空间,这是一种结合了符号AI和几何AI的混合算法。当前的RNN模型可以被看作是这种算法-几何混合模型的雏形。

一种依赖于几何基元(模式识别和直觉知识)和算法基元(推理、搜索和记忆)的学习程序

超越反向传播和可微分层

如果机器学习模型变得更像程序,那么它们可能不再是可微分的。

当然,这些程序仍然会将连续的几何层作为子例程,这部分是可微分的,但是整个模型不会具有这个性质。因此,将来训练模型的方法将不再是运用反向传播调整一个硬编码固定网络中的权重值,至少不会像现在这样完全依赖它。

我们需要找出能够有效地训练不可微系统的方法。目前可用方法有遗传算法、“进化策略”、某些强化学习方法和ADMM(交替方向乘子算法)。

当然,梯度下降仍将存在,在优化可微分参数函数时,梯度信息一直都是有效的。但是,我们的模型不会只满足于使用可微分参数函数。到时候,它们的自动开发(即“机器学习”中的“学习”)需要的就不只是反向传播方法了。

此外,反向传播是一种端到端方法,这对学习良好的链式变换是一件好事,但是由于不能充分利用深层网络的模块性,往往计算效率低下。

为了提高模型的学习效率,有一个通用策略,即引入模块性和层次结构。因此,我们可以通过引入一些具有同步机制的解耦训练模块,以分级方式组织这些模块,从而使反向传播本身更具效率。

DeepMind最近在“合成梯度”方面的一些进展,也反映了这一策略。我希望短期内在这方面,能看到更多相关的研究工作。

我们可以想象,在不久的将来,模型将是全局不可微分的,但会有可微分的部分。这些模型将使用一种高效搜索方法,而不使用梯度方法,来进行训练。同时,使用一些更有效的反向传播方法来充分利用梯度信息,可以更快地训练模型中的可微分部分。

自动机器学习

未来的模型架构将不是由工程师手动构建,而是通过自动学习来生成。自动学习架构将会与更丰富的基元以及程序化的机器学习模型进行结合。

目前,深度学习工程师的主要工作就是用Python脚本发送数据,使用大量时间对深层网络的结构和超参数进行调优,以获得一个效果较好或者最先进的模型。这显然不是最好的方法,但是,这项工作可以让AI来帮忙。

不幸的是,数据清洗部分很难实现自动化,因为它通常需要相关领域的专业知识,以及对所要实现的工作有着明确的深刻理解。然而,超参数调优只是一个简单的搜索过程,我们已经知道工程师的调整目标,即最小化(或最大化)网络中定义的损失函数。

现在,建立基本“AutoML”系统来完成大部分的超参数调优工作已经是常见的做法。几年前我也建立过这样的系统,还赢得了Kaggle的比赛。

在最基本的层次上,这种系统能简单地调整堆栈中的层数和堆叠顺序,以及每一层中的单元或过滤器的数量。这通常可以使用Hyperopt库来实现,在书中第7章已经讨论过。

但是我们也可以尝试在尽可能少的约束条件下,从头开始训练一个合适的网络架构。这可以通过增强学习或是遗传算法来实现。

另一个重要的AutoML方向是模型权重与模型架构一起学习。因为每次尝试一个稍微不同的架构时,都会重新训练一个新的模型,所以一个真正强大的AutoML系统将通过模型中对训练数据的反馈来调整模型的特征,同时控制着模型的演变方向,这样就能消除所有计算冗余。

就在我写下这篇文章的时候,这些方法已经开始出现。

当这种情况发生时,机器学习工程师并不会失业,反而将在价值创造链上走高。他们将会把工作重心转移到制定出能真正反映业务目标的复杂损失函数,并深入了解所构建的模型是如何影响其部署的数字生态系统(比如在消费预测模型中产生模型所用训练数据的用户们)。

但是目前,只有大公司才有能力考虑到这个问题。

终身学习和模块化子例程再利用

如果模型变得更加复杂,且建立在更加丰富的算法基元之上,那么这种增加的复杂性将需要在任务之间有更高程度的再利用,而不是每次有一个新的任务或一个新的数据集都要从头开始去训练一个新的模型

实际上,很多数据集包含的信息不足以让我们从头开发一个新的复杂模型,这时就需要再次利用先前数据集中包含的信息。这就像我们不是每次打开新书时都从头开始学习英语。此外,由于当前任务与先前任务之间有很大的重叠,针对每个新任务都从头开始训练模型,这是非常低效的做法。

此外,近年来在研究中重复出现的一个明显现象是,如果一个模型同时进行多个松散关联的任务,结果是这个模型会更好地执行各个任务。

例如,训练一个神经机器翻译模型来完成英语到德语的翻译和法语到意大利语的翻译,结果是这个模型在执行两个翻译任务时效果更好;训练一个能同时实现图像分割和图像分类的模型,两个任务共享同一组卷积核,结果是这个模型能更好地执行两个任务。

类似的例子还有很多。

我们可以直观地分析这个现象:在这些似乎没有关系的任务之间应该存在一定的信息重叠,因此,与仅训练单个特定任务的模型相比,混合模型能获得更多关于各个特定任务的信息。

在目前的跨任务模型再利用研究,我们先将预先训练的权重赋予用来执行常见功能的模型中,如视觉特征提取。书中第5章也提到了这一点。

我希望在将来,这种方法的通用版本会是这样的:我们不仅可以利用先前学习到的特征(即子模型权重),还可以利用模型架构和训练程序。随着模型演变得越来越像程序,我们将开始再利用程序子例程,比如编程语言中的函数和类别。

介绍下如今的软件开发过程:

一旦工程师解决了一个具体问题(例如Python中的HTTP查询),他们会把它打包成一个抽象且可再利用的函数库。如果后来有工程师遇到了类似问题,可以简单地检索下现有的函数库,下载所需代码并用在当前项目中。

将来,元学习系统能以类似的方式,通过在一个高级可再利用模块的全局库中搜索模块,用来组装新程序。

当系统发现自己要为几个不同的任务开发类似的程序子例程时,它会开发一个“抽象”的、可再利用的子例程版本,并将它存储在全局库中。

以上过程能够实现抽象能力,这是一种实现“极端泛化”的必要组件:一个在不同任务和域中有用的子例程,可看作是对解决问题的一些方面的抽象化。在这里,“抽象”的定义与软件工程中的“抽象”概念相似。这些子例程可属于几何型(带有预训练表征的深度学习模块),或是算法型(更靠近当代软件工程师使用的函数库)。

一个能够使用可再利用基元(包括算法型和几何型)来快速开发特定任务模型的元学习者(meta-learner),进而实现“极端泛化”。

总结与长远展望

简而言之,以下是关于机器学习领域的长远展望:

1.模型会变得越来越像程序,它所具有的能力将远远超出我们目前所做的对输入数据进行连续几何变换。这些程序可能更接近于人类对周围环境和自身的抽象思维模式,而且由于其丰富的算法性质,它们将具有更强的泛化能力。

2.特别的是,这种模型将结合提供形式推理、搜索和抽象能力的算法模块,和提供非形式直觉和模式识别功能的几何模块。AlphaGo是一个需要大量人为软件编程和人为决策的系统,它提供了一个早期的例子,展示了将符号AI和几何AI相结合的混合模型会是什么样的。

3.这些模型不再由工程师手动构建,而是可以自动扩展。它们可以使用存储在可再利用子例程的全局库中的模块,这个全局库是通过在数千个先前任务和数据集上学习高性能模型而得到的函数库。由于常见的问题解决模式是通过元学习系统来识别,它们将变成可再利用的子例程,这与软件编程中的函数和类别十分相似,也会被添加到上述全局库中。如此就实现了抽象的能力。

4.这个全局库和相关的模型扩展系统将能够在一定程度上实现类人的“极端泛化”:给定一个新的任务和情境,该系统仅需要使用极少的数据就能构建出一个满足任务要求的工作模型。这多亏了:1)丰富的程序化基元泛化效果较好;2)在相似任务上具有丰富经验。正是通过这种方式,人类花很短的时间就能学会一个复杂的新游戏,因为先前他们已经有一定的游戏经验,而且,从先前经验得出的模型是抽象且程序化的,不仅仅是一个从刺激到动作的简单映射关系。

5.因此,这种可永久学习的模式扩展系统可以被理解成通用人工智能(Artificial General Intelligence,AGI)。但不要以为任何带有奇点主义的机器人大动乱将要发生:这只能是幻想,是一种对智能和技术的长期深刻误解。

但是,本文对这一点不作评论。

相关阅读

原文地址: https://blog.keras.io/the-future-of-deep-learning.html

Deep Learning with Python电子书: https://www.manning.com/books/deep-learning-with-python

Chollet后来又写了篇《深度学习的未来》,同样发表在Keras博客,欢迎阅读英文版,也欢迎明天再来量子位读中文版。

0 人点赞