前馈神经网络(FNN)
前馈神经网络(Feedforward Neural Network,FNN)由多层的Logistic回归模型(连续的非线性函数)组成。在前馈神经网络中,各神经元分别属于不同的层.每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层.第0层称为输入层,最后一层称为输出层,其他中间层称为隐藏层.整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示.图4.7给出了前馈神经网
前馈神经网络(Feedforward Neural Network,FNN)由多层的Logistic回归模型(连续的非线性函数)组成。在前馈神经网络中,各神经元分别属于不同的层.每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层.第0层称为输入层,最后一层称为输出层,其他中间层称为隐藏层.整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示.
图4.7给出了前馈神经网络的示例.

表4.1给出了描述前馈神经网络的记号.

令= 𝒙,前馈神经网络通过不断迭代下面公式进行信息传播:

首先根据第𝑙−1层神经元的活性值(Activation)计算出第𝑙层神经元的净活性值(NetActivation)
,然后经过一个激活函数得到第𝑙层神经元的活性值.因此,我们也可以把每个神经层看作一个仿射变换(AffineTransformation)和一个非线性变换.
公式(4.32)和公式(4.33)也可以合并写为:![]()
或![]()
这样,前馈神经网络可以通过逐层的信息传递,得到网络最后的输出. 整个网络可以看作一个复合函数𝜙(𝒙;𝑾,𝒃),将向量𝒙作为第1层的输入
,将第𝐿层的输出
作为整个函数的输出.

其中𝑾,𝒃表示网络中所有层的连接权重和偏置.
1. 通用近似定理
前馈神经网络具有很强的拟合能力,常见的连续非线性函数都可以用前馈神经网络来近似.
定理4.1 通用近似定理(Universal Approximation Theorem):令𝜙(⋅)是一个非常数、有界、单调递增的连续函数,
是一个𝐷维的单位超立方体
,
是定义在
上 的连续函数集合.对于任意给定的一个函数𝑓 ∈
,存在一个整数𝑀,和一组实数
,
∈ℝ以及实数向量
∈
,𝑚=1,⋯,𝑀,以至于我们可以定义函数
作为函数𝑓的近似实现,即
其中𝜖>0是一个很小的正数.
通用近似定理在实数空间中的有界闭集上依然成立.
根据通用近似定理,对于具有线性输出层和至少一个使用“挤压”性质的激活函数的隐藏层组成的前馈神经网络,只要其隐藏层神经元的数量足够,它可以以任意的精度来近似任何一个定义在实数空间中的有界闭集函数.所谓“挤压”性质的函数是指像Sigmoid函数的有界函数,但神经网络的通用近似性质也被证明对于其他类型的激活函数,比如ReLU,也都是适用的.通用近似定理只是说明了神经网络的计算能力可以去近似一个给定的连续函数,但并没有给出如何找到这样一个网络,以及是否是最优的.此外,当应用到机器学习时,真实的映射函数并不知道,一般是通过经验风险最小化和正则化来进行参数学习.因为神经网络的强大能力,反而容易在训练集上过拟合.
2. 应用到机器学习
根据通用近似定理,神经网络在某种程度上可以作为一个“万能”函数来使用,可以用来进行复杂的特征转换,或逼近一个复杂的条件分布.
在机器学习中,输入样本的特征对分类器的影响很大.以监督学习为例,好的特征可以极大提高分类器的性能.因此,要取得好的分类效果,需要将样本的原始特征向量𝒙转换到更有效的特征向量𝜙(𝒙),这个过程叫作特征抽取.
多层前馈神经网络可以看作一个非线性复合函数𝜙∶ →
,将输入 𝒙∈
映射到输出𝜙(𝒙) ∈
.因此,多层前馈神经网络也可以看成是一种特征转换方法,其输出𝜙(𝒙)作为分类器的输入进行分类.
给定一个训练样本(𝒙,𝑦),先利用多层前馈神经网络将𝒙映射到𝜙(𝒙),然后 再将𝜙(𝒙)输入到分类器𝑔(⋅),即![]()
其中𝑔(⋅)为线性或非线性的分类器,𝜃为分类器𝑔(⋅)的参数,𝑦为分类器的输出.
特别地,如果分类器𝑔(⋅)为Logistic回归分类器或Softmax回归分类器,那么𝑔(⋅)也可以看成是网络的最后一层,即神经网络直接输出不同类别的条件概率𝑝(𝑦|𝒙).
对于二分类问题𝑦∈{0,1},并采用Logistic回归, 那么Logistic回归分类器可以看成神经网络的最后一层.也就是说,网络的最后一层只用一个神经元,并且其激活函数为Logistic函数.网络的输出可以直接作为类别𝑦=1的条件概率,![]()
其中𝑎(𝐿) ∈ ℝ为第𝐿层神经元的活性值.
对于多分类问题𝑦∈{1,⋯,𝐶},如果使用Softmax回归分类器, 相当于网络最后一层设置𝐶个神经元,其激活函数为Softmax函数.网络最后一层(第𝐿层) 的输出可以作为每个类的条件概率,即![]()
其中𝒛(𝐿) ∈ ℝ𝐶为第𝐿层神经元的净输入;𝒚∈ℝ𝐶为第𝐿层神经元的活性值,每 一维分别表示不同类别标签的预测条件概率.
忘记Logistic回归和softmax回归可以看这一篇:
3 参数学习
如果采用交叉熵损失函数,对于样本(𝒙,𝑦),其损失函数为![]()
其中𝒚∈为标签𝑦对应的one-hot向量表示.
给定训练集为,将每个样本
输入给前馈神经网络, 得到网络输出为
,其在数据集𝒟上的结构化风险函数为

