Deep Learning III Deep Feedforward Network & Regularization
深度前馈网络 Deep Feedforward Network
Introduction
深度前馈网络(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),在第十章介绍。
Example
f(x)=f3(f2(f1(x)))
这个名字。前馈网络的最后一层被称为输出层(output layer)。在神经网络训练的过程中,我们让 f(x) 去匹配 f∗(x)的值(也就是真实函数的值)。训练数据为我们提供了在不同训练点上取值的、含有噪声的f∗(x) 的近似实例。每个样本 x 都伴随着一个标签 y ≈ f∗(x)。
训练样本直接指明了输出层在每一点 x 上必须做什么;它必须产生一个接近 y 的值。但是训练数据并没有直接指明其他层应该怎么做。学习算法必须决定如何使用这些层来产生想要的输出,但是训练数据并没有说每个单独的层应该做什么。相反,学习算法必须决定如何使用这些层来最好地实现f∗ 的近似。因为训练数据并没有给出这些层中的每一层所需的输出,所以这些层被称为隐藏层(hidden layer)。
为了扩展线性模型来表示 x 的非线性函数,我们可以不把线性模型用于 x 本身,而是用在一个变换后的输入φ(x) 上,这里 φ 是一个非线性变换。同样,我们可以使用核技巧,来得到一个基于隐含地使用 φ 映射的非线性学习算法。我们可以认为 φ 提供了一组描述 x 的特征,或者认为它提供了 x 的一个新的表示。
那么如何定义φ?深度学习的策略是去学习φ。在这种方法中,我们有一个模型 y = f(x; θ, w)=φ(x; θ)⊤w。我们现在有两种参数:用于从一大类函数中学习φ的参数 θ,以及用于将 φ(x) 映射到所需的输出的参数w
注意!φ不是参数
XOR
基于梯度学习
我们到目前为止看到的线性模型和神经网络的最大区别,在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸(在多项式函数中的每一个函数都是凸的,如x^2,x^3,…)。这将会导致我们通过迭代的基于梯度的优化只能让代价函数达到一个很小的值而不一定是最小值,而训练算法也依然是基于梯度来使函数下降。
代价函数
在大多数情况下,我们的参数模型定义了一个分布p(y|x;θ)并且我们简单地使用最大似然原理。这意味着我们使用训练数据和模型预测间的交叉熵作为代价函数。
使用最大似然学习条件分布
输出单元
sigmoid function
softmax function
隐藏单元
大多数的隐藏单元都可以描述为接受输入向量x,计算仿射变换 z=W⊤x+b,然后使用一个逐元素的非线性函数g(z)。大多数隐藏单元的区别 仅仅在于激活函数g(z)的形式
整流线型单元 g(z)=max{0,z}
logistic sigmoid function/双曲正切激活函数
其他隐藏单元
架构设计
万能近似性质
乍一看,我们可能认为学习非线性函数需要为我们想要学习的那种非线性专 门设计一类模型族。幸运的是,具有隐藏层的前馈网络提供了一种万能近似框架。 具体来说, 万能近似定理(universal approximation theorem)(Hornik et al., 1989; Cybenko, 1989) 表明,一个前馈神经网络如果具有线性输出层和至少一层具有任何 一种 ‘‘挤压’’ 性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予 网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另 一个有限维空间的 Borel 可测函数。
万能近似定理意味着无论我们试图学习什么函数,我们知道一个大的MLP一定能够表示这个函数。然而,我们不能保证训练算法能够学得这个函数。即使MLP能够表示该函数,学习也可能因两个不同的原因而失败。首先,用于训练的优化算法可能找不到用于期望函数的参数值。其次,训练算法可能由于过拟合而选择了错误的函数。
具有单层的前馈网络足以表示任何函数,但是网络层可能大得不可实现, 并且可能无法正确地学习和泛化。在很多情况下,使用更深的模型能够减少表示期望函数所需的单元的数量,并且可以减少泛化误差。
反向传播和其他微分算法
正则化
简介
机器学习中的一个核心问题是设计不仅在训练数据上表现好,并且能在新输入 上泛化好的算法。在机器学习中,许多策略显式地被设计来减少测试误差(可能会 以增大训练误差为代价)。这些策略被统称为正则化。我们将在后文看到,深度学 习工作者可以使用许多不同形式的正则化策略。事实上,开发更有效的正则化策略 已成为本领域的主要研究工作之一。
将正则化定义为 ‘‘对学习算法的修改——旨在减少泛化误 差而不是训练误差’’。目前有许多正则化策略。有些策略向机器学习模型添加限制参 数值的额外约束。有些策略向目标函数增加额外项来对参数值进行软约束。如果我 们细心选择,这些额外的约束和惩罚可以改善模型在测试集上的表现。有时侯,这些 约束和惩罚被设计为编码特定类型的先验知识;其他时候,这些约束和惩罚被设计 为偏好简单模型,以便提高泛化能力。有时,惩罚和约束对于确定欠定的问题是必 要的。其他形式的正则化,如被称为集成的方法,则结合多个假说来解释训练数据。
通常情况下,面对一组数据和对应的训练,我们往往需要面对模型的三种情况
没有概括真实的数据生成过程–欠拟合/过大的bias
匹配真实的数据生成过程–完美!
除了包含了数据的生成过程,还包含了许多其他的生成过程–Variance主导的过拟合
正则化的目标是使模型从情况3转化为情况2
参数范数惩罚

