【深度学习】理论派

一个人的日常生活需要关于世界的巨量知识。很多这方面的知识是主观的、直观的,因此很难通过形式化的方式表达清楚。计算机需要获取同样的知识才能表现出智能。人工智能的一个关键挑战就是如何将这些非形式化的知识传达给计算机。


更新历史

  • 2020.02.18:重新上线
  • 2018.09.17:完成迁移

第 1 章 引言

一个人的日常生活需要关于世界的巨量知识。很多这方面的知识是主观的、直观的,因此很难通过形式化的方式表达清楚。计算机需要获取同样的知识才能表现出智能。人工智能的一个关键挑战就是如何将这些非形式化的知识传达给计算机。

在整个计算机科学乃至日常生活中,对表示的依赖都是一个普遍现象。许多人工智能任务都可以通过以下方式解决:先提取一个合适的特征集,然后将这些特征提供给简单的机器学习算法。然而,对于许多任务来说,我们很难知道应该提取哪些特征。解决这个问题的途径之一是使用机器学习来发掘表示本身,而不仅仅把表示映射到输出,这种方法我们称之为表示学习(representation learning)。

深度学习的历史趋势

  • 深度学习有着悠久而丰富的历史,但随着许多不同哲学观点的渐渐消逝,与之对应的名称也渐渐尘封。
  • 随着可用的训练数据量不断增加,深度学习变得更加有用。
  • 随着时间的推移,针对深度学习的计算机软硬件设施都有所改善,深度学习模型的规模也随之增长。
  • 随着时间的推移,深度学习已经解决日益复杂的应用,并且精度不断提高。

神经科学已经给了我们依靠单一深度学习算法解决许多不同任务的理由。神经学家们发现,如果将雪貂的大脑重新连接,使视觉信号传送到听觉区域,它们可以学会用大脑的听觉处理区域去『看』。这暗示着大多数哺乳动物的大脑使用单一的算法就可以解决其大脑可以解决的大部分不同任务。

目前大多数神经网络是基于一个称为整流线性单元(rectified linear unit)的神经单元模型。

一个粗略的经验法则是,监督深度学习算法在每类给定约 5000 个标注样本情况下一般将达到可以接受的性能,当至少有 1000 万个标注样本的数据集用于训练时,它将达到或超过人类表现。此外,在更小的数据集上获得成功是一个重要的研究领域,为此我们应特别侧重于如何通过无监督或半监督学习充分利用大量的未标注样本。

总之,深度学习是机器学习的一种方法。在过去几十年的发展中,它大量借鉴了我们关于人脑、统计学和应用数学的只是。近年来,得益于更强大的计算机、更大的数据集和能够训练更深网络的技术,深度学习的普及性和实用性都有了极大的发展。未来几年,深度学习更是充满了进一步提高并应用到新领域的挑战和机遇。

第 2 章 线性代数

掌握好线性代数对于理解和从事机器学习算法相关工作是很有必要的。推荐 The Matrix Cookbook(Petersen and Pedersen, 2006)。重要的基本概念有:

  • 标量 scalar
  • 向量 vector
  • 矩阵 matrix:转置 transpose,广播 broadcasting,矩阵相乘,单位矩阵 identity matrix,逆矩阵 matrix inversion,线性相关 linear dependence,对角矩阵 diagonal matrix,对称 symmetric,方阵 square,正交矩阵 orthogonal matrix,特征向量 eigenvector,特征值 eigenvalue,Moore-Penrose 伪逆,迹 trace,行列式 det(A)
    • 生成子空间 span 是原始向量线性组合后所能抵达的点的集合
    • 一个列向量线性相关的方阵被称为奇异的 singular
    • 所有特征值都是正数的矩阵称为正定 positive definite,都是负数称为负定 negative definite
    • 所有特征值都是非负数的矩阵称为半正定 positive semidefinite,都是非正数
  • 张量 tensor
  • 范数 norm,L2 范数称为欧几里得范数 Euclidean norm,它表示从原点出发到向量 x 确定的点的欧几里得距离,在机器学习中出现得十分频繁。

特征分解 eigendecomposition 是使用最广的矩阵分解之一,即我们将矩阵分解成一组特征向量和特征值。许多数学对象可以通过将它们分解成多个组成部分或者找到它们的一些属性来更好地理解。这些属性是通用的,而不是由我们选择表示它们的方式所产生的。

奇异值分解 singular value decomposition, SVD 是将矩阵分解为奇异向量 singular vector 和奇异值 singular value 的方法。

