大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本笔记介绍深度学习中常见的激活函数。
热门专栏
机器学习
深度学习
文章目录
激活函数
激活函数是核心组件之一,它赋予神经网络非线性能力,使得模型能够学习复杂的模式和函数映射。常见的激活函数有多种,每种激活函数都有其独特的特性、优缺点,并且往往是基于前一代激活函数的改进。
1) Sigmoid 函数
公式:
f
(
x
)
=
1
1
+
e
−
x
f(x)=\frac{1}{1 + e^{-x}}
f(x)=1+e−x1
输出范围:
0
<
f
(
x
)
<
1
0 < f(x)< 1
0<f(x)<1
优点:
- 平滑输出:Sigmoid 函数将输入压缩到 [0, 1] 之间,输出可以解释为概率,特别适合用于二分类问题的输出层。
缺点:
- 梯度消失问题:当输入过大或过小时,Sigmoid 的梯度接近 0,导致梯度消失,特别是在深层网络中,训练效率大大降低。
- 非零中心:输出是非零中心的,这可能导致后续层的梯度更新不均衡。
适用场景:
- 用于 输出层,特别是二分类任务中,输出可以解释为概率值。
- 在现代深层网络中,Sigmoid 逐渐被其他激活函数替代,因为它的梯度消失问题限制了其在深层网络中的表现。
2) Tanh 函数
公式:
f
(
x
)
=
tanh
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
f(x)=\tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
f(x)=tanh(x)=ex+e−xex−e−x
输出范围:
−
1
≤
f
(
x
)
≤
1
-1 \leq f(x) \leq 1
−1≤f(x)≤1
优点:
- 零中心输出:与 Sigmoid 函数相比,Tanh 函数的输出在 [-1, 1] 之间,输出接近 0 时,使得正负输入在更新时的方向性保持一致,收敛更快。
- 平滑性:类似 Sigmoid,它具有平滑的输出,在二分类问题中能产生强有力的激活效果。
缺点:
- 梯度消失问题:尽管 Tanh 的输出范围比 Sigmoid 更宽,但仍然会出现梯度消失的问题,尤其是在输入值非常大或非常小时。
基于 Sigmoid 的改进:
- Tanh 是对 Sigmoid 函数的改进,通过将输出范围调整为[-1, 1],零中心输出,使得网络能够更好地处理负值,并避免部分梯度不均衡问题。
适用场景:
- 在 隐藏层 中用于信号标准化和处理负数数据。特别适合需要中心化输出的场景,但在深层网络中仍存在梯度消失问题。
3) ReLU(Rectified Linear Unit)
公式:
f
(
x
)
=
max
(
0
,
x
)
f(x)=\max(0,x)
f(x)=max(0,x)
输出范围:
0
⩽
f
(
x
)
<
+
∞
0\leqslant f(x)<+\infty
0⩽f(x)<+∞
优点:
- 计算简单:ReLU 是线性分段函数,计算简单高效,不需要复杂的指数计算。
- 减轻梯度消失问题:由于 ReLU 在 x > 0 的区间上保持梯度恒定为 1,避免了梯度消失问题,尤其在深层网络中表现优异。
- 稀疏性:ReLU 的输出是稀疏的,当输入为负值时输出为 0,这有助于网络在某些场景下提升效率。
缺点:
- 死亡神经元、Dying ReLU问题:当 ReLU 的输入为负值时,神经元的输出会一直为 0,导致某些神经元永远不会被激活,进而无法参与模型的学习。
- 不对称性:ReLU 只对输入的正值产生作用,负值部分被置为 0,导致某些场景下信息丢失。
基于 Tanh 的改进:
- ReLU 是一种非线性激活函数,但在设计上简化了 Tanh 和 Sigmoid 的复杂性,同时减轻了梯度消失的问题。
适用场景:
- 深度神经网络的 隐藏层 中使用最广泛的激活函数,特别适用于卷积神经网络(CNN)和全连接网络(FCN)。
4) Leaky ReLU
公式:
f
(
x
)
=
{
x
if
x
>
0
α
x
if
x
⩽
0
f(x)=\begin{cases}x & \text{if } x > 0\\\alpha x & \text{if } x\leqslant0\end{cases}
f(x)={xαxif x>0if x⩽0
其中
α
\alpha
α通常是一个小的正数(如0.01)。
输出范围:
−
∞
<
f
(
x
)
<
+
∞
-\infty < f(x)<+\infty
−∞<f(x)<+∞
优点:
- 解决死亡神经元、Dying ReLU 问题:Leaky ReLU 在 x<=0 的区间上引入了一个小的【固定的】负斜率,避免了 ReLU 函数的死神经元问题。
- 梯度流动:通过允许负值的输入产生非零梯度,模型可以更好地更新权重。
缺点:
- 不一定总是比 ReLU 更好:虽然 Leaky ReLU 解决了死神经元的问题,但是引入了负值的输出,可能对模型效果有微小的影响,在某些任务中,它并不总是比 ReLU 有显著优势。
基于 ReLU 的改进:
- Leaky ReLU 是 ReLU 的改进版,通过为负值输入保留一个小的斜率来避免 ReLU 中的神经元失活问题。
适用场景:
- 常用于深层神经网络中,需要避免死神经元问题时。Leaky ReLU 的负斜率可以帮助梯度有效传播,特别适合于 生成对抗网络(GANs) 和 RNN 等需要更稳定梯度流的场景。
5) Parametric ReLU(PReLU)
公式:
f
(
x
)
=
{
x
if
x
>
0
α
x
if
x
≤
0
f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases}
f(x)={xαxif x>0if x≤0
其中
α
\alpha
α是可学习的参数。
输出范围:
(
−
∞
,
+
∞
)
(-\infty, +\infty)
(−∞,+∞)
- 由于PReLU在正值区间输出 x x x,而在负值区间输出 α x \alpha x αx,且 α \alpha α可以是任何常数,因此PReLU的输出范围是从 − ∞ -\infty −∞到 + ∞ +\infty +∞。
优点:
- 可学习的斜率:与 Leaky ReLU 不同,PReLU 中的 α \alpha α 是通过训练学习的,而不是一个固定值,这使得模型能够自动调整负值部分的斜率。
- 提升模型性能:它可以动态适应每个神经元的输入,在一些深层网络中,比固定的 ReLU 或 Leaky ReLU 表现更好。
缺点:
- 增加了模型复杂度:PReLU 引入了额外的参数 α \alpha α,这增加了模型的复杂性和训练成本。
基于 Leaky ReLU 的改进:
- PReLU 是对 Leaky ReLU 的改进,使得负斜率 α \alpha α 不再固定,而是通过学习调整,以便模型在训练过程中更加灵活。
适用场景:
- 适用于 深度卷积神经网络(CNN) 和 其他大型深度网络,当模型需要更大的灵活性和动态调整时,PReLU 提供了更优的性能。
6) ELU(Exponential Linear Unit)
公式:
f
(
x
)
=
{
x
if
x
>
0
α
(
e
x
−
1
)
if
x
≤
0
f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha(e^x - 1) & \text{if } x \leq 0 \end{cases}
f(x)={xα(ex−1)if x>0if x≤0
其中
α
>
0
\alpha > 0
α>0是一个超参数,通常取
α
=
1
\alpha = 1
α=1。
输出范围:
(
−
α
,
+
∞
)
(-\alpha, +\infty)
(−α,+∞)
- 当 x > 0 x > 0 x>0时,ELU输出 x x x,所以输出范围可以趋近于 + ∞ +\infty +∞。
- 当 x ≤ 0 x \leq 0 x≤0时,ELU的输出是 α ( e x − 1 ) \alpha(e^x - 1) α(ex−1),因此下限是 − α -\alpha −α,这取决于 α \alpha α的值(通常 α > 0 \alpha > 0 α>0)。
优点:
- 平滑负值处理:ELU 在 x<=0 时平滑输出,使得负值部分的输出更为柔和,解决了 ReLU 和 Leaky ReLU 在负值区间的突变问题。
- 零中心输出:相比 ReLU,ELU 的输出更接近零,有助于梯度均衡更新,提升训练速度。
缺点:
- 计算复杂度高:ELU 的负值部分包含指数计算,比 ReLU 和 Leaky ReLU 的计算复杂度更高。
基于 ReLU 的改进:
- ELU 是对 ReLU 的改进,它解决了 ReLU 处理负值时的过度稀疏问题,并通过指数函数使负值部分更平滑。
适用场景:
- ELU 常用于深层网络,如 卷积神经网络(CNN),尤其是需要更平滑输出的场景。它的平滑负值处理在一定程度上提高了模型的鲁棒性。
7) SELU(Scaled Exponential Linear Unit)
公式:
f
(
x
)
=
λ
{
x
if
x
>
0
α
(
e
x
−
1
)
if
x
≤
0
f(x) = \lambda \begin{cases} x & \text{if } x > 0 \\ \alpha(e^x - 1) & \text{if } x \leq 0 \end{cases}
f(x)=λ{xα(ex−1)if x>0if x≤0
其中:
- α ≈ 1.67326 \alpha \approx 1.67326 α≈1.67326
- λ ≈ 1.0507 \lambda \approx 1.0507 λ≈1.0507
输出范围:
(
−
∞
,
+
∞
)
(-\infty, +\infty)
(−∞,+∞)
优点:
- 自归一化:SELU 激活函数的最大特点是具有自归一化(self-normalizing)特性,它能够使得神经元的输出保持零均值和单位方差,即便经过多层网络传递后,仍然保持这种归一化效果。这一特性有助于避免梯度消失和梯度爆炸问题。
- 消除梯度消失和爆炸:SELU 通过引入缩放因子 ( λ \lambda λ) 和 ( α \alpha α),在负值区域引入非线性并进行归一化处理,有效防止梯度消失和爆炸。
- 无需额外正则化:SELU 可以减少或完全消除对批归一化(Batch Normalization)等正则化方法的依赖,在某些场景中表现非常稳定。
缺点:
- 依赖特定初始化和架构:SELU 要发挥最大效果,必须搭配 LeCun 正态初始化(LeCun Normal Initialization)和 Alpha Dropout。这种依赖特定初始化和架构的特性使得 SELU 在某些情况下的灵活性较差。
- 对输入数据敏感:SELU 要求输入数据标准化,即数据需要经过归一化处理(零均值、单位方差),否则效果可能较差。
基于 ELU 的改进:
- SELU 是对 ELU 函数的改进,保留了 ELU 在负值区间的平滑处理,同时通过添加缩放因子使输出具有自归一化特性。这种自归一化特性使得神经网络更稳定,并且减轻了对批归一化等正则化手段的需求。
适用场景:
- 自归一化神经网络(SNNs):SELU 常用于自归一化神经网络,它可以减少梯度消失和爆炸问题,尤其适用于深层网络。
- 适合需要高度稳定的训练过程,并且对批归一化等方法不适合的场景,如某些 序列生成 或 生成对抗网络(GANs) 中,SELU 可以提高网络的训练稳定性。
8) Swish(SiLU)
公式:
f
(
x
)
=
x
1
+
e
−
x
=
x
⋅
σ
(
x
)
f(x) = \frac{x}{1 + e^{-x}} = x \cdot \sigma(x)
f(x)=1+e−xx=x⋅σ(x)
其中
σ
(
x
)
\sigma(x)
σ(x)是Sigmoid函数。
优点:
- 平滑且非单调:Swish 是一个非单调的函数(即它既有递增区间,也有递减区间),这有助于捕捉复杂的非线性特性。
- 更好的性能:Swish 在一些任务中表现出优于 ReLU 和其他常见激活函数的性能,尤其是在深层网络中。
缺点:
- 计算复杂度略高:相比 ReLU,Swish 由于引入了 Sigmoid 计算,其计算复杂度稍高。
基于 ReLU 的改进:
- Swish 是一种由 Google 提出的激活函数,它保留了 ReLU 的线性部分,但结合了 Sigmoid 的平滑性,特别适用于深层神经网络。
适用场景:
- 深度卷积神经网络(CNN) 和 Transformer 等模型中,Swish 在一些任务(如图像分类、目标检测)中表现优异,特别适合深度模型。
- SD模型的三个组件中都用到了,GSC部件中的S。
总结
激活函数 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Sigmoid | 平滑输出,适合二分类问题 | 梯度消失,非零中心 | 二分类输出层 |
Tanh | 零中心输出,平滑 | 梯度消失 | 中间层或输出层 |
ReLU | 计算简单,减轻梯度消失 | 死神经元问题,不对称输出 | 深层网络,特别是卷积神经网络(CNN) |
Leaky ReLU | 解决 ReLU 死神经元问题,保持梯度流动 | 不一定总是比 ReLU 更好 | 需要避免死神经元问题的深层网络 |
PReLU | 可学习的负斜率,灵活性高 | 增加了模型的复杂度和训练时间 | 深度卷积网络等大型模型 |
ELU | 平滑负值处理,零中心输出 | 计算复杂度高 | 需要平滑负值处理的深层网络 |
SELU | 自归一化,减轻梯度消失和爆炸,减少对正则化的依赖 | 依赖特定的初始化和数据标准化 | 自归一化神经网络(SNN),深度网络 |
Swish | 非单调,性能好 | 计算复杂度略高 | 深层网络,如图像分类和目标检测 |
每种激活函数有其适用场景,选择激活函数时,应根据任务的特性、模型结构以及计算资源综合考虑。
- ReLU 和其变种在现代神经网络中应用广泛;
- Swish 和 ELU 在某些深层网络中表现更优。
- SELU 激活函数的最大优势在于其自归一化特性,适合深度神经网络的训练,尤其是在批归一化不适用的场景中表现优异。