前文已述,神经元最基础的功能是信息的整合和激发,这两点可为设计新型神经元带来一些灵感,因此本节将对神经元的组成成分做进一步分析。如图2.7所示,假定有来自其他神经元的
n
个输入信号组成的
n
维向量
x
=(
x
1
,
x
2
,…,
x
n
)∈ℝ
n
,在神经元中,每一个输入信号都有一个与之对应的突触,组成
n
维向量
w
=(
w
1
,
w
2
,…,
w
n
)∈ℝ
n
,权值的大小反映了输入信号对神经元的重要性。信号整合通过对加权的输入信号进行求和,以生成“激活电压”
。给定神经元激活阈值
θ
,可以计算出激活电位
u
,该电位为激活电压与激活阈值之差,即
。当激活电位
u
≥0时,神经元将产生兴奋信号,
u<
0时,神经元产生抑制信号。通过激活函数
σ
来将激活电位
u
映射到合理的范围内,得到该神经元的输出信号
o
,然后
o
被传递给与之相连接的其他神经元。
图2.7 神经元的整合-激发过程
思考
在人工神经元的组成成分中,有什么值得研究的问题?
1.神经元的输入信号个数 n 设为多少比较合适, n 是可变的吗?
2.不同信号 x i 的权值 w i 的大小如何确定?
3.信号整合中只是简单对输入信号 x 进行加权求和,你还能想出别的整合方法吗?
4.激活阈值 θ 该如何确定?
5.什么样的激活函数 σ 是合适的?你能举几个例子吗?
6.神经元之间如何进行连接?
神经元的激发主要是通过激活函数来完成的,本节将介绍几种常见的激活函数。
1.阈值函数
阈值函数包括单极性阈值函数和多极性阈值函数。阈值函数中存在一个阈值 θ ,当结果大于该阈值时,神经元为兴奋状态,单(多)极性阈值函数均输出1;小于该阈值时,神经元为抑制状态,单极性阈值函数输出0,双极性阈值函数输出-1。
· 单极性阈值函数
· 多极性阈值函数
图2.8是设定 θ =0时的阈值函数,图a是单极性阈值函数,图b是双极性阈值函数。阈值函数的缺点为不连续,这意味着无法对其进行求导,也就无法通过梯度对学习时的误差进行反向传播。即使不考虑阈值对应的点,人为地定义此处的梯度,其他位置的梯度也处处为0。因此,需要设计新的激活函数将输出变为连续值。
图2.8 阈值函数
2.Sigmoid函数
Sigmoid函数将输入从(-∞,+∞)映射到(0,1)区间。一般形式的Sigmoid函数为:
k 称为斜率参数,决定曲线的坡度。
当 k 趋向于无穷大, x 为正数时,e -kx 趋向于0,Sigmoid( x )趋向于1; x 为负数时,e -kx 趋向于无穷大,Sigmoid( x )趋向于0,此时Sigmoid函数近似于阈值函数。
Sigmoid函数是两端饱和函数。对于函数
ϕ
,当
时,称
ϕ
(
x
)为左饱和函数;当
时,称
ϕ
(
x
)为右饱和函数;既是左饱和函数又是右饱和函数时,称为两端饱和函数。在饱和区,激活函数值受输入的影响不大。
Sigmoid函数是一种挤压函数,将(-∞,+∞)的输入挤压到(0,1)内后,一定程度上可以将其视作概率分布,从而与统计学习模型相结合。
Sigmoid函数是连续函数,它的一阶导数也是连续可微的。由图2.9可以看出,Sigmoid函数的梯度(斜率)恒为正数,并且在 x =0时梯度最大,随着输入的绝对值不断增大,梯度不断减小,这样当输入的绝对值较大时,梯度接近于0,这将导致反向传播过程中的梯度消失,模型无法继续学习。
图2.9 Sigmoid函数
3.Tanh函数
Sigmoid函数的一个缺点在于输出值恒为正值,每一层的函数值经过Sig-moid函数激活后作为后续网络的输入,这样随着网络层数的增加,会产生累计偏差。而Tanh函数则解决了Sigmoid函数的这一问题。Tanh函数为:
如图2.10所示,Tanh函数的形状和Sigmoid函数的形状很像,但Tanh函数将输入从(-∞,+∞)映射到(-1,1)区间,其图像关于坐标原点对称,是一种均值为0的激活函数。但是与Sigmoid函数一样,Tanh函数同样面临着梯度消失的问题。
图2.10 Tanh函数
4.ReLU函数
ReLU函数中文名称为线性整流函数(Rectified Linear Unit),当 x> 0时,其导数为1,可以在一定程度上缓解梯度消失问题。其数学表示形式为:
ReLU函数的图像如图2.11所示,ReLU函数具有生物学上的合理性,即“单侧抑制现象”。当输入小于0时被抑制,输出一直为0,而当输入大于0时被激活。此外,ReLU函数的计算速度比较快,只需要判断一次。所以采用ReLU函数作为激活函数,训练时收敛速度较快。
图2.11 ReLU函数
当然,ReLU函数也有它的缺点。由于ReLU函数在输入小于0时梯度也为0,如果在一次不恰当的更新后,恰巧使得ReLU函数的输入小于0,那该神经元权值自此不会再更新,这就叫作ReLU神经元坏死问题(dead ReLU problem)。
为了让尽可能多的神经元参与到训练过程中,可以使用ReLU函数的一些变体,例如带泄漏线性整流函数(Leaky ReLU):
其中 γ ∈(0,1),即当输入小于等于0时,让激活函数有较小的梯度 γ ,从而解决坏死问题。神经网络中坏死的神经元同样占用计算资源,因此可以考虑将这些神经元抛弃,类似于大脑中神经元的凋亡。这就涉及神经网络压缩的一个分支——剪枝,这个话题在之后的章节会有所介绍。
此外,ReLU函数是非零中心化的函数,一些变体也将其改为零中心化以加快收敛速度,如指数线性单元(ELU):
其中 γ> 0。
思考
什么激活函数最好?
除了上面所提到的函数以外,还有很多函数可以作为激活函数,如恒等函数 y = x 、分段线性函数、Softmax函数等。每种激活函数都有优点和缺点,如表2.1所示,没有一种激活函数可以解决所有问题,因此,从问题出发选择最合适的激活函数才是正确的思路。如果都不合适,也可以根据问题自行研究和设计。
表2.1 激活函数的比较
神经元的整合主要是对输入信号的整合,整合的方式多种多样,除了最简单的加权求和,本节将介绍其他几种整合方式。
1.乘法神经元
设计思路是从数学结构上进行优化来提升神经元的表达能力,于是得到了如图2.12所示的模型结构,用累乘来代替MP神经元中的累加:
图2.12 乘法神经元
这种模型可以很好地拟合多项式分布的输入,在时间序列预测任务上效果较好,但是因为累乘计算量大,也增加了计算负担。在处理带有负数的输入的情况下,乘法神经元可能会产生错误的输出结果。
2.IC神经元
设计思路是假定两个小球
m
1
和
m
2
之间发生了物理碰撞,碰撞过程见图2.13。假设碰撞是弹性碰撞,可得
,记
,则有
。模拟该物理碰撞过程,将两小球视为前后两个神经元,连接权重为
w
,突触前神经元的输出(突触后神经元的输入)为
x
,突触后神经元的输入整合值为
v
′′
,由
和
两部分构成。小球
m
2
在碰撞后获得一个向右运动的速度(信息),对应公式(2.10)中的信息
。碰撞后根据两小球的质量关系决定
m
1
是否继续向右,对应公式(2.10)中的信息
。我们将右视为正方向,只有向右的速度(值为正的信息)才可以向后传递,因此在计算
m
1
的信息
时使用了ReLU。
图2.13 碰撞过程
IC神经元用一个ReLU函数加强了MP神经元中的非线性表达,神经元可从内部分成两部分。与MP神经元相比,IC神经元引入了更多的参数量和计算量。引入的计算量主要在求和操作上,见图2.14。对于同一组输入,所有神经元可以共用一个结果:
其中 σ 表示一种非线性操作,例如ReLU函数, f 为激活函数。与MP神经元相比,IC神经元能够解决线性不可分问题。在IC神经元中,令权值 w 1 = w 2 =0.28,偏置 b 1 =-0.35, b 2 =0.65,则可以得到图2.15中的空间划分,从而解决线性不可分的问题。在能够使用MP神经元的多种网络模型和具体任务中,通过将MP神经元替换成IC神经元,神经网络的性能能够得到一定提升且引入的参数量和计算量可以忽略。
表2.2中列出了前面介绍的三种神经元的比较。MP神经元模仿了生物学神经网络中的最基本成分——神经元,将它抽象成了简单模型,MP神经元结构简单且应用广泛,很容易集成来自输入的信号,但是缺点是无法进行学习。乘法神经元从更好拟合多项式分布出发,进行了数学结构的优化,适合用于时间序列,但是它延展性差并且难以集成。IC神经元受物理学中的弹性碰撞模型的启发,可以提升单个神经元的非线性表达能力,由此提升了网络性能,但是与此同时也导致了过拟合问题的出现。
图2.14 IC神经元
图2.15 解决线性不可分问题
思考
可以从哪些角度设计人工神经元?
表2.2 神经元对比