实例:PCA 推导

第 3 章 概率与信息论

在人工智能领域,概率论主要有两种用途:首先,概率法则告诉我们 AI 系统如何推理,据此我们设计一些算法来计算或者估算由概率论导出的表达式;其次,可以用概率和统计从理论上分析我们提出的 AI 系统的行为。

概率论使我们能够提出不确定的声明以及在不确定性存在的情况下进行推理,而信息论使我们能够量化概率分布中的不确定性总量。

几乎所有活动都需要一些在不确定性存在的情况下进行推理的能力。不确定性有 3 种可能的来源:1)被建模系统内在的随机性。2)不完全观测。3)不完全建模。

在很多情况下,使用一些简单而不确定的规则要比复杂而确定的规则更为实用,即使真正的规则是确定的并且我们建模的系统可以足够精确地容纳复杂规则。

概率直接与事件发生的频率相联系,被称为频率派概率 frequentist probability,比如从牌堆中抽出红色的概率。涉及确定性水平的被称为贝叶斯概率 Bayesian probability,比如医生诊断病人有 40% 的可能得流感。

概率可以被看做用于处理不确定性的逻辑扩展。逻辑提供了一套形式化规则,可以在给定某些命题是真或假的假设下,判断另外一些命题是真的还是假的。概率论提供了一套形式化的规则,可以在给定一些命题的似然后,计算其他命题为真的似然。重要的基本概念有:

  • 随机变量 random variable
  • 概率分布 probability distribution
    • 离散 - 概率质量函数 probability mass function, PMF;多个离散随机变量的话称为联合概率分布 joint probability distribution
    • 连续 - 概率密度函数 probabiliity density function, PDF
  • 边缘概率分布 marginal probability distribution
  • 条件概率与条件概率的链式法则
  • 期望 expectation,方差 variance
  • 协方差 covariance 在某种意义上给出了两个变量线性相关性的强度以及这些变量的尺度。相关系数 correlation

常用概率分布

  • Bernoulii 分布,单个二值随机变量的分布
  • Multinoulli 分布(范畴分布 categorical distribution),K 个不同状态的单个离散型随机变量上的分布
  • 高斯分布(正态分布)。采用正态分布的真实情况是比较接近正态分布的。中心极限定理 central limit theorem 说明很多独立随机变量的和近似服从正态分布。这意味着在实际中,很多复杂系统都可以被成功地建模成正态分布的噪声,即使系统可以被分解成一些更结构化的部分。第二,在具有相同方差的所有可能的概率分布中,正态分布在实数上具有最大的不确定性。因此,我们可以认为正态分布是对模型加入的先验知识量最少的分布。
  • 指数分布 exponential distribution 和 Laplace 分布,一个在 x=0 点处取得边界点 sharp point 的分布
  • Dirac 分布和经验分布 expirical distribution,希望概率分布中的所有质量都集中在一个点上
  • 混合分布 mixture distribution;潜变量 latent variable 是我们不能直接观测到的随机变量
  • 高斯混合模型 Gaussian Mixture Model,是概率密度的万能近似器 universal approximator,在这种意义上,任何平滑的概率密度都可以用足够多组件的高斯混合模型以任意精度来逼近。

常用函数的有用性质

  • logistic sigmoid 函数:通常用来产生 Bernoulli 分布中的参数 φ,范围是 (0,1)。sigmoid 函数在变量取绝对值非常大的正值或负值时会出现饱和 saturate 现象,意味着函数会变得很平,并且对输入的微小改变会变得不敏感。
  • softplus 函数:可以用来产生正态分布的 β 和 σ 参数,因为它的范围是 (0, 正无穷)

信息论是应用数学的一个分支,主要研究的是对一个信号包含信息的多少进行量化。重点概念:

  • 自信息 self-information
  • 香农熵 shannon entropy,当 x 是连续的,香农熵被称为微分熵 differential entropy

如果对于同一个随机变量 x 有两个单独的概率分布,我们可以用 KL 散度 Kullback_leibler divergence 来衡量这两个分布的差异。KL 散度有很多有用的性质,最重要的是,它是非负的。KL 散度为 0,当且仅当 P 和 Q 在离散型变量的情况下是相同的分布,或者在连续型变量的情况下是『几乎处处』相同的。

第 4 章 数值计算

