目录
Sigmoid系列
1. 优点:输出[0,1]、平滑易于求导
2. 缺点:计算量大、梯度消失、不易收敛
3. Sigmoid变体:HardSigmoid、Swish、
Tanh系列
1. 优点:缓解梯度消失和不易收敛问题
2. 缺陷:运算复杂、仍存在梯度消失
3. Tanh变体:HardTanh、TanhShrink
ReLU系列
1. 优势:收敛速度快、避免梯度消失、稀疏性
2. 缺点:收敛效果差、梯度爆炸、神经元坏死
3. ReLU变体:LReLU、PReLU、 RReLU、ELU、SELU、GELU
Softmax系列
1. 优势:多分类模型
2. Softmax变体:LogSoftMax、Softmin
激活函数的选择
激活函数为了增加网络的非线性拟合能力,需满足:非线性函数,连续可导,定义域R,单调的S型曲线。一般包括饱和函数(sigmoid、tanh)和非饱和函数(修正线性单元ReLU)为了解决ReLU函数的神经元坏死现象,又提出了Leaky ReLU和parametric ReLU函数
Sigmoid系列
也称为Logistic函数,因为Sigmoid函数可以从Logistic回归(LR)中推理得到,也是LR模型指定的激活函数。sigmod函数的取值范围在(0, 1)之间,可以将网络的输出映射在这一范围,方便分析。常用于浅层网络
1. 优点:输出[0,1]、平滑易于求导
- 适合做概率值的处理,例如LSTM中的各种门。(而ReLU就不行,因为无最大值限制,可能会出现很大值,适合用于深层网络的训练)
2. 缺点:计算量大、梯度消失、不易收敛
- 在正负无穷梯度为零的函数被称为饱和函数,无论如何取值,导数的最大值是0.25.这就意味着神经网络反向传播的时候,每层梯度会被动缩小大约1/4,如果当网络层数很多,或者某层出现极端的输出,反向传播的链式法则就会导致前几层的梯度几乎为零,参数不会被更新,这就是梯度消失现象。
- sigmoid函数的取值范围是[0,1],始终是大于零的(非零均值函数),如果考虑一个神经元的输入是x1和x2,它们都是上一层sigmoid函数的输出,所以都是大于0的值,进行反向传播后,得到w1和w2的梯度,下图黄色部分始终大于零。意味着w1和w2的梯度符号始终一致。被强制的同时正向或者反向更新。这种情况会使神经网络更慢的收敛到预定位置。
3. Sigmoid变体:HardSigmoid、Swish、
- HardSigmoid是在Sigmoid的基础上,当输入值超过某个范围强行置1和0
- Swish表达式为:,其中b为可学习参数,Swish具备无上界有下界、平滑、非单调的特性。(Swish 在深层模型上的效果优于 ReLU。例如,仅仅使用 Swish 单元替换 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的分类准确率提高 0.9%。)
Tanh系列(双曲正切)
把 tanh 函数看做是 sigmoid 向下平移和拉伸后的结果。常用于递归网络
1. 优点:缓解梯度消失和不易收敛问题
- tanh的输出范围为[-1, 1],解决了Sigmoid函数的不是zero-centered输出问题
- tanh导数范围在(0, 1)之间,相比sigmoid的(0, 0.25),梯度消失(gradient vanishing)问题会得到缓解,但仍然还会存在
2. 缺陷:运算复杂、仍存在梯度消失
3. Tanh变体:HardTanh、TanhShrink
- Hardtanh激活函数是Tanh的线性分段近似。相较而言,它更易计算,这使得学习计算的速度更快,尽管首次派生值为零可能导致静默神经元/过慢的学习速率。
- 基于Tanh之上,计算输入输出的差值,即为TanhShrink,在当输入在0附近时,梯度近乎为0,而在输入极大或极小时,梯度反而为正常梯度。
ReLU系列(修正线性单元)
Rectified Linear Unit,线性整流函数,是一个正比例映射,会抑制小于0的输入,只保留正数部分,只有当神经元输出大于零的时候才会回传梯度,小于零的时候就不会反向传播。常用于深层网络
1. 优势:收敛速度快、避免梯度消失、稀疏性
- 计算简单 → 收敛速度快
- 导数为非饱和函数,可以避免梯度消失现象
- 稀疏性:ReLU在训练过程中,可动态控制神经元的状态,要么激活大于0,要么等于0被抑制
- 信息的耦合程度降低:如果输入的参数发生了一个很小的改动,那么只有少部分的神经元需要改变状态,而不需要全局调整
- 表达维度尺寸可变:动态开启和关闭神经元的做法可以支持不同输入维度和中间层维度的特征学习
- 稀疏表达线性可分或弱线性可分:可以降低网络训练的难度
- 保持特征表达的能力:虽然稀疏,但是被激活的输出仍然保持原有的表达能力
2. 缺点:收敛效果差、梯度爆炸、神经元坏死
- 和sigmoid函数一样,都是非零均值函数,因此不易收敛。但是可以采用归一化的方式来解决
- 由于没有上界,如果线性单元输出过大,或者网络是循环结构,就会导致梯度累积超出计算机的数值上限,可通过参数初始化和重新设计网络结构来解决
- 某些神经元始终不会被激活,使得网络表达能力下降,被称为神经元坏死现象
3. ReLU变体:LReLU、PReLU、 RReLU、ELU、SELU、GELU
- 在ReLU函数的负半轴增加了一个很小的梯度值,这样在保留一定稀疏性的情况下,也避免了神经元坏死
- 将负半轴的梯度值更换成了可以动态学习调整的参数,是否保留稀疏性或者抑制神经元都要通过训练过程来确定。
- 在RReLU中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中,aji是从一个均匀的分布U(I,u)中随机抽取的数值。
- 指数线性单元激活函数ELU解决了 ReLU 的一些问题,同时也保留了一些好的方面。这种激活函数要选取一个 α 值;常见的取值是在 0.1 到 0.3 之间。ELU能避免神经元死亡问题,能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化,在计算梯度时能得到激活,而不是让它们等于 0。但是,由于包含了指数运算,计算时间更长,同样无法避免梯度爆炸问题,另外,神经网络不学习 α 值
- SELU 激活能够对神经网络进行自归一化,归一化就是首先减去均值,然后除以标准差。因此,经过归一化之后,网络的组件(权重、偏置和激活)的均值为 0,标准差为 1,而这正是 SELU 激活函数的输出值。通过归一化,网络参数会被初始化一个正态分布。SELU内部归一化的速度比外部归一化快,这意味着网络能更快收敛,而且避免了出现梯度消失或爆炸问题,在CNN或RNN 网络架构中有所应用。
- GELU高斯误差线性单元激活函数,GELU是某些函数(比如双曲正切函数 tanh)与近似数值的组合。GELU 在NLP 领域有较好表现,尤其在 Transformer 模型中表现最好,能避免梯度消失问题。
Softmax系列
1. 优势:多分类模型
- 比较适合作为多分类模型的激活函数,一般会与交叉熵损失函数相配
- 只应用于输出层,把一堆实数的值映射到0-1区间,并且使他们的和为1,可以理解为对应每个类别对应的预测概率
- 用于将输入进行归一化到(0,1),并且其和为1,普遍应用于分类模型(互斥)的预测概率值。事实上,但凡涉及到概率的地方基本都会用到softmax,典型的就比如attention layer当中,都会使用softmax来计算attention值
2. Softmax变体:LogSoftMax、Softmin
- LogSoftmax是基于Softmax函数之上,计算其对应的对数值,范围在(-∞,0)用来计算交叉熵损失函数(根据groundtruth的标签取出对应的值即可)。LogSoftMax 加快了运算速度,提高数据稳定性。
- Softmin是在Softmax的基础上,做相反变换。Softmin是在Softmax的基础上,做相反变换。 跟softmax类似,输入n维t数据,对它们进行重新缩放使得n维输出的每个元素都在[0, 1]区间内,且和为1。不同的是,softmax是单调递增而softmin是单调递减,意味着softmax操作会使得最大的值在激活操作后依然保持最大,而softmin会使得最小的数在经过了softmin后变成最大值。
激活函数的选择
- 一般地,Sigmoid 系列用于二分类任务输出层,softmax系列用于多分类任务输出层,tanh系列用于模型隐藏层,Relu系列用于回归任务以及卷积神经网络隐藏层
-
以终为始,激活函数的选择也是为最终的任务目标服务的。不存在普遍适用各种神经网络的万能的激活函数,在选择激活函数的时候,要考虑不同的条件限制,例如,如果函数可导,求导数的计算难度如何?函数光滑程度如何?输出是否保持标准化?网络的收敛速度如何?等等
-
一般地,在用于分类器时,Sigmoid函数及其组合通常效果更好。为了避免梯度消失问题,又需要避免使用Sigmoid和TanH。如果是回归模型,在输出层上可以使用线性激活函数。如果是浅层神经网络,如不超过4层的,可选择使用多种激励函数,没有太大的影响。如果网络中存在大量未激活神经元,可以考虑leaky ReLU函数。
-
ReLU函数是应用比较广泛的激活函数,可以作为默认选项。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
-
一个经验上的建议是:SELU > ELU > Leaky ReLU > ReLU> tanh > sigmoid,但是,如果网络的体系结构阻止自归一化,那么 ELU 可能是比 SELU 更好的选择。如果速度很重要,Leaky ReLU 将是比慢很多的 ELU 更好的选择。
-
更重要的是,激活函数仍在发展,需要跟踪业界的最新进展,并勇于探索和创新。
参考来源:
【[5分钟深度学习] #03 激活函数】https://www.bilibili.com/video/BV1qB4y1e7GJ?vd_source=30227f06f5820212ac44d7e3406d36e8
神经网络中常见的激活函数_半吊子全栈工匠的博客-CSDN博客