激活函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了激活函数相关的知识,希望对你有一定的参考价值。

参考技术A

参考 : https://blog.csdn.net/qq_30815237/article/details/86700680

非线性激活函数能够使神经网络逼近任意复杂的函数。如果没有激活函数引入的非线性,多层神经网络就相当于单层的神经网络
sigmoid

1、梯度消失:sigmoid函数在0和1附近是平坦的。也就是说,sigmoid的梯度在0和1附近为0。在通过sigmoid函数网络反向传播时,当神经元的输出近似于0和1时它的梯度接近于0。这些神经元被称为饱和神经元。因此,这些神经元的权值无法更新。不仅如此,与这些神经元相连接的神经元的权值也更新得非常缓慢。这个问题也被称为梯度消失。所以,想象如果有一个大型网络包含有许多处于饱和动态的sigmoid激活函数的神经元,那么网络将会无法进行反向传播。
2、不是零均值:sigmoid的输出不是零均值的。
3、计算量太大:指数函数与其它非线性激活函数相比计算量太大了。下一个要讨论的是解决了sigmoid中零均值问题的非线性激活函数。

Sigmoid 和 Softmax 区别:

sigmoid将一个real value映射到(0,1)的区间,用来做二分类。而 softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax 可以用于多分类问题多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。

tanh

Tanh唯一的缺点是:tanh函数也存在着梯度消失的问题,因此在饱和时会导致梯度消失。为了解决梯度消失问题,让我们讨论另一个被称为线性整流函数(ReLU)的非线性激活函数,它比我们之前讨论的两个激活函数都更好,并且也是在今天应用最为广泛的激活函数。

ReLU

用形式化的语言来说,所谓****非线性 ,就是一阶导数不为常数 ReLu 的定义是max(0, x),因此, ReLU 的导数为:

显然, ReLU 的导数不是常数,所以 ReLU 非线性 的。Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

1、ReLu虽然在大于0的区间是线性的,在小于等于0的部分也是线性的, 但是它整体不是线性的,因为不是一条直线,所以Relu函数是非线性函数 。也就是说,线性和 非线性 都是就 函数 的整体而言的。用术语来说, 线性、 非线性 是就 函数 的整个定义域而言的。 这就意味着无论我们堆多少层网络,如果这些层都使用线性激活 函数 ,那这些层最终等效于一层!那这样的模型的表达能力就很 限了。多个线性操作的组合也是一个线性操作,没有非线性激活,就相当于只有一个超平面去划分空间。

ReLu是非线性的,效果类似于划分和折叠空间,组合多个(线性操作 + ReLu)就可以任意的划分空间

2、对于浅层的机器学习,比如经典的三层神经网络,用它作为激活函数的话,那表现出来的性质肯定是线性的。但是在深度学习里,少则几十,多则上千的隐藏层,虽然,单独的隐藏层是线性的,但是很多的隐藏层表现出来的就是非线性的。举个简单的例子,一条曲线无限分段,每段就趋向直线,反过来,很多这样的直线就可以拟合曲线。类似,大规模的神经网络,包含很多这样的线性基本组件,自然也可以拟合复杂的非线性情况。Relu通过构造很多的线形空间(类似于折叠的方式),逼近非线性方程。

但是Relu神经元有几个缺点:

平时使用的时候RELU的缺点并不是特别明显,只有在学习率设置不恰当(较大)的时候,会加快神经网络中神经元的“死亡”。

为了解决relu激活函数在x<0时的梯度消失问题, 提出了Leaky Relu

leaky ReLU

pReLU

PRelu的函数为:

其中α为超参数。PRelu的思想是引进任意超参数α ,而 这个α可以通过反向传播学习(注意 PRelu 与leaky relu的区别,前者是学习得到,后者是我们认为设定) 。这赋予了神经元在负区域内选择最好斜率的能力,因此,他们可以变成单纯的ReLU激活函数或者Leaky ReLU激活函数。如果α=0,那么 PReLU 退化为ReLU;如果α是一个很小的固定值(如α =0.01),则 PReLU 退化为 Leaky ReLU(LReLU)。

(1) PReLU只增加了极少量的参数,也就意味着网络的计算量以及过拟合的危险性都只增加了一点点。特别的, 当不同channels使用相同的ai时,参数就更少了。
(2) BP更新ai时,采用的是带动量的更新方式:

