第6章 深度前馈网络
深度前馈网络,也叫作前馈神经网络或者多层感知机,是典型的深度学习模型。前馈网络的目标是近似某个函数$f^*$。 例如,对于分类器,$y = f^*(x)$将输入$x$映射到一个类别$y$。 前馈网络定义了一个映射$y = f(x; \theta)$,并且学习参数$\theta$的值,使它能够得到最佳的函数近似。
这种模型被称为前向的,是因为信息流过$x$的函数,流经用于定义$f$的中间计算过程,最终到达输出$y$。
在模型的输出和模型本身之间没有反馈连接。 当前馈神经网络被扩展成包含反馈连接时,它们被称为循环神经网络,在第10章介绍。
[success] 问:为什么称为“前馈”? 答:因为信息只从前向后传,不存在从后向前。如果有从后前向传递信息,就称为循环(recurrent)神经网络。
一些术语
前馈网络对于机器学习的从业者是极其重要的。 它们是许多重要商业应用的基础。 例如,用于对照片中的对象进行识别的卷积神经网络就是一种专门的前馈网络。 前馈网络是通往循环网络之路的概念基石,后者在自然语言的许多应用中发挥着巨大作用。
前馈神经网络被称作网络是因为它们通常用许多不同函数复合在一起来表示。 该模型与一个有向无环图相关联,而图描述了函数是如何复合在一起的。 例如,我们有三个函数$f^{(1)}, f^{(2)}$和$f^{(3)}$连接在一个链上以形成$f(x) = f^{(3)}(f^{(2)}(f^{(1)}(x)) )$。 这些链式结构是神经网络中最常用的结构。 在这种情况下,$f^{(1)}$被称为网络的第一层,$f^{(2)}$被称为第二层,以此类推。 链的全长称为模型的深度。 正是因为这个术语才出现了"深度学习"这个名字。 前馈网络的最后一层被称为输出层。 在神经网络训练的过程中,我们让$f(x)$去匹配$f^(x)$的值。 训练数据为我们提供了在不同训练点上取值的、含有噪声的$f^(x)$的近似实例。 每个样本$x$都伴随着一个标签$y\approx f^(x)$。 训练样本直接指明了输出层在每一点$x$上必须做什么;它必须产生一个接近$y$的值。 但是训练数据并没有直接指明其他层应该怎么做。 学习算法必须决定如何使用这些层来产生想要的输出,但是训练数据并没有说每个单独的层应该做什么。 相反,学习算法必须决定如何使用这些层来最好地实现$f^$的近似。 因为训练数据并没有给出这些层中的每一层所需的输出,所以这些层被称为隐藏层。
[success] 网络 network:称为网络是因为它由许多不同的函数组装到一起。例如、、,连到一起形成了 第一层 first layer:例子中的 第二层 second layer:例子中的 深度 depth:函数链的长度。 输出层 output layer:前馈网络的最后一层。 f*(x):要近似的函数。 f(x):由模型得到的函数。 隐藏层 hidden layer:中间层的结果不会展示出来,因为称为“隐藏层”。 宽度 width:中间层是以向量的形式表示的。向量的维度即模型的宽度。 神经元 neuron:中间层向量里面的每一个元素可以看作是一个神经元。 层 layer:两个解释表达同一个意思(1)一个“向量->向量”的函数。(2)一组可以并行计算的单元,每个单元是一个“向量->标量”的函数。每个单元从许多其它单元获取输入并得到一个激活值。这些单元形象化地称为“神经元”。
最后,这些网络被称为\emph{神经网络}是因为它们或多或少地受到神经科学的启发。 网络中的每个隐藏层通常都是向量值的。这些隐藏层的维数决定了模型的宽度。 向量的每个元素都可以被视为起到类似一个神经元的作用。 除了将层想象成向量到向量的单个函数,我们也可以把层想象成由许多并行操作的单元组成,每个单元表示一个向量到标量的函数。 每个单元在某种意义上类似一个神经元,它接收的输入来源于许多其他的单元,并计算它自己的激活值。 使用多层向量值表示的想法来源于神经科学。 用于计算这些表示的函数$f^{(i)}(x)$的选择,也或多或少地受到神经科学观测的指引,这些观测是关于生物神经元计算功能的。 然而,现代的神经网络研究受到更多的是来自许多数学和工程学科的指引,并且神经网络的目标并不是完美地给大脑建模。 我们最好将前馈神经网络想成是为了实现统计泛化而设计出的函数近似机,它偶尔从我们了解的大脑中提取灵感,但并不是大脑功能的模型。
从线性模型开始
一种理解前馈网络的方式是从线性模型开始,并考虑如何克服它的局限性。 线性模型,例如逻辑回归和线性回归,是非常吸引人的,因为无论是通过闭解形式还是使用凸优化,它们都能高效且可靠地拟合。 线性模型也有明显的缺陷,那就是该模型的能力被局限在线性函数里,所以它无法理解任何两个输入变量间的相互作用。
[success] 闭解形式 凸优化 优点:能通过闭解形式或凸优化形式高效且可靠地拟合。 缺点:只能表达线性关系,无法理解任何两个输入变量间的相互作用。
为了扩展线性模型来表示$x$的非线性函数,我们可以不把线性模型用于$x$本身,而是用在一个变换后的输入$\phi(x)$上,这里$\phi$是一个非线性变换。 同样,我们可以使用5.7.2中描述的核技巧,来得到一个基于隐含地使用$\phi$映射的非线性学习算法。 我们可以认为$\phi$提供了一组描述$x$的特征,或者认为它提供了$x$的一个新的表示。
[success] 改进方法:不把线性模型用于x 本身,而是用在一个变换后的输入ϕ(x) 上。 其中:ϕ是一种非线性变化,或核技巧。
怎样选择ϕ?
剩下的问题就是如何选择映射$\phi$。
其中一种选择是使用一个通用的$\phi$,例如无限维的$\phi$,它隐含地用在基于RBF核的核机器上。 如果$\phi(x)$具有足够高的维数,我们总是有足够的能力来拟合训练集,但是对于测试集的泛化往往不佳。 非常通用的特征映射通常只基于局部光滑的原则,并且没有将足够的先验信息进行编码来解决高级问题。
[success] RBF核 使用一个通用的ϕ。 优点:当ϕ的维度足够高,可以拟合任何训练数据。 缺点:泛化能力不够。 ?为什么泛化能力不够,因为数据不够吗?还是说要达到同样的效果,这种方法需要更多的数据? 怎么理解基于局部光滑的原则?
另一种选择是手动地设计$\phi$。 在深度学习出现以前,这一直是主流的方法。 这种方法对于每个单独的任务都需要人们数十年的努力,从业者各自擅长特定的领域(如语音识别或计算机视觉),并且不同领域之间很难迁移(transfer)。
[success] 手动设计ϕ。 传统的DPD算法就是使用这样的技术。
深度学习的策略是去学习$\phi$。 在这种方法中,我们有一个模型$y = f(x;\theta, w) = \phi(x; \theta)^\top w$。 我们现在有两种参数:用于从一大类函数中学习$\phi$的参数$\theta$,以及用于将$\phi(x)$映射到所需的输出的参数$w$。 这是深度前馈网络的一个例子,其中$\phi$定义了一个隐藏层。 这是三种方法中唯一一种放弃了训练问题的凸性的,但是利大于弊。 在这种方法中,我们将表示参数化为$\phi(x; \theta)$,并且使用优化算法来寻找$\theta$,使它能够得到一个好的表示。 如果我们想要的话,这种方法也可以通过使它变得高度通用以获得第一种方法的优点——我们只需使用一个非常广泛的函数族$\phi(x; \theta)$。 这种方法也可以获得第二种方法的优点。 人类专家可以将他们的知识编码进网络来帮助泛化,他们只需要设计那些他们期望能够表现优异的函数族$\phi(x; \theta)$即可。 这种方法的优点是人类设计者只需要寻找正确的函数族即可,而不需要去寻找精确的函数。
[success] 让机器自己学习ϕ。 令:
其中,w为到输出的映射。用于从一大类函数中学习的参数。定义了一个隐藏层。 在这种方法中,人为设计一个通常函数族,机器学习最优的,共同得到。
这种通过学习特征来改善模型的一般化原则不仅仅适用于本章描述的前馈神经网络。 它是深度学习中反复出现的主题,适用于全书描述的所有种类的模型。 前馈神经网络是这个原则的应用,它学习从$x$到$y$的确定性映射并且没有反馈连接。 后面出现的其他模型会把这些原则应用到学习随机映射、学习带有反馈的函数以及学习单个向量的概率分布。
本章我们先从前馈网络的一个简单例子说起。 接着,我们讨论部署一个前馈网络所需的每个设计决策。 首先,训练一个前馈网络至少需要做和线性模型同样多的设计决策:选择一个优化模型、代价函数以及输出单元的形式。 我们先回顾这些基于梯度学习的基本知识,然后去面对那些只出现在前馈网络中的设计决策。 前馈网络已经引入了隐藏层的概念,这需要我们去选择用于计算隐藏层值的激活函数。 我们还必须设计网络的结构,包括网络应该包含多少层、这些层应该如何连接,以及每一层包含多少单元。 在深度神经网络的学习中需要计算复杂函数的梯度。 我们给出反向传播算法和它的现代推广,它们可以用来高效地计算这些梯度。 最后,我们以某些历史观点来结束这一章。
Last updated