第六章 深度前馈网络
深度前馈网络,也常常被叫做前馈神经网络,或者多层感知机(MLPs),是经典的深度学习模型。前馈网络的主要目标是逼近某个函数f*。比如说,对于一个分类器,y=f*(x)将输入x映射到其对应的类别y。一个前馈网络定义了一个映射函数y=f(x;θ),通过学习参数θ,得到最接近样本数据的函数估计。
这类模型之所以被称为“前馈”是因为信息由x流入估计的函数,随后通过函数f的中间值,最后得到输出y。这里并没有反馈式的连接,所谓反馈,即是将网络的输出又输入到其自身。如果我们将前馈神经网络扩展为有反馈连接的网络时,我们称其为循环神经网络,如第十章所述。
前馈网络对于机器学习的开发者来说是极其重要的。我们可以从许多金融应用的基础中看到它们的身影。比如说卷积网络,是前馈网络的一种特别的形式,我们使用它从图片中识别物体。前馈网络是循环神经网络概念的基石,而循环神经网络在自然语言理解方面已大展拳脚。
前馈神经网络之所以称为网络,是因为它们可以被经典地表示为许多不同函数的集合体。这类模型都可以通过一个有向无环图来形象的表示那些不同函数是如何组合在一起的。比如,我们可以有三个函数f(1),f(2),f(3),我们可以将其链接起来,得到f(x)=f(3)(f(2)(f(1)(x))),这类链式结构将会常常在神经网络里用到。在这种情况下,f(1)被称为网络的第一层,f(2)被称为网络的第二层,以此类推。这个链子的总长度就代表了这个模型的深度,深度学习的名字就是这么来的。前馈网络的最后一层叫做输出层。在神经网络的训练中,我们使f(x)去逼近f*(x)。训练数据可能会带来噪声,而样例也会在训练的不同阶段被测试。每一个样例x都有其对应的一个标签y。训练样例特别指定了输出层在每一个x点需要做的任务,那就是它必须求解出一个接近y的值,而其他层的行为则不会直接受到训练数据的影响。学习算法必须解决如何利用这些层来产生期望的输出,同时训练数据并不会直接用于指导每一个独立的层去如何做。训练数据并不会为每一层指示出其所需要的输出,因而这类层叫做隐藏层。
最后,这些网络之所以被冠以“神经”之名,是因为他们在一定程度上受到了神经科学的启发。网络的每一个隐藏层都是经典的向量化的值。隐藏层的维度决定了这个模型的宽度。我们可以认为向量中的每一个元素扮演了一个类似神经元的角色。除了把这些层视为单个的向量-向量的函数,我们也可以认为每一层中的单元在并行地协作,而其中的每一个单元则完成从向量到标量的映射。
每一个单元在某种程度上类似于一个神经元,它接受来自其他单元的刺激,并且计算出它自身的响应值。使用向量化的方法来表示层的概念的想法来自于神经科学。用来计算响应值的激活函数f(i)(x)的选择也是在一定程度上受到了神经科学中对生物神经元响应方式的影响。然而确切的说,现代神经网络的研究受到了许多数学和工程规律的指导,并且神经网络的设计目标不是要完美的模仿大脑功能。我们最好将前馈网络视为一种工具,这种工具被设计用于逼近某种统计归纳,这个工具偶尔会受到大脑工作原理的启发。
理解前馈网络的一种方法是从线性模型学起并且考虑如何克服线性模型中存在的弊端。线性模型,比如logistic回归和线性回归,它们在闭型与凸优化中是可信赖和高效率的,但是它也有其明显的缺点,它的泛化能力受限于线性函数,因此该模型无法理解任何两个变量之间的交互。
为了扩展模型使其可以表示非线性的函数x,我们不直接使用x本身而是使用一种转化后的输入形式Φ(x),其中Φ是一个非线性转化函数。同样的,我们也可以应用核技巧去获得非线性学习算法。我们可以认为Φ是描述x的一组函数,也可以认为它是x的一种新的表达方式。
那么,接下来的问题就是如何选择映射函数Φ:
1. 有一个非常经典的选择是使用一个比较一般的方法,比如使用一个维数足够大的函数Φ,它隐式的应用了基于径向基的核机器。如果Φ(x)有足够高的维度,那么我们总有足够的能力去满足训练集,但是其对于测试集的泛化能力将会很差。非常通用的特征映射主要是基于局部平滑的原则,并且没有考虑足够的先验信息来解决更复杂的问题。
2. 另一个选择是人工设计一个映射函数。在深度学习的到来以前,这是一个主要的方法。这种方法对于每一个不同的领域都需要花费人类专家数十年的精力,不同领域包括,语音识别和计算机视觉等等,而这些领域通常只有很少的交集。
3. 深度学习的策略则是学习映射函数Φ。在这种方法中,我们有如下模型,y=f(x;θ,w)=Φ(x;θ)Tw。我们现在利用参数θ从许多类别的函数中去学习Φ,并且依据参数w将Φ(x)映射到我们想要的输出中。上述一个深度前馈网络的样例,这个网络里边有一个被Φ定义的隐藏层。这种方法是上述三个方法中唯一放弃训练过程中的凸性问题的,但是其利大于弊。在这种方法中,我们将表示形式参数化为Φ(x;θ)并且使用优化算法求得合适的θ以使其有一个好的表征。如果我们希望该方法能使第一种方法有所提高,我们可以使用比较广泛的函数簇Φ(x;θ)。这种方法也能使第二种方法得到提高,开发者可以编码他们已有的知识以设计一个函数簇Φ(x;θ),以此来增强模型的泛化能力,这样做的优势在于人类算法设计者只需要专注去找到一个好的函数簇而不需要确定精确的函数。