如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
激活函数的主要作用是提供网络的非线性建模能力。如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。
上图中我们对output进行计算(这里i1代表input1,i2代表input2):
我们将公式转化一下可以得到:
我们假设outpu=0
最后我们发现函数的又回到了y=X*W的模式,即线性模式。所以现在神经元的学习能力是非常有限的。解决不了非线性的问题,所以叠加简单的神经网络解决不了非线性的问题。
函数公式和图表如下图
在sigmod函数中我们可以看到,其输出是在[0,1]这个开区间内,我们可以联想到概率,可以被表示做为概率,或用于输入的归一化,代表性的如Sigmoid交叉熵损失函数,但是严格意义上讲,不要当成概率。sigmod函数曾经是比较流行的,它可以想象成一个神经元的放电率,在中间斜率比较大的地方是神经元的敏感区,在两边斜率很平缓的地方是神经元的抑制区。
当然,流行也是曾经流行,这说明函数本身是有一定的缺陷的。
具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个 f′(x)f′(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f′(x)f′(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。
此外,sigmoid函数的输出均大于0,使得输出不是0均值,这称为偏移现象,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。
tanh函数公式和曲线如下
tanh的变形
tanh是双曲正切函数,tanh函数和sigmod函数的曲线是比较相近的,咱们来比较一下看看。首先相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。
一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数。不过这些也都不是一成不变的,具体使用什么激活函数,还是要根据具体的问题来具体分析,还是要靠调试的。
ReLU函数公式和曲线如下
ReLU(Rectified Linear Unit)函数是目前比较火的一个激活函数,相比于sigmod函数和tanh函数,它有以下几个优点:
当然,缺点也是有的:
ELU函数公式和曲线如下图
ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱和和指数运算的问题。
PReLU函数公式和曲线如下图
PReLU也是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势吧。
我们看PReLU的公式,里面的参数α一般是取0~1之间的数,而且一般还是比较小的,如零点零几。当α=0.01时,我们叫PReLU为Leaky ReLU,算是PReLU的一种特殊情况吧。
maxout网络能够近似任意连续函数,且当w2,b2,…,wn,bn为0时,退化为ReLU。Maxout能够缓解梯度消失,同时又规避了ReLU神经元死亡的缺点,但增加了参数和计算量。
softmax--用于多分类神经网络输出
sigmod和ReLU
隐藏层的激活函数有9中激活函数可以选择:Sigmoid,Linear,Tanh,ArchTan,Relu,Parameteric ReLU(PReLU),ELU,SoftPlus和BentLinear
这里我们在隐藏层分别用sigmod和ReLU,输出层为sigmod。
对于ReLU而言,ReLU的特点是,隐层比sigmoid需要的神经元多,学习速率相对要小一点,mini_batch的数量要大一些。
总体来看,这些激活函数都有自己的优点和缺点,没有一条说法表明哪些就是不行,哪些激活函数就是好的,所有的好坏都要自己去实验中得到。不同的数据不同的场景不同的模型所需要的是不同的激活函数,而我们所需要做的就是优雅的选出那个最合适的为我们所用。
参考链接:
大白话讲解BP算法:【https://blog.csdn.net/zhaomengszu/article/details/77834845】
RNN学习中长期依赖的三种机制:【https://zhuanlan.zhihu.com/p/34490114】
RNN中为什么用tanh作为激活函数而不是ReLU(其实也是可以用ReLU,比如IRNN):【https://www.zhihu.com/question/61265076】
常用的激活函数:【https://www.jianshu.com/p/22d9720dbf1a】