机器学习算法通常需要大量的数值计算。这通常是指通过迭代过程更新解的估计值来解决数学问题的算法,而不是通过解析过程推导出公式来提供正确解的方法。常见的操作包括优化(找到最小化或最大化函数值的参数)和线性方程组的求解。对数字计算机来说,实数无法在有限内存下精确表示,因此仅仅是计算涉及实数的函数也是很困难的。重要概念:

  • 上溢和下溢,必须对上溢和下溢进行数值稳定的一个例子是 softmax 函数
  • 病态条件,条件数指的是函数相对于输入的微小变化的快慢程度。输入被轻微扰动而循序改变的函数对于科学计算来说可能是有问题的,因为输入中的舍入误差可能导致输出的巨大变化
  • 梯度下降 gradient descent,临界点 critical point 或驻点 stationary point,局部极小点 local minimum,局部极大点 local maximum,鞍点 saddle point
  • 偏导数 partial derivative,梯度 gradient,学习率 learning rate
  • Jacobian 矩阵,包含输入输出都为向量的函数的所有偏导数的矩阵
  • Hessian 矩阵,包含所有的二阶导数的矩阵
  • 约束优化 constrained optimization,可行点 feasible point
  • Karush-Kuhn-Tucker(KKT) 方法是针对约束优化非常通用的解决方案
    • 广义 Lagrangian 的梯度为零
    • 所有关于 x 和 KKT 乘子的约束都满足
    • 不等式约束显示『互补松弛性』

大多数深度学习算法都涉及某种形式的优化。优化指的是改变 x 以最小化或最大化某个函数 f(x) 的任务。我们通常以最小化 f(x) 指代大多数最优化问题。最大化可经由最小化算法 -f(x) 来实现。我们把要最小化或最大化的函数称为目标函数 object function 或准则 criterion。当我们对其进行最小化时,也把它称为代价函数 cost function、损失函数 loss function 或误差函数 error function。

仅使用梯度信息的优化算法称为一阶优化算法 first-order optimization algorithms,如梯度下降。使用 Hessian 矩阵的优化算法称为二阶最优化算法 second-order optimization algorithms,如牛顿法。最成功的特定优化领域或许是凸优化 convex optimization。凸优化通过更强的限制提供更多的保证。凸优化算法只对凸函数适用,即 Hessian 处处半正定的函数。因为这些函数没有鞍点而且其所有全局极小点必然是全局最小点,所以表现很好。然而,深度学习中的大多数问题都难以表示成凸优化的形式(凸优化的重要性大大减少)

第 5 章 机器学习基础

通常机器学习任务定义为机器学习系统应该如何处理样本 sample。样本是指我们从某些希望机器学习系统处理的对象或事件中收集到的已经量化的特征 feature 的集合。常见的机器学习任务有:

  • 分类
  • 输入缺失分类
  • 回归
  • 转录
  • 机器翻译
  • 结构化输出
  • 异常检测
  • 合成和采样
  • 缺失值填补
  • 去噪
  • 密度估计或概率质量函数估计

对于诸如分类、缺失输入分类和转录任务,我们通常度量模型的准确率 accuracy。在先前未观测到的输入上表现良好的能力被称为泛化 generalization。

没有免费午餐定理清楚阐述了没有最优的学习算法,特别是没有最优的正则化形式。反之,我们必须挑选一个非常适合于我们所要解决的任务的正则形式。深度学习中普遍的理念是大量任务(例如所有人能做的智能任务)也许都可以使用非常通用的正则化形式来有效解决。

大多数机器学习算法都有超参数,可以设置来控制算法行为。超参数的值不是通过学习算法本身学习出来的。

统计领域为我们提供了很多工具来实现机器学习目标,不仅可以解决训练集上的任务,还可以泛化。基本的概念,例如参数估计、偏差和方差,对于正式地刻画泛化、欠拟合和过拟合都非常有帮助。

第 6 章 深度前馈网络

深度前馈网络 deep feedforward network,也叫做前馈神经网络 feedforward neural network 或者多层感知机 multilayer perceptron, MLP 是典型的深度学习模型。前馈网络的目标是近似某个函数 f*。例如,对于分类器,y = f*(x) 将输入 x 映射到一个类别 y。前馈网络定义了一个映射 y = f(x;𝜃),并学习参数 𝜃 的值,使它能够得到最佳的函数近似。

这种模型被称为前向 feedforward 的,因为信息流过 x 的函数,流经用于定义 f 的中间计算过程,最终到达输出 y。在模型的输出和模型本身时间没有反馈 feedback 连接。当前馈神经网络被扩展成包含反馈连接时,它们被称为循环神经网络 recurrent neural network。