总之, 一般使用ReLU效果更好 ,但是你可以通过实验使用Leaky ReLU或者Parametric ReLU来观察它们是否能对你的问题给出最好的结果。

ELU

SELU

经过该激活函数后使得样本分布自动归一化到0均值和单位方差(自归一化,保证训练过程中梯度不会爆炸或消失,效果比Batch Normalization 要好)
其实就是ELU乘了个lambda,关键在于这个lambda是大于1的。以前relu,prelu,elu这些激活函数,都是在负半轴坡度平缓,这样在activation的方差过大的时候可以让它减小,防止了梯度爆炸,但是正半轴坡度简单的设成了1。而selu的正半轴大于1,在方差过小的的时候可以让它增大,同时防止了梯度消失。这样激活函数就有一个不动点,网络深了以后每一层的输出都是均值为0方差为1。

swish

激活函数总结

参考技术A 因为神经网络是线性组合,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中.好用的激活函数具有可求且方便求导,单调平滑.下面简单介绍一下常用的激活函数:

1. sigmoid函数 :常用于LR中,也可以用于神经网络最后一层(一分类问题,是该类,和其他).函数公式和图表如下图:

如图2所示,它能够把输入的连续实值变换为(0,1)之间的输出,特别的,如果是非常大的负数,那么输出就是0,如果是非常大的正数,输出就是1. sigmoid曾经是主流的激活函数,但是由于一些缺陷,导致现在不主流了...它的缺点有:

1) 由于sigmoid导数的性质(如图3),在神经网络进行反向传播时,会发生梯度消失(权重初始值在[0,1]内)和梯度爆炸(权重初始值在[1,+∞]).

2) 其解析式中含有幂运算,计算机求解时相对来讲比较耗时,对于规模比较大的深度网络,这会较大地增加训练时间.

3) sigmoid的输出不是0均值的,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入, 产生的一个结果就是:如果数据进入神经元的时候是正的,那么计算出的梯度也会始终都是正的.

2. tanh函数 :tanh函数是拉伸后的sigmoid,它弥补了sigmoid的缺点3,tanh函数公式和曲线如下:

它的值域变成了(-1,1),均值从sigmoid的0.5,变成了0.从而解决sigmoid的缺点3输出均值不为0的问题.从图4可以看出,在0附近曲线的倾斜更为陡峭,所以它的导数的曲线是比图3更高更细一些.

它的优点是解决了sigmoid的输出均值不为0的问题,还有就是比sigmoid的收敛更快一些.

它的缺点是还没有解决sigmoid最大的问题1,梯度消失和梯度爆炸的问题.

3. ReLU函数 :ReLU函数训练速度比tanh快6倍,是目前使用最广泛的激活函数.当输入值小于零时,输出值为零.当输入值大于等于零时,输出值等于输入值.公式和曲线如下:

它的优点是训练速度快(因为线性),同时当输入为正数时,不会造成梯度爆炸.

它的缺点是ReLU所在的神经元在训练的过程中可能会随机失活,如果learning rate很大,那么很有可能网络中的40%的神经元都”dead”了.而且它的输出也不是均值为0.

4. LeakyReLU & PReLU函数 :这两个激活函数类似,都是ReLU的改良版,目的是为了避免出现神经单元失活的问题.公式如下:

其中LeakyReLU将α的值设为0.001,而PReLU是将α当做参数一起参与到模型训练中去学习.这样函数的输出下界不为0,从而也不会有神经元失活的现象.

5. ELU函数 (指数线性单元):它解决了ReLU的两个问题,一个是失活,一个是均值不为0的问题.

6. softmax函数 :常用于神经网络的最后一层(多分类),是sigmoid函数在多分类问题上的推广.公式如下:

它的值域是[0,1],输出是概率值,所以加和为1.用指数的形式是为了使大的值更大,同时也为了求导.

1.尽量不要使用sigmoid和tanh函数(梯度消失和爆炸),尽量使用ReLU及其变体.

2.使用ReLU时,注意设置小的learning rate.

3.尽量使用0均值的激活函数.

以上是关于激活函数的主要内容,如果未能解决你的问题,请参考以下文章

激活函数总结

激活函数

常用激活函数比较

激活函数总结

激活函数

激活函数的选择