目录
一:简介
激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端,旨在帮助网络学习数据中的复杂模式。
下图展示了一个神经元是如何输入激活函数以及如何得到该神经元最终的输出:
二:为什么要用激活函数
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。
使用激活函数能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,使深层神经网络表达能力更加强大,这样神经网络就可以应用到众多的非线性模型中。
三:激活函数的分类
激活函数可以分为两大类:
- 饱和激活函数: sigmoid、 tanh...
- 非饱和激活函数: ReLU 、Leaky Relu 、ELU、PReLU、RReLU...
首先,我们先了解一下什么是饱和?
反之,不满足以上条件的函数则称为非饱和激活函数。
Sigmoid函数需要一个实值输入压缩至[0,1]的范围 tanh函数需要讲一个实值输入压缩至 [-1, 1]的范围
相对于饱和激活函数,使用非饱和激活函数的优势在于两点:
1.非饱和激活函数能解决深度神经网络(层数非常多)带来的梯度消失问题
2.使用非饱和激活函数能加快收敛速度。
四:常见的几种激活函数
4.1.Sigmoid函数
Sigmoid激活函数的数学表达式为:
导数表达式为:
函数图像如下:
Sigmoid函数在历史上曾非常常用,输出值范围为[0,1]之间的实数。但是现在它已经不太受欢迎,实际中很少使用。
什么情况下适合使用Sigmoid?
-
Sigmoid 函数的输出范围是 0 到 1。非常适合作为模型的输出函数用于输出一个0~1范围内的概率值,比如用于表示二分类的类别或者用于表示置信度。
-
梯度平滑,便于求导,也防止模型训练过程中出现突变的梯度
Sigmoid有哪些缺点?
-
容易造成梯度消失。我们从导函数图像中了解到sigmoid的导数都是小于0.25的,那么在进行反向传播的时候,梯度相乘结果会慢慢的趋向于0。这样几乎就没有梯度信号通过神经元传递到前面层的梯度更新中,因此这时前面层的权值几乎没有更新,这就叫梯度消失。除此之外,为了防止饱和,必须对于权重矩阵的初始化特别留意。如果初始化权重过大,可能很多神经元得到一个比较小的梯度,致使神经元不能很好的更新权重提前饱和,神经网络就几乎不学习。
-
函数输出不是以 0 为中心的,梯度可能就会向特定方向移动,从而降低权重更新的效率
-
Sigmoid 函数执行指数运算,计算机运行得较慢,比较消耗计算资源。
4.2.Tanh函数
tanh激活函数的数学表达式为:
函数图像如下:
实际上,Tanh函数是 sigmoid 的变形:
与sigmoid不同的是,tanh是“零为中心”的。因此在实际应用中,tanh会比sigmoid更好一些。但是在饱和神经元的情况下,tanh还是没有解决梯度消失问题。
什么情况下适合使用Tanh?
-
tanh 的输出间隔为 1,并且整个函数以 0 为中心,比 sigmoid 函数更好;
-
在 tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。
Tanh有哪些缺点?
-
仍然存在梯度饱和的问题
-
依然进行的是指数运算
4.3.ReLU函数线性整流单元)
ReLU激活函数的数学表达式为:
函数图像如下:
什么情况下适合使用ReLU?
-
ReLU解决了梯度消失的问题,当输入值为正时,神经元不会饱和
-
由于ReLU线性、非饱和的性质,在SGD中能够快速收敛
-
计算复杂度低,不需要进行指数运算
ReLU有哪些缺点?
-
与Sigmoid一样,其输出不是以0为中心的
-
Dead ReLU 问题。当输入为负时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新
因此,RELU函数不适合用于学习输入为负值或0的样本。如果要使用RELU进行训练,建议将各个神经元权重的初始值设定为大于0的较小值。
为了解决DeadReLU问题,ReLU被扩展为LeakyReLU,ParametricReLU等多种函数以方便训练不同范围的输入
训练神经网络的时候,一旦学习率没有设置好,第一次更新权重的时候,输入是负值,那么这个含有ReLU的神经节点就会死亡,再也不会被激活。所以,要设置一个合适的较小的学习率,来降低这种情况的发生
在训练中除了输入为负,达到极值点也可能造成节点死亡,但这种情况概率不大,部分原因是因为梯度下降算法会向局部极值点靠近而不是完全达到这个极值点(也就是梯度为0的点),因此RELU仍然可以广泛运用
4.4.Leaky Relu函数
Leaky Relu激活函数的数学表达式为:
函数图像如下:
什么情况下适合使用Leaky ReLU?
-
解决了ReLU输入值为负时神经元出现的死亡的问题
-
Leaky ReLU线性、非饱和的性质,在SGD中能够快速收敛
-
计算复杂度低,不需要进行指数运算
Leaky ReLU有哪些缺点?
-
函数中的α,需要通过先验知识人工赋值(一般设为0.01)
-
有些近似线性,导致在复杂分类中效果不好。
注意:从理论上讲,Leaky ReLU 具有 ReLU 的所有优点,而且 Dead ReLU 不会有任何问题,但在实际操作中,尚未完全证明 Leaky ReLU 总是比 ReLU 更好
4.5.PRelu函数
PRelu激活函数的数学表达式为:
函数图像如下:
PRelu激活函数也是用来解决ReLU带来的神经元坏死的问题。与Leaky ReLU激活函数不同的是,PRelu激活函数负半轴的斜率参数α 是通过学习得到的,而不是手动设置的恒定值
4.6.ELU函数
ELU激活函数的数学表达式为:
函数图像如下:
与Leaky ReLU和PRelu激活函数不同的是,ELU激活函数的负半轴是一个指数函数而不是一条直线
什么情况下适合使用ELU?
-
ELU试图将激活函数的输出均值接近于零,使正常梯度更接近于单位自然梯度,从而加快学习速度
-
ELU 在较小的输入下会饱和至负值,从而减少前向传播的变异和信息
ELU有哪些缺点?
-
计算的时需要计算指数,计算效率低
4.7.SELU函数
SELU激活函数的数学表达式为:
其中λ = 1.0507 , α = 1.6733
函数图像如下:
SELU 允许构建一个映射 g,其性质能够实现 SNN(自归一化神经网络)。SNN 不能通过ReLU、sigmoid 、tanh 和 Leaky ReLU 实现。这个激活函数需要有:(1)负值和正值,以便控制均值;(2)饱和区域(导数趋近于零),以便抑制更低层中较大的方差;(3)大于 1 的斜率,以便在更低层中的方差过小时增大方差;(4)连续曲线。后者能确保一个固定点,其中方差抑制可通过方差增大来获得均衡。通过乘上指数线性单元(ELU)来满足激活函数的这些性质,而且 λ>1 能够确保正值净输入的斜率大于 1
SELU激活函数是在自归一化网络中定义的,通过调整均值和方差来实现内部的归一化,这种内部归一化比外部归一化更快,这使得网络能够更快得收敛
4.8.Swish函数
Swish激活函数的数学表达式为:
函数图像如下:
Swish激活函数无界性有助于防止慢速训练期间,梯度逐渐接近 0 并导致饱和;同时,有界性也是有优势的,因为有界激活函数可以具有很强的正则化(防止过拟合, 进而增强泛化能力),并且较大的负输入问题也能解决
Swish激活函数在x=0
附近更为平滑,而非单调的特性增强了输入数据和要学习的权重的表达能力。
4.9.Mish函数
Mish激活函数的数学表达式为:
函数图像如下:
Mish激活函数的函数图像与Swish激活函数类似,但要更为平滑一些,缺点是计算复杂度要更高一些
4.10.Softmax函数
Softmax激活函数的数学表达式为:
函数图像如下:
Softmax函数常在神经网络输出层充当激活函数,将输出层的值通过激活函数映射到0-1区间,将神经元输出构造成概率分布,用于多分类问题中,Softmax激活函数映射值越大,则真实类别可能性越大
下图给出了Softmax作激活函数对输出值映射处理过程,进而形象理解Softmax函数
4.11.Maxout函数
Maxout出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10, CIFAR-100, SVHN这4个数据上都取得了“state of the art”的识别率。
Maxout可以看做是在深度学习网络中加入一层激活函数层,包含一个参数k.这一层相比ReLU,sigmoid等,其特殊之处在于增加了k个神经元,然后输出激活值最大的值——知乎作者:Alex
Maxout是如何学习的?
-
Maxout将节点分为多组,分别计算并取最大值
Maxout有什么样的特点?
- IanGoodfellow认为这种激活函数具有对抗遗忘的能力,因为同一层节点有多个权重和对应的激活函数,因此在多分类训练时有更强的适应能力
- 遗忘即神经网络在学习新的任务时会忘记过去的任务。例如:手写数字识别任务,网络学会了识别1之后节点权重改变,识别5的准确率可能会因此下滑
优点:Maxout的拟合能力非常强,可以拟合任意的凸函数。Maxout具有ReLU的所有优点,线性、不饱和性。同时没有ReLU的一些缺点。如:神经元的死亡。
缺点:从上面的激活函数公式中可以看出,每个神经元中有两组(w,b)参数,那么参数量就增加了一倍,这就导致了整体参数的数量激增。
——知乎作者:Alex 原文链接