
4.5 常用激活函数讲解
神经网络的激活函数其实有很多种,在前面的章节中我们介绍过两种激活函数,即sign函数和purelin函数。sign函数也称为符号函数,因为当sign(x)中的x>0时,函数结果为1;sign(x)中的x<0时,函数结果为-1。purelin函数也称为线性函数,表达式为y=x。这两种激活函数在处理复杂的非线性问题的时候都不能得到很好的结果,并且线性函数的分类边界也是线性的,所以不能区别非线性的复杂边界。例如,一条直线不能区分异或问题的两个类别。下面我们介绍几个在BP神经网络中常用的非线性激活函数,即sigmoid函数、tanh函数、softsign函数和ReLU函数,使用这些非线性激活函数可以帮助我们解决复杂的非线性问题。
4.5.1 sigmoid函数
sigmoid函数——sigmoid函数也称为逻辑函数(Logical Function),函数的公式为

如图4.7所示。

图4.7 sigmoid函数
从图4.7中,我们可以看出函数的取值范围为0~1。当x趋向于-∞的时候,函数值趋向于0;当x趋向于+∞的时候,函数值趋向于1。
4.5.2 tanh函数
tanh函数——tanh函数也称为双曲正切函数,函数的公式为

如图4.8所示。

图4.8 tanh函数
从图4.8中我们可以看出函数的取值范围为-1~1。当x趋向于-∞的时候,函数值趋向于-1;当x趋向于+∞的时候,函数值趋向于1。
4.5.3 softsign函数
softsign函数——softsign函数的公式为

如图4.9所示。

图4.9 softsign函数
从图4.9中我们可以看出函数的取值范围为-1~1。当x趋向于-∞的时候,函数值趋向于-1;当x趋向于+∞的时候,函数值趋向于1。
我们可以通过图4.10对比一下这3个函数的区别。

图4.10 3个函数的对比
从图4.10中我们可以看出这3个激活函数都是S形函数,形状相似,只不过sigmoid函数的取值范围是0~1、tanh函数和softsign函数的取值范围是-1~1。我们还可以观察到softsign函数相对于tanh函数而言,其过渡更加平滑。在x等于0附近的位置处,函数的数值改变更缓慢。
4.5.4 ReLU函数
ReLU函数最早源自2011年的论文“Deep Sparse Rectifier Neural Networks”[2],它是模拟生物神经元的激活函数设计出来的一个人工神经网络激活函数。图4.11为生物神经元放电曲线图。

图4.11 生物神经元放电曲线图[2]
从图4.11中我们可以看到,当输入电压不足时,生物神经元放电为0,电压达到一定的阈值以后生物神经元才会开始放电,并且放电速率跟输入电压成正相关关系。
ReLU函数——ReLU函数的公式为

如图4.12所示。

图4.12 ReLU函数
当x<0时,y=0;当x>0时,y=x。ReLU的中文名称是校正线性单元,虽然在x<0时函数是线性的、x>0时函数也是线性的,但是组合起来之后,函数就具有了非线性的特征。这种非线性的特征是怎么体现的呢?我们可以观察下面的一系列图片,首先看图4.13。
图4.13使用的是tanh作为激活函数训练出来的分类模型,其实使用sigmoid或者softsign函数也可以得到类似结果。本文使用了带有4个隐藏层的神经网络训练出了这个模型,图4.13中有两个类别的数据,并且我们可以观察到一个类似椭圆形的分类边界把两个类别给区分开了。我们再观察图4.14。

图4.13 使用tanh函数作为激活函数的分类边界

图4.14 使用ReLU函数作为激活函数的分类边界(4个隐藏层)
还是使用带有4个隐藏层的神经网络训练出了这个模型。从图4.14中我们可以发现,使用ReLU激活函数得到的分类边界跟使用tanh激活函数得到分类边界是差不多的,并不能看出ReLU函数的特点。同样的一个学习任务和数据,改变神经网络的层数,只使用2个隐藏层,依然使用ReLU激活函数,可以得到如图4.15所示的结果。

图4.15 使用ReLU函数作为激活函数的分类边界(2个隐藏层)
我们观察图4.15可以得到一些结论:
(1)我们可以发现ReLU激活函数所描绘出来的边界其实是一条一条的直线构成的,不存在曲线。图4.14中的边界看起来像一个椭圆,实际上它也是由一段一段很小的直线构成的。
(2)神经网络的层数会影响模型的拟合效果,层数越多,模型就可以拟合出更复杂的分类边界。
模型的拟合效果其实还跟其他一些因素相关,如每一层隐藏层的神经元越多,那么模型的拟合能力也就越强;模型训练的周期越多,模型的拟合能力就越强。关于模型拟合强弱的问题,在后面的章节中我们还会进一步讨论。
另外,我们再来看一下ReLU应用于回归预测时的特点,我们看一下图4.16和图4.17。

图4.16 使用tanh激活函数训练的回归模型

图4.17 使用ReLU激活函数训练的回归模型
从图4.16和图4.17中我们发现了跟分类中类似的情况,tanh激活函数得到的回归线是一条曲线,而ReLU激活函数得到的是由一段一段直线构成的回归线。
大家可以思考一个问题,上面介绍的这几个激活函数,哪一个效果比较好,为什么?这个问题在4.8节中我们再继续讨论。