其中𝑾和𝒃分别表示网络中所有的权重矩阵和偏置向量;是正则化项,用来防止过拟合;𝜆 > 0为超参数.𝜆越大,𝑾越接近于0.这里的
一般使用 Frobenius范数:

有了学习准则和训练样本,网络参数可以通过梯度下降法来进行学习.在梯度下降方法的每次迭代中,第𝑙层的参数和
参数更新方式为

其中𝛼为学习率.
梯度下降法需要计算损失函数对参数的偏导数,如果通过链式法则逐一对每个参数进行求偏导比较低效.在神经网络的训练中经常使用反向传播算法来高效地计算梯度.
4 反向传播算法
假设采用随机梯度下降进行神经网络参数学习,给定一个样本(𝒙,𝒚),将其输入到神经网络模型中,得到网络输出为.假设损失函数为
,要进行参数学习就需要计算损失函数关于每个参数的导数.
不失一般性,对第𝑙层中的参数和
计算偏导数.因为
的计算涉及向量对矩阵的微分,十分繁琐,因此我们先计算
关于参数矩阵中每个元素的偏导数
.根据链式法则,
公式(4.49)和公式(4.50)中的第二项都是目标函数关于第𝑙层的神经元 的偏导数,称为误差项,可以一次计算得到.这样我们只需要计算三个偏导数,分 别为
,
和
.
下面分别来计算这三个偏导数.
1)计算偏导数 因
=
+
,偏导数
其中为权重矩阵
的第𝑖行,
表示第𝑖个元素为
,其余为0的行向量
2)计算偏导数 因为
和
的函数关系为
=
+
,因此偏导数
为×
的单位矩阵.
3)计算偏导数 偏导数
表示第𝑙层神经元对最终损失的影响,也反映了最终损失对第𝑙层神经元的敏感程度,因此一般称为第𝑙层神经元的误差项,用𝛿(𝑙)来表示.
误差项𝛿(𝑙)也间接反映了不同神经元对网络能力的贡献程度,从而比较好地解决了贡献度分配问题(CreditAssignmentProblem,CAP).

其中⊙是向量的点积运算符,表示每个元素相乘.
从公式(4.63)可以看出,第𝑙层的误差项可以通过第𝑙+1层的误差项计算得到,这就是误差的反向传播(BackPropagation,BP).反向传播算法的含义是: 第𝑙层的一个神经元的误差项(或敏感性)是所有与该神经元相连的第𝑙+1层 的神经元的误差项的权重和.然后,再乘上该神经元激活函数的梯度. 在计算出上面三个偏导数之后,公式(4.49)可以写为

其中𝛿(𝑙) 𝑖 𝑎(𝑙−1) 𝑗相当于向量𝛿(𝑙)和向量𝒂(𝑙−1)的外积的第𝑖,𝑗个元素.外积参见公式(A.28).上式可以进 一步写为
因此,ℒ(𝒚,𝒚)关于第𝑙层权重𝑾(𝑙)的梯度为

同理,ℒ(𝒚,𝒚)关于第𝑙层偏置𝒃(𝑙)的梯度为

