激活函数(Activation functions)将非线性特性引入到我们的网络中。其主要目的是将A-NN模型中一个节点的输入信号转换成一个输出信号。该输出信号现在被用作堆叠中下一个层的输入。
如果没有激活函数,我们每一层的输出都是线性的,线性的累加仍是线性的,所以整个模型下来结果是线性的,而我们碰到的很多问题都不是线性能解决的,训练的结果就是模型没什么用,所以我们要引入非线性能力,这就需要靠激活函数,所以激活函数都是线性的,线性的激活函数没什么意义。
如果不理解为什么不加激活函数每一层的输出是线性的,可以看下图
我们的网络是由神经元组成的,每个神经元很简单,就是你给我一个输入,我把输入乘相应的权重给你一个输出,这就类似于y=Ax1+Bx2+…,所以是线性的。
人工智能中常用的激活函数: sigmoid,tanh,ReLU, leaky-ReLU, parametric-ReLU, ReLU6,ELU, SELU,,Swish,Mish
sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。Sigmoid作为激活函数有以下优缺点:
优点:平滑、易于求导。
缺点:激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。
定义域:R,值域:(-1,1),关于原点对称,奇函数,虽然关于原点对称,但是从函数公式上来看,计算量较sigmoid提高了,饱和性函数的缺点没有改变,如下图
线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元,是人工神经网络中常用的激活函数。
优势
1.仿生物学原理:相关大脑方面的研究表明生物神经元的信息编码通常是比较分散及稀疏的。通常情况下,大脑中在同一时间大概只有1%-4%的神经元处于活跃状态。使用线性修正以及正则化(regularization)可以对机器神经网络中神经元的活跃度(即输出为正值)进行调试;相比之下,逻辑函数在输入为0时达到,即已经是半饱和的稳定状态,不够符合实际生物学对模拟神经网络的期望。不过需要指出的是,一般情况下,在一个使用修正线性单元(即线性整流)的神经网络中大概有50%的神经元处于激活态。
2.更加有效率的梯度下降以及反向传播:避免了梯度爆涨和梯度消失[弥散]问题
3.简化计算过程:没有了其他复杂激活函数中诸如指数函数的影响;同时活跃度的分散性使得神经网络整体计算成本下降。
缺点
训练过程该函数不适应较大梯度输入,因为在参数更新以后,ReLU的神经元不会再有激活的功能,导致梯度永远都是零。
可以参考https://blog.csdn.net/u011754972/article/details/81584719
Leaky Relu对原来relu的饱和区域做了调整,以解决x<0区域的梯度消失问题,解决了relu神经元死亡的问题,其中x<0时的系数a是手动设置的固定值,一般选为0.1
与Leak-Relu的区别在于x<0时的系数a是在一个给定的范围内随机抽取的值,最终训练下来确定一个较优的值,简单来说就是通过学习获得。
可以看出正半轴是一次线性函数,负半轴是饱和性函数
ELU函数可以加速训练并且可以提高分类的准确率。它有以下特征:
1)ELU由于其正值特性,可以像Relu,LeakRelu,PRelu一样缓解梯度消失的问题。
2)相比Relu,ELU存在负值,可以将激活单元的输出均值往0推近,达到batchnormlization的效果且减少了计算量。(输出均值接近0可以减少偏移效应进而使梯
度接近于自然梯度。)
3)Lrelu和prelu虽然有负值存在,但是不能确保是一个噪声稳定的去激活状态。
4)Elu在负值时是一个指数函数,对于输入特征只定性不定量。
其实就是ELU乘了个lambda,lambda是大于1的。以前Relu,Prelu,Elu这些激活函数,都是在负半轴坡度平缓,这样在activation的方差过大的时候可以让它减小,防止了梯度爆炸,但是正半轴坡度简单的设成了1。而SELU的正半轴大于1,在方差过小的的时候可以让它增大,同时防止了梯度消失。这样激活函数就有一个不动点,网络深了以后每一层的输出都是均值为0方差为1。
f(x)=x⋅sigmoid(βx)
Swish 具备无上界有下界、平滑、非单调的特性。
无界性避免了饱和,函数饱和区域的梯度很小,训练非常缓慢,因此网络必须小心的初始化才能保持在这些函数的线性状态。此外,有下界也可能是有利的,因为强大的正则化效应。与relu和softplus不同的是, 由于它的非单调性,它为小的负输入产生负输出,swish的非单调性增加了表现力并改善了梯度流,这一点很重要,因为许多预激活都属于这个范围,该属性还可以对不同的初始化和学习速率提供一定的鲁棒性。
swish的网络输出landscape比relu要平滑的多,输出landscape的平整度直接影响着损失的平整度,平滑的损失可能更容易优化,因为它更具可遍历性,降低了对初始化和学习速率的敏感性。
mish从swish的self-Gating属性中获得灵感,其中标量输入被提供给gate,self-gating有利于代替像relu这样的激活函数,而不需要改变网络参数。
mish与swish对比:
从数据上来看mish的性能略优于swish,两篇论文的依据都差不多,mish中没有为什么mish优于swish的解释,单单是从大量的实验中得出mish优于swish的结论,两者的各项性质很像,mish这篇论文有大量的实验数据,从性能角度大体上看是:mish > swish > relu。
参考
https://www.cnblogs.com/makefile/p/activation-function.html
https://blog.csdn.net/qq_43152949/article/details/103083709
https://www.cnblogs.com/jins-note/p/9646602.html