激活函数总结(四):Hard系列激活函数补充
- 1 引言
- 2 激活函数
- 2.1 HardSigmoid激活函数
- 2.2 HardTanh激活函数
- 2.3 Hardswish激活函数
- 3. 总结
1 引言
在前面的文章中已经介绍了过去大家较为常见的激活函数 (Sigmoid
、Tanh
、ReLU
、Leaky ReLU
、PReLU
、Swish
、ELU
、SELU
、GELU
、Softmax
、Softplus
、Mish
、Maxout
)。在这篇文章中,会接着上文提到的众多激活函数继续进行介绍,给大家带来更多不常见的激活函数的介绍。这里放一张激活函数的机理图:
最后,对于文章中没有提及到的激活函数,大家可以通过评论指出,作者会在后续的文章中进行添加补充。
2 激活函数
2.1 HardSigmoid激活函数
HardSigmoid(硬Sigmoid)激活函数是一种近似于Sigmoid函数的非线性激活函数。HardSigmoid 激活函数通过对Sigmoid函数进行修剪和缩放
,使其更加接近于一个分段线性函数
。其数学表达式和数学图像分别如下所示:
H
a
r
d
S
i
g
m
o
i
d
(
x
)
=
m
a
x
(
0
,
m
i
n
(
1
,
α
∗
x
+
β
)
)
HardSigmoid(x) = max(0, min(1, α * x + β))
HardSigmoid(x)=max(0,min(1,α∗x+β))
其中,
α
α
α 是斜率参数,
β
β
β 是偏移参数。通常情况下,
α
α
α 取值为1/6,
β
β
β 取值为1/3,这样 HardSigmoid 函数在x取值在[-3, 3]
范围内比较接近于Sigmoid函数。对于超出这个范围的输入,其输出将被限制在0和1之间
。
优点:
- 更加高效:相比于Sigmoid函数,HardSigmoid函数计算
更加简单
,因为它只涉及最大值、最小值和简单的线性变换。这使得HardSigmoid函数在一些资源有限的设备上更容易实现,并且可以减少计算负担
。 - 计算稳定:sigmoid函数的输入在绝对值较大时,其输出会趋近于0或1,导致
梯度消失
;而hardsigmoid的输出在0和1之间波动,避免了这种情况 - 增加稀疏性:由于hardsigmoid的输出是截断的,超过一定阈值的输入将被截断成1,从而增加了神经元对输入的敏感程度,有利于网络产生
稀疏表示
缺点:
- 非光滑性:HardSigmoid是一个
分段线性
函数,在某些点上存在不连续性
。这意味着在这些点上梯度不连续,可能导致优化过程中出现问题。在反向传播时,梯度的不连续性可能会影响训练的稳定性
,增加收敛时间,甚至导致模型无法收敛。 - 信息丢失:由于HardSigmoid对输入进行硬剪裁,将超过一定范围的值
限制
在0和1之间,因此它会导致部分信息的丢失
。这可能会对模型的表达能力产生一定的负面影响,尤其是对于那些需要更精确输出的任务。 - 缺乏灵活性:HardSigmoid是一个
固定形状
的激活函数,其斜率和偏移参数在大多数情况下是固定的。这使得它相对缺乏灵活性
,难以适应复杂的数据分布或任务。 - 不适用于梯度爆炸问题:HardSigmoid虽然在某些情况下有助于
缓解梯度消失
问题,但对于梯度爆炸
问题并没有提供明显的改进。在深度神经网络中,梯度爆炸问题可能导致训练不稳定或无法收敛。
当前还是ReLU的天下,连续的激活函数往往更令人喜欢!!!HardSigmoid几乎没见人用过。。。
2.2 HardTanh激活函数
HardTanh(硬切线激活函数)是一种非线性激活函数,它是Tanh函数的一种变体。与标准的Tanh函数相比,HardTanh函数进行了简单的截断和缩放
,使其更接近于一个分段线性函数
。其数学表达式和数学图像分别如下所示:
H
a
r
d
T
a
n
h
(
x
)
=
m
a
x
(
−
1
,
m
i
n
(
1
,
x
)
)
HardTanh(x) = max(-1, min(1, x))
HardTanh(x)=max(−1,min(1,x))
该函数将输入x限制在区间[-1, 1]
之间。在输入小于-1时,输出值将被固定为-1,在输入大于1时,输出值将被固定为1。只有当输入在[-1, 1]之间时,HardTanh函数才对输入进行线性变换。
优点:
- 简单性:HardTanh函数的
计算非常简单
,只涉及最大值、最小值和简单的线性变换,因此在硬件加速或资源受限的设备上实现起来相对容易。 - 非线性性:尽管HardTanh函数在输入在[-1,1]之间是线性的,但它在输入小于-1和大于1时是非线性的,因此可以
引入一些非线性特性
,有助于提高模型的表达能力。 - 有界输出:HardTanh函数的输出范围被限制在[-1, 1]之间,这有
助于避免梯度爆炸和梯度消失问题
,并提供更稳定的训练过程。
缺点:
- 非光滑性:HardTanh是一个分段线性函数,在
某些点上存在不连续性
。这意味着在这些点上梯度不连续
,可能导致优化过程中出现问题。类似于HardSigmoid,梯度的不连续性可能会影响训练的稳定性,并增加收敛时间。 - 信息丢失:HardTanh对输入进行
硬剪裁
,将超过一定范围的值限制在固定的范围内(通常为-1和1之间)。这会导致一些信息的丢失
,特别是对于那些需要更大范围输出的任务,HardTanh可能无法准确地表示输出。 - 硬剪裁的影响:HardTanh的硬剪裁
可能导致梯度的消失问题
,尤其是在较深的神经网络中。当输入位于硬剪裁的边界附近时,梯度可能变得非常小,导致模型的学习速度减慢甚至停止学习。 - 不适用于梯度爆炸问题:类似于HardSigmoid,HardTanh对于
梯度爆炸
问题并没有提供明显的改进。在深度神经网络中,梯度爆炸问题可能导致训练不稳定或无法收敛。 - 参数缺少:HardTanh激活函数通常
不具有可调整的参数
,这使得它在某些情况下缺乏灵活性。无法调整参数可能会导致HardTanh难以适应复杂的数据分布或任务。
同样地,对于不连续的HardTanh激活函数,几乎没有人使用。。。
2.3 Hardswish激活函数
论文链接:https://arxiv.org/abs/1905.02244
HardSwish(硬切线激活函数)是一种近似于Swish激活函数的非线性激活函数。HardSwish激活函数在2017年
提出,是对Swish函数进行修剪和缩放,使其更加接近于一个分段线性函数
。其数学表达式和数学图像分别如下所示:
H
a
r
d
S
w
i
s
h
(
x
)
=
{
0
i
f
x
<
=
−
3
x
i
f
x
>
=
+
3
x
∗
(
x
+
3
)
/
6
o
t
h
e
r
w
i
s
e
HardSwish(x)=\left\{ \begin{matrix} \quad \quad \quad 0 \quad \quad \quad if \quad x <= -3 \\ \quad \quad \quad x \quad \quad \quad if \quad x >= +3 \\ x \ * (x+3)/6 \quad \quad otherwise \end{matrix} \right.
HardSwish(x)=⎩
⎨
⎧0ifx<=−3xifx>=+3x ∗(x+3)/6otherwise
优点:
- 可在嵌入式上使用:swish非线性激活函数提高了检测精度,但
不适合在嵌入式移动设备
上使用,因为“S”型函数在嵌入式移动设备上的计算成本更高,求导较为复杂,在量化时计算较慢
。而hardswish非线性激活函数与swish函数相比:在准确性上没有明显差别
,但从部署在嵌入式移动设备上而言具有多重优势
。 - 数值稳定性好:在量化模式下,它消除了由于
近似Sigmoid形
的不同实现而导致的潜在数值精度损失
。 - 计算速度快:在实践中,hardswish激活函数可以实现为
分段功能
,以减少内存访问次数
,从而大大降低了等待时间成本。
缺点:
虽然相比于swish具有较快的计算速度,但是相比ReLU6
仍存在计算量较大
的问题。
设计之初是为了应用于移动端,在MobileNetV3、YOLOv5中都有应用。其本身具有与Swish差不多的性能,且更快。因此,是一个当前较为流行的激活函数。
3. 总结
到此,使用 激活函数总结(四) 已经介绍完毕了!!! 如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。如果存在没有提及的激活函数
也可以在评论区提出,后续会对其进行添加!!!!
如果觉得这篇文章对你有用,记得点赞、收藏并分享给你的小伙伴们哦😄。