人工神经网络(Artificial Neural Network, ANN)是一系列受生物学和神经科学启发的数学模型,在人工只能领域,人工神经网络称为神经网络(Neural Network, NN)或神经模型(Neural Model)。
1.神经元
人工神经元(Artificial Neuron),简称神经元(Neuron),是构成神经网络的基本单元。假设一个神经元接收D个输入x1,x2,...,xD,令向量x=[x1;x2;...;xD]来表示这组输入,并用净输入(Net Input)表示一个神经元所获得的输入信号x的加权和:
z=d=1∑Dwdxd+b=wTx+b
w=[w1;w2;...;wD]∈RD是D维的权重向量
净输入z经过非线性函数f(⋅)之后,得到神经元的活性值(Activation)a:
a=f(z)
所以非线性函数f(⋅)为激活函数(Activiation Function)。
激活函数(Activiation Function)性质:
连续并可导(允许少数点上不可导)的非线性函数,可导的激活函数可直接利用数值优化的方法来学习网络参数。
激活函数以及导函数要尽可能的简单,有利于提高网络计算效率。
激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。
1.1.Sigmoid型函数
Sigmoid函数是指一类S型曲线函数,为两端饱和函数,常用的Sigmoid型的函数有Logistic函数和Tanh函数。
对于函数f(x),若x→−∞时,其导数f′(x)→0,则称其为左饱和;若x→+∞时,其导数f′(x)→0,则称其为右饱和;同时满足左右饱和,就为两端饱和。
Logistic函数:
σ(x)=1+exp(−x)1
Logistic函数是一个压缩函数,把一个实数域的输入压缩到(0,1)
,当输入值在0
附近,Sigmoid近似为线性函数,当输入值接近两端时,对输入抑制,输入越小越接近于0,输入越大越接近于1。Logistic激活函数有如下两个性质:
其输出直接可以看做概率分布,使得神经网络可以更好地和统计学习模型进行结合。
其可以看做一个软性门(Soft Gate),用来控制其他神经网络输出信息的数量。
Tanh函数:
tanh(x)=exp(x)+exp(−x)exp(x)−exp(−x)
Tanh函数可以看做放大并平移的Logistic函数,其值域是(-1,1)
:
tanh(x)=2σ(2x)−1
从图上可知Tanh函数输出是零中心化的(Zero-Centered),而Logistic函数输出恒大于0,非零中心化的输出会使得后一层神经元的输入发生偏置偏移(Bias Shift)。
1.2.Hard-Logistic/Hard-Tanh
Logistic函数和Tanh函数都是Sigmoid型的,具有饱和性,但计算开销很大,因为这两个函数都在中间近似线性,因此,两个函数可通过分段函数来近似。
Logistic函数σ(x):
它导数为σ′(x)=σ(x)(1−σ(x))
该函数在0
附近的一阶泰勒展开(Taylor expansion)为:gl(x)≈σ(0)+x×σ′(0)=0.25x+0.5
所以Logistic使用分段函数hard-logistic(x)来近似:
hard−logistic(x)=⎩⎨⎧1,gl(x)≥1gl,0<gl(x)<10,gl(x)≤0=max(min(gl(x),1),0)=max(min(0.25x+0.5,1),0)
Tanh函数在0附近的泰勒展开为:
gt(x)≈tanh(0)+x×tanh′(0)=x
所以Tanh使用分段函数hard-tanh(x)来近似:
hard−tanh(x)=max(min(gt(x),1),−1)=max(min(x,1),−1)
1.2.ReLU函数
ReLU(Rectified Linear Unit,修正线性单元),也叫Rectifier函数,是目前深度神经网络中经常使用的激活函数。ReLU实际上是一个斜坡(Ramp)函数,定义如:
ReLU(x)={x,x≥00,x<0=max(0,x) 优点:采用ReLU的神经元只需要进行加、乘和比较的操作,计算上更加高效。ReLU函数被认为具有生物学合理性(Biological Plausibility),比如单侧抑制、宽兴奋边界(兴奋程度可以很高)。Sigmoid型激活函数会导致一个非稀疏的神经网络,而ReLU却具有良好稀疏性,大约50%
的神经元会处于激活状态。优化时,相比于Sigmoid型函数的两端饱和,ReLU函数为左饱和函数,在x > 0时导数为1,在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降收敛速度。
缺点:ReLU函数输出是非零中心化,给后一层神经网络引入了偏置偏移,会影响梯度下降效率,此外,ReLU神经元在训练时容易死亡。在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个ReLU神经元在所有的训练数据上都不能被激活,那么该神经元自身参数的梯度永远都是0,在之后训练中再也不可被激活——这种现象称为死亡ReLU问题(Dying ReLU Problme)。
1.2.1.带泄漏的ReLU
带泄漏的ReLU(Leaky ReLU)在输入x<0时,保持一个很小的梯度γ,这样当神经元非激活时也能有一个非零的梯度可以更新参数,避免永远不能被激活,它的定义如下:
LeakyReLU(x)={x,x>0γx,x≤0=max(0,x)+γmin(0,x) 其中γ是一个很小常数,如0.01,带泄漏的ReLU也可以写成:LeakyReLU(x)=max(x,γx),相当于是一个比较简单的maxout单元。
1.2.2.带参数的ReLU
带参数的ReLU(Parametric ReLU, PReLU)引入一个可学习的参数,不同神经元可以有不同参数,对第i
个神经元,它的定义如:
PReLUi(x)={x,x>0γix,x≤0=max(0,x)+γimin(0,x) 由于γi是x≤0时函数斜率,所以PReLU是非饱和函数
如果γi=0,那么PReLU等价于ReLU。
如果γi是很小常数,那么PReLU等价于一个带泄漏的ReLU。
PReLU允许不同神经元具有不同参数,也可以一组神经元共享一个参数。
1.2.3.ELU函数
ELU(Exponential Linear Unit,指数线性单元)是一个近似零中心化的非线性函数:
ELU(x)={x,x>0γi(exp(x)−1),x≤0=max(0,x)+min(0,γ(exp(x)−1)) γ≥0是一个超参数,决定x≤0时的饱和曲线,并调整输出均值在0附近。
1.2.4.Softplus函数
Softplus函数可以看做Rectifier函数的平滑版本,定义如:
Softplus(x)=log(1+exp(x))
Softplus函数其导数刚好是Logistic函数,Softplus函数虽然也具有单抑制、宽兴奋边界特性,无稀疏激活性。
1.3.Swish函数
Swish函数是一种自控门(Self-Gated)激活函数:
swish(x)=xσ(βx)
σ(⋅)为Logistic函数,σ(⋅)∈(0,1)可当做软性的门控机制
β=0,Swish函数变成线性函数x/2。
β=1,Swish函数在x > 0时近似线性,在x < 0时近似饱和,同时具有一定非单调性。
β→+∞,σ(βx)趋向于离散的0-1函数,Swish函数近似为ReLU函数。
因此Swish函数可以看做线性函数和ReLU函数之间的非线性插值函数,由β参数控制。
1.4.GELU函数
GELU(Gaussian Error Linear Unit,高斯误差线性单元)是一种通过门控机制来调整输出值的激活函数,和Swish函数类似:
GELU(x)=xP(X≤x)
其中P(X≤x)是高斯分布N(μ,σ2)的累积分布函数,其中μ,σ为超参数,μ=0,σ=1即可,由于高斯分布累积分布函数为S型函数,因此GELU函数可和Tanh函数或Logistic函数近似
GELU(x)≈0.5x(1+tanh(π2(x+0.044715x3)))
GELU(x)≈xσ(1.702x)
当使用Logistic函数近似时,GELU相当于一种特殊的Swish函数。
1.5.Maxout单元
Maxout单元也是一种分段线性函数,Sigmoid型函数、ReLU等激活函数的输入是神经元的净输入z,是一个标量,而Maxout单元的输入是上一层神经元的全部输出,是一个向量x=[x1;x2;...;xD]
每个Maxout单元有K个权重向量wk∈RD和偏置bk(1≤k≤K),对于输入x,可以得到K个净输入zk,1≤k≤K。
zk=wkTx+bk
其中wk=[wk1,...,wkD]T为第k个权重向量,Maxout单元的非线性函数定义为:
maxout(x)=k∈[1,K]max(zk)
Maxout单元不单是净输入到输出之间的非线性映射,而是整体学习输入到输出之间的非线性关系映射,它的激活函数可以看做任意凸函数的分段线性近似,并且在有限点上不可微的。
2.网络结构
2.1.前馈网络
前馈网络中各个神经元按照接收信息的先后分为不同组,每一组可看做一个神经层,每一层接收前一层的输出,并且输出到下一层,整个网络中信息是一个方向传播,没有反向传播,通常包括:
它可以看做一个函数,通过简单非线性函数多次组合,实现复杂映射。
2.2.记忆网络
记忆网络,又称反馈网络,神经元不仅可接受其他神经元的信息,也可以接收自己的历史信息——记忆网络中神经元具有记忆功能,不同时刻状态不一样,通常包括:
它可以看做一个程序,有更强的计算能力以及记忆能力,如果记忆单元使用了外部的读写,那么这种网络称为记忆增强神经网络(Memory Augmented Neural Network, MANN):
2.3.图网络
前馈网络和记忆网络中输入最终都表示成了向量或向量序列,都很难处理图结构的数据,图网络是定义在图结构之上的神经网络,节点之间可有向,也可无向。它包含:
图卷积网络(Graph Convolutional Network, GCN)
图注意力网络(Graph Attention Network, GAT)
消息传递神经网络(Message Passing Neural Network, MPNN)
3.前馈网络
前馈神经网络(Feedforward Neural Network, FNN)是最早发明的简单人工神经网络,通常也称为多层感知机(Multi-Layer Perceptron, MLP)——其实这种叫法欠妥,因为它由多层Logistic回归模型组成,并非多层的感知机构成。
该网络中主要包含三层:输入层(第0层)、隐藏层、输出层(最后一层)。令a(0)=x,前馈神经网络通过不断迭代下边两个公式来传播
z(l)=W(l)a(l−1)+bl
a(l)=fl(z(l))
步骤:
先根据l−1层神经元的活性值(Activation)a(l−1)计算出第l层神经元的净活性值(Net Activation)z(l)。
经过一个激活函数得到第l层神经元的活性值——所以可以把每个神经层看做一个仿射变换(Affine Transformation)和一个非线性变换。
合并后的表达:
z(l)=W(l)fl−1(z(l−1))+b(l)
所以前馈神经网络逐层传递,整个网络可以当做一个复合函数ϕ(x;W,b):
x=a(0)→z(0)→a(1)→z(1)→...→a(L−1)→z(L)→a(L)=ϕ(x;W,b)
W,b表示网络中所有层的链接权重和偏置。
3.1.通用近似定理
定理4.1——通用近似定理(Universal Approximation Theorem),令ϕ(⋅)是一个非常数、有界、单调递增的连续函数,JD是一个D维的单位超立方体[0,1]T,C(JD)是定义在JD上的连续函数集合,对于任一给定的一个函数f∈C(JD),存在一个整数M,和一组实数vm,bm∈R以及实数向量wm∈RD,m=1,...,M,以至于我们可以定义函数: F(x)=m=1∑Mvmϕ(wmTx+bm) 作为函数f的近似实现,即 ∣F(x)−f(x)∣<ϵ,∀x∈JD 其中ϵ>0是一个很小的正数
根据通用近似定理,对于具有线性输出层和至少一个使用“积压”性质的激活函数的隐藏层组成的前馈神经网络,只要其隐藏层神经元的数量足够,它可以以任意的精度来近似任何一个定义在实数空间RD中有界闭集函数。该定理只说明神经网络的计算能力可以去近似一个给定的连续函数,但并没给出如何找到这样的一个网络。
3.2.机器学习
根据上述定理,神经网络在某种程度上可作为一个“万能”函数,可进行复杂的特征转换。机器学习中,要取得很好的分类效果,需将样本原始特征向量x转换到更有效的特征向量ϕ(x)中,这个过程就是特征抽取。
给定一个训练样本(x,y),
y^=g(ϕ(x);θ)
g(⋅)是一个线性或非线性分类器
θ是分类器g(⋅)的参数
如果 g(⋅)是Logistic回归或Softmax函数,则可认为是网络最后一层。
如果是二分类,使用Logistic回归:p(y=1∣x)=α(L)
如果是多分类,使用Softmax函数:(^y)=softmax(z(L))
3.3.参数学习
该算法可使用交叉熵损失函数,对样本(x,y)而言,损失函数如:
L(y,y^)=−yTlogy^
结构化风险函数
R(W,b)=N1n=1∑NL(yn,yn^)+21λ∣∣W∣∣F2
其中W,b分别标识网络中所有权重矩阵和偏置向量
∣∣W∣∣F2是正则化项,防止过拟合
λ>0是超参数,它越大,W越接近于0。
此处∣∣W∣∣F2一般使用Frobenius范数:
∣∣W∣∣F2=l=1∑Li=1∑Mlj=1∑Ml+1(wij(l))2
梯度下降公式:
W(l)←W(l)−α(N1n=1∑N(∂W(l)∂L(yn,yn^))+λW(l))
b(l)←b(l)−α(N1n=1∑N∂b(l)∂L(yn,yn^))
梯度下降法需计算损失函数对参数的偏导,如果对链式法则逐一求解效率很低,因此经常使用反向传播算法来计算梯度。
4.反向传播算法
上述公式根据链式法则会得到两个偏导数:
∂wij(l)∂L(y,y^)=∂wij(l)∂z(l)∂z(l)∂L(y,y^)
∂b(l)∂L(y,y^)=∂b(l)∂z(l)∂z(l)∂L(y,y^)
上边第二项都是目标函数关于第l层神经元z(l)的偏导数,又称为误差项,所以只需计算如下三个:
计算偏导数∂wij(l)∂z(l)
计算偏导数∂b(l)∂z(l),结果为一个Ml×Ml的单位矩阵
计算偏导数∂z(l)∂L(y,y^),它表示第l层神经元对最终损失的影响,也反应了敏感层度,所以一般称为误差项,该项反应了不同神经元对网络的贡献程度,所以很好解决了贡献度分配问题(Credit Assignment Problme, CAP)
最终得到第l层的误差项:
δ(l)≜∂z(l)∂L(y,y^)=fl′(z(l))⊙((W(l+1))Tδ(l+1))∈RMl
⊙是哈达玛积(Hadamard),表示每个元素相乘。
上述公式可以知道,l层的误差项可通过l+1层的误差项进行计算,这就是误差的反向传播(BackPropagation, BP),所以反向传播的含义为:第l层神经网络的误差项是第l+1层神经网络的所有误差项的权重和,然后再乘以该神经元激活函数的梯度。
l(y,y^)关于权重W(l)的权重梯度为:
∂W(l)∂L(y,y^)=δ(l)(α(l−1))T∈RMl×Ml+1
l(y,y^)关于偏置b(l)的偏置梯度为:
∂b(l)∂L(y,y^)=δ(l)∈RMl
误差反向传播算法的前馈神经网络训练步骤:
前馈计算每一层的净输入z(l)和激活值α(l),直到最后一层
反向传播计算每一层的误差项δ(l)
算法细节略
5.自动梯度计算
5.1.数值微分
数值微分(Numerical Differentiation)是用数值方法来计算f(x)的导数,它在点x的导数定义如:
f′(x)=Δx→0limΔxf(x+Δx)−f(x)
如果Δx过小,会引起数值计算问题,舍入误差。
如果Δx过大,会增加截断误差。
因为上述原因,数值微分实用性不高,实际应用中,会使用下边公式来计算精度,减少截断误差:
f′(x)=Δx→0lim2Δxf(x+Δx)−f(x−Δx)
5.2.符号微分
符号微分(Symbolic Differentiation)是一种基于符号计算的自动求导方法,符号计算也称代数计算,表示用计算机处理带有变量的数学表达式。此处变量为符号,一般不用具体值,它的输入和输出都是数学表达式如:化简、因式分解、微分、积分、方程、常微分等。
符号微分的优点是具有平台无关性,可同时在CPU和GPU上运行。
缺点:
为了进行符号微分,需设计一种专门的语言来表示数学表达式,并对符号变量预声明
5.3.自动微分
自动微分(Automatic Differentiation, AD)是一个可以对一个(程序)函数进行计算导数的方法,符号微分处理数学表达式,而自动微分处理一个函数或一段程序:将符合函数分解为一系列的基本操作,构成一个计算图(Computational Graph)。
(示例略),自动微分分为两种模式:前向模式和后向模式
前向模式:按照计算图中计算方向的相同方向递归计算梯度
反向模式:按照计算图中计算方向的相反方向递归计算梯度
反向模式和反向传播的计算梯度的方式相同。
静态计算图和动态计算图:计算图按构建方式可分为静态计算图(Static Computational Graph)和动态计算图(Dynamic Computational Graph),静态计算图是在编译时构建,而动态计算图是在运行时构建。
符号微分和自动微分(略)
6.优化问题
神经网络优化难点:
误差经过每一层会不断衰减,当网络层数很深,梯度就会衰减甚至消失,这就是梯度消失问题(Vanishing Gradient Problem),也称梯度弥散问题。
7.小结
常见激活函数