训练一个前馈神经网络至少需要做和线性模型同样多的设计决策:选择一个优化模型、代价函数以及输出单元的形式。前馈网络已经引入了隐藏层的概念,这需要我们去选择用于计算隐藏层值的激活函数 activation function。我们还必须设计网络结构,包括网络应该包含多少层、这些层应该如何连接,以及每一层包含多少单元。在深度神经网络的学习中需要计算复杂函数的梯度。我们给出反向传播 back propagation 算法和它的现代推广,他们可以用来高效地计算这些梯度。

我们到目前为止看到的线性模型和神经网络的最大区别,在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸。这意味着神经网络的训练通常使用迭代的、基于梯度的优化,仅仅使得代价函数达到一个非常小的值;而不是像用于训练线性回归模型的线性方程求解器,或者用于训练逻辑回归或 SVM 的凸优化算法那样保证全局收敛性。凸优化从任何一种初始参数出发都会收敛(理论上)。用于非凸损失函数的随机梯度下降没有这种收敛性保证,并且对参数的初始值很敏感。对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的。

整流线性单元 ReLU 是隐藏单元极好的默认选择。

万能近似定理意味着无论我们试图学习什么函数,我们知道一个大的 MLP 一定能够表示这个函数。然而,我们不能保证训练算法能够学得这个函数。即使 MLP 能够表示该函数,学习也可能因两个不同的原因而失败。首先,用于训练的优化算法可能找不到用于期望函数的参数值。其次,训练算法可能由于过拟合而选择了错误的算法。

当我们使用前馈神经网络接受输入 x 并产生输出 ŷ 时,信息通过网络向前流动。输入 x 提供初始信息,然后传播到每一层的隐藏单元,最终产生输出 ŷ。这称之为前向传播 forward propagation。在训练过程中,前向传播可以持续向前直到它产生一个标量代价函数 J(𝜃)。反向传播 back propagation 算法,经常简称为 backprop,允许来自代价函数的信息通过网络向后流动,以便计算梯度。

计算梯度的解析表达式是很直观的,但是数值化地求解这样的表达式在计算上的代价可能很大。反向传播算法使用简单和廉价的程序来实现这个目标。

反向传播这个术语经常呗误解为用于多层神经网络的整个学习算法。实际上,反向传播仅指用于计算梯度的方法,而另一种算法,例如随机梯度下降,使用该梯度来进行学习。

反向传播实际上是利用逆矩阵(或伪逆)的特性,减少梯度计算中的重复计算来加快训练过程的。

注:需要去阅读更多关于反向传播的通俗理解(理解意思就好,不用特别在意推导)

前馈网络可以被视为一种高效的非线性函数近似器,它以使用梯度下降来最小化函数近似误差为基础。从这个角度看,现代前馈神经网络是一般函数近似任务的几个世纪进步的结晶。

整流线性单元还具有历史意义,因为它们表明神经科学继续对深度学习算法的发展产生影响。

第 7 章 深度学习中的正则化

机器学习中的一个核心问题是设计不仅在训练数据上表现好,而且能在新输入上泛化好的算法。在机器学习中,许多策略被显式地设计来减少测试误差(可能会以增大训练误差为代价)。这些策略被统称为正则化。

让机器模型泛化得更好的最好方法是使用更多的数据进行训练。当然,在实践中,我们拥有的数据量是很有限的。解决这个问题的一种方法是创建假数据并添加到训练集中。对于一些机器学习任务,创建新的假数据相当简单。

参数范数惩罚是正则化参数使其彼此接近的一种方式,而更流行的方法是使用约束:强迫某些参数相等。由于我们将各种模型或模型组件解释为共享唯一的一组参数,这种正则化方法通常被称为参数共享 parameter sharing。和正则化参数使其接近(通过范数惩罚)相比,参数共享的一个显著有点是,只有参数(唯一一个集合)的子集需要被存储在内存中。对于某些特定的模型,如卷积神经网络,这可能可以显著减少模型所占用的内存。

目前为止,最流行和广泛使用的参数共享出现在应用于计算机视觉的卷积神经网络 CNN 中。自然图像中有许多统计属性是对转换不变的。CNN 通过在图像多个位置共享参数来考虑这个特性。相同的特征(具有相同权重的隐藏单元)在输入的不同位置上计算获得。

Bagging(botstrap aggregating) 是通过结合几个模型降低泛化误差的技术。主要想法是分别训练几个不同的模型,然后让所有模型表决测试样例的输出。这是机器学习中常规则略的一个例子,被称为模型平均 model averaging。采用这种策略的技术被称为集成方法。模型平均奏效的原因是不同的模型通常不会在测试集上产生完全相同的误差。

