3.3 激活函数
激活函数(Activation Function),是在神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
3.3.1 为什么需要激活函数
深度学习网络中引入激活函数,主要有以下几个作用。
(1)激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。
(2)激活函数可以引入非线性因素。如果不使用激活函数,则输出信号只是一个简单的线性函数。线性函数是一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、语音等。
(3)激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好地被分类。
3.3.2 为什么激活函数需要非线性函数
为什么通常使用的激活函数是非线性的?主要有以下两个原因。
(1)假设网络中全部是线性部件,那么线性的组合还是线性的,与一个单独的线性分类器无异。这样就做不到用非线性来逼近任意函数了。
(2)使用非线性激活函数,以便使网络更加强大,增强它的能力,使它可以学习复杂的事物、复杂的表单数据,并表示输入/输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入/输出之间生成非线性映射。
3.3.3 常见的激活函数及其图像
常见的激活函数及其图像如下。
(1)sigmoid激活函数。
函数的定义为:,其值域为(0,1)。
sigmoid激活函数图像如图3-21所示。
图3-21 sigmoid激活函数图像
(2)tanh激活函数
函数的定义为:,值域为(-1,1)。
tanh激活函数图像如图3-22所示。
图3-22 tanh激活函数图像
(3)Relu激活函数。
函数的定义为:f(x)=max(0,x),值域为(0,+∞)。
Relu激活函数图像如图3-23所示。
图3-23 Relu激活函数图像
(4)Leaky Relu激活函数。
函数定义为:,值域为(-∞,+∞)。
Leaky Relu激活函数图像如图3-24所示(a=0.05)。
图3-24 Leaky Relu激活函数图像
(5)Softplus激活函数。
函数的定义为:f(x)=ln(1+ex),值域为(0,+∞)。
Softplus激活函数图像如图3-25所示。
图3-25 Softplus激活函数图像
(6)softmax函数。
函数定义为:。
softmax函数多用于多分类神经网络输出。
3.3.4 常见激活函数的导数计算
常见激活函数的导数计算如表3-1所示。
表3-1 常见激活函数的导数计算
3.3.5 激活函数有哪些性质
激活函数主要有以下性质。
(1)非线性:当激活函数是非线性的,一个两层的神经网络就基本上可以逼近所有的函数。但如果激活函数是恒等激活函数,即f(x)=x,那么就不满足这个性质,而且如果多层感知机使用的是恒等激活函数,那么其实整个网络与单层神经网络是等价的。
(2)可微性:当优化方法基于梯度时,就会体现出该性质。
(3)单调性:当激活函数是单调的时候,单层网络能够保证是凸函数。
(4)f'(x)≈x:当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值。
(5)输出值的范围:当激活函数输出值有限时,基于梯度的优化方法会更加稳定,因为特征的表示受有限权重的影响更显著;当激活函数的输出无限时,模型的训练会更加高效,不过在这种情况下,一般需要更小的学习率(Learning Rate)。
3.3.6 如何选择激活函数
选择一个合适的激活函数并不容易,需要考虑很多因素。通常的做法是,如果不确定哪一个激活函数效果更好,可以逐一尝试,然后在验证集或测试集上进行评价,选择表现最好的,就去使用它。
以下是常见的选择建议。
(1)如果输出值是0、1(二分类问题),则输出层选择sigmoid激活函数,其他的所有单元都选择Relu激活函数。
(2)如果在隐含层上不确定使用哪个激活函数,则通常会使用Relu激活函数。有时,也会使用tanh激活函数,但Relu激活函数的一个优点是:当它是负值时,导数等于0。
(3)sigmoid激活函数:除了输出层是一个二分类问题的情况,基本不会用它。
(4)tanh激活函数:它非常优秀,几乎适合所有场合。
(5)Relu激活函数:最常用的默认函数,如果不确定用哪个激活函数,就先使用Relu或Leaky Relu,再去尝试其他的激活函数。
(6)如果遇到了一些死的神经元,则可以使用Leaky Relu函数。
3.3.7 为什么tanh收敛速度比sigmoid快
首先看如下两个函数的求导:
由上面两个公式可知tanh(x)梯度消失的问题比sigmoid(x)轻,所以tanh收敛速度比sigmoid快。
3.3.8 Relu激活函数的优点
Relu激活函数的优点如下。
(1)在区间变动很大的情况下,Relu激活函数的导数或激活函数的斜率都会远大于0,程序里用一个简单的if-else语句即可实现,而sigmoid函数需要进行浮点四则运算。在实践中,使用Relu激活函数的神经网络通常会比使用sigmoid或tanh激活函数的神经网络学习得更快。
(2)sigmoid和tanh激活函数的导数在正负饱和区的梯度都会接近于0,这会造成梯度弥散,而Relu和Leaky Relu激活函数大于0的部分都为常数,不会产生梯度弥散现象。
注:Relu进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性,而Leaky Relu不会产生这个问题。
3.3.9 理解Relu激活函数的稀疏激活性
Relu激活函数图像如图3-23所示。根据图像可看出其具有如下特点:单侧抑制、相对宽阔的兴奋边界,以及稀疏激活性。
Relu函数从图像上看,是一个分段线性函数,把所有的负值都变为0,而正值不变,这样就成为单侧抑制。因为有了单侧抑制,才使神经网络中的神经元也具有了稀疏激活性。
稀疏激活性是指从信号方面来看,神经元同时只对输入信号的少部分进行选择性响应,大量信号被刻意屏蔽了,这样可以提高学习的精度,更好、更快地提取稀疏特征。当x<0时,Relu硬饱和,而当x>0时,则不存在饱和问题。Relu能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。
3.3.10 什么时候可以用线性激活函数
大多数情况下,深度学习网络建议使用非线性激活函数,但是有些情况也可以使用线性激活函数。
(1)在输出层大多使用线性激活函数时。
(2)在隐含层可能会使用一些线性激活函数时。
3.3.11 softmax函数的定义及作用
softmax是一种形如下式的函数:
其中,θi和x是列向量,可能被换成函数关于x的函数fi(x)。
通过softmax函数,可以使得P(i)的范围在[0,1]之间。在回归和分类问题中,通常θ是待求参数,通过寻找使得P(i)最大的θi作为最佳参数。
但是,使得范围在[0,1]之间的方法有很多,为何要在前面加上e的幂函数的形式?请参考Logistic函数:
这个函数的作用就是使P(i)在负无穷到0的区间上趋向于0,在0到正无穷的区间上趋向1。同样,softmax函数加入了e的幂函数正是为了两极化:正样本的结果将趋近于1,而负样本的结果趋近于0。这样为多类别提供了方便,可以说,softmax函数是logistic函数的一种泛化。
softmax函数可以把它的输入值,处理成(0,1)区间内,并且能够把输出归一化到和为1。这意味着softmax函数与分类的概率分布等价。它是一个网络预测多分类问题的最佳输出激活函数。
3.3.12 softmax函数如何应用于多分类
softmax函数在多分类过程中,将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。
假设有一个数组,Vi表示V中的第i个元素,那么这个元素的softmax值为:
图3-26所示为神经网络softmax分类示意图,从中可见,神经网络中包含了输入层,然后通过两个特征层处理,最后通过softmax分析器就能得到不同条件下的概率。这里需要分成3个类别,最终会得到y=0,y=1,y=2的概率值。
图3-26 神经网络softmax分类示意图
图3-27所示为softmax计算示意图,3个输入通过softmax函数后,得到一个数组[0.88,0.12,0]。
图3-27 softmax计算示意图
softmax更形象的映射过程示意图如图3-28所示。
图3-28 softmax更形象的映射过程示意图
图中三个输入的值分别为3、1、-3,权重分别为20、2.7、0.05,再分别除以累加和得到最终的概率值,分别为0.88、0.12、0,而这些概率值的累加和为1,在最后选取输出节点的时候,可以选取概率最大的节点,作为我们的预测目标。