激活函数总结(二):ELU、SELU、GELU激活函数
- 1 引言
- 2. 激活函数
- 2.1 ELU(Exponential Linear Unit)激活函数
- 2.2 SELU(Scaled Exponential Linear Unit)激活函数
- 2.3 GELU激活函数
- 3. 总结
1 引言
在上篇文章中已经介绍了过去大家较为常见的激活函数 (Sigmoid
、Tanh
、ReLU
、Leaky ReLU
、PReLU
、Swish
)。在这篇文章中,会接着上文提到的众多激活函数继续进行介绍,给大家带来更多不常见的激活函数的介绍。这里放一张激活函数的机理图:
最后,对于文章中没有提及到的激活函数,大家可以通过评论指出,作者会在后续的文章中进行添加补充。
2. 激活函数
2.1 ELU(Exponential Linear Unit)激活函数
论文链接:https://arxiv.org/pdf/1511.07289.pdf
ELU激活函数是对ReLU激活函数的改进版本,解决了ReLU在负数区域出现的梯度截断问题。
ELU的定义和数学图像分别如下所示:
E
L
U
(
x
)
=
{
x
i
f
x
>
=
0
α
(
e
x
−
1
)
i
f
x
<
0
ELU(x)=\left\{ \begin{matrix} x \quad \quad \quad \quad \quad \quad if \quad x >= 0 \\ \alpha (e^x - 1) \quad \quad \quad if \quad x < 0 \end{matrix} \right.
ELU(x)={xifx>=0α(ex−1)ifx<0
优点:
- 它在所有点上都是连续的和可微的。
- 与其他线性非饱和激活函数(如 ReLU 及其变体)相比,它有着更快的训练时间。
- 与 ReLU 不同,它没有神经元死亡的问题。 这是因为 ELU 的梯度对于所有负值都是非零的。
- 作为非饱和激活函数,它不会遇到梯度爆炸或消失的问题。
- 与其他激活函数(如 ReLU 和变体、Sigmoid 和双曲正切)相比,它实现了更高的准确性。
缺点:
- 计算速度慢。与 ReLU 及其变体相比,由于
负输入涉及非线性
,因此计算速度较慢
。 - 无法避免梯度爆炸问题;
- 神经网络不学习 α \alpha α 值。
注意:对于ELU激活函数,之前看到一个博主的实验中曾介绍了:ReLU+BN
的效果远远大于
ELU
的效果 同时远大于 ELU+BN
的效果!! 所以,这里对于ELU激活函数不做评价,大家可以作为常用激活的一个补充!
2.2 SELU(Scaled Exponential Linear Unit)激活函数
论文链接:https://arxiv.org/pdf/1706.02515.pdf
SELU(Scaled Exponential Linear Unit)激活函数是2017年提出的一种激活函数。SELU是对ELU激活函数的改进,通过引入自标准化机制
,使得神经网络的隐藏层在训练过程中可以自动地保持输出的均值和方差接近于1
。SELU激活函数的定义和数学图像分别如下所示:
S
E
L
U
(
x
)
=
s
c
a
l
e
∗
{
x
i
f
x
>
0
α
(
e
x
−
1
)
i
f
x
<
=
0
SELU(x)=scale \ * \left\{ \begin{matrix} x \quad \quad \quad \quad \quad \quad if \quad x > 0 \\ \alpha (e^x - 1) \quad \quad \quad if \quad x <= 0 \end{matrix} \right.
SELU(x)=scale ∗{xifx>0α(ex−1)ifx<=0
其中,
s
c
a
l
e
scale
scale 和
α
\alpha
α 是用户定义的两个超参数,通常设置为:
s
c
a
l
e
=
1.0507
α
=
1.67326
scale = 1.0507 \\ \alpha = 1.67326
scale=1.0507α=1.67326
SELU激活函数具有以下特点:
- 自标准化:SELU激活函数引入了自标准化机制,使得神经网络的输出在训练过程中保持均值和方差接近于1。这有助于解决神经网络中的
梯度爆炸和梯度消失
问题,从而使得深层网络更容易训练。 - 激活范围:SELU激活函数在输入为负数时具有指数增长,而在输入为正数时近似于线性。这种非线性特性使得SELU在某些情况下比ReLU等激活函数表现更好。
- 高斯分布:SELU激活函数的输出在
输入接近于0时接近于高斯分布
,这有助于提高神经网络的泛化能力。
需要注意的是,SELU激活函数在某些情况下可能并不适用于所有任务和网络结构。在使用SELU时,还需要注意初始化参数的设置,因为它对于网络的输出分布有严格的要求。如果不合适地使用SELU,可能会导致网络输出的均值和方差不稳定,从而影响模型的性能。
总的来说,SELU激活函数是一种值得尝试的激活函数,但是要小心其不稳定的情况!!!
2.3 GELU激活函数
论文链接:https://arxiv.org/pdf/1606.08415.pdf
GELU激活函数是一种平滑的激活函数,与Gaussian
(高斯分布)相关联。GELU激活函数在输入为负数时逼近于0,输入为正数时逼近于线性激活。GELU的定义和数学图像分别如下所示:
G
E
L
U
(
x
)
=
0.5
∗
x
∗
(
1
+
t
a
n
h
(
2
/
π
∗
(
x
+
0.044715
∗
x
3
)
)
)
GELU(x) = 0.5 * x * (1 + tanh(\sqrt{2 / \pi} * (x + 0.044715 * x^3)))
GELU(x)=0.5∗x∗(1+tanh(2/π∗(x+0.044715∗x3)))
优点:
- 平滑性:GELU是一种平滑的激活函数,在所有点上都是可导的,
没有梯度截断
问题。这使得在使用基于梯度的优化算法时更加稳定,有助于提高神经网络的训练效率。 - 近似线性:对于较大的输入值,GELU函数的输出值近似于输入值。这使得它在某些情况下可以起到线性激活函数的作用,有利于模型在一定程度上
保持线性特性
。 - 高斯分布:GELU激活函数的输出在输入接近于0时接近于高斯分布,这有助于
提高神经网络的泛化能力
,使得模型更容易适应不同的数据分布。
缺点:
- 计算开销:GELU激活函数的
计算相对复杂
,涉及到指数、平方根和双曲正切等运算,因此在计算资源有限的情况下可能会带来较大的计算开销。 - 趋向于线性:对于较大的输入值,GELU函数的输出趋向于线性,
可能会导致一些非线性特性的丢失
。
当前,GELU激活函数广泛应用于各个领域!!!尤其是在transformer模型中更为普遍!!!
3. 总结
到此,使用 激活函数总结(二) 已经介绍完毕了!!! 如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。如果存在没有提及的激活函数
也可以在评论区提出,后续会对其进行添加!!!!
如果觉得这篇文章对你有用,记得点赞、收藏并分享给你的小伙伴们哦😄。