Dropout 提供了正则化一大类模型的方法,计算方便但功能强大。Dropout 提供了一种廉价的 Bagging 集成近似,能够训练和评估指数级数量的神经网络。具体而言,Dropout 训练的集成包括所有从基础网络除去非输出单元后形成的子网络。

计算方便是 Dropout 的一个优点。训练过程中使用 Dropout 产生 n 个随机二进制数与状态相乘,每个样本每次更新只需 O(n) 的计算复杂度。Dropout 的另一个显著有点是不怎么限制适用的模型或训练过程。几乎在所有使用分布式表示且可以用随机梯度下降训练的模型上都表现很好。包括前馈神经网络、概率模型。

在许多情况下,神经网络在独立同分布的测试集上进行评估已经达到了人类表现。因此,我们自然要怀疑这些模型在这些任务上是否获得了真正的人类层次的理解。人类观察者不会察觉原始样本和对抗样本 adversarial example 之间的差异,但是网络会做出非常不同的预测。

第 8 章 深度模型中的优化

深度学习算法在许多情况下都涉及优化。用于深度模型训练的优化算法与传统的优化算法在几个方面有所不同。机器学习通常是间接作用的。在大多数机器学习问题中,我们关注某些性能度量 P,其定义于测试集上并且可能是不可解的。因此,我们只是间接地优化 P。

基于最小化这种平均训练误差的训练过程被称为经验风险最小化 empirical risk minimization。在这种情况下,机器学习仍然和传统的直接优化很相似。我们并不直接最优化风险(因为我们实际上还不知道),而是最优化经验风险,希望也能够很大地降低风险。一系列不同的理论构造了一些条件,使得在这些条件下真实风险的期望可以下降不同的量。

然而,经验风险最小化很容易导致过拟合。高容量的模型会简单记住训练集。在很多情况下,经验风险最小化并非真的可行。最有效的现代优化算法是基于梯度下降的。

机器学习算法和一般优化算法不同的一点是,机器学习算法的目标函数通常可以分解为训练样本上的求和。机器学习中的优化算法在计算参数的每一次更新时通常仅使用整个代价函数中一部分项来估计代价函数的期望值。

例如,最大似然估计问题可以在对数空间中分解成各个样本的总和,最大化这个总和等价于最大化训练集在经验分布上的期望。准确计算这个期望的计算代价非常大,因为我们需要在整个数据集上的每个样本上评估模型。在实践中,我们可以从数据集中随机采样少量的样本,然后计算这些样本上的平均值。

使用整个训练集的优化算法被称为批量 batch 或确定性 deterministic 梯度算法,因为它们会在一个大批量中同时处理所有样本。每次只使用单个样本的优化算法有时被称为随机 stochastic 或者在线 online 算法。大多数用于深度学习的算法介于以上两者之间,使用一个以上而又不是全部的训练样本。传统上,这些会被称为小批量 minibatch 或小批量随机 minibatch stochastic 方法,现在通常将它们简单地称为随机 stochastic 方法。

小批量的大小通常由以下几个因素决定:

  • 更大的批量会计算更精确的梯度估计,但是回报却是小于线性的。
  • 极小批量通常难以充分利用多核架构。这促使我们使用一些绝对最小批量,低于这个值的小批量处理不会减少计算时间。
  • 如果批量处理中的所有样本可以并行地处理(通常确是如此),那么内存消耗和批量大小会正比。对于很多硬件设施,这是批量大小的限制因素。
  • 在某些硬件上使用特定大小的数组时,运行时间会更少。尤其是在使用 GPU 时,通常使用 2 的幂数作为批量大小可以获得更少的运行时间。一般,2 的幂数的取值范围是 32~256,16 有时在尝试大模型时使用。
  • 可能是由于小批量在学习过程中加入了噪声,它们会有一些正则化效果。泛化误差通常在批量大小为 1 时最好。因为梯度估计的高方差,小批量训练需要较小的学习率以保持稳定性。因为降低的学习率和消耗更多步骤来遍历整个训练集都会产生更多的步骤,所以会导致总的运行时间非常大。

小批量是随机抽取的这一点也很重要。从一组样本中计算出梯度期望的无偏估计要求这些样本是独立的。

优化通常是一个及其困难的任务。传统的机器学习会小心设计目标函数和约束,以确保问题是凸的,从而避免一般优化问题的复杂度。在训练神经网络时,我们肯定会遇到一般的非凸情况。即使是凸优化,也并非没有任何问题。

