深度学习激活函数汇总
如果没有激活函数,即便再添加更多隐藏层,依然只能与仅含输入层的单层神经网络等价
常见网络:
CNN:
- 隐藏层:ReLU
- 输出层:Softmax、Sigmoid、Linear
RNN:
- 隐藏层:Tanh
- …
优秀激活函数的性质
非线性、可微性、计算简单、非饱和性、单调性、参数少
怎么选择激活函数
GeLU、Mish > SELU > ELU > Leaky ReLU > ReLU
这个顺序可能基于一些实验结果和研究发现,以下是一些可能的依据:
- GeLU和Mish:GeLU(Gaussian Error Linear Unit)和Mish是相对较新的激活函数,它们在某些任务和网络结构上表现出了很好的性能。GeLU是基于高斯误差函数的激活函数,而Mish是一种平滑的非线性激活函数。这两个激活函数具有更强的非线性表示能力,可以帮助网络学习更复杂的特征。
- SELU:SELU(Scaled Exponential Linear Unit)是一种自归一化的激活函数,具有一些特殊的性质。SELU在一定的假设条件下可以使得网络的输出保持在一个稳定的范围内,并且在某些情况下可以提供更好的性能。
- ELU:ELU(Exponential Linear Unit)是一种具有负值支持的激活函数,相比于ReLU,ELU在负值区域有更平滑的曲线。这种平滑性可以帮助网络更好地处理负值输入,并且在某些情况下可以提供更好的梯度传播和模型性能。
- Leaky ReLU:Leaky ReLU是一种修正线性单元的变体,它在负值区域引入了一个小的斜率,以解决ReLU在负值区域出现的“神经元死亡”问题。Leaky ReLU相对简单且计算高效,因此在实践中被广泛使用。
- ReLU:ReLU(Rectified Linear Unit)是一种最简单和常用的激活函数,它在正值区域上具有线性特性,而在负值区域上输出为0。ReLU的计算速度快,并且在许多任务和网络结构上表现良好,但它也存在一些问题,如“神经元死亡”和梯度消失。
以原点为中心
以原点为中心的激活函数更好,如ReLU、Leaky ReLU等
- 避免梯度问题
- 提供更好的对称性
- 支持零中心化
以原点为中心的激活函数在0附近有较大的梯度,有助于梯度在网络中传播,避免梯度消失问题。
同时以原点为中心的激活函数,输入值的分布更容易保持在一个合适的范围内,避免了梯度爆炸问题。这是因为在反向传播时,梯度值会通过激活函数的导数进行缩放。如果激活函数的导数在输入值较大时较小,那么梯度值也会相应地减小,从而避免梯度爆炸。以原点为中心的激活函数具有对称性,这意味着对于正值和负值的输入,激活函数的输出也会保持对称。这种对称性有助于网络学习到更平衡的表示,从而提高网络的表达能力。
在一些数据预处理技术中,常常会对输入数据进行零中心化(即减去均值),以便更好地适应网络的训练。以原点为中心的激活函数可以与这种零中心化的数据配合使用,使得网络的输入和输出保持在相似的范围内。
常见激活函数汇总
Sigmoid
σ(x)=11+e−x\sigma(x)=\frac{1}{1+e^{-x}}σ(x)=1+e−x1
- 逻辑回归模型中使用的逻辑函数;
- sigmoid函数是一个s形图。
- 这是一个非线性函数。sigmoid函数将其输入转换为0到1之间的概率值。它将大的负值转换为0,将大的正值转换为1。
- 对于输入0,它返回0.5。
- 所以0.5被称为阈值,它可以决定给定的输入属于什么类型的两个类。
优点:
1、将很大范围数据压缩到(0,1),标准化化神经元输出;
2、处处可微;
3、根据其输出范围,该函数适用于将预测概率作为输出的模型;
4、函数单调,平滑渐变,值无突变。
缺点:
1、有梯度弥散(消失问题)
2、输出不是0均值,进而导致后一层神经元将得到上一层输出的非0均值的信号作为输入。随着网络的加深,会改变原始数据的分布趋势。
3、梯度可能会过早消失,进而导致收敛速度较慢,例如与Tanh函数相比,其就比sigmoid函数收敛更快,是因为其梯度消失问题较sigmoid函数要轻一些
4、幂运算相对耗时。
应用场景
早期,Sigmoid函数被用作MLP、CNN和RNN中隐藏层的激活函数。
现在,sigmoid函数仍在RNN中使用。
通常不将sigmoid函数用于MLP和CNN中的隐藏层,因为太慢了,我们在那里使用ReLU或LeakyReLU。
当我们构建二进制分类器时,输出层必须使用sigmoid函数,其中输出被解释为类标签,具体取决于函数返回的输入的概率值。
Softmax
Softmax(zi)=ezi∑j=1KezjSoftmax(z_i)=\frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}}Softmax(zi)=∑j=1Kezjezi
这也是一个非线性激活函数。
- Softmax函数计算一个事件(类)在K个不同事件(类)上的概率值。
- 它计算每个类别的概率值。所有概率的总和为1,这意味着所有事件(类)都是互斤的。
应用
- 必须在多类分类问题的输出层使用Softmax函数。
- 不在隐藏层中使用Softmax函数。
Tanh
σ(x)=ex−e−xex+e−x\sigma(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}σ(x)=ex+e−xex−e−x
优点:
- 解决了Sigmoid函数输出不是0均值的问题;
- 梯度取值范围在01之间,优于sigmoid函数的00.25,一定程度上缓解了梯度消失的问题;
- 在原点附近与y=xy=xy=x函数形式相近,当输入的激活值较低时,可以直接进行矩阵运算,训练相对容易
缺点:
- 与Sigmoid函数类似,梯度消失问题仍然存在
- 观察其两种形式的表达式,即2∗sigmoid(2x)−12*sigmoid(2x)-12∗sigmoid(2x)−1=tanh==tanh==tanh=ex−e−xex+e−x\frac{e^x-e^{-x}}{e^x+e^{-x}}ex+e−xex−e−x,可见,幕运算的问题仍然存在;
应用场景
主要特点:
- tanh(正切双曲线)函数的输出始终介于-1和+1之间。像sigmoid函数一样,它有一个s形图。
- 这也是一个非线性函数。
- 与sigmoid函数相比,使用tanh函数的优点是tanh函数以零为中心,这使得优化过程更加容易。
- tanh函数的梯度比sigmoid函数的梯度更陡。
用法:
- 目前tanh函数还被用作RNN中隐藏层的激活函数。
- 我们通常不将tanh函数用于MLP和CNN中的隐藏层。
- 我们从不在输出层使用tanh函数。
ReLU
σ(x)=max(0,x)\sigma(x)=max(0,x)σ(x)=max(0,x)
优点
- 没有饱和区,不存在梯度消失问题;
- 计算速度非常快;
- 收敛速度远快于sigmoid以及Tanh函数
- Relu输出会使一部分神经元为0值,在带来网络稀疏性的同时,也减少了参数之间的关联性,一定程度上缓解了过拟合的问题
- 比sigmoid更符合生物学神经激活机制。
缺点:
- Relu函数的输出也不是以0为均值的函数
- 存在Dead ReLU Problem:一个非常大的梯度流过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,进而导致相应参数一直得不到更新。产生该问题主要原因包括参数初始化问题以及学习率设置过大问题;
- 当输入为正值,导数为1,在“链式反应“中,不会出现梯度消失,但梯度下降的强度则完全取决于权值的乘积如此可能会导致梯度爆炸问题;
应用场景
特点
- ReLU(整流线性单元)激活函数是sigmoid和tanh激活函数的绝佳替代品。
- ReLU发明是深度学习领域最重要的突破之一。不存在梯度消失问题。
- 计算成本很低。认为ReLU的收敛速度比sigmoid和tanh函数快6倍。
- 如果输入值为0或大于0,则ReLU函数按原样输出输入。如果输入小于0,则ReLU函数输出值0。
- ReLU函数由两个线性分量组成。因此,ReLU函数是一个分段线性函数。所以ReLU函数是一个非线性函数。ReLU函数的输出范围可以从0到正无穷大。
- 收敛速度比sigmoid和tanh函数快。这是因为ReLU函数对一个线性分量具有固定导数(斜率),而对另一个线性分量具有零导数。
- 因此,使用ReLU函数的学习过程要快得多。使用ReLU可以更快地执行计算,因为函数中不包含指数项。
应用场景
- ReLU函数是MLP和CNN神经网络模型中隐藏层的默认激活函数。
- 我们通常不会在RNN模型的隐藏层中使用ReLU函数。相反,我们在那里使用sigmoid或tanh函数。
- 我们从不在输出层使用ReLU函数。
Leaky ReLU
σ(x)={x,x≥0ax,x<0\sigma(x)=\begin{cases}
x,&x≥0 \\
ax,&x<0
\end{cases}σ(x)={x,ax,x≥0x<0
优点:
- 针对Relu函数中存在的Dead ReLU Problem,Leaky ReLU函数在输入为负值时,给予输入值一个很小的斜率,在解决了负输入情况下的0梯度问题的基础上,也很好的缓解了DeadRelu问题;
- 该函数的输出为负无穷到正无穷,即leaky扩大了Relu函数的范围,其中a的值一般设置为一个较小值,如0.01-0.3;
- 学习过程稍块,原点问题;
缺点:
- 理论上来说,该函数具有比ReLU函数更好的效果,但是大量的实践证明,其效果不稳定,故实际中该函数的应用并不多。
- 由于在不同区间应用的不同的函数所带来的不一致结果,将导致无法为正负输入值提供一致的关系预测。
- 在一些模型中还是在用。
PReLU
f(α,x)={αxif x<0xif x≥0f(\alpha,x)=\begin{cases}
\alpha x &if\ x<0 \\
x &if\ x ≥ 0
\end{cases}f(α,x)={αxxif x<0if x≥0
优点:
允许学习负斜率与Leaky ReLU不同,此函数提供函数负部分的斜率作为参数。因此,可以执行反向传播并学习最合适的α\alphaα值。
缺点:
不同问题,表现不同;
ReLU6
σ(x)=min(max(0,x),6)\sigma(x)=min(max(0,x),6)σ(x)=min(max(0,x),6)
ReLU在 x>0x>0x>0的区域使用xxx进行线性激活,有可能造成激活后的值太大,影响模型的稳定性,为抵消ReLU激活函数的线性增长部分,可以使用ReLU6函数
ELU(Exponential Linear Units)
σ(x)={x,x>0a(ex−1),x≤0\sigma(x)=\begin{cases}
x, &x>0 \\
a(e^x-1), &x≤0
\end{cases}σ(x)={x,a(ex−1),x>0x≤0
优点:
- 显然,ELU 具有 ReLU 的所有优点;
- 没有 Dead ReLU 问题;
- 输出的平均值接近0,以0为中心;
缺点:
- 一个小问题是它的计算强度更高,计算量较大。与 Leaky ReLU 类似,尽管理论上比 ReLU 要好,但目前在实践中没有充分的证据表明ELU总是比ReLU好。
SLU(Scaled ELU)
σ(x)=λ{x,x>0a(ex−1),x≤0\sigma(x)=\lambda \begin{cases}
x, &x>0 \\
a(e^x-1), &x ≤0
\end{cases}σ(x)=λ{x,a(ex−1),x>0x≤0
- 如果正确初始化,使用线性层的前馈网络将自归一化,前提是所有隐藏层都被SELU激活。
- 这意味着每一层的输出将大致具有等于0的平均值和等于1的标准偏差,这有助于防止梯度消失或爆炸问题,并允许构建深度网络。
- 该论文在来自UCl机器学习库、药物发现基准甚至天文学任务的120多个任务上评估了这种自标准化网络,发现它们显著优于传统的前馈网络。
2~1.0507,α=1.6733时,且weight正态分布时,各层输出近似正态分布,消除梯度消失和爆炸,让结构简单的网络甚至超过sota(state of the art 最先进)性能
Swish
σ(x)=x∗sigmoid(βx)\sigma(x)=x*sigmoid(\beta x)σ(x)=x∗sigmoid(βx)
sigmoid(x)=11+exsigmoid(x)=\frac{1}{1+e^x}sigmoid(x)=1+ex1
-
仅在隐藏层中使用,不在神经网络模型的输出层使用这个函数
-
Swish 函数的主要缺点是计算量很大,因为函数中包含了 eze^zez项。这可以使用 “Hard Swish” 的特殊函数来避免。
-
该函数是通过将 sigmoid 函数乘以输入 z 构成的。
-
上无界,下有界,非单调,平滑;
-
该图与ReLU激活函数的图非常相似,常用来作为Relu的替代品来评估Swish;
-
曲线比ReLU激活函数更平滑。在训练模型时,这种平滑度很重要。该函数在训练时很容易收敛。与gelu非常相似;
Hard Swish
Hard Swish(x)=ReLU6(x+3)6Hard\ Swish(x)=\frac{ReLU6(x+3)}{6}Hard Swish(x)=6ReLU6(x+3)
ReLU6(x)=min(max(0,x),6)ReLU6(x)=min(max(0,x),6)ReLU6(x)=min(max(0,x),6)
与Swish函数的曲线基本相同。这在计算上很便宜,因为sigmoid函数被线性模拟取代。
H-Swish的用法类似干Swish激活函数的用法。
Mish
Mish(x)=x∗tanh(ln(1+ex))Mish(x)=x*tanh(ln(1+e^x))Mish(x)=x∗tanh(ln(1+ex))
tanh(x)=ex−e−xex+e−xtanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}tanh(x)=ex+e−xex−e−x
由于其他很多的训练因素,很难解释为什么一种激活函数比另一种更好,但Mish无上界有下界,平滑和非单调的特性都对结果有改善;
从数据上来看mish的性能略优于swish,但没有为什么mish优于swish的解释
单单是从大量的实验中得出mish优于swish的结论,两者的各项性质很像
GeLU激活函数
GeLU(x)=0.5x(1+tanh[2π(x+0.044715x3)])→GeLU(x)=xP(X<=x)=xΦ(x)\scriptsize{
GeLU(x)=0.5x(1+tanh[\sqrt{\frac{2}{\pi}(x+0.044715x^3)}])\rightarrow
GeLU(x)=xP(X<=x)=x\Phi(x)
}GeLU(x)=0.5x(1+tanh[π2(x+0.044715x3)])→GeLU(x)=xP(X<=x)=xΦ(x)
erf(x)=2π⎰0xe−ηdη → Φ(z)=12[1+erf(z2)]erf(x)=\frac{2}{\sqrt{\pi}}\lmoustache_{0}^{x} e^{-\eta}d\eta\ \rightarrow\ \Phi(z)=\frac{1}{2}
[1+erf(\frac{z}{\sqrt{2}})]erf(x)=π2⎰0xe−ηdη → Φ(z)=21[1+erf(2z)]
该函数只是将其输入与此输入处的正态分布的积累密度函数相乘
概率P(X≤x)P(X≤x)P(X≤x)(x可看成当前神经元的激活值输入)即X的高斯正态分布φ(x)\varphi(x)φ(x)的累积分布ϕ(x)\phi(x)ϕ(x)是随着X的变化而变化的,当xxx增大,ϕ(x)\phi(x)ϕ(x)增大,当x减小,ϕ(x)\phi(x)ϕ(x)减小,即当x越小,在当前激活函数激活的情况下,越有可能激活结果为0,即此时神经元被dropout。而当×越大越有可能被保留。
Gelu激活函数于2016年发表,作者针对ReLU和ELU函数评估了GELU激活,并发现所有计算机视觉自然语言处理和语音任务的性能都有提高。