一. 什么是激活函数
神经网络中,输入神经元线性组合后,传入的非线性函数就是激活函数(大多是非线性的)。
二. 激活函数的主要功能
给神经网络引入非线性元素,使神经网络可以完成非线性映射。如果不使用激活函数,无论神经网络有多少层,都只是线性组合而已。
三. 常见激活函数特点分析
1. sigmoid函数
曾经最主流的激活函数,现在很少用了,函数公式和图像如下图所示:
sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1,数值绝对值越大,梯度越平坦,敏感度越低。也正是这个特点,为它的失宠埋下了伏笔。
- 缺点:
- Sigmoid容易饱和,当输入非常大或者非常小的时候,函数曲线非常平坦,梯度就接近于0,从图中可以看出梯度的趋势。而反向传播中,我们需要使用sigmoid的导数来更新权重,如果导数都基本为0,会导致权重基本没什么更新,我们就无法递归地学习到输入数据了,这种现象也可以叫做梯度弥散。
- Sigmoid 的输出不是0均值的,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。
- 计算量大,sigmod函数要进行指数运算,这个对于计算机来说是比较慢的。
- 优点:
将所有数据映射成了(0,1)之间的数,很好的表达神经元的激活与未激活的状态,适合二分类。
2. tanh函数
tanh是在sigmoid基础上的改进,将压缩范围调整为(-1,1)。
Tanh和Sigmoid是一对姐妹花,图形基本是相似的,不同的是它把输入压缩到(-1,1)的范围,因此它基本是0均值的。
- 优点:
它是0均值的,解决了上述Sigmoid缺点中的第二个,所以实际中tanh会比sigmoid更常用。 - 缺点:
- 它还是存在梯度弥散的问题。
- 计算量大,函数要进行指数运算,这个对于计算机来说是比较慢的。
3. relu函数
relu函数是目前主流的激活函数,它的公式很简单,输入小于0的时候为0,大于0的时候是本身。
- 优点:
- 正方向上,梯度不变,也就不会发生梯度弥散。
- 正方向上是线性函数,相比于 sigmoid/tanh需要计算指数等,ReLU 只需要一个阈值就可以得到激活值。
- 缺点:
只要输入是负值,那么输出就为0,这可能导致后面的网络输入都是0,造成网络大面积坏死。
4. 改进的relu
ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱和和指数运算的问题。
PReLU也是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势吧。
四. 神经网络的输入为什么要0均值化
这样做的优点是为了在反向传播中加快网络中每一层权重参数的收敛。为什么0均值化就会加快收敛呢?
在梯度下降的时候,假设图中蓝色箭头方向理想最优向量,根据上述公式,我们可以想一想:
当x全为正或者全为负时,每次返回的梯度都只会沿着一个方向发生变化,这样就会使得权重收敛效率很低。
但当x正负数量“差不多”时,那么梯度的变化方向就会不确定,这样就能达到上图中的变化效果,加速了权重的收敛。
参考:
https://blog.csdn.net/kangyi411/article/details/78969642
https://blog.csdn.net/mooneve/article/details/81943904