在优化凸函数时,会遇到一些挑战。这其中最突出的是 Hessian 矩阵 H 的病态,这是数值优化、凸优化或其他形式的优化中普遍存在的问题。病态问题一般被认为存在于神经网络训练过程中。病态体现在随机梯度下降会”卡"在某些情况,此时某即使很小的更新步长也会增加代价函数。

自适应学习率算法中比较有代表性的有(具体的选择目前没有一个统一标准):

  • AdaGrad 算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。具有损失最大偏导的参数响应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。
    • 在凸优化背景中 AdaGrad 算法具有一些令人满意的理论性质。然而,经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减少
  • RMSProp 算法,修改 AdaGrad 以在非凸设定下效果更好。目前是常用的优化方法之一
  • Adam 通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改

二阶近似方法比较有代表性的有:

  • 牛顿法,计算复杂度为参数个数的三次方,另外由于参数每次更新都将改变,每次训练迭代都需要重新计算 Hessian 矩阵的逆。其结果是,只有参数很少的网络才能在实际中用牛顿法训练。其他的方法是在保存牛顿法优点的前提下,避免计算障碍
  • 共轭梯度,是一种通过迭代下降的共轭方向 conjugate directions 以有效避免 Hessian 矩阵求逆的计算方法
  • BFGS Broyden-Fletcher-Goldfarb-Shanno 具有牛顿法的一些优点,但是没有牛顿法的计算负担

优化策略和元算法中比较有代表性的有:

  • 批标准化,是优化深度神经网络中最激动人心的最新创新之一。它是一个自适应的重参数化的方法,试图解决训练非常深的模型的困难
  • 坐标下降 coordinate descent
  • Polyak 平均
  • 监督预训练

第 9 章 卷积网络

卷积网络 convolutional network 也叫做卷积神经网络 convolutional neural network, CNN,是一种专门用来处理具有类似网格结构的数据的神经网络。流入时间序列数据和图像数据。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

在卷积网络的术语中,卷积的第一个参数 x 通常叫做输入 input,第二个参数 w 叫做核函数 kernel function。输出有的时候被称作特征映射 feature map。

卷积运算通过三个重要的思想来帮助改进机器学习系统:稀疏交互 sparse interactions,参数共享 parameter sharing,等变表示 equivariant representations。另外,卷积提供了一种处理大小可变的输入的方法。

传统神经网络使用矩阵乘法来建立输入与输出的连接关系。其中,参数矩阵中每一个单独的参数都描述了一个输入单元与一个输出单元间的交互。这意味着每一个输出单元与每一个输入单元都产生交互。然而,卷积网络具有稀疏交互 sparse interactions,也叫做稀疏连接 sparse connectivity 或者稀疏权重 sparse weights 的特征。这是使核的大小远小于输入的大小来达到的。

参数共享 parameter sharing 是指在一个模型的多个函数中使用相同的参数。在卷积神经网络中,核的每一个元素都作用在输入的每一位置上。卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的运行时间,但它显著地把模型的存储需求降低至 k 个参数。

处于卷积网络更深的层中的单元,他们的接受域要比处在浅层的单元的接受域更大。如果网络还包含类似步幅卷积或者池化之类的结构特征,这种效应会加强。这意味着在卷积网络中尽管直接连接都是很稀疏的,但处在更深的层中的单元可以间接地连接到全部或者大部分输入图像。

卷积网络中一个典型层包含三级。在第一级中,这一层并行地计算多个卷积产生一组线性激活响应。在第二级中,每一个线性激活响应将会通过一个非线性的激活函数,例如整流线性激活函数。这一级有时也被称为探测级 detector stage。在第三级中,我们使用池化函数 pooling function 来进一步调整这一层的输出。

池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如,最大池化 max pooling 函数给出相邻矩阵区域内的最大值。其他常用的池化函数包含相邻矩阵区域内的平均值、L2 范数以及基于距中心像素距离的加权平均函数。

不管采用什么样的池化函数,当输入做出少量平移时,池化能够帮助输入的表示近似不变 invariant。使用池化可以看作增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。

因为池化综合了全部邻居的反馈,这使得池化单元少于探测单元成为可能。在很多任务中,池化对于处理不同大小的输入具有重要作用。例如我们想对不同大小的图像进行分类时,分类层的输入必须是固定的大小,而这通常通过调整池化区域的偏置大小来实现。

