第二部分 基础模型
第四章 前馈神经网络
激活函数
连续可导(允许少数点上不可导)的非线性函数。
激活函数和其导函数简单。
导函数的值域在一个合适的区间
Sigmoid 型函数
Sigmoid 型函数是指一类S型曲线函数,为两端饱和函数(即)。常用的Sigmoid 型函数有Logistic 函数和Tanh 函数。
Hard-Logistic 函数和Hard-Tanh 函数
Logistic 函数和Tanh 函数都是Sigmoid 型函数,具有饱和性,但是计算开销较大。因为这两个函数都是在中间(0 附近)近似线性,两端饱和。因此,这两个函数可以通过分段函数来近似。
以Logistic 函数σ(x) 为例,其导数为σ′(x) = σ(x)(1 − σ(x))。Logistic 函数在0 附近的一阶泰勒展开为:
这样Logistic 函数可以用分段函数hard-logistic(x) 来近似。
同样,Tanh 函数在0 附近的一阶泰勒展开为
这样Tanh 函数也可以用分段函数hard-tanh(x) 来近似。
ReLU函数
ReLU(Rectified Linear Unit,修正线性单元),也叫Rectifier函数,是目前深度神经网络中经常使用的激活函数。ReLU实际上是一个斜坡(ramp)函数,定义为:
优点:
- 计算上更加高效(只要进行加、乘和比较的操作)。
- ReLU 函数被认为有生物上的解释性,比如单侧抑制、宽兴奋边界(即兴奋程度也可以非常高)。在生物神经网络中,同时处于兴奋状态的神经元非常稀疏。人脑中在同一时刻大概只有1% ∼ 4% 的神经元处于活跃状态。Sigmoid 型激活函数会导致一个非稀疏的神经网络,而ReLU却具有很好的稀疏性,大约50% 的神经元会处于激活状态。
- 在优化方面,相比于Sigmoid 型函数的两端饱和,ReLU函数为左饱和函数,且在x > 0 时导数为1,在一定程度上缓解了神经网络的梯度消失问题,加速梯 度下降的收敛速度。
缺点:
- ReLU函数的输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。
- ReLU 神经元在训练时比较容易“死亡”。
为解决上述问题。ReLU有几个变体:
-
带泄露的ReLU
在输入x < 0 时,保持一个很小的梯度λ。这样当神经元非激活时也能有一个非零的梯度可以更新参数,避免永远不能被激活
-
带参数的ReLU
引入一个可学习的参数,不同神经元可以有不同的参数。对于第i 个神经元,其PReLU 的
定义为:
-
ELU 函数
ELU(Exponential Linear Unit,指数线性单元) 是一个近似的零中心化的非线性函数,其定义为
-
Softplus 函数
Softplus 函数 可以看作是Rectifier 函数的平滑版本,其定义为
Swish 函数
是一种自门控(Self-Gated)激活函数,定义为:
其中σ(·) 为Logistic 函数,β 为可学习的参数或一个固定超参数。σ(·) ∈ (0, 1) 可以看作是一种软性的门控机制。当σ(βx) 接近于1 时,门处于“开”状态,激活函数的输出近似于x本身;当σ(βx) 接近于0 时,门的状态为“关”,激活函数的输出近似于0。
当β = 0 时,Swish 函数变成线性函数x/2。当β = 1 时,Swish 函数在x > 0 时近似线性,在x < 0 时近似饱和,同时具有一定的非单调性。当β → +∞时,σ(βx) 趋向于离散的0-1 函数,Swish 函数近似为ReLU函数。因此,Swish 函数可以看作是线性函数和ReLU函数之间的非线性插值函数,其程度由参数β 控制。
高斯误差线性单元(GELU)
和Swish 函数比较类似,也是一种通过门控机制来调整其输出值的激活函数:
其中P(X ≤ x) 是高斯分布 的累积分布函数,其中μ, σ 为超参数,一般设μ = 0, σ = 1 即可。由于高斯分布的累积分布函数为S 型函数,因此GELU可以用Tanh 函数或Logistic 函数来近似:
Maxout 单元
也是一种分段线性函数。Sigmoid 型函数、ReLU 等激活函数的输入是神经元的净输入z,是一个标量。而Maxout 单元的输入是上一层神经元的全部原始输出,是一个向量。
每个Maxout单元有K个权重向量和偏置bk (1 ≤ k ≤ K)。对于输入x,可以得到K 个净输入zk, 1 ≤ k ≤ K:
Maxout 单元的非线性函数定义为:
Maxout 单元不单是净输入到输出之间的非线性映射,而是整体学习输入到输出之间的非线性映射关系。Maxout 激活函数可以看作任意凸函数的分段线性近似,并且在有限的点上是不可微的。
神经网络
目前常用的神经网络有三种
-
前馈网络
可以看作一个函数,通过简单非线性函数的多次复合,实现输入空间到输出空间的复杂映射。这种网络结构简单,易于实现。
-
记忆网络
也称为反馈网络,网络中的神经元不但可以接收其它神经元的信息,也可以接收自己的历史信息。和前馈网络相比,记忆网络中的神经元具有记忆功能,在不同的时刻具有不同的状态。记忆神经网络中的信息传播可以是单向
或双向传递,因此可用一个有向循环图或无向图来表示。记忆网络包括循环神经网络、Hopfield 网络、玻尔兹曼机、受限玻尔兹曼机 等。记忆网络可以看作一个程序,具有更强的计算和记忆能力。
为了增强记忆网络的记忆容量,可以引入外部记忆单元和读写机制,用来保存一些网络的中间状态,称为记忆增强神经网络。比如神经图灵机和记忆网络。
-
图网络
为处理图结构的数据(用向量表示会损失信息)而出现的网络。
图网络是定义在图结构数据上的神经网络。图中每个节点都由一个或一组神经元构成。节点之间的连接可以是有向的,也可以是无向的。每个节点可以收到来自相邻节点或自身的信息。
图网络是前馈网络和记忆网络的泛化,包含很多不同的实现方式,比如图卷积网络(GCN)、图注意力
网络(GAT)、消息传递网络(MPNN) 等。
前馈神经网络(FNN)
也称为多层感知器(MLP)。但多层感知器的叫法并不是十分合理,因为前馈神经网络其实是由多层的Logistic回归模型(连续的非线性函数)组成,而不是由多层的感知器(不连续的非线性函数)组成。
用以下记号描述一个前馈神经网络:
通用近似定理
对于具有线性输出层和至少一个使用“挤压”性质的激活函数的隐藏层组成的前馈神经网络,就是可以通过足够多隐藏层神经元的数量的前馈神经网络,可以以任意的精度来近似任何一个定义在实数空间中的有界闭集函数。
通用近似定理只是说明了神经网络的计算能力可以去近似一个给定的连续函数,但并没有给出如何找到这样一个网络,以及是否是最优的。此外,当应用到机器学习时,真实的映射函数并不知道,一般是通过经验风险最小化和正则化来
进行参数学习。因为神经网络的强大能力,反而容易在训练集上过拟合。
应用到机器学习
在机器学习中,输入样本的特征对分类器的影响很大。因此,要取得好的分类效果,需要将样本的原始特征向量x转换到更有效的特征向量ϕ(x),这个过程叫做特征抽取。
反向传播算法
设用随机梯度下降进行参数更新。给定一个样本(x, y),将其输入到神经网络模型中,得到网络输出为ˆy。假设损失函数为L(y, ˆy),要进行参数学习就需要计算损失函数关于每个参数的导数。
首先计算偏导数 :
再计算偏导数:
自动梯度计算
数值微分
是用数值方法来计算函数f(x) 的导数。实现简单,但实用性差,且时间复杂度高。
符号微分
是一种基于符号计算的自动求导方法。
符号计算也叫代数计算,是指用计算机来处理带有变量的数学表达式。
和符号计算相对应的概念是数值计算,即将数值代入 数学表示中进行计算。
符号计算一般来讲是对输入的表达式,通过迭代或递归使用一些事先定义的规则进行转换。当转换结果不能再继续使用变换规则时,便停止计算。
也就是符号微分可以在编译时就计算梯度的数学表示,并进一步进行优化。此外,符号计算的一个优点是符号计算和平台无关,可以在CPU或GPU上运行。
符号微分的缺点:一是编译时间较长,特别是对于循环,需要很长时间进行编译;二是为了进行符号微分,一般需要设计一种专门的语言来表示数学表达式,并且要对变量(符号)进行预先声明;三是很难对程序进行调试。
自动微分
如对复合函数进行自动微分,可构建计算图:
是一种可以对一个(程序)函数进行计算导数的方法。符号微分的处理对象是数学表达式,而自动微分的处理对
象是一个函数或一段程序。自动微分可以直接在原始程序代码进行微分,因此自动微分成为目前大多数深度学习框架的首选。
自动微分的基本原理是所有的数值计算可以分解为一些基本操作,包含+,−,×, / 和一些初等函数exp, log, sin, cos 等,然后利用链式法则来自动计算一个复合函数的梯度。
按照计算导数的顺序,自动微分可以分为两种模式:前向模式和反向模式(类似反向传播)。
静态计算图和动态计算图计算图按构建方式可以分为静态计算图(Theano 和Tensorflow)和动态计算图(PyTorch)。静态计算图是在编译时构建计算图,计算图构建好之后在程序运行时不能改变,而动态计算图是在程序运行时动态构建。两种构建方式各有优缺点。静态计算图在构建时可以进行优化,并行能力强,但灵活性比较差。动态计算图则不容易优化,当不同输入的网络结构不一致时,难以并行计算,但是灵活性比较高。
优化问题
神经网络的参数学习比线性模型要更加困难,主要原因有两点:(1)非凸优化问题和(2)梯度消失问题。