注意,在神经网络中,参数包括每一层仿射变换的权重和偏置,然而我们通常只对权重做惩罚。
L2参数正则化,添加一个正则项Ω(θ)=1/2||w||22,又被成为岭回归(Ridge Regression)
L1参数正则化,添加一个正则项Ω(θ)=||w||1,即各个参数的绝对值之和,这个方法又被成为Lasso Regression。L1参数正则化往往可以产生更加稀疏的解法。
在第 5.6.1 节,我们看到许多正则化策略可以被解释为 MAP 贝叶斯推断,特别
是 L2正则化相当于权重是高斯先验的 MAP 贝叶斯推断。对于 L1正则化,用于正则
化代价函数的惩罚项 αΩ(w) = α∑ |wi| 与通过 MAP 贝叶斯推断最大化的对数先 i
验项是等价的(w∈Rn 并且权重先验是各向同性的拉普拉斯分布(式(3.26)))
作为约束的范数惩罚
正则化和欠约束问题
当输入的数据相对与输入特征的维数较少时,我们需要使用该种方法。
数据集增强
让机器学习模型泛化得更好的最好办法是使用更多的数据进行训练。当然,在 实践中,我们拥有的数据量是很有限的。解决这个问题的一种方法是创建假数据并 添加到训练集中。对于一些机器学习任务,创建新的假数据相当简单。
比如,在CNN识别数字的过程中,我们采用了一种方法,对于每一个样本,我们可以考虑将其少量的平移或者旋转,来增强整个系统的泛化性。
在神经网络的输入层注入噪声 (Sietsma and Dow, 1991) 也可以被看作是数据增 强的一种方式。对于许多分类甚至一些回归任务而言,即使小的随机噪声被加到输 入,任务仍应该是能够被解决的。然而,神经网络被证明对噪声不是非常健壮 (Tang and Eliasmith, 2010)。改善神经网络健壮性的方法之一是简单地将随机噪声添加到 输入再进行训练。输入噪声注入是一些无监督学习算法的一部分,如去噪自编码 器(Vincent et al., 2008a)。向隐藏单元施加噪声也是可行的,这可以被看作在多个抽 象层上进行的数据集增强。
噪声鲁棒性
对于某些模型而言, 向输入添加方差极小的噪声等价于对权重施加范数惩罚 (Bishop, 1995a,b)。在一般情 况下,注入噪声远比简单地收缩参数强大,特别是噪声被添加到隐藏单元时会更加强 大。向隐藏单元添加噪声是值得单独讨论重要的话题;在第 7.12 节所述 Dropout 算 法是这种做法的主要发展方向。
半监督学习
在深度学习的背景下,半监督学习通常指的是学习一个表示 h = f(x)。学习表 示的目的是使相同类中的样本有类似的表示。无监督学习可以为如何在表示空间聚 集样本提供有用线索。在输入空间紧密聚集的样本应该被映射到类似的表示。在许 多情况下,新空间上的线性分类器可以达到较好的泛化 (Belkin and Niyogi, 2002; Chapelle et al., 2003)。这种方法的一个经典变种是使用主成分分析作为分类前(在 投影后的数据上分类)的预处理步骤。
多任务学习
多任务学习 (Caruana, 1993) 是通过合并几个任务中的样例(可以视为对参数 施加的软约束)来提高泛化的一种方式。正如额外的训练样本能够将模型参数推向 具有更好泛化能力的值一样,当模型的一部分被多个额外的任务共享时,这部分将 被约束为良好的值(如果共享合理),通常会带来更好的泛化能力。
这种方法将模型中的参数氛围两类
具体任务的参数-只能从各自任务的样本中实现比较好的泛化
所有任务共享的通用参数
提前终止
当训练有足够的表示能力甚至会过拟合的大模型时,我们经常观察到,训练误 差会随着时间的推移逐渐降低但验证集的误差会再次上升。图 7.3 是这些现象的一个 例子,这种现象几乎一定会出现。
这意味着我们只要返回使验证集误差最低的参数设置,就可以获得验证集误差 更低的模型(并且因此有希望获得更好的测试误差)。在每次验证集误差有所改善后,我们存储模型参数的副本。当训练算法终止时,我们返回这些参数而不是最新的参数。当验证集上的误差在事先指定的循环次数内没有进一步改善时,算法就会终止。
这种策略被称为 提前终止(early stopping)。这可能是深度学习中最常用的正 则化形式。它的流行主要是因为有效性和简单性。
然而这种方法也有两个缺点。
通过提前终止自动选择超参数的第一个显著的代价是 训练期间要定期评估验证集。在理想情况下,这可以并行在与主训练过程分离的机 器上,或独立的 CPU,或独立的 GPU 上完成。如果没有这些额外的资源,可以使用比训练集小的验证集或较不频繁地评估验证集来减小评估代价,较粗略地估算取得最佳的训练时间。
另一个提前终止的额外代价是需要保持最佳的参数副本。这种代价一般是可忽略的,因为可以将它储存在较慢较大的存储器上(例如,在 GPU 内存中训练,但将 最佳参数存储在主存储器或磁盘驱动器上)。由于最佳参数的写入很少发生而且从不在训练过程中读取,这些偶发的慢写入对总训练时间的影响不大。
提前终止需要验证集,这意味着某些训练数据不能被馈送到模型。为了更好地 利用这一额外的数据,我们可以在完成提前终止的首次训练之后,进行额外的训练。 在第二轮,即额外的训练步骤中,所有的训练数据都被包括在内。有两个基本的策略都可以用于第二轮训练过程(具体的策略请见深度学习书中的214页)。
参数绑定和参数共享
参数范数惩罚是正则化参数使其彼此接近的一种方式,而更流行的方法是使用 约束:强迫某些参数相等。由于我们将各种模型或模型组件解释为共享唯一的一组 参数,这种正则化方法通常被称为 参数共享(parameter sharing)。和正则化参数使 其接近(通过范数惩罚)相比,参数共享的一个显著优点是,只有参数(唯一一个集 合)的子集需要被存储在内存中。对于某些特定模型,如卷积神经网络,这可能可 以显著减少模型所占用的内存。
系数表示
前文所述的权重衰减直接惩罚模型参数。另一种策略是惩罚神经网络中的激活单元,稀疏化激活单元。这种策略间接地对模型参数施加了复杂惩罚。

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

在误差完全相关即 c = v 的情况下,均方误差减少到 v,所以模型平均没有任何帮 助。在错误完全不相关即 c = 0 的情况下,该集成平方误差的期望仅为1/k*v。这意味着集成平方误差的期望会随着集成规模增大而线性减小。换言之,平均上,集成至少与它的任何成员表现得一样好,并且如果成员的误差是独立的,集成将显著地比其成员表现得更好。
具体来说,Bagging涉及构造 k 个不同的数据集。每个数据集从原始数据集中重复采样构成,和原始数据集具有相同数量的样例。这意味着,每个数据集以高概率 缺少一些来自原始数据集的例子,还包含若干重复的例子(如果所得训练集与原始数据集大小相同,那所得数据集中大概有原始数据集 2/3 的实例)。模型 i 在数据集 i 上训练。每个数据集所含样本的差异导致了训练模型之间的差异。
神经网络能找到足够多的不同的解,意味着他们可以从模型平均中受益 (即使所 有模型都在同一数据集上训练)。神经网络中随机初始化的差异、小批量的随机选择、 超参数的差异或不同输出的非确定性实现往往足以使得集成中的不同成员具有部分独立的误差。