深度学习 伊恩·古德费洛 约书亚·本吉奥
内容提要 全书的内容包括3个部分:第1部分介绍基本的数学工具和机器学习的概念,它们是深度学习的预备知识;第2部分系统深入地讲解现今已成熟的深度学习方法和技术;第3部分讨论某些具有前瞻性的方向和想法,它们被公认为是深度学习未来的研究重点。 中文版推荐语(按姓氏拼音排序) 深度学习是创建人工智能系统的一个重要的方法,但不是全部的方法。 译者序 第1部分介绍基本的数学工具和机器学习的概念,它们是深度学习的预备知识。第2部分系统深入地讲解现今已成熟的深度学习方法和技术。第3部分讨论某些具有前瞻性的方向和想法,它们被公认为是深度学习未来的研究重点。 深度学习集技术、科学与艺术于一体,牵涉统计、优化、矩阵、算法、编程、分布式计算等多个领域。 人工智能的真正挑战在于解决那些对人来说很容易执行、但很难形式化描述的任务,比如识别人们所说的话或图像中的脸。对于这些问题,我们人类往往可以凭直觉轻易地解决 “其兴也悖焉,其亡也忽焉” 江山代有人才出,各领风骚数十年! 数学符号 第1章 引言 人工智能的真正挑战在于解决那些对人来说很容易执行、但很难形式化描述的任务,如识别人们所说的话或图像中的脸。 国际象棋完全可以由一个非常简短的、完全形式化的规则列表来描述,并可以容易地由程序员事先准备好。 AI系统需要具备自己获取知识的能力,即从原始数据中提取模式的能力。这种能力称为机器学习(machine learning)。 解决这个问题的途径之一是使用机器学习来发掘表示本身,而不仅仅把表示映射到输出。这种方法我们称之为表示学习(representation learning)。 另一种是在深度概率模型中使用的方法,它不是将计算图的深度视为模型深度,而是将描述概念彼此如何关联的图的深度视为模型深度。在这种情况下,计算每个概念表示的计算流程图的深度可能比概念本身的图更深。这是因为系统对较简单概念的理解在给出更复杂概念的信息后可以进一步精细化 深度学习在许多软件领域都是有用的,包括计算机视觉、语音和音频处理、自然语言处理、机器人技术、生物信息学和化学、电子游戏、搜索引擎、网络广告和金融。 《深度学习》英文版配套网站是www.deeplearningbook.org。 一般认为,迄今为止深度学习已经经历了3次发展浪潮:20世纪40年代到60年代,深度学习的雏形出现在控制论(cybernetics)中;20世纪80年代到90年代,深度学习表现为联结主义(connectionism);直到2006年,才真正以深度学习之名复兴。 目前大多数神经网络是基于一个称为整流线性单元(rectified linear unit)的神经单元模型。 联结主义的中心思想是,当网络将大量简单的计算单元连接在一起时可以实现智能行为。 第三次浪潮已开始着眼于新的无监督学习技术和深度模型在小数据集的泛化能力,但目前更多的兴趣点仍是比较传统的监督学习算法和深度模型充分利用大型标注数据集的能力。 截至2016年,一个粗略的经验法则是,监督深度学习算法在每类给定约5000个标注样本情况下一般将达到可以接受的性能,当至少有1000万个标注样本的数据集用于训练时,它将达到或超过人类表现。 联结主义的主要见解之一是,当动物的许多神经元一起工作时会变得聪明。单独神经元或小集合的神经元不是特别有用。 自从隐藏单元引入以来,人工神经网络的规模大约每2.4年扩大一倍。这种增长是由更大内存、更快的计算机和更大的可用数据集驱动的。 对象识别中最大的比赛是每年举行的ImageNet大型视觉识别挑战(ILSVRC) 深度网络在行人检测和图像分割中也取得了引人注目的成功(Sermanet et al.,2013; Fara-bet et al.,2013; Couprie et al.,2013),并且在交通标志分类上取得了超越人类的表现(Ciresan et al.,2012)。 循环神经网络,如之前提到的LSTM序列模型,现在用于对序列和其他序列之间的关系进行建模,而不是仅仅固定输入之间的关系。这种序列到序列的学习似乎引领着另一个应用的颠覆性发展,即机器翻译 在强化学习中,一个自主的智能体必须在没有人类操作者指导的情况下,通过试错来学习执行任务。 第2章 线性代数 线性代数主要是面向连续数学,而非离散数学 The Matrix Cookbook(Petersen and Pedersen, 2006) 标量(scalar):一个标量就是一个单独的数 矩阵(matrix):矩阵是一个二维数组,其中的每一个元素由两个索引(而非一个)所确定。 张量(tensor):在某些情况下,我们会讨论坐标超过两维的数组。一般的,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量。 向量可以看作只有一列的矩阵。对应地,向量的转置可以看作只有一行的矩阵。 这种隐式地复制向量b到很多位置的方式,称为广播(broadcasting)。 矩阵A的矩阵逆记作A-1,其定义的矩阵满足如下条件:[插图] 然而,逆矩阵A-1主要是作为理论工具使用的,并不会在大多数软件应用程序中实际使用。这是因为逆矩阵A-1在数字计算机上只能表现出有限的精度,有效使用向量b的算法通常可以得到更精确的x。 当机器学习问题中零和非零元素之间的差异非常重要时,通常会使用L1范数。 并非所有的对角矩阵都是方阵。长方形的矩阵也有可能是对角矩阵。非方阵的对角矩阵没有逆矩阵 特征分解(eigendecomposition)是使用最广的矩阵分解之一,即我们将矩阵分解成一组特征向量和特征值。 每个实对称矩阵都可以分解成实特征向量和实特征值: 对角矩阵D的伪逆D+是其非零元素取倒数之后再转置得到的。 行列式,记作det(A),是一个将方阵A映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。如果行列式是0,那么空间至少沿着某一维完全收缩了,使其失去了所有的体积;如果行列式是1,那么这个转换保持空间体积不变。 主成分分析(principal components analysis, PCA)是一个简单的机器学习算法,可以通过基础的线性代数知识推导 主成分分析(principal components analysis, PCA)是一个简单的机器学习算法,可以通过基础的线性代数知识推导。 一种方法是最小化原始输入向量x和重构向量g(c∗)之间的距离。 PCA限制D的列向量彼此正交 最优的d是[插图]最大特征值对应的特征向量。 第3章 概率与信息论 在人工智能领域,概率论主要有两种用途:首先,概率法则告诉我们AI系统如何推理,据此我们设计一些算法来计算或者估算由概率论导出的表达式;其次,可以用概率和统计从理论上分析我们提出的AI系统的行为。 概率论使我们能够提出不确定的声明以及在不确定性存在的情况下进行推理,而信息论使我们能够量化概率分布中的不确定性总量。 几乎所有活动都需要一些在不确定性存在的情况下进行推理的能力。 在很多情况下,使用一些简单而不确定的规则要比复杂而确定的规则更为实用,即使真正的规则是确定的并且我们建模的系统可以足够精确地容纳复杂的规则。 前面那种概率直接与事件发生的频率相联系,被称为频率派概率(frequentistprobability);而后者涉及确定性水平,被称为贝叶斯概率(Bayesianprobability)。 概率可以被看作用于处理不确定性的逻辑扩展。逻辑提供了一套形式化的规则,可以在给定某些命题是真或假的假设下,判断另外一些命题是真的还是假的。概率论提供了一套形式化的规则,可以在给定一些命题的似然后,计算其他命题为真的似然。 一个随机变量只是对可能的状态的描述;它必须伴随着一个概率分布来指定每个状态的可能性 概率分布(probability distribution)用来描述随机变量或一簇随机变量在每一个可能取到的状态的可能性大小。 离散型变量的概率分布可以用概率质量函数(probability mass function, PMF)[插图]来描述 概率质量函数可以同时作用于多个随机变量。这种多个变量的概率分布被称为联合概率分布(joint probability distribution)。P(x=x, y=y)表示x=x和y=y同时发生的概率。我们也可以简写为P(x,y)。 这种定义在子集上的概率分布被称为边缘概率分布(marginal probability distribution)。 计算一个行动的后果被称为干预查询(intervention query)。干预查询属于因果模型(causal modeling)的范畴 函数f(x)关于某分布P(x)的期望(expectation)或者期望值(expected value)是指,当x由P产生,f作用于x时,f(x)的平均值。 协方差(covariance)在某种意义上给出了两个变量线性相关性的强度以及这些变量的尺度: 第二,在具有相同方差的所有可能的概率分布中,正态分布在实数上具有最大的不确定性。因此,我们可以认为正态分布是对模型加入的先验知识量最少的分布。 高斯混合模型是概率密度的万能近似器(universal approximator),在这种意义下,任何平滑的概率密度都可以用具有足够多组件的高斯混合模型以任意精度来逼近。 softplus函数可以用来产生正态分布的β和σ参数,因为它的范围是(0,∞)。当处理包含s softplus函数可以用来产生正态分布的β和σ参数,因为它的范围是(0,∞) 测度论的一个重要贡献就是提供了一些集合的特征,使得我们在计算概率时不会遇到悖论 信息论是应用数学的一个分支,主要研究的是对一个信号包含信息的多少进行量化。 信息论的基本想法是一个不太可能的事件居然发生了,要比一个非常可能的事件发生,能提供更多的信息。 如果对于同一个随机变量x有两个单独的概率分布P(x)和Q(x),可以使用KL散度(Kullback-Leibler(KL)divergence)来衡量这两个分布的差异 在离散型变量的情况下,KL散度衡量的是,当我们使用一种被设计成能够使得概率分布Q产生的消息的长度最小的编码,发送包含由概率分布P产生的符号的消息时,所需要的额外信息量 当用图来表示这种概率分布的分解时,我们把它称为结构化概率模型(structured probabilistic model)或者图模型(graphical model)。 有向或者无向不是概率分布的特性;它是概率分布的一种特殊描述(description)所具有的特性,而任何概率分布都可以用这两种方式进行描述。 第4章 数值计算 机器学习算法通常需要大量的数值计算。这通常是指通过迭代过程更新解的估计值来解决数学问题的算法,而不是通过解析过程推导出公式来提供正确解的方法 一种极具毁灭性的舍入误差是下溢(underflow)。当接近零的数被四舍五入为零时发生下溢。 必须对上溢和下溢进行数值稳定的一个例子是softmax函数(softmax function)。softmax 在实现深度学习算法时,底层库的开发者应该牢记数值问题。 条件数指的是函数相对于输入的微小变化而变化的快慢程度 我们把要最小化或最大化的函数称为目标函数(objective function)或准则(criterion)。当我们对其进行最小化时,也把它称为代价函数(cost function)、损失函数(loss function)或误差函数(error function)。 有些临界点既不是最小点也不是最大点,这些点称为鞍点(saddle point) 在深度学习的背景下,即使找到的解不是真正最小的,但只要它们对应于代价函数显著低的值,我们通常就能接受这样的解 有时我们需要计算输入和输出都为向量的函数的所有偏导数。包含所有这样的偏导数的矩阵被称为Jacobian矩阵。 二阶导数是对曲率的衡量 Hessian等价于梯度的Jacobian矩阵。 二阶导数还可以用于确定一个临界点是否是局部极大点、全局极小点或鞍点。 维度多于一个时,鞍点不一定要具有0特征值:仅需要同时具有正特征值和负特征值。 仅使用梯度信息的优化算法称为一阶优化算法(first-orderoptimization algorithms),如梯度下降。使用Hessian矩阵的优化算法称为二阶最优化算法(second-order optimizationalgo-rithms)(Nocedal and Wright,2006),如牛顿法。 Karush-Kuhn-Tucker(KKT)方法[插图]是针对约束优化非常通用的解决方案。 Karush-Kuhn-Tucker(KKT)方法是针对约束优化非常通用的解决方案。 这些是确定一个点是最优点的必要条件,但不一定是充分条件。这些条件是:• 广义Lagrangian的梯度为零。• 所有关于x和KKT乘子的约束都满足。• 不等式约束显示的“互补松弛性”:α⊙h(x)=0。 第5章 机器学习基础 深度学习是机器学习的一个特定分支 Murphy(2012)或者Bishop(2006) 机器学习本质上属于应用统计学,更多地关注于如何用计算机统计地估计复杂函数,不太关注为这些函数提供置信区间,因此我们会探讨两种统计学的主要方法:频率派估计和贝叶斯推断。 对于某类任务T和性能度量P,一个计算机程序被认为可以从经验E中学习是指,通过经验E改进后,它在任务T上由性能度量P衡量的性能有所提升。 学习是我们所谓的获取完成任务的能力 通常机器学习任务定义为机器学习系统应该如何处理样本(example) 输入缺失分类 缺失值填补 根据学习过程中的不同经验,机器学习算法可以大致分类为无监督(unsupervised)算法和监督(supervised)算法。 传统上,人们将回归、分类或者结构化输出问题称为监督学习,将支持其他任务的密度估计称为无监督学习。 表示数据集的常用方法是设计矩阵(design matrix)。设计矩阵的每一行包含一个不同的样本。每一列对应不同的特征。 通过经验以提高计算机程序在某些任务上性能的算法。 度量模型性能的一种方法是计算模型在测试集上的均方误差(mean squared error) 所以当预测值和目标值之间的欧几里得距离增加时,误差也会增加。 截距项b通常被称为仿射变换的偏置(bias)参数 在先前未观测到的输入上表现良好的能力被称为泛化(generaliza-tion)。 欠拟合(underfitting)和过拟合(overfitting)。欠拟合是指模型不能在训练集上获得足够低的误差,而过拟合是指训练误差和测试误差之间的差距太大。 当机器学习算法的容量适合于所执行任务的复杂度和所提供训练数据的数量时,算法效果通常会最佳 奥卡姆剃刀(Occam's razor)(c. 1287-1387)。该原则指出,在同样能够解释已知观测现象的假设中,我们应该挑选“最简单”的那一个。这个想法是在2 奥卡姆剃刀(Occam's razor)(c. 1287-1387)。该原则指出,在同样能够解释已知观测现象的假设中,我们应该挑选“最简单”的那一个。 统计学习理论中最重要的结论阐述了训练误差和泛化误差之间差异的上界随着模型容量增长而增长,但随着训练样本增多而下降 参数模型学习的函数在观测到新数据前,参数向量的分量个数是有限且固定的。非参数模型没有这些限制。 从预先知道的真实分布p(x,y)预测而出现的误差被称为贝叶斯误差(Bayes error)。 学习理论表明机器学习算法能够在有限个训练集样本中很好地泛化。 机器学习的没有免费午餐定理(no free lunch theo-rem)表明(Wolpert,1996),在所有可能的数据生成分布上平均之后,每一个分类算法在未事先观测的点上都有相同的错误率。 这意味着机器学习研究的目标不是找一个通用学习算法或是绝对最好的学习算法,而是理解什么样的分布与人工智能获取经验的“真实世界”相关,以及什么样的学习算法在我们关注的数据生成分布上效果最好。 因此我们可以通过两种方式控制算法的性能,一是允许使用的函数种类,二是这些函数的数量。 更一般地,正则化一个学习函数f(x;θ)的模型,我们可以给代价函数添加被称为正则化项(regularizer)的惩罚。 正则化是指修改学习算法,使其降低泛化误差而非训练误差。正则化是机器学习领域的中心问题之一,只有优化能够与其重要性相提并论。 我们将训练数据分成两个不相交的子集。其中一个用于学习参数。另一个作为验证集,用于估计训练中或训练后的泛化误差,更新超参数。 一个小规模的测试集意味着平均测试误差估计的统计不确定性,使得很难判断算法A是否比算法B在给定的任务上做得更好。 点估计试图为一些感兴趣的量提供单个“最优”预测。 点估计也可以指输入和目标变量之间关系的估计,我们将这种类型的点估计称为函数估计。 如果,那么估计量被称为是无偏(unbiased),这意味着。如果,那么估计量被称为是渐近无偏(asymptotically unbiased),这意味着。 样本均值是高斯均值参数的无偏估计量。 在机器学习实验中,我们通常说算法A比算法B好,是指算法A的误差的95%置信区间的上界小于算法B的误差的95%置信区间的下界。 偏差度量着偏离真实函数或参数的误差期望,而方差度量着数据上任意特定采样可能导致的估计期望的偏差。 一种解释最大似然估计的观点是将它看作最小化训练集上的经验分布和模型分布之间的差异,两者之间的差异程度可以通过KL散度度量。 任何一个由负对数似然组成的损失都是定义在训练集上的经验分布和定义在模型上的概率分布之间的交叉熵。 最大似然估计最吸引人的地方在于,它被证明当样本数目m→∞时,就收敛率而言是最好的渐近估计。 贝叶斯统计的视角完全不同。贝叶斯统计用概率反映知识状态的确定性程度。数据集能够被直接观测到,因此不是随机的。另一方面,真实参数θ是未知或不确定的,因此可以表示成随机变量。 相对于最大似然估计,贝叶斯估计有两个重要区别。第一,不像最大似然方法预测时使用θ的点估计,贝叶斯方法使用θ的全分布。 支持向量机的一个重要创新是核技巧(kernel trick) 核函数完全等价于用φ(x)预处理所有的输入,然后在新的转换空间学习线性模型。 核技巧十分强大有两个原因:其一,它使我们能够使用保证有效收敛的凸优化技术来学习非线性模型(关于x的函数)。这是可能的,因为我们可以认为φ是固定的,仅优化α,即优化算法可以将决策函数视为不同空间中的线性函数。其二,核函数k的实现方法通常比直接构建φ(x)再算点积高效很多。 核机器的一个主要缺点是计算决策函数的成本关于训练样本的数目是线性的。 最常见的3种包括低维表示、稀疏表示和独立表示。 随机梯度下降的核心是,梯度是期望。期望可使用小规模的样本近似估计。 几乎所有的深度学习算法都可以被描述为一个相当简单的配方:特定的数据集、代价函数、优化过程和模型。 最常见的代价函数是负对数似然,最小化代价函数导致的最大似然估计。 促使深度学习发展的一部分原因是传统学习算法在这类人工智能问题上泛化能力不足。 当数据的维数很高时,很多机器学习问题变得相当困难。这种现象被称为维数灾难(curse of dimensionality)。 深度学习的核心思想是假设数据由因素或特征组合产生,这些因素或特征可能来自一个层次结构的多个层级。 深度的分布式表示带来的指数增益有效地解决了维数灾难带来的挑战。 流形(manifold)指连接在一起的区域。 流形学习(manifold learning)算法通过一个假设来克服这个障碍,该假设认为中大部分区域都是无效的输入,有意义的输入只分布在包含少量数据点的子集构成的一组流形中,而学习函数的输出中,有意义的变化都沿着流形的方向或仅发生在我们切换到另一流形时。 第一个支持流形假设(manifold hypothesis)的观察是现实生活中的图像、文本、声音的概率分布都是高度集中的。 支持流形假设的第二个论点是,我们至少能够非正式地想象这些邻域和变换。 当数据位于低维流形中时,使用流形中的坐标而非[插图]中的坐标表示机器学习数据更为自然。 第2部分 深度网络:现代实践 通过添加更多层以及向层内添加更多单元,深度网络可以表示复杂性不断增加的函数。 参数化函数近似技术的核心 第6章 深度前馈网络 我们最好将前馈神经网络想成是为了实现统计泛化而设计出的函数近似机,它偶尔从我们了解的大脑中提取灵感,但并不是大脑功能的模型。 这种方法的优点是人类设计者只需要寻找正确的函数族即可,而不需要去寻找精确的函数。 选择一个优化模型、代价函数以及输出单元的形式。 在现代神经网络中,默认的推荐是使用由激活函数g(z)=max{0,z}定义的整流线性单元(rectified linear unit)或者称为ReLU 在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸 在大多数情况下,参数模型定义了一个分布p(y|x;θ)并且简单地使用最大似然原理。这意味着我们使用训练数据和模型预测间的交叉熵作为代价函数。 大多数现代的神经网络使用最大似然来训练。这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵等价。 贯穿神经网络设计的一个反复出现的主题是代价函数的梯度必须足够的大和具有足够的预测性,来为学习算法提供一个好的指引。 用于实现最大似然估计的交叉熵代价函数有一个不同寻常的特性,那就是当它被应用于实践中经常遇到的模型时,它通常没有最小值。 可惜的是,均方误差和平均绝对误差在使用基于梯度的优化方法时往往成效不佳。一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。这就是交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一了,即使是在没必要估计整个p(y|x)分布时。 最大似然几乎总是训练sigmoid输出单元的优选方法。 整流线性单元是隐藏单元极好的默认选择 部分原因是神经网络训练算法通常不会达到代价函数的局部最小值,而是仅仅显著地减小它的值 整流线性单元的一个缺陷是它们不能通过基于梯度的方法学习那些使它们激活为零的样本。整流线性单元的各种扩展保证了它们能在各个位置都接收到梯度。 当必须要使用sigmoid激活函数时,双曲正切激活函数通常要比logistic sigmoid函数表现更好。 万能近似定理(universal approximation theorem)(Hornik et al., 1989; Cybenko, 1989)表明,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种“挤压”性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数。 前馈网络可以被视为一种高效的非线性函数近似器,它以使用梯度下降来最小化函数近似误差为基础。 第7章 深度学习中的正则化 许多策略被显式地设计来减少测试误差(可能会以增大训练误差为代价)。这些策略被统称为正则化 正则化定义为“对学习算法的修改——旨在减少泛化误差而不是训练误差” 估计的正则化以偏差的增加换取方差的减少 最好的拟合模型(从最小化泛化误差的意义上)是一个适当正则化的大型模型。 参数包括每一层仿射变换的权重和偏置,我们通常只对权重做惩罚而不对偏置做正则惩罚 只有在显著减小目标函数方向上的参数会保留得相对完好。在无助于目标函数减小的方向(对应Hessian矩阵较小的特征值)上改变参数不会显著增加梯度。这种不重要方向对应的分量会在训练过程中因正则化而衰减掉。 L2正则化能让学习算法“感知”到具有较高方差的输入x,因此与输出目标的协方差较小(相对增加方差)的特征的权重将会收缩。 对于某些模型而言,向输入添加方差极小的噪声等价于对权重施加范数惩罚 这种策略被称为提前终止(early stopping)。这可能是深度学习中最常用的正则化形式。它的流行主要是因为有效性和简单性。 模型平均(model averaging)奏效的原因是不同的模型通常不会在测试集上产生完全相同的误差。 模型平均是一个减少泛化误差的非常强大可靠的方法 Dropout可以被认为是集成大量深层神经网络的实用Bagging方法。 第8章 深度模型中的优化 每次只使用单个样本的优化算法有时被称为随机(stochastic)或者在线(online)算法。 黏性阻力避免了这两个问题——它足够弱,可以使梯度引起的运动直到达到最小,但又足够强,使得坡度不够时可以阻止运动。 第9章 卷积网络 卷积网络(convolutional network)(LeCun,1989),也叫作卷积神经网络(convolutional neural network, CNN),是一种专门用来处理具有类似网格结构的数据的神经网络 稀疏交互(sparse interactions)、参数共享(parameter sharing)、等变表示(equivariant representations) 池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。 局部平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时 使用池化可以看作增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。 第10章 序列建模:循环和递归网络