原理

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

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

前馈神经网络被称作网络(network)是因为它们通常用许多不同函数复合在一起来表示。该模型与一个有向无环图相关联,而图描述了函数是如何复合在一起的。例如,我们有三个函数\(f^{(1)},f^{(2)},f^{(3)}\)连接在一个链上以形成\(f(x)=f^{(3)}(f^{(2)}(f^{(1)}(x)))\)。这些链式结构是神经网络中最常用的结构。在这种情况下,\(f^{(1)}\)被称为网络的第一层(first layer),\(f^{(2)}\)被称为第二层(second layer),以此类推。链的全长称为模型的深度(depth)。正是因为这个术语才出现了“深度学习”这个名字。前馈网络的最后一层被称为输出层(output layer)。在神经网络训练的过程中,我们让\(f(x)\)去匹配\(f^*(x)\)的值。训练数据为我们提供了在不同训练点上取值的、含有噪声的\(f^*(x)\)的近似实例。每个样本x都伴随着一个标签\(y \approx f^*(x)\)。训练样本直接指明了输出层在每一点x上必须做什么;它必须产生一个接近y的值。但是训练数据并没有直接指明其他层应该怎么做。学习算法必须决定如何使用这些层来产生想要的输出,但是训练数据并没有说每个单独的层应该做什么。相反,学习算法必须决定如何使用这些层来最好地实现\(f^*\)的近似。因为训练数据并没有给出这些层中的每一层所需的输出,所以这些层被称为隐藏层(hidden layer)。

最后,这些网络被称为神经网络是因为他们或多或少地受到了神经科学的启发。网络中的每个隐藏层通常都是向量值的。这些隐藏层的维数决定了模型的宽度(width)。

向量的每个元素都可以被视为起到类似一个神经元的作用。除了将层想象成向量到向量的单个函数,我们也可以把层想象成由许多并行操作的单元(unit)组成,每个单元表示一个向量到标量的函数。每个单元在某种意义上类似于一个神经元,它接收的输入来源于许多其他的单元,并计算它自己的激活值。使用多层向量值表示的想法来源于神经科学。用于计算这些表示的函数\(f^{(i)}(x)\)的选择,也或多或少地受到神经科学观测的指引,这些观测是关于生物神经元计算功能的。然而,现代的神经网络研究受到更多的是来自许多数学和工程学科的指引,并且神经网络的目标并不是完美地给大脑建模。

我们最好将前馈神经网络想成是为了实现统计泛化而设计出的函数近似机,它偶尔从我们了解的大脑中提取灵感,但并不是大脑功能的模型。

一种理解前馈网络的方式是从线性模型开始,并考虑如何克服它的局限性。线性模型,例如逻辑回归和线性回归,是非常吸引人的,因为无论通过闭解形式还是使用凸优化,它们都能高效且可靠地拟合。线性模型也有明显的缺陷,那就是该模型的能力被局限在线性函数里,所以它无法理解任何两个输入变量间的相互作用。

为了扩展线性模型来表示x的非线性函数,我们可以不把线性模型用于x本身,而是用在一个变换后的输入\(\phi(x)\)上,这里\(\phi\)是一个非线性变换。同样,我们可以使用核技巧,来得到一个基于隐含地使用\(\phi\)映射的非线性学习算法。我们可以认为\(\phi\)提供了一组描述x的特征,或者认为它提供了x的一个新的表示。

剩下的问题就是如何选择映射\(\phi\)。

  1. 其中一种选择是使用一个通用的\(\phi\),例如无限维的\(\phi\),它隐含地用在基于RBF核的核机器上。如果\(\phi(x)\)具有足够高的维数,我们总是有足够的能力来拟合训练集,但是对于测试集的泛化往往不佳。非常通用的特征映射通常只基于局部光滑的原则,并且没有将足够的先验信息进行编码来解决高级问题。
  2. 另一种选择是手动地设计\(\phi\)。在深度学习出现以前,这一直是主流的方法。这种方法对于每个单独的任务都需要人们数十年的努力,从业者各自擅长特定的领域(如语音识别或计算机视觉),并且不同领域之间很难迁移(transfer)。
  3. 深度学习的策略是去学习\(\phi\)。在这种方法中,我们有一个模型\(y=f(x;\theta,w)=\phi(x;\theta)^T w\).我们现在有两种参数:用于从一大类函数中学习\(\phi\)的参数\(\theta\),以及用于将\(\phi(x)\)映射到所需的输出的参数w。这是深度前馈网络的一个例子,其中\(\phi\)定义了一个隐藏层。这是三种方法中唯一一种放弃训练问题的凸性的方法,但是利大于弊。在这种方法中,我们将表示参数化为\(\phi(x; \theta)\),并且使用优化算法来寻找\(\theta\),使它能够得到一个好的表示。如果我们想要的话,这种方法也可以通过使它变得高度通用以获得第一种方法的优点——我们只需使用一个非常广泛的函数族\(\phi(x;\theta)\)。这种方法也可以获得第二种方法的优点。人类专家可以将他们的知识编码进网络来帮助泛化,他们只需要设计那些他们期望能够表现优异的函数族\(\phi(x;\theta)\)即可。这种方法的优点是人类设计者只需要寻找正确的函数族即可,而不需要去寻找精确的函数。

这种通过学习特征来改善模型的一般化原则不仅仅适用于本章描述的前馈神经网络。它是深度学习中反复出现的主题,适用于全书描述的所有种类的模型。前馈神经网络是这个原则的应用,它学习从x到y的确定性映射并且没有反馈连接。后面出现的其他模型会把这些原则应用到学习随机映射、学习带有反馈的函数以及学习单个向量的概率分布。

学习XOR

线性模型不能用来表示XOR函数。解决这个问题的其中一种方法是使用一个模型来学习一个不同的特征空间,在这个空间上线性模型能够表示这个解。具体来说,即是引入一个前馈神经网络模型。

如果深度学习的每一层都是线性模型,那么前馈网络作为一个整体对于输入仍然是线性的。

因此,我们必须用非线性函数来描述这些特征。大多数神经网络通过仿射变换之后紧跟着一个被称为激活函数的固定非线性函数来实现这个目标,其中仿射变换由学习到的参数控制。

我们这里使用这种策略,定义\(h=g(W^T x +c)\),其中W是线性变换的权重矩阵,c是偏置。此前,为了描述线性回归模型,我们使用权重向量和一个标量的偏置参数来描述从输入向量到输出向量的仿射变换。现在,因为我们描述的是向量x到向量h的仿射变换,所以我们需要一整个向量的偏置阐述。

激活函数g通常选择对每个元素分别起作用的函数,有\(h_i = g(x^T W_{:,i} +c_i)\)。在现代神经网络中,默认的推荐是使用激活函数\(g(z)=max {0,z}\)定义的整流线性单元(rectified linear unit)或者称为ReLU。

整流线性激活函数是被推荐用于大多数前馈神经网络的默认激活函数。将此函数用于线性变换的输出将产生非线性变换。然而,函数仍然非常接近线性,在这种意义上它是具有两个线性部分的分段线性函数。由于整流线性单元几乎是线性的,因此它们保留了许多使得线性模型易于使用基于梯度的方法进行优化的属性。它们还保留了许多使得线性模型能够泛化良好的属性。计算机科学的一个通用原则是,我们可以从最小的组件构建复杂的系统。就像图灵机的内存只需要能够存储0或1的状态,我们可以从整流线性函数构建一个万能函数近似器。