出版社:本文来自Keras的作者Fran?oisChollet,他也是他所著的《Deeping Learning with Python》一书第9章第2节的作者注:本文的读者article已经是深有学习经验的人(例如,读过本书第1章到第8章的人)。我们假设读者已经具备一定的知识基础。深度学习的几何视角深度学习最令人惊讶的地方在于它的简单性。十年前,没有人期望通过梯度下降法训练的简单参数模型在机器感知问题上取得惊人的结果。现在,事实证明,您所需要的只是一个具有足够参数并在足够大的数据集上使用梯度下降训练的模型。正如费曼曾经说过的宇宙,“它并不复杂,只是很多。”在深度学习中,一切都是向量,即一切都是几何空间中的一个点。模型输入(可以是文本、图像等)和目标首先被“向量化”,即变成一些初始输入向量空间和目标向量空间。深度学习模型中的每一层都对通过它的数据执行简单的几何变换。同时,模型的层级链形成了一个非常复杂的几何变换,分解为一系列简单的几何变换。这种复杂的转换试图一次将输入空间映射到目标空间一个点。这种转换由层的权重参数化,层的权重根据模型当前的表现迭代更新。这种几何变换的一个关键特征是它必须是可微的,以便我们可以通过梯度下降来学习它的参数。直观上,这意味着从输入到输出的几何变形必须平滑且连续——这是一个重要的约束条件。将这种复杂的几何变换应用于输入数据的整个过程可以在3D中可视化,方法是将其想象成一个人试图压平一个皱巴巴的纸球:皱巴巴的纸球是模型开头的输入数据的副本。人对纸球的每一次操作都相当于一层简单的几何变换操作。完整的平滑(纸球)动作序列是整个模型的复杂变换。深度学习模型是用于解开高维数据复杂流形的数学机器。深度学习的神奇之处在于:将语义转化为向量,转化为几何空间,然后逐渐学习将一个空间映射到另一个空间的复杂几何变换。您所需要的只是一个维度足够高的空间,以捕获原始数据中的所有关系。深度学习的局限性这种简单策略的应用空间几乎是无限的。然而,现有的深度学习技术对于更多的应用来说是完全无能为力的——即使有大量人工注释的数据。例如,你可以尝试收集几千条甚至几百万条由产品经理编写的软件产品特性的英文描述的数据集,以及由工程师团队开发的相应源代码来满足这些需求。即使有了这些数据,您也无法训练深度学习模型来简单地阅读产品描述并生成适当的代码库。这只是一个例子。一般来说,无论你扔多少数据,深度学习模型都无法实现任何需要推理的东西,比如编程或科学方法的应用——长期规划和数据操作,比如算法。即使使用深度神经网络学习排序算法也非常困难。这是因为深度学习模型只不过是将一个向量空间映射到另一个向量空间的简单连续几何变换链。它所能做的就是将一个数据流形X映射到另一个Y,假设存在从X到Y的可学习连续变换,并且可以使用密集的X:Y样本作为训练数据。因此,虽然深度学习模型可以解释为程序,但相反,大多数程序不能表示为深度学习模型——对于大多数任务,要么没有相应的现实大小的深度神经网络来解决任务,要么这样的神经网络存在,但它可能无法学习,即相应的几何变换可能太复杂,或者可能没有合适的数据可用于学习它。通过堆叠更多层和使用更多训练数据来扩展当前的深度学习技术只能从表面上缓解一些问题。它未能解决深度学习模型在它们可以表示的内容种类上非常有限的根本问题,并且大多数预期可学习的程序不能表示为数据流形的连续几何变形。拟人化机器学习模型的风险当代人工智能的一个非常真实的风险是人们误解了深度学习模型的作用并高估了它们的能力。人类思维的一个基本特征是我们的“思维理论”,即我们倾向于将我们的意图、信念和知识投射到我们周围的事物上。在石头上画个笑脸,一下子在我们的意识里变成了“快乐”。应用于深度学习,这意味着当我们能够“大致成功”地训练一个模型来生成描述图像的说明文字时,我们就可以相信该模型能够“理解”图像的内容并“理解”它生成的说明文字。然后,当训练数据中出现的图像类别略有偏差时,我们会非常惊讶地看到模型开始生成完全无意义的说明。特别值得强调的是“对抗性示例”,这些示例是深度学习网络的输入示例,旨在诱使模型对其进行错误分类。你已经意识到可以在输入空间上执行梯度上升以生成最大化某些闭环滤波器激活的输入,这是我们在第5章和第8章中介绍的滤波器可视化技术的基础。算法。此外,使用梯度上升,可以稍微修改图像以最大化给定类别的类别预测。通过拍摄熊猫的照片并添加“长臂猿”梯度,我们可以得到一个将熊猫分类为长臂猿的神经网络。这证明了这些模型的脆弱性,以及它们的输入输出映射与我们人类认知之间的巨大差异。简而言之,深度学习模型不理解它们的输入,至少不理解人类有意识的理解。我们人类对图像、声音和语言的理解是基于我们作为人类的感觉运动体验——正如地球上的生物所表现的那样。机器学习模型无法获得这些经验,因此无法像人类那样“理解”它们的输入。通过标注大量的训练样例来训练我们的模型,我们让它们学习一种几何变换,将数据映射到特定数据集上的人类概念,但这种映射只是我们头脑中原始模型的简单总结,即我们用作人类实体的体验-它就像镜子中的模糊图像。作为机器学习从业者,请始终牢记这一点,永远不要陷入相信神经网络能够理解它们执行的任务的陷阱——它们不会,至少不会以对我们有意义的方式。他们没有接受我们想要教给他们的任务,而是被训练来执行更窄的任务:简单地将训练集输入逐点映射到训练目标。向他们展示任何偏离训练数据的东西,他们会给出最荒谬的结果。Localgeneralizationvs.extremegeneralization深度学习模型中从输入到输出的直接几何变换,与人类的思考和学习方式几乎完全不同。这不仅仅是人类从自己的经验中学习而不是从明确的训练示例中学习的问题。除了学习过程的差异外,底层表示的性质也存在根本差异。人类可以做的远不止像深度神经网络或昆虫那样将即时刺激映射为即时反应。人们对自己和他人的当前状况保持着复杂的抽象模型,并可以使用这些模型来预测不同的可能未来并进行长期规划。他们能够结合已知的概念来表示他们以前从未经历过的事情,例如想象一匹穿着牛仔裤的马或想象如果他们中了彩票会做什么。这种处理假设的能力,将我们的心理模型空间扩展到远远超出我们可以直接体验的事物的空间,总而言之,抽象和推理,可以说是人类认知的决定性特征。我称之为“极端泛化”:它是在面对没有经验的情况时,使用很少或根本不使用新数据来适应新情况的能力。这与深度网络所做的形成鲜明对比,我称之为“局部泛化”:如果新输入与其在训练时看到的略有不同,深度网络执行的从输入到输出的映射立即失去意义。例如,考虑想要了解将火箭降落在月球上的正确发射参数的问题。如果你要用一个深度网络来完成这个任务,无论是使用监督学习还是强化学习进行训练,你都需要用几千甚至几百万次的射击试验来训练,也就是说,你需要把模型放在一个密集的空间输入样本点的数量,以便学习从输入空间到输出空间的可靠映射。相比之下,人类可以利用他们的抽象能力提出物理模型——火箭科学——并在一次或几次试验中得出月球火箭发射参数的精确解决方案。同样,如果你开发一个控制人体的深度网络,使其可以在城市中安全驾驶汽车而不会被其他汽车撞到,那么该网络将不得不在各种场景中“死亡”数千次,直到它遇到汽车和危险可以推断出并制定适当的规避行动。进入一个新城市,网络将不得不重新学习它已经知道的大部分内容。另一方面,人类不必为学习安全行为而死,这要归功于他们对假设情况进行抽象建模的能力。LocalGeneralization:模式识别层面的泛化;ExtremeGeneralization:抽象和推理层面的泛化综上所述,尽管我们在机器感知方面取得了进步,但我们距离人类级别的AI还很远:我们的模型只能进行部分泛化,而且必须与原始数据密切相关适应新的场景,而人类的认知可以限制泛化,快速适应新的情况,或者为长期的未来情况制定计划。推而广之,您应该牢记以下几点:到目前为止,深度学习唯一真正的成功是能够在给定大量人工注释数据的情况下,使用连续几何变换将空间X映射到空间Y。做到这一点对每个行业来说都是游戏规则的改变者,但距离人类水平的人工智能还有很长的路要走。为了解除这些限制并开始与人脑竞争,我们需要从简单的输入到输出映射转变为推理和抽象。计算机程序可能是各种情况和概念的抽象建模的合适基础。正如我们在前几本书中所说,机器学习模型可以定义为“可学习的程序”;目前我们可以学习的程序属于所有可能程序的一个非常狭窄和特定的子集。但是,如果我们能够以模块化和可重用的方式学习任何程序呢?鉴于我们对深度神经网络的工作原理、它们的局限性以及研究现状的了解,我们能否预见神经网络将如何发展?在这里分享一些个人的想法。请注意,我没有预测未来的水晶球,所以我的大部分预测可能都会失败。这是一篇完全具有预测性的帖子,我分享这些推测并不是希望它们在不久的将来被证明是正确的,而是因为它们目前很有趣且实用。总的来说,我预见的主要方向是:更类似于通用计算机程序的模型,建立在比我们当前的可区分层次结构更丰富的原语集上——这就是我们获得模型的方式推理和抽象的策略,这是基础当前模型的弱点。一种使上述成为可能的新颖学习策略——它允许模型摆脱当前的可微转换。需要较少人类工程师参与的模型-无休止的参数调整不应该成为您工作的一部分。对以前学习的特性和架构进行更多、更系统的重用;基于可重用和模块化子程序的元学习系统。同样值得注意的是,这些反思与深度学习无关,深度学习已成为监督学习的主力军。恰恰相反,这些考虑适用于任何形式的机器学习,包括无监督、自监督和强化学习。您的标签来自何处或您的训练循环看起来如何并不重要。机器学习的这些不同分支只是同一结构的不同方面。让我们开始深入挖掘,模型就是程序正如我们在上一篇文章中提到的,我们在机器学习领域可以期待的发展之一是来自纯模式识别,只能实现局部泛化(Localgeneralization,见上一篇)article)模型,转向能够实现抽象和推理的模型,也就是能够实现极致的泛化能力。当前人工智能程序能够进行的基本推理形式都是由人类程序员硬编码的:例如,依赖于搜索算法、图形处理和形式逻辑的软件。具体来说,比如在DeepMind的AlphaGo中,大部分“智能”是由专业程序员设计和硬编码的(比如蒙特卡洛树搜索),从数据中学习只发生在专门的子模块(价值网络和策略网络).但在未来,这样的人工智能系统很可能会在没有人类参与的情况下被完全学习。有什么办法吗?让我们考虑一种众所周知的网络类型:递归递归神经网络(RNN)。重要的一点是循环神经网络比前馈网络的限制更少。这是因为递归神经网络不仅仅是几何变换:它们是在for循环中重复应用的几何变换。循环本身的计时由人类开发人员硬编码:它是网络的内置假设。自然地,递归神经网络在它们可以表示的东西上仍然非常有限,主要是因为它们执行的每一步仍然只是一个可微分的几何变换,它们将信息从当前步骤传递到下一步的方式是通过空间中连续的几何点(状态向量)。现在,想象一下神经网络将以类似的方式“编程”,就像for循环编程原语,但不仅仅是具有硬编码几何内存的硬编码for循环,而是一大组编程原语,然后是模型这些原语可以自由操作以扩展它们的处理能力,例如if分支、while循环、变量创建、用于长期记忆的磁盘存储、排序操作以及高级数据结构如列表、图形和哈希表等。这样的网络可以表示的空间将比目前的深度学习模型大得多,其中一些程序甚至可以实现超强的泛化能力。总而言之,我们将摆脱“硬编码算法智能”(手工软件)和“学习几何智能”(深度学习)。我们将拥有提供推理和抽象能力的正式算法模块,以及提供非正式直觉和模式识别能力的几何模块。整个系统只需要最少的人工参与即可完成学习。我认为与人工智能相关的一个子领域可能即将迎来春天,那就是程序综合(Programsynthesis),尤其是神经程序综合(Neuralprogramsynthesis)。程序合成涉及通过使用搜索算法(如遗传编程中的遗传搜索)自动生成简单的程序,以探索可能程序的广阔空间。当找到符合要求的程序时搜索停止(要求通常作为一组输入输出对提供)。正如您想象的那样,它是否让您想起机器学习:给定输入-输出对作为“训练数据”,我们找到一个将输入映射到输出并泛化到其他输入的“程序”。不同之处在于,我们不是在硬编码程序(神经网络)中学习参数值,而是通过离散搜索过程生成源代码。我一定会期待未来几年这个子领域的第二春。特别是,我期待深度学习和程序合成之间交叉子领域的出现,我们不采用通用语言生成程序,而是使用一组丰富的算法原语(几何数据处理流)增强的生成神经网络,例如至于循环等。这应该比直接生成源代码更容易处理和更有用,而且它将大大扩展机器学习可以解决的问题范围——我们可以从适当的训练数据中自动生成程序空间。符号人工智能(SymbolicAI)和几何人工智能(GeometricAI)的融合,当代的递归神经网络可视为这种混合算法几何模型的鼻祖。依赖几何原语(模式识别和直觉)和算法原语(推理、搜索和存储)的学习程序超越反向传播和可微层如果机器学习模型变得更像程序,它们将变得不再可微——当然这些程序仍然使用连续的几何层作为子程序,它们都是可微的,但整个模型不是。因此,在固定的、硬编码的网络中使用反向传播来调整权重值不可能是未来训练模型的首选方式——至少不是现在这样。我们需要找到有效训练非微分系统的方法。目前的方法包括遗传算法、进化策略、某些强化学习方法和乘法器的交替方向法(ADMM)。自然地,梯度下降不会有任何进展——梯度信息对于优化可微分参数函数总是有用的。但我们的模型肯定会比单纯的可微参数函数更强大,因此它们的自主改进(“机器学习”中的“学习”)需要的不仅仅是反向传播。此外,反向传播是一种端到端的学习模型,这对于学习好的链式变换是一件好事,但由于没有充分利用深度神经网络的模块化特性,因此计算效率低下。为了提高效率,有一个通用策略:引入模块化和层次结构。因此,我们可以通过引入单独的训练模块和它们之间的某种同步机制来提高反向传播计算的效率,并以分层方式组织。这种策略在DeepMind最近的工作《合成梯度》中有所体现。我希望在不久的将来能在这方面做更多的工作。我们可以预见的一个未来是,这些模型将变得全局不可微(但将在局部可微),然后通过有效的搜索过程而不是梯度策略进行训练。另一方面,通过使用一些更有效的反向传播版本来利用梯度下降策略,可以更快地训练局部可微区域。自动化机器学习未来,模型架构将能够被学习,而不是由工程师手动设置。自动学习架构将与更丰富的原语和类似程序的机器学习模型的使用相结合。目前,深度学习工程师的大部分工作是使用Python脚本处理数据,然后花费大量时间调整深度网络的架构和超参数以获得可以通过的模型——甚至获得最先进的模型性能,如果工程师够雄心勃勃。毋庸置疑,这种做法并不是最优的,但深度学习技术此时仍然可以发挥一定的作用。不幸的是,数据处理部分很难自动化,因为它通常需要领域知识和对工程师想要什么的非常清晰的高层理解。然而,超参数调整是一个非常简单的搜索过程,我们已经知道工程师在这种情况下想要实现什么:它是由被微调的网络的损失函数定义的。设置一个基本的“AutoML”系统来处理大部分模型调整已经很普遍了。几年前,我什至建立了自己的模型并赢得了Kaggle比赛。在最基本的层面上,这样的系统可以简单地调整堆栈中堆叠的层数、??顺序以及每层中的单元或过滤器的数量。这通常是通过像Hyperopt这样的库完成的,我们在《Deep Learning with Python》的第7章中讨论过。但我们可以更有野心,尝试从头开始学习合适的架构,然后尽可能减少约束。这可以通过强化学习或遗传算法来实现。另一个重要的AutoML方向是联合学习模型架构和模型权重。由于从头开始训练全新的架构并在每次尝试时都对架构进行微调既费时又低效,因此真正强大的AutoML系统可以设法改进架??构,从而消除所有计算冗余。在我撰写本文时,这些方法已经开始出现。发生这种情况时,机器学习工程师的工作不会消失,相反,工程师将在价值创造链中向上移动。他们将开始投入更多精力来设计真正反映业务目标的复杂损失函数,并深入了解他们的模型如何影响他们部署的数字生态系统(例如,负责使用模型预测和生成模型训练数据的用户),这些问题目前只有巨头公司才有时间去照顾。终身学习和模块化子程序重用如果模型变得更复杂并建立在更丰富的算法原语上,这种增加的复杂性将需要更好的跨不同任务的重用性,而不是每次我们有新任务或新数据集时都从头开始训练新模型。事实上,许多数据集不够大,无法支持从头开始训练新的复杂模型,需要利用以前数据集中的信息。就像你不需要每次打开一本新书都重新学习英语一样。此外,由于当前任务和以前遇到的任务之间可能有很大的重叠,为每个新任务从头开始训练模型效率非常低。此外,近年来反复出现的一个引人注目的观察结果是,训练同一个模型同时执行几个松散连接的任务将产生一个更适合每个任务的模型。例如,训练相同的神经机器翻译模型以涵盖从英语到德语和法语到意大利语的翻译将产生比单独训练它更好的模型。另一个例子是训练一个图像分类模型和一个图像分割模型,共享相同的卷积核,从而产生一个在两个任务中表现更好的模型,等等。这是非常直观的:这些看似无关的任务之间总是存在信息重叠,因此联合训练模型可以比仅针对特定任务训练的模型捕获更多关于每个单独任务的信息。我们目前在跨任务模型重用方向上的工作是使用预训练的权重模型来处理视觉特征提取等常见任务。你会在第5章看到这一点。未来,我希望这种泛化能力能够实现更好的普适性:我们不仅会复用之前学习到的特征(子模型的权重值),还会复用模型架构和培训过程。随着模型变得更像程序,我们将开始重用程序子例程,例如人类编程语言中的函数和类。想一想今天软件开发的过程:一旦工程师解决了一个特定的问题(比如Python中的HTTP请求问题),他们就把它打包成一个抽象的、可重用的库。这样工程师在未来遇到类似问题时,只需搜索现有的库,然后下载并在他们的项目中使用即可解决问题。同样,未来元学习系统将能够通过筛选全球高级可重用块库来组装全新的程序。当系统发现自己为几个不同的任务开发了相似的程序子程序时,如果能够具有“抽象”的能力,即子程序的可重用版本,则将其存入全局库。这样的过程将启用抽象能力,这是实现“最终泛化”的必要部分:在不同任务和领域中发现有用的子程序可以说是“抽象”了某些问题解决方案的某些方面。这里“抽象”的定义类似于软件工程中抽象的概念。这些子例程可以是几何的(具有预训练表示的深度学习模块)或算法的(更接近当代软件工程师使用的软件库)。元学习器可以使用可重复使用的原语(算法和几何)快速开发特定于任务的模型,从而实现“极端泛化”。总结:对未来的洞察总而言之,这里是我对机器学习的一些长期见解:模型将更像程序,并且将具有远远超出我们目前使用的输入数据的连续几何变换的能力。这些程序可以说更接近人类对周围环境和自身的抽象心理模型,并且由于其丰富的算法性质,它们将具有更强的泛化能力。特别是,该模型将融合一个算法模块,它可以提供形式推理、搜索和抽象能力,以及一个几何模块,它可以提供非正式的直觉和模式识别功能。AlphaGo(一个需要大量手动软件工程和人工设计决策的系统)提供了一个早期示例,说明当符号和几何AI融合时它会是什么样子。它们将通过使用存储在全球可重用子程序库中的模块化部件自动增长,该库是从在数万个先前任务和数据集上学习的高性能模型演变而来的,而不是由人类工程师手动设置。当元学习系统识别出常见的问题解决模式时,它们会变成可重用的子例程——就像当代软件工程中的函数和类一样——并添加到全局库中,从而实现抽象功能。这个全局库和关联的模型生长系统(Model-growingsystem)将能够实现某种形式的类人“极度泛化”:给定一个新任务、一个新情况,系统将能够组装一个模型这适用于新模型。一种新的工作模型,适用于需要很少数据的任务。这要归功于1)丰富的类程序原语(Program-likeprimitives),泛化能力强;2)丰富的类似任务经验。就像人类可以在很短的时间内玩好一个全新的、复杂的视频游戏一样,因为他们有很多以前的游戏经验,并且因为从以前的经验中得出的模型是抽象的和程序的,而不是刺激和行为的。之间的基本映射。因此,这种不断学习的模型生长系统可以称为通用人工智能(AGI)。但不要担心任何机器人末日:这只是一个幻想,源于对智能和技术的一系列深刻误解。然而,这方面的批评不在本文讨论范围之内。
