深度学习:卷积神经网络技术与实践
上QQ阅读APP看书,第一时间看更新

3.3 激活函数

激活函数的作用是增加神经网络的非线性,常用的激活函数有Sigmoid、Relu、Softmax等。下面介绍这几种函数。

3.3.1 Sigmoid函数

在神经网络的搭建中,Sigmoid函数较为常用,其定义如下:

Sigmoid函数图像如图3-4所示。可以看出Sigmoid函数值在开区间0到1之间,自变量的绝对值越靠近0,函数值变化越快;自变量的绝对值越大,函数值变化越缓慢。

图3-4 Sigmoid函数图像

基于Keras搭建神经网络时,选择Sigmoid函数,可通过model.add()在指定的Dense层后添加该激活函数。主要语句如下:


model.add(Activation('sigmoid'))

Sigmoid函数可以模仿生物神经元的神经对刺激信号的接收,当神经所接收的刺激程度过小时,可以忽略该刺激信号,即Sigmoid函数输出值接近于0;当神经所接收的刺激程度在正常范围内时,可以接收该刺激信号,即Sigmoid函数输出0~1的函数值;当神经所接收的刺激程度过大时,神经会变得迟钝,维持之前的感觉不变,即Sigmoid函数输出值一直趋近1。

Sigmoid函数也有一些缺点,如在后续提到的神经网络反向传播中,该函数可能会造成梯度消失或梯度饱和;该函数需要进行指数运算,故在训练时运算量较大;该函数图像不是关于原点对称,不利于梯度下降等。

3.3.2 Tanh函数

Tanh函数也是一种常用的S型非线性激活函数,是Sigmoid的变种。其定义如下:

Tanh函数图像如图3-5所示。Tanh函数把一个实数压缩至–1到+1之间,对中部区的信号增益较大,对两侧区的信号增益小。它的输出有界,为神经网络带来了非线性。同时Tanh克服了Sigmoid非0均值输出的缺点,延迟了饱和期,拥有更好的容错能力,性能上要优于Sigmoid。但是它存在梯度弥散的问题,而这种缺点是致命的。这也表明,不管是Sigmoid还是Tanh都存在极大的局限性。

图3-5 Tanh函数图像

3.3.3 Relu函数

Relu函数也较为常用,其定义如下:

Relu函数图像如图3-6所示。只有当自变量值大于等于0时,函数值才有输出,否则为0。类比于生物神经元的神经对刺激信号的接收,当刺激程度小于某临界值时,可忽略不计;当刺激程度大于某临界值时,神经才开始接收该刺激信号。

基于Keras搭建神经网络时,选择Relu函数,可通过model.add()在指定的Dense层后添加该激活函数。主要语句如下:


model.add(Activation('relu'))

相比于Sigmoid函数,Relu函数不会在训练过程中造成梯度饱和,同时由于Relu函数的线性运算,运算速度也要比Sigmoid函数快。由于输入为负、输出为0的性质,在反向传播时,Relu函数也会造成梯度消失。

图3-6 Relu函数图像

3.3.4 Softmax函数

Softmax函数常用在输出层,配合输出层完成多分类输出的任务,其定义如下:

Softmax函数又称为归一化指数函数,其输出值也是归一化的分类概率,可以得到每个类别的概率,范围为(0,1),全部类别概率之和为1。

Sigmoid函数可以把数据映射到(0,1)的区间内,可以用来完成二分类的任务。相比于Sigmoid函数,Softmax函数可以被视为将数据(a1,a2,a3,…)映射为(b1,b2,b3,…),其中bi均为0到1的常数,进而可以根据bi的大小来完成多分类的任务。

基于Keras搭建神经网络时,选择Softmax函数,可通过model.add()在输出层后添加该激活函数。主要语句如下:


model.add(Activation('softmax'))