来源:blog.keras.io
作者:Francois Chollet
编译:弗格森 刘小芹
【新智元导读】 Keras作者、《Python深度学习》一书的作者 Francois Chollet 在博客上发文探讨深度学习的未来,从技术演化的角度,提出未来深度学习的4大走向:模型即程序、超越反向传播和可微分层、自动化的机器学习、终身学习和重复利用模块化子程序。未来深度学习走向无疑是越来越自主化的,但是从技术角度需要什么累积与突破,文章进行了很好的解读。作者认为,机器学习工程师的工作不会消失,相反,工程师将在价值创造链上走高。
Keras作者、《Python深度学习》一书的作者 Francois Chollet 在自己的博客上公开了自己书中的内容,讨论深度学习的未来:
鉴于我们对深度神经网络的了解,包括它们的局限性,以及对当下研究图景的掌握,我们是否能预测在短期内,深度学习将会走向何方?下面是一些纯个人的思考。需要注明的是,我没有水晶球,所以可能很多我的预测不会成为现实。这是一篇纯推测的博客。我之所以在此分享这些预测,并不是因为我期望它在未来被证明是完全正确的,而是,在目前看来,它们非常有趣,而且是可行的。
在最上层,我认为有潜力的主要方向是:
更贴近通用计算机程序的模型,建立在比当下不同神经网络层远丰富得多的基元之上,这就是我们将如何得到推理和抽象,即当前模型的根本弱点。
能让上述情况实现的新形式的学习——允许模型获得更多的发展,而不仅仅局限在不同的转移。
需要人类工程师更少干涉的模型,无休止地调整控制旋钮(knobs)不应该是你的工作。
对前期学习特征和架构系统性的再利用;基于可再利用和模块化程序和子程序的元学习系统。
此外,需要说明的是,以上所举并不特指监督式学习——这种学习方式目前是深度学习的基本业务,它们可以应用到任何形式的机器学习上,其中包括非监督学习、自监督学习、强化学习等等。你的标签来自哪或者你的训练环看起来是怎么样的在根本上也不重要。这些机器学习不同的分支只是同一结构的不同方面。
让我们深入下去。
正如我们在此前的博客里提到的,在机器学习领域,我们可以期待的一个必要的转变是:从只能做模式识别和获得局部的泛化,到能够执行抽象和推理的模型,这能获得极端的泛化。当下,具有基本推理形式能力的AI程序都是由人类程序员硬编码的:例如,依赖于搜索算法,图形操作和形式逻辑的软件。
例如,在DeepMind的AlphaGo程序中,其展示的绝大部分“智能”都是由专业的程序员设计和硬编码完成的(比如,蒙特卡洛树搜索)。从数据中进行学习仅仅发生在特定的从属模块中(价值网络和策略网络)。但是,未来,这样的AI 系统或许可以进行完全的学习,不需要任何的人类参与。
要实现这一想法,都有哪些渠道?考虑一下一个广为人知的神经网络——RNN。重点是,RNN比前馈神经网络(Feedforward Networks)的局限性要少得多。这是因为,RNN不仅仅是一个几何变换。在一个循环内,RNN被重复应用的几何变换。
时间循环本身由人类开发人员硬编码:它是网络的内置假设。当然,RNN在它们可以代表的方面仍然非常有限,主要是因为它们执行的每个步骤仍然只是一个可微的几何变换,并且它们从一个步骤到另一步骤中传递信息的方式是通过连续几何空间(状态向量)中的点。现在,想象一下神经网络将以类似于编程基元(例如for循环)的方式“增强”,但不仅仅是一个有硬编码几何存储器的硬编码for循环,而是一组大型的编程原语,让模型可以自由地操纵以扩展其处理功能,例如分支,语句,变量创建,长期内存的磁盘存储,排序运算符,高级数据结构(如列表,图形和哈希表)等等。这样一个网络可以代表的程序的空间将远大于当前深入学习模式所能表达的范围,其中一些程序可以实现更高的泛化能力。
总而言之,我们将远离一手掌握“硬编码算法智能”(手工软件),一只手“学习几何智能”(深度学习)的方式。取而代之的是,我们将提供混合的正式算法模块,它们能提供推理和抽象能力,同时,其中的几何模型能提供非正式的直觉和模式识别能力。整个系统将能在不需要,或者少量人类参与的情况下进行学习。
我认为可能会获得飞速发展的 AI 相关子领域是程序综合(program synthesis),特别是神经网络程序综合。程序综合在于通过使用搜索算法(可能是遗传搜索,如遗传编程)自动生成简单的程序来探索大量的可能的程序。当找到符合所需规格的程序时,搜索就会停止,通常作为一组输入 - 输出对进行提供。正如你所看到的,它是否高度让人联想到机器学习:给出作为输入 - 输出对提供的“训练数据”,我们找到一个将输入与输出进行匹配的“程序”,并将其推广到新的输入之中。不同之处在于,我们不用在硬编码程序(神经网络)中学习参数值,而是通过离散搜索过程生成源代码。
我肯定期望这个子领域在未来几年内会迎来新一波的热潮。
特别是,我期望在深度学习和程序综合之间出现一个交叉子域,在这里我们不是用通用语言生成通用程序,而是用丰富的算法基元,如for循环等等生成神经网络(几何数据处理流)。
这应该比直接生成源代码要容易得多,而且它会大大扩展机器学习可以解决的问题的范围 - 我们可以自动生成给定适当的培训数据的程序的空间——这是一种符号AI和几何AI的混合。当代RNN可以被看作是这种混合算法几何模型的史前祖先。
如果机器学习模型变得更像程序,那么它们将几乎不再是可微分的。当然,这些程序仍然会将连续的几何图层用作子程序,这些是可微分的,但是整个模型不会是这样。因此,在一个固定的、硬编码的网络中,使用反向传播来调整权重值,将不能成为未来训练模型的首选方法, 至少不全部使用这一方法。
我们需要找到如何能有效地训练不可微系统。目前的方法包括遗传算法,“进化策略”,某些强化学习方法和ADMM(乘法器的交替方向法)。自然地,梯度下降不会受影响 - 梯度信息对于优化可微分参数函数将永远是有用的。但是,比起仅仅使用可微分参数的函数,我们的模型肯定会变得越来越强大,因此它们的自动开发(“机器学习”中的“学习”)将不仅仅需要反向传播。
此外,反向传播是端到端的,这对于学习良好的链接变换是一件好事,但是,这种方法计算效率低下,因为它不能充分利用深层网络的模块化。为了使事情更有效率,有一个通用的配方:引入模块化和层次结构。因此,我们可以通过引入具有一些同步机制的解耦训练模块,以分级方式组织,从而使反向传播本身更有效率。 DeepMind最近在“合成梯度”方面的工作,反映了这一策略。我希望在不久的将来会有更多的这方面的工作。
人们可以想象这样一个未来:模型从全局上看是不可微分的(但是会对可微分的部分做特征处理),这些模型会在训练中得到成长,使用一个高效的搜索过程,而不用梯度。同时,可微分的部分将会通过利用梯度的优势,得以更快地训练,其方法是使用一些更有效率的反向传播方法。
未来, 模型架构将会通过机器自身的学习来获得,而不是由工程师手写编码来设计。自动地学习架构将与更丰富的基元和类似程序的机器学习模型的使用共同发展。
目前,深度学习工程师的大部分工作就是用Python脚本清洗数据,然后对深层网络的体系结构和超参数进行长时间的调优,以获得一个可用的模型 ,甚至是获得最先进的模型,如果工程师野心足够大的话。毫无疑问,这不是一个最优的设置。AI 在这方面也可以提供帮助。不幸的是,数据清洗部分很难自动化,因为它通常需要专业领域知识,以及对工程师想要实现的工作有明确的高度的理解。然而,超参数调优是一个简单的搜索过程,我们已经知道工程师在这种情况下需要实现什么:它由被调整的网络中的损失函数进行定义。设置基本的“AutoML”系统,来处理大部分的模型旋钮已经是常见的做法。多年前,我甚至自己做了一个这样的系统,赢得了Kaggle的比赛。
在最基本的层次上,这样的系统将简单地调整堆栈中的层数、它们的顺序以及每一层中的单元或过滤器的数量。这通常是使用诸如Hyperopt一类的库,我们在第7章(注意:使用Python深度学习)中讨论过。但是我们也可以更有野心,尝试从头开始学习一个适当的架构,尽可能减少约束。这可以通过加强学习,例如遗传算法来实现。
另一个重要的AutoML方向是与模型权重一起学习模型架构。因为每次尝试一个稍微不同的架构时,都会从头开始训练一个新的模型,所以一个真正强大的AutoML系统将通过对训练数据的反馈来调整模型的特征,同时管理体系结构,以消除所有计算冗余。这些方法已经开始出现,因为我正在写类似的代码。
当这种情况开始发生时,机器学习工程师的工作不会消失,相反,工程师将在价值创造链上走高。他们将开始更多地努力制定真正反映业务目标的复杂损失函数,并深入了解他们的模型如何影响其部署的数字生态系统——目前,只有最大的公司才会考虑这些问题。
如果模型变得更加复杂,并且建立在更加丰富的算法原语之上,那么这种增加的复杂性将需要在任务之间有更高的重用,而不是每当有一个新任务或一个新的数据集时都需要从头开始训练一个新的模型。实际上,很多数据集是没有包含足够的信息来从头开发新的复杂模型的,需要利用先前的数据集的信息。就像你每次打开一本新的书都不会从头开始学习英语——这是不可能的。此外,由于当前的任务与先前的任务之间有很大的重叠,每个新任务都要从头开始训练模型是非常低效的。
此外,近年来出现的一个值得注意的观察是,训练同一个模型去同时做多个有松散关联的任务,能产生一个在每项任务上都表现更好的模型。例如,训练同一个神经机器翻译模型去同时做英语-德语翻译和法语-意大利语翻译,将得到一个在每个语言对上都表现更好的模型。训练一个图像分类和图像分割的模型,两个任务共享同一个卷积base,得到一个在两个任务上都表现更好的模型。等等。这是非常直观的:在这些似乎没有关联的任务之间总是存在一些重叠的信息,因此,联合模型相比仅针对一个特定任务训练的模型能访问更多有关各个任务的信息。
我们目前跨任务做类似模型重用的方式是利用执行常见功能的模型的预训练权重,例如视觉特征提取。将来,我希望这一方法的通用性版本能够变得常用:我们不仅利用先前学习的特征(子模型权重),还利用模型架构和训练程序。随着模型变得越来越像程序,我们将开始重用程序子例程(program subroutines),例如人类编程语言中的函数(function)和类(class)。
想想今天的软件开发过程:一旦工程师解决了一个特定的问题(例如Python中的HTTP查询),他们就将它封装成一个抽象且可重用的库。后来面临类似问题的工程师可以简单地搜索现有的库,下载并在自己的项目中使用它们。以类似的方式,将来,元学习系统将能够通过筛选高级可重用block的全局库来组装一个新的程序。当系统发现自己为几个不同的任务开发类似的程序子例程时,如果出现一个“抽象的”可重用子例程版本,系统会将它存储在全局库中。这样的过程将实现抽象的能力,这是实现“极端泛化”( extreme generalization)的必要组件:一个被发现在不同任务和域中有用的子例程可以说是“抽象化”问题解决的一些方面。“抽象”( abstraction)的定义与软件工程中抽象的概念相似。这些子例程可以是几何的(具有预训练的表征的深度学习模块)或算法的(更接近当代软件工程师操作的库)。
图:一个能够使用可重用原语(包括算法的和几何的)快速开发任务特定模型的元学习器(meta-learner),从而实现“极端泛化”(extreme generalization)。
作为总结:以下是我对机器学习的长期展望
模型将更像程序,并且具有远远超出我们目前使用的输入数据的连续几何变换的能力。这些程序可以说是更接近于人类对周围环境和自身的抽象思维模式,而且由于其丰富的算法性质,它们将具有更强的泛化能力。
尤其,模型将被混合起来提供正式推理,搜索和抽象功能的算法模块,并提供具有非正式直觉和模式识别功能的几何模块。AlphaGo(一个需要大量人工软件工程和人类决策的系统)提供了一个早期的例子,展示象征和几何AI之间的混合的可能样子。
它们将自动成长,而不是由人类工程师人工制作,使用存储在可重复使用子程序的全局库中的模块化组件——这是通过在数千个先前任务和数据集上学习高性能模型演变而来的库。由于常见的问题解决模式是通过元学习系统识别的,它们将变成可重用的子例程——非常像当代软件工程中的函数和类——并被添加到全局库中。这就实现了抽象的能力。
这个全局库和相关的模型成长系统将能够实现某种形式的类似人类的“极端泛化”:给出新的任务,新的情况,该系统将能够组装一个适合新任务的新的有效模型,而且使用的数据非常少。这要归功于:1)丰富的类似程序的原始泛化得很好,2)丰富的类似任务的经验。同样的方式,人类可以学习使用非常少的时间学会玩一个很复杂的新视频游戏,因为他们有许多以前的游戏的经验,并且从以前的经验得出的模型是抽象的和程序化(program-like)的,而不是一个基本的刺激-行动之间的映射。
因此,这种永久学习的模型成长系统可以被解释为AGI——通用人工智能。但不用期待什么奇点主义的机器人启示录将来临:那完全是幻想,来源与对智能和技术的长期误解。不过,本文不评论这一点。