通常,卷积网络训练中最昂贵的部分是学习特征。输出层的计算代价通常相对不高,因为在通过若干层池化之后作为该层输入的特征的数量较少。

卷积神经网络在深度学习的历史中发挥了重要作用。它们是将研究大脑获得的深刻理解成功用于机器学习应用的关键例子。它们也是首批表现良好的深度模型之一,远远早于任意深度模型被认为是可行的之前。

卷积网络提供了一种方法来特化神经网络,使其能够处理具有清除的网络结构拓扑的数据,以及将这样的模型扩展到非常大的规模。这种方法在二维图像拓扑上是最成功的。为了处理一维序列数据,我们接下来转向神经网络框架的另一种强大的特化:循环神经网络。

第 10 章 序列建模:循环和递归网络

循环神经网络 recurrent neural network 或 RNN 是一类用于处理序列数据的神经网络。

单向 RNN 有一个“因果”结构,意味着在时刻 t 的状态只能从过去的序列以及当前的输入捕获信息。然而在许多应用中,我们要输入出的预测可能依赖于整个输入序列,这种时候就可以使用双向 RNN,在手写识别和语音识别中非常成功。

我们经常将 RNN 的输入称为“上下文”。我们希望产生此上下文的表示 C。这个上下文 C 可能是一个概括输入序列 X 的向量或者向量序列。

用于映射可变长度序列到另一可变长度序列的想法非常简单:

  1. 编码器 encoder 或读取器 reader 或输入 input RNN 处理输入序列。编码器输出上下文 C(通常是最终隐藏状态的简单函数)
  2. 解码器 decoder 或写入器 writer 或输出 output RNN 则以固定长度的向量为条件产生输出序列 Y

这种架构的创新之处在于输入长度和输出长度可以不同。此架构的一个明显不足是,编码器 RNN 输出的上下文 C 的维度太小而难以适当地概括一个长序列。解决的方法是让 C 成为一个可变长度的序列,而不是一个固定大小的向量,也可以引入将序列 C 的元素和输出序列的元素相关联的注意力机制 attention mechanism。

大多数 RNN 中的计算可以分解成 3 块参数及其相关的变换:

  1. 从输入到隐藏状态
  2. 从前一状态到下一隐藏状态
  3. 从隐藏状态到输出

递归神经网络代表循环网络的另一个扩展,它被构造为深的树状结构而不是 RNN 的链状结构,因此是不同类型的计算图。主要应用于自然语言处理和计算机视觉。

引入自循环的巧妙构思,以产生梯度长时间持续流动的路径是初始长短期记忆 long short-term memory, LSTM 模型的核心贡献。其中一个关键扩展是使自循环的权重视上下文而定,而不是固定的。

第 11 章 实践方法论

要成功地使用深度学习技术,仅仅知道存在哪些算法和解释他们为何有效的原理是不够的。一个优秀的机器学习实践者还需要知道如何针对具体应用挑选一个合适的算法以及如何监控,并根据实验反馈改进机器学习系统。在机器学习系统的日常开发中,实践者需要决定是否收集更多的数据、增加或减少模型容量、添加或删除正则化项、改进模型的优化、改进模型的近似推断或调试模型的软件实现。尝试这些操作都需要大量时间,因此确定正确的做法,而不盲目猜测尤为重要。

正确应用一个算法需要掌握一些相当简单的方法论,我们建议参考以下几个实践设计流程:

  1. 确定目标 - 使用什么样的误差度量,并为此误差度量指定目标值。这些目标和误差取决于该应用旨在解决的问题
  2. 尽快建立一个端到端的工作流程,包括估计合适的性能度量
  3. 搭建系统,并确定性能瓶颈。检查哪部分的性能差于预期,以及是否因为过拟合、欠拟合,或者数据或软件缺陷造成的
  4. 根据具体观察反复地进行增量式的改动,如收集新数据、调整超参数或改进算法

有时,我们需要训来弄检测某些罕见事件的二元分类器。假设每一百万人只有一人患病。我们只需要让分类器一直报告没有患者,就能轻易地在检测任务上实现 99.9999% 的正确率。显然,正确率很难描述这种系统的性能。解决这个问题的方法是度量精度 precision 和召回率 recall。精度是模型报告的检测正确的比率,而召回率则是真实事件被检测到的比率。当使用精度和召回率时,我们通常会画 PR 曲线,y 轴表示精度,x 轴表示召回率。在很多情况下,我们希望用一个数而不是曲线来概括分类器的性能。要做到这一点,我们可以将精度 p 和召回率 r 转换为 F-score,公式为 F=2pr/(p+r),另一种方法是报告 PR 曲线下方的总面积。