在计算出每一层的误差项之后,我们就可以得到每一层参数的梯度.因此, 使用误差反向传播算法的前馈神经网络训练过程可以分为以下三步:
(1) 前馈计算每一层的净输入𝒛(𝑙)和激活值𝒂(𝑙),直到最后一层;
(2) 反向传播计算每一层的误差项𝛿(𝑙);
(3) 计算每一层参数的偏导数,并更新参数.
算法4.1给出使用反向传播算法的随机梯度下降训练过程.

5 自动梯度计算
神经网络的参数主要通过梯度下降来进行优化.当确定了风险函数以及网络结构后,我们就可以手动用链式法则来计算风险函数对每个参数的梯度,并用代码应用实现.但是手动求导并转换为计算机程序的过程非常琐碎并容易出错,导致实现神经网络变得十分低效.实际上,参数的梯度可以让计算机来自动计算.目前,主流的深度学习框架都包含了自动梯度计算的功能,即我们可以只考虑网络结构并用代码实现,其梯度可以自动进行计算,无须人工干预,这样可以大幅提高开发效率.
自动计算梯度的方法可以分为以下三类:数值微分、符号微分和自动微分.
5.1 数值微分
数值微分(NumericalDifferentiation)是用数值方法来计算函数𝑓(𝑥)的导数.函数𝑓(𝑥)的点𝑥的导数定义为
要计算函数𝑓(𝑥)在点𝑥的导数,可以对𝑥加上一个很少的非零的扰动Δ𝑥, 通过上述定义来直接计算函数𝑓(𝑥)的梯度.数值微分方法非常容易实现,但找到一个合适的扰动Δ𝑥却十分困难.如果Δ𝑥过小,会引起数值计算问题,比如舍入误差;如果Δ𝑥过大,会增加截断误差,使得导数计算不准确.因此,数值微分的实用性比较差. 在实际应用,经常使用下面公式来计算梯度,可以减少截断误差.
数值微分的另外一个问题是计算复杂度.假设参数数量为𝑁,则每个参数都需要单独施加扰动,并计算梯度.假设每次正向传播的计算复杂度为𝑂(𝑁),则计算数值微分的总体时间复杂度为𝑂(𝑁2).
5.2 符号微分
符号微分(Symbolic Differentiation)是一种基于符号计算的自动求导方法. 符号计算也叫代数计算,是指用计算机来处理带有变量的数学表达式.这里的变量被看作符号(Symbols),一般不需要代入具体的值.符号计算的输入和输出都是数学表达式,一般包括对数学表达式的化简、因式分解、微分、积分、解代 数方程、求解常微分方程等运算.
比如数学表达式的化简:
符号计算一般来讲是对输入的表达式,通过迭代或递归使用一些事先定义的规则进行转换.当转换结果不能再继续使用变换规则时,便停止计算.
符号微分可以在编译时就计算梯度的数学表示,并进一步利用符号计算方法进行优化.此外,符号计算的一个优点是符号计算和平台无关,可以在CPU或 GPU上运行.符号微分也有一些不足之处:1)编译时间较长,特别是对于循环,需要很长时间进行编译;2)为了进行符号微分,一般需要设计一种专门的语言来表示数学表达式,并且要对变量(符号)进行预先声明;3)很难对程序进行调试
5.3自动微分
自动微分(Automatic Differentiation,AD)是一种可以对一个(程序)函数进行计算导数的方法.符号微分的处理对象是数学表达式,而自动微分的处理对象是一个函数或一段程序.
自动微分的基本原理是所有的数值计算可以分解为一些基本操作,包含 +,−,×,/和一些初等函数exp, log, sin, cos等,然后利用链式法则来自动计算一个复合函数的梯度.
为简单起见,这里以一个神经网络中常见的复合函数的例子来说明自动微分的过程.令复合函数𝑓(𝑥;𝑤,𝑏)为

其中𝑥为输入标量,𝑤和𝑏分别为权重和偏置参数.
首先,我们将复合函数𝑓(𝑥;𝑤,𝑏)分解为一系列的基本操作,并构成一个计算图(ComputationalGraph).计算图是数学运算的图形化表示.计算图中的每个非叶子节点表示一个基本操作,每个叶子节点为一个输入变量或常量.图4.8给出了当𝑥=1,𝑤 = 0,𝑏 = 0时复合函数𝑓(𝑥;𝑤,𝑏)的计算图,其中连边上的红色数字表示前向计算时复合函数中每个变量的实际取值.
从计算图上可以看出,复合函数𝑓(𝑥;𝑤,𝑏)由6个基本函数ℎ𝑖,1 ≤ 𝑖 ≤ 6组 成.如表4.2所示,每个基本函数的导数都十分简单,可以通过规则来实现.
整个复合函数𝑓(𝑥;𝑤,𝑏)关于参数𝑤和𝑏的导数可以通过计算图上的节点 � �(𝑥;𝑤,𝑏)与参数𝑤和𝑏之间路径上所有的导数连乘来得到,即
如果函数和参数之间有多条路径,可以将这多条路径上的导数再进行相加, 得到最终的梯度.
按照计算导数的顺序,自动微分可以分为两种模式:前向模式和反向模式.
前向模式
前向模式是按计算图中计算方向的相同方向来递归地计算梯度.以 为例,当𝑥=1,𝑤=0,𝑏=0时,前向模式的累积计算顺序如下:


反向模式
反向模式是按计算图中计算方向的相反方向来递归地计算梯度.以为例,当𝑥=1,𝑤=0,𝑏=0时,反向模式的累积计算顺序如下:

前向模式和反向模式可以看作应用链式法则的两种梯度累积方式.从反向模式的计算顺序可以看出,反向模式和反向传播的计算梯度的方式相同.
对于一般的函数形式𝑓∶→
,前向模式需要对每一个输入变量都进行一遍遍历,共需要𝑁遍.而反向模式需要对每一个输出都进行一个遍历,共需要𝑀遍.当𝑁 >𝑀时,反向模式更高效.在前馈神经网络的参数学习中,风险函 数为𝑓∶
→ℝ,输出为标量,因此采用反向模式为最有效的计算方式,只需要 一遍计算.
静态计算图和动态计算图
计算图按构建方式可以分为静态计算图(StaticCom putational Graph)和动态计算图(Dynamic Computational Graph). 静态计算图是在编译时构建计算图,计算图构建好之后在程序运行时不能改变,而动态计算图是在程序运行时动态构建.两种构建方式各有优缺点.静态计算图在构建时 可以进行优化,并行能力强,但灵活性比较差.动态计算图则不容易优化,当不同输入的网络结构不一致时,难以并行计算,但是灵活性比较高.
符号微分和自动微分
符号微分和自动微分都利用计算图和链式法则来自动求解导数.符号微分在编译阶段先构造一个复合函数的计算图,通过符号计算得到导数的表达式,还可以对导数表达式进行优化,在程序运行阶段才代入变量的具体数值来计算导数.而自动微分则无须事先编译,在程序运行阶段边计算边记录 计算图,计算图上的局部梯度都直接代入数值进行计算,然后用前向或反向模式来计算最终的梯度. 图4.9给出了符号微分与自动微分的对比.

6 优化问题
神经网络的参数学习比线性模型要更加困难,主要原因有两点:1)非凸优 化问题和2)梯度消失问题.
6.1 非凸优化问题
神经网络的优化问题是一个非凸优化问题.以一个最简单的1-1-1结构的两层神经网络为例,
其中𝑤1和𝑤2为网络参数,𝜎(⋅)为Logistic函数.
给定一个输入样本(1,1),分别使用两种损失函数,第一种损失函数为平方 误差损失:ℒ(𝑤1,𝑤2) = (1 − 𝑦)2,第二种损失函数为交叉熵损失ℒ(𝑤1,𝑤2) = log𝑦.当𝑥 = 1,𝑦 = 1时,其平方误差和交叉熵损失函数分别为:ℒ(𝑤1,𝑤2) = (1 −𝑦)2和ℒ(𝑤1,𝑤2) = log𝑦.损失函数与参数𝑤1和𝑤2的关系如图4.10所示,可 以看出两种损失函数都是关于参数的非凸函数.

6.2 梯度消失问题
在神经网络中误差反向传播的迭代公式为![]()
误差从输出层反向传播时,在每一层都要乘以该层的激活函数的导数.当我们使用Sigmoid型函数:Logistic函数𝜎(𝑥)或Tanh函数时,其导数为
Sigmoid型函数的导数的值域都小于或等于1,如图4.11所示.

由于Sigmoid型函数的饱和性,饱和区的导数更是接近于0.这样误差经过每一层传递都会不断衰减.当网络层数很深时,梯度就会不停衰减,甚至消失,使得整个网络很难训练.这就是所谓的梯度消失问题(VanishingGradient Problem),也称为梯度弥散问题. 在深度神经网络中,减轻梯度消失问题的方法有很多种.一种简单有效的方式是使用导数比较大的激活函数,比如ReLU等.
更多推荐




所有评论(0)