- 原文地址:The future of deep learning
- 原文做者:Francois Chollet
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:Changkun Ou
- 校对者:MoutainOne, sunshine940326
这篇文章改编自个人书 Deep Learning with Python(Manning 出版社)第 9 章第 3 节(译者注:「结论」一章最后一小节)。
它是讨论当前深度学习的局限性及其将来系列文章的第二篇。
你能够在这里阅读第一篇:深度学习的局限性。html
鉴于咱们已经了解深度神经网的工做原理、局限性以及目前的研究现状,那咱们可以预测它将来的趋势吗? 这里给出一些纯粹的我的想法。 注意,我并无预知将来的能力,因此我预测的不少东西可能并不会成为现实。这是一个完彻底全的思考性文章。我与大家分享这些不是由于我但愿它们在将来被证实彻底正确,而是由于它们在如今颇有意思而且可行。前端
从高处审视,我以为比较有前途的主要方向有:python
此外,请注意,这些考虑并非特定于已经做为深度学习基础设施的有监督学习,而是适用于任何形式的机器学习,包括无监督、自监督及强化学习。你训练数据标签的来源或你的训练循环怎么样其实并不重要,机器学习的这些不一样的分支只是同一结构的不一样面而已。react
就让咱们来一探究竟吧。android
正如咱们在上一篇文章中指出的那样,咱们能够预计的是,机器学习领域开发的一个必要转型就是:从使用模型自己进行纯模式识别并仅能实现局部泛化当中脱离开来,转为可以进行抽象及推理的模型,从而实现极端泛化(extreme generalization)。目前的 AI 程序所具备的基本形式的推理能力均为程序员们手动写死的代码,例如:依赖搜索算法、图操做、形式逻辑的软件;又好比 DeepMind 的 AlphaGo,大多数所谓的「智能」其实都是被专业程序员设计并写死实现的(例如 Monte-Carlo 树搜索);从数据中学习只发生在特殊的一些子模块(价值网络及策略网络)中。可是,这样的 AI 系统在将来可能会在没有人为参与的状况下被充分学习。ios
什么可使得这种状况成为可能呢?考虑一个众所周知的网络类型:RNN。很重要的一点就是,RNN 的局限性远小于前馈神经网络。这是由于 RNN 不只仅只是一个简单几何变换,而是在 for 循环里不断重复的几何变换。时间 for 循环自己由程序员写死的,这是网络自己的假设。固然,RNN 在它们可以表示的方面依然十分有限,主要缘由是它们执行的每一个步骤都是一个可微的几何变换,而且它们每一步传递信息的方式是经过连续几何空间中的点(状态向量)。如今,想象神经网络将以相似编程原语(例如 for 循环,但不只仅是一个单一的写死的具备写死的几何记忆的 for 循环)的方式「加强」,具备一组大量的编程原语,使得模型可以自由的操纵而且扩充它的处理函数,例如 if 条件分支、while 循环语句、变量建立、长期记忆的磁盘存储、排序运算符、诸如列表、图、哈希表等的高级数据结构等等。这样一个网络能够表示的程序的空间将远大于当前深度学习模型所能表达的范围,其中一些程序能够实现更高的泛化能力。git
总而言之,咱们将远离写死的算法智能(手工软件)和学会的几何智能(深度学习),取而代之的是去提供混合推理和抽象能力的正式算法模块和非正式直觉和模式识别功能的几何模块,使得不多甚至没有人参与整个系统的学习。程序员
有一个相关的 AI 子领域我认为可能会出现巨大突破,那就是程序合成(Program Synthesis),尤为是神经程序合成(Neural Program Synthesis)。程序合成在于经过使用搜索算法(可能的遗传搜索、遗传编程)自动生成简单的程序,从而探索可能程序的一个更大的空间。当找到符合要求的程序后,中止搜索,并做为一组输入输入对来提供。正如你所看到的,这让咱们高度联想到机器学习:给定训练数据做为输入输出对,找到一个程序使其匹配输入输出对,并可以泛化新的输入。不一样之处在于,咱们不用去学习写死程序(一个神经网路)的参数,而是经过离散的搜索过程来生成源代码。github
我至关期待这个子领域能在将来的几年里掀起一股新浪潮。特别地,我指望深度学习和程序合成之间可以再出现一个交叉子领域,在这里咱们再也不用通用语言来写程序,而是生成经过丰富的算法原语集加强的神经网络(几何数据处理流),好比 for 循环等等。这会比直接生成源代码要容易且有用得多,并且他会大大的扩展机器学习能够解决问题的范围 —— 咱们能够自动生成给定适当训练数据的程序空间。一个符号 AI 与几何 AI 的混合。当代的 RNN 能够看作是这种混合算法与几何模型的鼻祖。算法
图:一个依赖几何原语(模式识别、直觉)和算法原语(推理、搜索、记忆)的学习程序。
若是机器学习模型变得更像程序,那么它们将几乎再也不是可微的 —— 固然,这些程序依然会将连续的几何图层做为可微的子程序,可是整个模型却不会这样。所以,使用反向传播来调整固定、写死的网络权重不能成为将来训练模型的首选方法 —— 至少不能是惟一的方法。咱们须要找出有效地训练不可微系统的方法。目前的方法包括遗传算法、「进化策略」、某些强化学习方法和 ADMM(乘子交替方向法)。天然地,梯度降低不会被淘汰 —— 由于梯度信息老是对优化可微参数的函数有用。可是,咱们的模型确定会变得愈来愈有野心,而不只仅只知足于可微参数的函数。所以它们的自动开发(「机器学习」中的「学习」)将须要的不只仅只普通的反向传播。
此外,反向传播是端到端的,这对于学习良好的链式变换(Chained Transformation)是一件好事,但它却计算效率低下,由于它不能充分利用深度神经网络的模块化性质。 为了使事情更有效率,有一个通用的方案:引入模块化和层次结构。 所以,咱们能够经过引入具备一些同步机制的解耦训练模块,以分级方式组织,从而使反向传播自己更有效率。 DeepMind 最近在「合成梯度」(Synthetic Gradient) 方面的工做(译者注:指这篇论文),反映了这一策略。 我但愿在不久的未来会有更多的这方面的工做。
能够想象这样一个将来,那时人们能够训练全局不可微(但具备可微的部分)的模型,他们使用一个高效的搜索过程,而非利用梯度方法。但与此同时,可微的部分则经过使用的某些利用梯度优点从而更高效版本的反向传播而训练得更快。
在将来,模型架构也是学习的对象,而再也不由工程师手工搭建。学习架构将自动与使用更丰富的原语,以及相似程序的机器学习模型配合使用。
目前,深刻学习工程师的大部分工做就是用 Python 脚本清洗数据,而后对深度神经网络的架构和超参数进行长时间的调优,最终得到一个有用的模型 —— 若是工程师有野心的话,甚至能够说是当下最好的模型。无需多说,这并非一个最理想的设置,但 AI 其实也能够帮忙。不幸的是,数据清洗的部分很难自动化,由于它一般须要对应的领域知识(Domain Knowledge),以及对工程师想要实现的工做有明确的高层理解。 然而,超参数调优其实只是一个简单的搜索过程,咱们已经知道工程师在这种状况下须要实现什么:它由被调整网络的损失函数所定义。 设置基本的「AutoML」系统已是一个常见的作法了,它负责大部分模型的参数调优。我甚至在几年前就这么干了,还赢得过 Kaggle 的比赛。
在最基本的级别上,这样的系统将简单地调整(网络)栈中的层数、它们的顺序以及每一层中的单元或过滤器的数量。 这一般能够由诸如 Hyperopt 的库来完成,咱们在第 7 章中讨论过(注:Deep Learning with Python)。可是咱们也能够更加有野心,尝试从头开始学习一个适当的网络架构,尽量少的约束。这能够经过增强学习来实现,例如遗传算法。
另外一个重要的 AutoML 方向是与模型权重一块儿学习模型架构。由于每次尝试一个稍微不一样的架构都须要从新训练模型是异常低效的,因此一个真正强大的 AutoML 系统将经过对训练数据的反馈来调整模型的特征,同时管理网络架构,进而消除全部计算冗余。这样的方法已经开始出现,由于我正在写这些东西。
当这种状况开始发生时,机器学习工程师的工做并不会消失 —— 相反,工程师将在价值创造链上站的更高。他们将开始更多地努力制定真正反映业务目标的复杂损失函数,并更加深刻了解他们的模型如何影响其部署的数字生态系统(例如,消耗模型预测内容并生成模型训练数据的用户)—— 考虑那些目前只有大公司才能考虑的问题。
若是模型变得更加复杂,而且创建在更丰富的算法原语之上,那么这种增长的复杂性将须要更高的任务之间的复用,而不是每当咱们有一个新的任务或一个新的数据集从头开始训练一个新的模型。实际上,不少数据集并无包含足够的信息来从头开发新的复杂模型,并且利用来自先前遇到的数据集的信息也是有必要的。 这就像你每次打开新书时都不会从头开始学习英语 —— 这是不可能的。此外,因为当前任务与之前遇到的任务之间的重叠很大,对每一个新任务重头开始训练模型的效率是很是低的。
此外,近年来反复出现的一个值得注意的现象是,同一个模型同时进行多个松散链接任务的同时会产生一个更好的模型,而这个模型对每一个任务的结果都更好。例如,训练相同的神经网络机器翻译模型来涵盖「英语到德语」的翻译和「法语到意大利语」的翻译将得到对每一个语言间翻译效果都更好的模型。与图像分割模型联合训练图像分类模型,并共享相同的卷积基,能获得对于两个任务更好的模型,等等。这是至关直观的:在这些看似断开链接的任务之间老是存在一些信息重叠。所以,联合模型能够得到比仅针对该特定任务训练的模型更多的关于每一个独立任务的信息。
你已经在第 5 章中看到,咱们目前是沿着跨任务复用模型的方式,利用预训练的权重来执行常见函数的模型,如视觉特征提取。在将来,我会指望出现这种更通常的版本:咱们不只将利用之前学习的特征(子模型权重),还能够利用模型架构和训练过程。随着模型愈来愈像程序,咱们将开始复用程序的子程序,就像编程语言中的函数和类那样。
想一想今天的软件开发过程:一旦工程师解决了一个特定的问题(例如 Python 中的 HTTP 查询),他们将把它打包成一个抽象的和可复用的库。将来面临相似问题的工程师能够简单地搜索现有的库,下载并在本身的项目中使用它们。相似的方式,未来的元学习系统将可以经过筛选全局库中高度可复用块来组装新程序。当系统发现本身为几个不一样的任务开发相似的程序子程序时,若是能够产生一个「抽象的」子程序的可复用版本,就会将其存储在全局库中。这样的过程将实现抽象的能力,这是实现「极端泛化」的必要组件:在不一样任务和领域中被发现的有用的子程序能够说是「抽象化」问题解决的一些方面。 「抽象」的定义与软件工程中抽象的概念类似,这些子程序能够是几何(具备预先训练表示的深度学习模块)或算法(更靠近当代软件工程师操纵的库)。
图: 元学习者可以使用可复用的(算法与几何)原语快速开发特定任务的模型,从而实现「极端泛化」。
简单来讲,如下是我对机器学习的一些长期愿景:
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、React、前端、后端、产品、设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划。