在一些应用中,机器学习系统可能会拒绝作出判断。如果机器学习算法能够估计所作判断的置信度,这将会非常游泳,特别是在错误判断会导致严重危害,而人工操作员能够偶尔接管的情况下。

确定性能度量和目标后,任何实际应用的下一步是尽快建立一个合理的端到端的系统。根据问题的复杂性,项目开始时可能无须使用深度学习。如果只需正确地选择几个线性权重就可能解决问题,那么项目可以开始于一个简单的统计模型,如逻辑回归。如果问题属于『AI-完全』类的,如对象识别、语音识别、机器翻译等,那么项目开始于一个合适的深度学习模型,效果会比较好。如果我们的任务和另一个被广泛研究的任务相似,那么通过复制先前研究中已知性能良好的模型和算法,可能会得到很好的效果,甚至可以从该任务中复制一个训练号的模型。

一个常见问题是项目开始时是否使用无监督学习,这个问题和特定领域有关,比如自然语言处理,能够大大受益于无监督学习技术,如学习无监督词嵌入。

许多机器学习新手都忍不住尝试很多不同的算法来进行改进。然而,收集更多的数据往往比改进学习算法要有用得多。

怎么判断是否需要收集更多的数据?首先,确定训练集上的性能是否可接受。如果模型在训练集上的性能就很差,学习算法都不能在训练集上学习出良好的模型,那么就没必要收集更多的数据。反之,可以尝试增加更多的网络层或每层增加更多的隐藏单元,以增加模型的规模。此外,也可以尝试调整学习率等超参数的措施来改进学习算法。如果更大的模型和仔细调试的优化算法效果不佳,那么问题可能源自训练数据的质量。数据可能包含太多噪声,或是可能不包含预测输出所需要的正确输入。这意味着我们需要重新开始,收集更干净的数据或是收集特征更丰富的数据集。

如果测试集上的性能比训练集要差得多,那么收集更多的数据是最有效的解决方案之一。在其他情况下,如医疗应用,收集更多的数据可能代价很高或者不可行。一个可以替代的简单方法是降低模型大小或是改进正则化(调整超参数,如权重率先系数,或是加入正则化策略,如 Dropout)。

大部分深度学习算法都有许多超参数来控制不同方面的算法表现。有些超参数会影响算法运行的时间和存储成本,有些超参数会影响学习到的模型质量以及在新输入上推断正确结果的能力。有两种选择超参数的基本方法:手动选择和自动选择。手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良好的泛化。自动选择超参数算法大大减少了这些想法的需要,但它们往往需要更高的计算成本。当有 3 个或更少的超参数时,常见的超参数搜索方法是网格搜索 grid search。

当一个机器学习系统效果不好时,通常很难判断效果不好的原因是算法本身,还是算法实现错误。由于各种原因,机器学习系统很难调试。一些重要的调试检测如下所述:

  • 可视化计算中模型的行为
  • 可视化最严重的错误
  • 根据训练和检测误差检测软件
  • 拟合极小的数据集
  • 比较反向传播导数和数值导数
  • 监控激活函数值和梯度的直方图

第 12 章 应用

深度学习的基本思想基于联结注意:尽管机器学习模型中单个生物性的神经元或者说是单个特征不是智能的,但是大量的神经元或者特征作用在一起往往能够表现出智能。我们必须着重强调神经元数量必须很大这个事实。在过去的 30 年内,网络规模是以指数级的速度递增的。然而如今的人工神经网络的规模也仅仅和昆虫的神经系统差不多。

在许多情况下,单个机器的计算资源是有限的。因此,我们希望把训练或者推断的任务分摊到多个机器上进行。分布式的推断是容易实现的,因为每一个输入的样本都可以在单独的机器上运行。这也被称为数据并行 data parallelism。同样地,模型并行 model parallelism 也是可行的,其中多个机器共同运行一个数据点,每一个机器负责模型的一个部分。对于推断和训练,这都是可行的。

语音识别,从隐马尔可夫模型 hidden markov model, HMM 和高斯混合模型 gaussian mixture model, GMM 的结合,到完全抛弃 HMM 并转向研究端到端的深度学习语音识别系统。

自然语言处理:n-gram,词嵌入

知识表示、推理和回答:三元组,知识库,链接预测 link prediction,词义消岐 word-sense disambiguation


剩下的部分偏理论了,暂时不再关注的范围内