深度学习中的深度前馈网络简介

发布时间:2022-11-15 12:00

 几乎所有的深度学习算法都可以被描述为一个相当简单的配方:特定的数据集、代价函数、优化过程和模型

        在大多数情况下,优化算法可以定义为求解代价函数梯度为零的正规方程。我们可以替换独立于其它组件的大多数组件,因此我们能得到很多不同的算法。

        通常代价函数至少含有一项使学习过程进行统计估计的成分。最常见的代价函数是负对数似然、最小化代价函数导致的最大似然估计。代价函数也可能含有附加项,如正则化项

        组合模型、代价和优化算法来构建学习算法的配方同时适用于监督学习和无监督学习。

        在某些情况下,由于计算原因,我们不能实际计算代价函数。在这种情况下,只要我们有近似其梯度的方法,那么我们仍然可以使用迭代数值优化近似最小化目标。

        尽管有时候不显然,但大多数学习算法都用到了上述配方。如果一个机器学习算法看上去特别独特或是手动设计的,那么通常需要使用特殊的优化方法进行求解。有些模型,如决策树或k-均值,需要特殊的优化,因为它们的代价函数有平坦的区域,使其不适合通过基于梯度的优化去最小化。

 

        深度前馈网络(deep feedforward network),也叫做前馈神经网络(feedforward neurnal network)或者多层感知机(multilayer perceptron, MLP),是典型的深度学习模型。前馈网络的目标是近似某个函数f*。例如,对于分类器,y=f*(x)将输入x映射到一个类别y。前馈网络定义了一个映射y=f(x;θ),并且学习参数θ的值,使它能够得到最佳的函数近似。在前馈神经网络内部,参数从输入层向输出层单向传播,有异于递归神经网络,它的内部不会构成有向环

        这种模型被称为前向(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≈f*(x)。训练样本直接指明了输出层在每一点x上必须做什么,它必须产生一个接近y的值。但是训练数据并没有指明其它层应该怎么做。学习算法必须决定如何使用这些层来产生想要的输出,但是训练数据并没有说每个单独的层应该做什么。相反,学习算法必须决定如何使用这些层来最好地实现f*的近似。因为训练数据并没有给出这些层中的每一层所需的输出,所以这些层被称为隐藏层(hidden layer)。

        最后,这些网络被称为神经网络是因为它们或多或少地受到神经科学的启发。网络中的每个隐藏层通常都是向量值的。这些隐藏层的维数决定了模型的宽度(width)。向量的每个元素都可以被视为起到类似一个神经元的作用。除了将层想象成向量到向量的单个函数,我们也可以把层想象成由许多并行操作的单元(unit)组成,每个单元表示一个向量到标量的函数。每个单元在某种意义上类似一个神经元,它接收的输入来源于许多其它的单元,并计算它自己的激活值。使用多层向量值表示的想法来源于神经科学。用于计算这些表示的函数f(i)(x)的选择,也或多或少地受到神经科学观测的指引,这些观测是关于生物神经元计算功能的。然而,现代的神经网络研究受到更多的是来自许多数学和工程学科的指引,并且神经网络的目标并不是完美地给大脑建模。我们最好将前馈神经网络想成是为了实现统计泛化而设计出的函数近似机,它偶尔从我们了解的大脑中提取灵感,但并不是大脑功能的模型。

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

        我们当然也可以用梯度下降来训练诸如线性回归和支持向量机之类的模型,并且事实上当训练集相当大时这是很常用的。从这点来看,训练神经网络和训练其它任何模型没有太大区别。

        和其它的机器学习模型一样,为了使用基于梯度的学习方法我们必须选择一个代价函数,并且我们必须选择如何表示模型的输出

        代价函数:深度神经网络设计中的一个重要方面是代价函数的选择。用于训练神经网络的完整的代价函数,通常在我们这里描述的基本代价函数的基础上结合一个正则项

        大多数现代的神经网络使用最大似然来训练。这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵等价。代价函数的具体形式随着模型而改变

        在信息论中,交叉熵是表示两个概率分布p,q,其中p表示真实分布,q表示非真实分布,在相同的一组事件中,其中用非真实分布q来表示某个事件发生所需要的平均比特数。交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。

        使用最大似然来导出代价函数的方法的一个优势是,它减轻了为每个模型设计代价函数的负担。明确一个模型p(y|x)则自动地确定了一个代价函数logp(y|x)。代价函数的梯度必须足够的大和具有足够的预测性,来为学习算法提供一个好的指引。

        用于实现最大似然估计的交叉熵代价函数有一个不同寻常的特性,那就是当它被应用于实践中经常遇到的模型时,它通常没有最小值。对于离散型输出变量,大多数模型以一种特殊的形式来参数化,即它们不能表示概率零和一,但是可以无限接近。逻辑回归是其中一个例子。

        均方误差和平均绝对误差在使用基于梯度的优化方法时往往成效不佳。一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。这就是为什么交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一。

        输出单元:代价函数的选择与输出单元的选择紧密相关。大多数时候,我们简单地使用数据分布和模型分布间的交叉熵。选择如何表示输出决定了交叉熵函数的形式。任何可用作输出的神经网络单元,也可以被用作隐藏单元。

用于高斯输出分布的线性单元:一种简单的输出单元是基于仿射变换的输出单元,仿射变换不具有非线性。这些单元往往被直接称为线性单元。因为线性模型不会饱和,所以它们易于采用基于梯度的优化算法,甚至可以使用其它多种优化算法。

        隐藏单元大多数的隐藏单元可以描述为接受输入向量x,计算仿射变换z=wTx+b,然后使用一个逐元素的非线性函数g(z)。大多数隐藏单元的区别仅仅在于激活函数g(z)的形式

        整流线性单元(Rectified Linear Unit, ReLU)是隐藏单元极好的默认选择。许多其它类型的隐藏单元也是可用的。整流线性单元使用激活函数g(z)=max{0,z}。在z=0处不可微。不可微的隐藏单元通常只在少数点上不可微。整流线性单元易于优化,因为它们和线性单元非常类似。线性单元和整流线性单元的唯一区别在于整流线性单元在其一半的定义域上输出为零。这使得只要整流线性单元处于激活状态,它的导数都能保持较大。它的梯度不仅大而且一致。整流操作的二阶导数几乎处处为0,并且在整流线性单元处于激活状态时,它的一阶导数处处为1。这意味着相比于引入二阶效应的激活函数来说,它的梯度方向对于学习来说更加有用。

        有很多整流线性单元的扩展存在。整流线性单元的一个缺陷是它们不能通过基于梯度的方法学习那些使它们激活为零的样本。整流线性单元的各种扩展保证了它们能在各个位置都接收到梯度。ReLU的扩展:Leaky Rectified Linear Unit(Leaky ReLU)、Parameteric Rectified Linear Unit(PReLU)、Randomized Leaky ReLU(RReLU)、Noisy ReLU、Maxout。

        线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元, 是一种人工神经网络中常用的激活函数(activationfunction),通常指代以斜坡函数及其变种为代表的非线性函数。线性整流被认为有一定的生物学原理,并且由于在实践中通常有着比其他常用激活函数(譬如逻辑函数)更好的效果,而被如今的深度神经网络广泛使用于诸如图像识别等计算机视觉人工智能领域。

        通常意义下,线性整流函数指代数学中的斜坡函数,即f(x)=max(0,x),而在神经网络中,线性整流作为神经元的激活函数,定义了该神经元在线性变换wTx+b之后的非线性输出结果。换言之,对于进入神经元的来自上一层神经网络的输入向量x,使用线性整流激活函数的神经元会输出max(0, wTx+b)至下一层神经元或作为整个神经网络的输出(取决现神经元在网络结构中所处位置)。

        使用ReLU的优势:相比于传统的神经网络激活函数,诸如逻辑函数(Logistic sigmoid)和tanh等双曲函数,线性整流函数有着以下几方面的优势:

        (1)、仿生物学原理:相关大脑方面的研究表明生物神经元的信息编码通常是比较分散及稀疏的。通常情况下,大脑中在同一时间大概只有1%-4%的神经元处于活跃状态。使用线性修正以及正则化(regularization)可以对机器神经网络中神经元的活跃度(即输出为正值)进行调试;相比之下,逻辑函数在输入为0时达到1/2,即已经是半饱和的稳定状态,不够符合实际生物学对模拟神经网络的期望。不过需要指出的是,一般情况下,在一个使用修正线性单元(即线性整流)的神经网络中大概有50%的神经元处于激活态。

        (2)、更加有效率的梯度下降以及反向传播:避免了梯度爆炸和梯度消失问题。

        (3)、简化计算过程:没有了其他复杂激活函数中诸如指数函数的影响;同时活跃度的分散性使得神经网络整体计算成本下降。

        整流线性单元和它们的这些扩展都是基于一个原则,那就是如果它们的行为更接近线性,那么模型更容易优化。使用线性行为更容易优化的一般性原则同样也适用于除深度线性网络以外的情景。

        隐藏单元的设计仍然是一个活跃的研究领域,许多有用的隐藏单元类型仍有待发现。

        架构设计架构(architecture)是指网络的整体架构:它应该具有多少单元,以及这些单元应该如何连接

        大多数神经网络被组织成称为层的单元组。大多数神经网络架构将这些层布置成链式结构,其中每一层都是前一层的函数。在这种结构中,第一层由下式给出:h(1)=g(1)(W(1)Tx+b(1));第二层由h(2)=g(2)(W(2)Th(1)+b(2));给出,依次类推

        在这些链式架构中,主要的架构考虑是选择网络的深度和每一层的宽度。即使只有一个隐藏层的网络也足够适应训练集。更深层的网络通常能够对每一层使用更少的单元数和更少的参数,并且经常容易泛化到测试集,但是通常也更难以优化。对于一个具体的任务,理想的网络架构必须通过实验,观测在验证集上的误差来找到。

        线性模型,通过矩阵乘法将特征映射到输出,顾名思义,仅能表示线性函数。它具有易于训练的优点,因为当使用线性模型时,许多损失函数会导出凸优化问题。不幸的是,我们经常希望我们的系统学习非线性函数。

        具有隐藏层的前馈网络提供了一种万能近似框架。具体来说,万能近似定理(universal approximation theorem)表明,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种”挤压”性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数。定义在Rn的有界闭集上的任意连续函数是Borel可测的,因此可以用神经网络来近似。神经网络也可以近似从任何有限维离散空间映射到另一个的任意函数。虽然原始定理最初以具有特殊激活函数的单元的形式来描述,这个激活函数当变量取绝对值非常大的正值和负值时都会饱和,万能近似定理也已经被证明对于更广泛类别的激活函数也是适用的,其中就包括现在常用的整流线性单元。

        万能近似定理意味着无论我们试图学习什么函数,我们知道一个大的MLP一定能够表示这个函数。然而,我们不能保证训练算法能够学得这个函数。即使MLP能够表示该函数,学习也可能因两个不同的原因而失败。首先,用于训练的优化算法可能找不到用于期望函数的参数值。其次,训练算法可能由于过拟合而选择了错误的函数。前馈网络提供了表示函数的万能系统,在这种意义上,给定一个函数,存在一个前馈网络能够近似该函数。不存在万能的过程既能够验证训练集上的特殊样本,又能够选择一个函数来扩展到训练集上没有的点。万能近似定理说明了,存在一个足够大的网络能够达到我们所希望的任意精度,但是这个网络并没有说这个网络有多大。具有单层的前馈网络足以表示任何函数,但是网络层可能大得不可实现,并且可能无法正确地学习和泛化。在很多情况下,使用更深的模型能够减少表示期望函数所需的单元的数量,并且可以减少泛化误差。根据经验,更深的模型似乎确实在广泛的任务中泛化得更好。

        反向传播:当我们使用前馈神经网络接收输入x并产生输出y’时,信息通过网络向前流动。输入x提供初始信息,然后传播到每一层的隐藏单元,最终产生输出y’。这称之为前向传播(forward propagation)。在训练过程中,前向传播可以持续向前直到它产生一个标量代价函数J(θ)。反向传播(back propagation)算法,经常简称为backprop,允许来自代价函数的信息通过网络向后流动,以便计算梯度。实际上,反向传播仅指用于计算梯度的方法,例如随机梯度下降,使用该梯度来进行学习。反向传播原则上它可以计算任何函数的导数(对于一些函数,正确的响应是报告函数的导数是未定义的)。

        微积分中的链式法则:用于计算复合函数的导数。反向传播是一种计算链式法则的算法,使用高效的特定运算顺序。

        设x是实数,f和g是从实数映射到实数的函数。假设y=g(x)并且z=f(g(x))=f(y).那么链式法则是说:

        我们可以将这种标量情况进行扩展。假设x∈Rm,y∈Rn,g是从Rm到Rn的映射,f是从Rn到R的映射。如果y=g(x)并且z=f(y),那么:

        使用向量记法,可以等价地写成:

        这里dy/dx是g的n*m的Jacobian矩阵。从这里看到,变量x的梯度可以通过Jacobian矩阵dy/dx和梯度▽yz相乘来得到。反向传播算法由图中每一个这样的Jacobian梯度的乘积操作所组成。通常我们将反向传播算法应用于任意维度的张量,而不仅仅用于向量。从概念上讲,这与使用向量的反向传播完全相同。唯一的区别是如何将数字排列成网格以形成张量。我们可以想象,在我们运行反向传播之前,将每个张量变平为一个向量,计算一个向量值梯度,然后将该梯度重新构造成一个张量。从这种重新排列的观点上看,反向传播仍然只是将Jacobian乘以梯度。

        为了表示值z关于张量X的梯度,我们记为▽Xz,就像X是向量一样。X的索引现在有多个坐标,例如,一个3维的张量由三个坐标索引。我们可以通过使用单个变量i来表示完整的索引元组,从而完全抽象出来。对所有可能的元组i,(▽Xz)i给出dz/dXi.这与向量中索引的方式完全一致,(▽xz)i给出dz/dxi。使用这种记法,我们可以写出适用于张量的链式法则。如果Y=g(X)并且z=f(Y),那么:

        递归地使用链式法则来实现反向传播:使用链式法则,我们可以直接写出某个标量关于计算图中任何产生该标量的节点的梯度的代数表达式。然而,实际在计算机中计算该表达式时会引入一些额外的考虑。具体来说,许多子表达式可能在梯度的整个表达式中重复若干次。任何计算梯度的程序都需要选择是存储这些子表达式还是重新计算它们几次。在某些情况下,计算两次相同的子表达式纯粹是浪费。在复杂图中,可能存在指数多的这种计算上的浪费,使得简单的链式法则不可实现。在其它情况下,计算两次相同的子表达式可能是以较高的运行时间为代价来减少内存开销的有效手段。

        张量通常可以具有任意维度,并且包含标量、向量和矩阵。

        反向传播算法的软件实现通常提供操作和其bprop方法,所以深度学习软件库的用户能够对使用诸如矩阵乘法、指数运算、对数运算等等常用操作构建的图进行反向传播。反向传播不是计算梯度的唯一方式或最佳方式,但它是一个非常实用的方法。

        前馈网络可以被视为一种高效的非线性函数近似器,它以使用梯度下降来最小化函数近似误差为基础。

        反向传播(Backpropagation,缩写为BP)是”误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。反向传播要求有对每个输入值想得到的已知输出,来计算损失函数梯度。因此,它通常被认为是一种监督式学习方法,虽然它也用在一些无监督网络(如自动编码器)中。反向传播要求人工神经元(或”节点”)的激活函数可微。

        任何监督学习算法的目标是找到一个能把一组输入最好的映射到其正确的输出的函数。例如一个简单的分类任务,其中输入是动物的图像,正确的输出将是动物的名称。一些输入和输出模式可以很容易地通过单层神经网络(如感知器)学习。但是这些单层的感知机不能学习一些比较简单的模式,例如那些非线性可分的模式。例如,人可以通过识别动物的图像的某些特征进行分类,例如肢的数目,皮肤的纹理(无论是毛皮,羽毛,鳞片等),该动物的体型,以及种种其他特征。但是,单层神经网络必须仅仅使用图像中的像素的强度来学习一个输出一个标签函数。因为它被限制为仅具有一个层,所以没有办法从输入中学习到任何抽象特征。多层的网络克服了这一限制,因为它可以创建内部表示,并在每一层学习不同的特征。第一层可能负责从图像的单个像素的输入学习线条的走向。第二层可能就会结合第一层所学并学习识别简单形状(如圆形)。每升高一层就学习越来越多的抽象特征,如上文提到的用来图像分类。每一层都是从它下方的层中找到模式,就是这种能力创建了独立于为多层网络提供能量的外界输入的内部表达形式。 反向传播算法的发展的目标和动机是找到一种训练的多层神经网络的方法,于是它可以学习合适的内部表达来让它学习任意的输入到输出的映射

        反向传播算法(BP算法)主要由两个阶段:激励传播与权重更新。

        第1阶段:激励传播:

        每次迭代中的传播环节包含两步:(前向传播阶段)将训练输入送入网络以获得激励响应;(反向传播阶段)将激励响应同训练输入对应的目标输出求差,从而获得隐层和输出层的响应误差。

        第2阶段:权重更新:

        对于每个突触上的权重,按照以下步骤进行更新:将输入激励和响应误差相乘,从而获得权重的梯度;将这个梯度乘上一个比例并取反后加到权重上。

        这个比例(百分比)将会影响到训练过程的速度和效果,因此称为”训练因子”。梯度的方向指明了误差扩大的方向,因此在更新权重的时候需要对其取反,从而减小权重引起的误差。

        第1和第2阶段可以反复循环迭代,直到网络的对输入的响应达到满意的预定的目标范围为止。

        以上内容主要摘自: 《深度学习中文版》 、 维基百科

        GitHub:  https://github.com/fengbingchun/NN_Test 

--------------------- 本文来自 fengbingchun 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/fengbingchun/article/details/79881847?utm_source=copy

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号