按照常用度大致从高到低排列的常用激活函数:
- ReLU 函数:计算简单、收敛速度快,能有效缓解梯度消失问题,在各种神经网络的隐藏层中广泛应用,是目前最常用的激活函数之一。
- Sigmoid 函数:常被用于将输出转换为概率形式,在逻辑回归以及神经网络的输出层用于二分类问题等场景较为常见。
- Tanh 函数:输出以 0 为中心,在一些需要对称输出的场景以及早期的神经网络中使用较多。
- Softmax 函数:专门用于多分类问题的输出层,将多个输入值转换为一个概率分布,在分类任务的模型中必不可少。
- Leaky ReLU 函数:作为 ReLU 的改进版本,一定程度上避免了 Dead ReLU 问题,在一些对 ReLU 改进有需求的场景中使用。
- GELU 函数:在自然语言处理等领域的一些先进模型中表现出色,随着相关领域的发展,使用频率逐渐增加。
- Swish 函数:具有良好的非线性特性,在一些实验和特定模型中展现出较好性能,使用也相对较为广泛。
- ELU 函数:综合了 ReLU 和 sigmoid 函数的一些优点,能使输出均值更接近 0,有助于加快训练收敛速度,但相比前面几种,使用场景相对少一些。
- 线性激活函数:由于无法引入非线性,在复杂的神经网络中很少单独使用,仅在某些简单的线性模型或作为神经网络中的初始激活函数等特定场景出现。
激活函数的作用
激活函数在神经网络中扮演着非常重要的角色,主要有以下作用:
- 引入非线性:主要强调激活函数能让神经网络从只能处理线性问题转变为可以处理非线性问题,突出其对神经网络本质表达能力的改变。
- 神经网络的本质是要学习输入和输出之间的复杂关系,很多实际问题中的数据关系往往是非线性的。如果没有激活函数,神经网络将只是一个线性模型,无论有多少层,其表达能力都等同于一个单层的线性模型,只能处理线性可分的问题。激活函数的加入使得神经网络能够学习和处理各种非线性关系,大大增强了神经网络的表达能力,使其可以拟合任何复杂的函数,从而能够解决如图像识别、语音识别、自然语言处理等众多领域中的非线性问题。
- 增加模型复杂度:侧重于说明激活函数使神经网络能形成更复杂的决策边界和特征表示,提升模型对复杂模式和规律的学习能力。
- 激活函数通过在神经元中引入非线性变换,使得神经网络能够形成更复杂的决策边界和特征表示。每一层神经元经过激活函数处理后,都可以提取到更高级、更抽象的特征,随着网络层数的增加,这些非线性变换的组合可以让模型学习到极其复杂的模式和规律,从而提高模型对数据的拟合能力和泛化能力。
- 控制神经元激活状态:聚焦于激活函数可决定神经元是否激活及激活程度,使网络能选择性地关注重要特征。
- 激活函数可以将神经元的输入映射到一个特定的输出范围,以此来决定神经元是否被激活以及激活的程度。例如,像 ReLU 函数,当输入大于 0 时神经元被激活,输出等于输入;当输入小于等于 0 时,神经元不激活,输出为 0。这种特性可以让神经网络实现对不同特征的选择性激活,使得网络能够专注于学习数据中的重要特征,忽略一些不重要的信息,从而提高模型的效率和准确性。
- 实现信息传递和变换:着重于激活函数在神经网络前向传播过程中对信息的处理、编码和传递作用,以及对最终任务目标实现的意义。
- 在神经网络的前向传播过程中,激活函数对每一层的输入进行处理后再传递给下一层,它不仅决定了信息是否能够通过神经元进行传递,还对信息进行了非线性的变换和编码。这样,经过多层神经网络的层层传递和处理,原始输入数据能够被逐步转换为对任务有用的特征表示,最终用于实现分类、回归等各种任务的目标。
- 帮助模型训练:主要阐述激活函数的导数在反向传播中对计算梯度和更新权重的作用,以及对模型训练收敛的影响。
- 在反向传播算法中,激活函数的导数用于计算误差的梯度,从而更新神经网络的权重。合适的激活函数能够保证梯度在反向传播过程中的稳定性和有效性,使得模型能够顺利地进行训练,收敛到一个较好的解。例如,一些激活函数如 ReLU 在正数部分的梯度为 1,避免了梯度消失问题,使得训练能够更快地进行。
ReLU(Rectified Linear Unit)函数
定义与表达式
ReLU 函数的数学表达式为
f
(
x
)
=
max
(
0
,
x
)
f(x)=\max(0, x)
f(x)=max(0,x),其含义是:当输入 (x) 大于 0 时,函数输出等于输入值 (x);当输入 (x) 小于等于 0 时,函数输出为 0。
函数图像
ReLU 函数的图像是一条折线。在 (x) 轴负半轴,函数值恒为 0,是一条与 (x) 轴重合的直线;在 (x) 轴正半轴,函数图像是斜率为 1 的直线,即 (y = x)。图像直观地展示了该函数在不同输入区间的行为。
优点
- 计算简单高效:ReLU 函数只需要进行一次比较操作(判断输入是否大于 0),相比于一些复杂的激活函数(如 Sigmoid 和 Tanh),计算量大大减少。这使得在大规模神经网络的训练和推理过程中,能够显著提高计算速度,节省计算资源。
- 缓解梯度消失问题:在传统的激活函数(如 Sigmoid 和 Tanh)中,当输入值非常大或非常小时,函数的导数趋近于 0,导致在反向传播过程中梯度变得极小,使得网络参数更新缓慢甚至停滞,即出现梯度消失问题。而对于 ReLU 函数,当输入 (x>0) 时,其导数恒为 1,这保证了在正区间内梯度不会消失,能够有效地将梯度传递到前面的层,加快网络的训练速度。
- 具有稀疏性:ReLU 函数会使一部分神经元的输出为 0,这意味着这些神经元处于“不激活”状态。这种稀疏性可以减少神经元之间的相互依赖,降低过拟合的风险,同时也使得网络更加高效,能够自动提取数据中的重要特征。
缺点
- Dead ReLU 问题:当输入小于等于 0 时,ReLU 函数的输出恒为 0,并且在这个区间内导数也为 0。如果在训练过程中,某个神经元的输入始终小于等于 0,那么该神经元将永远不会被激活,其对应的权重也不会再更新,导致这个神经元“死亡”。在一些情况下,可能会出现大量神经元死亡的现象,使得网络的学习能力下降。
- 输出均值不为 0:ReLU 函数的输出值均为非负数,这导致其输出的均值不为 0。在神经网络中,如果每一层的输入数据均值不为 0,可能会使梯度更新的方向产生偏差,影响网络的收敛速度和稳定性。
应用场景
- 隐藏层:ReLU 函数广泛应用于各种深度神经网络的隐藏层中,如卷积神经网络(CNN)、循环神经网络(RNN)及其变体(如 LSTM、GRU)等。由于其计算简单和缓解梯度消失的特性,能够帮助网络快速学习到数据中的特征。
- 计算机视觉:在图像识别、目标检测、图像生成等计算机视觉任务中,ReLU 函数被大量使用。CNN 中的卷积层和全连接层通常会采用 ReLU 作为激活函数,以提高模型的性能和训练效率。
改进版本
为了克服 ReLU 函数的缺点,研究人员提出了一些改进版本,如 Leaky ReLU、PReLU(Parametric ReLU)、ELU(Exponential Linear Unit)等。这些改进版本在一定程度上解决了 Dead ReLU 问题,同时保留了 ReLU 函数的优点。例如,Leaky ReLU 在输入小于 0 时,会赋予一个很小的非零斜率,避免神经元完全死亡。
Sigmoid 函数
数学表达式
Sigmoid函数的数学表达式为:
S
(
x
)
=
1
1
+
e
−
x
S(x)=\frac{1}{1 + e^{-x}}
S(x)=1+e−x1,其中
x
x
x可以是单个数据点,也可以是一个向量或矩阵,表示输入数据。
函数图像
Sigmoid函数的图像是一条S形曲线,具有以下特点:
- 取值范围在(0,1)之间,当 x x x趋近于正无穷时, S ( x ) S(x) S(x)趋近于 1 1 1;当 x x x趋近于负无穷时, S ( x ) S(x) S(x)趋近于 0 0 0。
- 函数在(x = 0)处取得中点值(0.5),即 S ( 0 ) = 0.5 S(0)=0.5 S(0)=0.5。
- 函数是平滑的,处处可导,其导数在 x = 0 x = 0 x=0处取得最大值,随着 x x x的绝对值增大,导数逐渐趋近于 0 0 0。
主要作用
- 归一化:将任意实数映射到 ( 0 , 1 ) (0,1) (0,1)区间,这在很多场景中非常有用,例如可以将模型的输出转换为概率形式,用于表示某个事件发生的可能性。
- 引入非线性:神经网络中,如果没有激活函数,无论网络有多少层,其输出都是输入的线性组合,无法拟合复杂的非线性关系。Sigmoid函数能够为神经网络引入非线性因素,使网络能够学习和处理各种复杂的非线性问题。
导数性质
Sigmoid函数的导数可以用其本身来表示,其导数公式为:
S
′
(
x
)
=
S
(
x
)
(
1
−
S
(
x
)
)
S'(x)=S(x)(1 - S(x))
S′(x)=S(x)(1−S(x))。这一性质在神经网络的反向传播算法中非常重要,因为在反向传播过程中,需要计算误差关于每个神经元输入的导数,以便更新网络的权重。
优缺点
- 优点
- 输出范围固定:输出值在 0 0 0到 1 1 1之间,具有很好的解释性,方便用于表示概率等。
- 平滑可导:函数的平滑性和可导性使得在训练神经网络时,可以使用基于梯度的优化算法,如随机梯度下降等,进行权重的更新和优化。
- 缺点
- 梯度消失问题:当(x)的绝对值较大时,Sigmoid函数的导数 S ′ ( x ) S'(x) S′(x)会趋近于 0 0 0。在深层神经网络中,这可能导致梯度在反向传播过程中逐渐消失,使得前面的层难以更新权重,从而影响模型的训练效果。
- 非零中心问题:Sigmoid函数的输出不是以 0 0 0为中心的,这可能会导致在神经网络训练过程中,权重更新时出现一些问题,例如神经元的输出可能会一直偏向于正值或负值,使得训练过程不稳定。
Tanh函数
数学表达式
Tanh函数的数学表达式为:
t
a
n
h
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
tanh(x)=ex+e−xex−e−x,这里的
x
x
x既可以是单个数值,也能够是向量或矩阵形式的输入数据。
函数图像
Tanh函数的图像呈现为关于原点对称的S形曲线,具备以下特性:
-
其值域为 ( − 1 , 1 ) (-1, 1) (−1,1),当 x x x趋向于正无穷时, t a n h ( x ) tanh(x) tanh(x)趋近于 1 1 1;当 x x x趋向于负无穷时, t a n h ( x ) tanh(x) tanh(x)趋近于 − 1 -1 −1。可以将输入映射到(-1,1)
-
函数曲线平滑且在定义域内处处可导,导数在 x = 0 x = 0 x=0处达到最大值,随着 x x x绝对值的增大,导数逐渐趋近于 0 0 0
主要作用
- 归一化:把任意实数映射到 ( − 1 , 1 ) (-1, 1) (−1,1)区间,有助于对数据进行归一化处理,使数据在特定范围内分布,方便后续计算与模型训练。
- 引入非线性:在神经网络中,为模型引入非线性因素。若没有激活函数,神经网络只能学习线性关系,Tanh函数能让网络处理复杂的非线性问题,增强模型的表达能力。
导数性质
Tanh函数的导数公式为:
t
a
n
h
′
(
x
)
=
1
−
t
a
n
h
2
(
x
)
tanh^\prime(x)=1 - tanh^{2}(x)
tanh′(x)=1−tanh2(x) 。在神经网络反向传播过程里,该导数性质对于计算误差关于神经元输入的导数起着关键作用,进而实现网络权重的更新。
优缺点
- 优点
- 零中心对称:输出以 0 0 0为中心对称,相比于一些非零中心输出的激活函数,能使神经元输出更平衡,减少训练时权重更新的偏差,有助于加快训练速度。
- 平滑可导:与Sigmoid函数类似,Tanh函数的平滑性和可导性允许在训练神经网络时运用基于梯度的优化算法,便于模型参数的调整与优化。
- 缺点
- 梯度消失问题:当 x x x的绝对值较大时,Tanh函数的导数 t a n h ′ ( x ) tanh^\prime(x) tanh′(x)趋近于 0 0 0。在深度神经网络中,这会致使梯度在反向传播时逐渐消失,前面层的权重难以有效更新,影响模型训练效果。
- 计算复杂度:由于函数中涉及指数运算,相比部分简单的激活函数,其计算复杂度较高,在一定程度上会增加模型训练的时间成本。
Softmax 函数
数学表达式
Softmax函数通常用于多分类问题,对于一个包含
n
n
n 个元素的输入向量
z
=
(
z
1
,
z
2
,
⋯
,
z
n
)
\mathbf{z}=(z_1,z_2,\cdots,z_n)
z=(z1,z2,⋯,zn),Softmax函数的数学表达式为:
S
(
z
j
)
=
e
z
j
∑
i
=
1
n
e
z
i
S(z_j)=\frac{e^{z_j}}{\sum_{i = 1}^{n}e^{z_i}}
S(zj)=∑i=1neziezj,其中
j
=
1
,
2
,
⋯
,
n
j = 1,2,\cdots,n
j=1,2,⋯,n。该函数会将输入向量
z
\mathbf{z}
z 转换为一个概率分布,输出的每个元素都在
(
0
,
1
)
(0, 1)
(0,1) 区间内,且所有元素之和为
1
1
1。
函数图像
下图只是示意,只大概保证输出的每个值都在
(
0
,
1
)
(0, 1)
(0,1) 之间,并且所有输出值的总和为
1
1
1
Softmax函数本身是针对向量进行操作的,它将向量中的每个元素映射为一个概率值。对于二维的简单示例,如果输入向量是二维的 ( z 1 , z 2 ) (z_1, z_2) (z1,z2),那么输出的 ( S ( z 1 ) , S ( z 2 ) ) (S(z_1), S(z_2)) (S(z1),S(z2)) 满足 S ( z 1 ) + S ( z 2 ) = 1 S(z_1)+S(z_2) = 1 S(z1)+S(z2)=1。其特性主要体现在将输入值转换为概率分布上,具有以下特点:
- 输出的每个值都在 ( 0 , 1 ) (0, 1) (0,1) 之间,并且所有输出值的总和为 1 1 1,这符合概率分布的定义。
- 当某个输入值 z j z_j zj 增大时,对应的 S ( z j ) S(z_j) S(zj) 会增大,同时其他元素对应的概率值会相应减小,以保证总和为 1 1 1。
主要作用
- 多分类问题的概率输出:在多分类的机器学习任务中,神经网络的最后一层输出往往是未经归一化的得分(logits),Softmax函数可以将这些得分转换为每个类别的概率,使得模型的输出具有明确的概率意义,方便进行类别预测。例如在图像分类任务中,通过Softmax函数可以得到图像属于各个类别的概率。
- 梯度计算与模型训练:Softmax函数结合交叉熵损失函数在神经网络训练中非常常用,能够有效地计算梯度,从而使用梯度下降等优化算法更新模型的参数。
导数性质
Softmax函数的导数形式相对复杂。对于
S
(
z
j
)
S(z_j)
S(zj) 关于
z
k
z_k
zk 的导数,当
j
=
k
j = k
j=k 时,
∂
S
(
z
j
)
∂
z
k
=
S
(
z
j
)
(
1
−
S
(
z
j
)
)
\frac{\partial S(z_j)}{\partial z_k}=S(z_j)(1 - S(z_j))
∂zk∂S(zj)=S(zj)(1−S(zj));当
j
≠
k
j\neq k
j=k 时,
∂
S
(
z
j
)
∂
z
k
=
−
S
(
z
j
)
S
(
z
k
)
\frac{\partial S(z_j)}{\partial z_k}=-S(z_j)S(z_k)
∂zk∂S(zj)=−S(zj)S(zk)。这些导数在反向传播算法中用于计算损失函数关于输入的梯度,进而更新模型的权重。
优缺点
- 优点
- 概率解释性强:输出是一个概率分布,能够直观地表示每个类别被选中的可能性,便于理解和决策。
- 适用于多分类:专门为多分类问题设计,能够很好地处理多个类别之间的竞争关系。
- 缺点
- 计算复杂度较高:涉及指数运算和求和操作,当输入向量的维度较高时,计算量会比较大。
- 对异常值敏感:如果输入向量中存在较大的异常值,指数运算会使得该值对应的概率变得非常大,从而影响其他类别的概率分布,导致模型的稳定性受到影响。
Leaky ReLU 函数
数学表达式
Leaky ReLU函数是ReLU(Rectified Linear Unit)函数的一种改进变体,其数学表达式为:
f
(
x
)
=
{
x
,
if
x
≥
0
α
x
,
if
x
<
0
f(x)= \begin{cases} x, & \text{if } x \geq 0 \\ \alpha x, & \text{if } x < 0 \end{cases}
f(x)={x,αx,if x≥0if x<0
其中,
α
\alpha
α 是一个很小的正数,通常取值在
0.01
0.01
0.01 左右,它为
x
<
0
x < 0
x<0 时的函数赋予了一个非零的斜率,避免了ReLU函数在
x
<
0
x < 0
x<0 时梯度为零的问题。
函数图像
Leaky ReLU函数图像由两部分组成:
- 当 x ≥ 0 x \geq 0 x≥0 时,函数图像与 y = x y = x y=x 重合,是一条斜率为 1 1 1 的直线。
- 当 x < 0 x < 0 x<0 时,函数图像是一条斜率为 α \alpha α 的直线,由于 α \alpha α 是一个较小的正数,这条直线相对平缓地穿过第三象限。
主要作用
- 缓解梯度消失问题:在神经网络中,ReLU函数在 x < 0 x < 0 x<0 时梯度为零,可能导致神经元在训练过程中“死亡”,即不再更新权重。Leaky ReLU通过为 x < 0 x < 0 x<0 时赋予一个非零斜率,使得在该区域也能有梯度传递,从而缓解了梯度消失问题,让神经网络在训练时能够更有效地更新参数。
- 引入非线性:和其他激活函数一样,Leaky ReLU能够为神经网络引入非线性因素,使网络能够学习和处理复杂的非线性关系,提升模型的表达能力。
导数性质
Leaky ReLU函数的导数为:
f
′
(
x
)
=
{
1
,
if
x
≥
0
α
,
if
x
<
0
f^\prime(x)= \begin{cases} 1, & \text{if } x \geq 0 \\ \alpha, & \text{if } x < 0 \end{cases}
f′(x)={1,α,if x≥0if x<0
在反向传播过程中,这个导数性质用于计算误差关于神经元输入的梯度,以便更新网络的权重。
优缺点
- 优点
- 缓解梯度消失:有效解决了ReLU函数在负半轴的梯度消失问题,使得神经网络在训练时能够更稳定地学习,尤其在深层网络中表现较好。
- 计算效率高:和ReLU函数类似,Leaky ReLU的计算简单,只涉及线性运算,相比一些复杂的激活函数(如Sigmoid、Tanh),计算成本较低,能够加快训练速度。
- 缺点
- 超参数问题: α \alpha α 的取值需要人为设定,不同的取值可能对模型性能产生较大影响,需要通过实验来确定合适的 α \alpha α 值,增加了调参的工作量。
- 非零中心输出:Leaky ReLU函数的输出不是以 0 0 0 为中心的,可能会在神经网络训练过程中带来一些和Sigmoid函数类似的问题,影响训练的稳定性。
GELU函数
数学表达式
GELU(Gaussian Error Linear Unit)函数的数学表达式主要有以下两种形式:
- 形式一: f ( x ) = 0.5 × x × ( 1 + tanh ( 2 π × ( x + 0.044715 × x 3 ) ) ) f(x)=0.5\times x\times(1 + \tanh(\sqrt{\frac{2}{\pi}}\times(x + 0.044715\times x^3))) f(x)=0.5×x×(1+tanh(π2×(x+0.044715×x3)))
- 形式二:
f
(
x
)
=
0.5
×
x
×
(
1
+
erf
(
x
2
)
)
f(x)=0.5\times x\times(1 + \text{erf}(\frac{x}{\sqrt{2}}))
f(x)=0.5×x×(1+erf(2x))
其中, erf ( x ) \text{erf}(x) erf(x)是误差函数,它将实数映射到区间 ( − 1 , 1 ) (-1,1) (−1,1), 2 \sqrt{2} 2是2的平方根。
函数图像
图像整体呈现出在负半轴增长较为缓慢,在正半轴增长速度逐渐加快的特点,是一条平滑的曲线,没有明显的间断点或尖锐的拐角。
跟下面太像了,放个python代码。
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import erf
def gelu(x):
return 0.5 * x * (1 + erf(x / np.sqrt(2)))
x = np.linspace(-5, 5, 400)
y = gelu(x)
plt.plot(x, y)
plt.title('GELU Function')
plt.xlabel('x')
plt.ylabel('GELU(x)')
plt.grid(True)
plt.show()
主要作用
- 增强模型非线性表达能力:在深度学习中,GELU函数能够比一些传统的激活函数(如ReLU等)更好地捕捉数据中的复杂非线性关系,使神经网络可以学习到更复杂的模式,从而提升模型在各种任务上的性能,比如在自然语言处理任务中,能帮助模型更好地理解语义信息等。
- 提高模型稳定性:由于其连续可导且平滑的特性,在神经网络的训练过程中,能够使得梯度的传播更加稳定,有助于模型更快地收敛,减少训练过程中的振荡和不稳定现象,尤其在训练深度神经网络时,这种稳定性更为重要。
导数性质
GELU函数的导数为 f ′ ( x ) = 0.5 × ( 1 + erf ( x 2 ) ) + x 2 π e − x 2 2 f^\prime(x)=0.5\times(1 + \text{erf}(\frac{x}{\sqrt{2}})) + \frac{x}{\sqrt{2\pi}}e^{-\frac{x^{2}}{2}} f′(x)=0.5×(1+erf(2x))+2πxe−2x2。在神经网络的反向传播过程中,需要利用这个导数来计算误差关于神经元输入的梯度,从而更新网络的权重,以实现模型的训练和优化。
优缺点
- 优点
- 拟合能力强:GELU函数的曲线更加平滑,能够更好地拟合各种数据分布,对于具有复杂分布的数据,使用GELU函数作为激活函数的模型往往能够取得更好的拟合效果,从而提高模型的准确性。
- 理论基础优势:从随机正则的角度来看,它具有一定的理论依据,在激活过程中引入了概率思想,使得模型在训练过程中能够更好地利用输入的概率分布信息,一定程度上起到了正则化的作用,有助于防止模型过拟合。
- 缺点
- 计算复杂度高:与一些简单的激活函数(如ReLU、Leaky ReLU等)相比,GELU函数的计算相对复杂,涉及到误差函数等运算,这会增加模型训练和推理的时间成本,尤其是在处理大规模数据和复杂模型结构时,计算量的增加可能会比较明显。
- 非零中心输出:GELU函数的输出不是以0为中心的,这可能会在一定程度上影响神经网络训练的稳定性,尤其是在一些对输入数据分布较为敏感的模型中,可能需要额外的处理来调整数据的分布。
Swish 函数
数学表达式
Swish 函数的数学表达式为:
f
(
x
)
=
x
⋅
σ
(
x
)
f(x)=x\cdot \sigma(x)
f(x)=x⋅σ(x),其中
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1 + e^{-x}}
σ(x)=1+e−x1 是 Sigmoid 函数。也可以写成
f
(
x
)
=
x
1
+
e
−
x
f(x)=\frac{x}{1 + e^{-x}}
f(x)=1+e−xx 。
函数图像
Swish 函数图像是一条平滑的曲线,在负半轴部分函数值小于 0 ,随着 x x x 增大,函数值逐渐增大且增长速度加快,在正半轴呈现单调递增趋势。
跟上面那个太像,放个python代码。
import numpy as np
import matplotlib.pyplot as plt
def swish(x):
return x / (1 + np.exp(-x))
x = np.linspace(-10, 10, 400)
y = swish(x)
plt.plot(x, y)
plt.title('Swish Function')
plt.xlabel('x')
plt.ylabel('Swish(x)')
plt.grid(True)
plt.show()
主要作用
- 提升模型表达能力:作为一种激活函数,Swish 函数能够为神经网络引入更复杂的非线性变换,帮助模型学习到数据中更精细的模式,相比一些传统激活函数(如 ReLU ),在某些任务上可以使模型具有更好的性能表现,比如在图像识别、自然语言处理等深度学习任务中,能增强模型对复杂信息的拟合能力。
- 优化训练过程:其平滑的特性有助于在神经网络训练时更稳定地传播梯度,减少梯度消失等问题,使模型在训练过程中能够更快地收敛,提高训练效率。
导数性质
Swish 函数的导数为:
f
′
(
x
)
=
σ
(
x
)
+
x
⋅
σ
(
x
)
⋅
(
1
−
σ
(
x
)
)
f^\prime(x)=\sigma(x)+x\cdot\sigma(x)\cdot(1 - \sigma(x))
f′(x)=σ(x)+x⋅σ(x)⋅(1−σ(x)) 。在神经网络反向传播过程中,利用该导数来计算误差关于神经元输入的梯度,从而更新网络权重,以实现模型的训练优化。
优缺点
- 优点
- 性能表现好:在诸多实验中,使用 Swish 函数的模型在复杂任务上展现出比使用传统激活函数(如 ReLU )更好的性能,能够提升模型的准确率和泛化能力。
- 平滑连续:Swish 函数在整个定义域内平滑且连续可导,这使得在基于梯度的优化算法(如随机梯度下降)中,梯度的计算和传播更加稳定,有利于模型的训练。
- 缺点
- 计算成本较高:由于 Swish 函数包含 Sigmoid 函数运算,相比于简单的 ReLU 函数,其计算复杂度更高,在处理大规模数据和深度神经网络时,会增加模型训练和推理的时间成本。
ELU函数
数学表达式
ELU(Exponential Linear Unit)函数的数学表达式为:
f
(
x
)
=
{
x
,
if
x
≥
0
α
(
e
x
−
1
)
,
if
x
<
0
f(x)= \begin{cases} x, & \text{if } x \geq 0 \\ \alpha (e^{x}- 1), & \text{if } x < 0 \end{cases}
f(x)={x,α(ex−1),if x≥0if x<0
其中
α
\alpha
α 是一个大于 0 的超参数,通常取值为 1。该函数在
x
x
x 大于等于 0 时为线性函数,在
x
x
x 小于 0 时为指数函数。
函数图像
运行以下 Python 代码可绘制 ELU 函数图像:
import numpy as np
import matplotlib.pyplot as plt
alpha = 1
def elu(x):
return np.where(x >= 0, x, alpha * (np.exp(x) - 1))
x = np.linspace(-5, 5, 400)
y = elu(x)
plt.plot(x, y)
plt.title('ELU Function')
plt.xlabel('x')
plt.ylabel('ELU(x)')
plt.grid(True)
plt.show()
ELU 函数的图像由两部分组成。当 x ≥ 0 x \geq 0 x≥0 时,图像是一条斜率为 1 的直线;当 x < 0 x < 0 x<0 时,图像是一个指数增长的曲线,且趋近于 − α -\alpha −α 。
主要作用
- 缓解梯度消失问题:在负半轴,ELU 函数采用指数形式,使得当 x x x 为负数时也能有非零的梯度,避免了像 ReLU 函数那样在负半轴梯度为零导致神经元“死亡”的问题,从而在训练过程中能更有效地更新参数,有助于缓解梯度消失。
- 输出具有非正的均值:与 ReLU 等函数相比,ELU 函数的输出均值更接近零,这有助于使输入数据的分布更加对称,在一定程度上加快了模型的收敛速度。
- 引入非线性:和其他激活函数一样,ELU 函数为神经网络引入了非线性因素,使网络能够学习和处理复杂的非线性关系,提升模型的表达能力。
导数性质
ELU 函数的导数为:
f
′
(
x
)
=
{
1
,
if
x
≥
0
α
e
x
,
if
x
<
0
f^\prime(x)= \begin{cases} 1, & \text{if } x \geq 0 \\ \alpha e^{x}, & \text{if } x < 0 \end{cases}
f′(x)={1,αex,if x≥0if x<0
在神经网络的反向传播过程中,这个导数用于计算误差关于神经元输入的梯度,以便更新网络的权重。
优缺点
- 优点
- 缓解梯度消失:在负半轴的指数形式使得梯度不会消失,保证了在整个定义域内都能进行有效的参数更新,尤其在深层网络中表现较好。
- 零均值输出:输出均值接近零,有利于优化算法的收敛,减少了训练过程中的波动,提高了模型的稳定性。
- 平滑性:函数在 x = 0 x = 0 x=0 处连续可导,避免了在该点出现梯度突变的问题,使得梯度计算更加稳定。
- 缺点
- 计算复杂度:由于在负半轴涉及指数运算,相比于 ReLU 等简单的激活函数,计算复杂度较高,会增加一定的计算时间和资源消耗。
- 超参数问题: α \alpha α 是一个需要手动调整的超参数,不同的取值可能会对模型性能产生较大影响,需要通过实验来确定合适的值,增加了调参的工作量。
线性激活函数
数学表达式
线性激活函数(也称为恒等激活函数)的数学表达式为:
f
(
x
)
=
x
f(x)=x
f(x)=x,其中
x
x
x 为输入值,该函数将输入值原样输出。
函数图像
运行以下 Python 代码可绘制线性激活函数图像:
import numpy as np
import matplotlib.pyplot as plt
def linear(x):
return x
x = np.linspace(-10, 10, 400)
y = linear(x)
plt.plot(x, y)
plt.title('Linear Activation Function')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid(True)
plt.show()
线性激活函数的图像是一条过原点且斜率为 1 的直线,它表明输入和输出之间是完全的线性关系,图像上每一点的横坐标和纵坐标相等。
主要作用
- 简单数据拟合:在一些简单的线性回归问题中,如果数据本身呈现出线性关系,使用线性激活函数可以直接对数据进行拟合。例如,预测房屋价格与房屋面积之间的线性关系,此时线性激活函数可以帮助模型学习到这种线性映射。
- 多层线性模型的构建:在某些情况下,当我们希望构建一个多层的线性模型时,使用线性激活函数可以保持模型的线性特性。例如,在一些简单的金融风险评估模型中,可能只需要对不同的风险因素进行线性组合,线性激活函数就可以满足需求。
导数性质
线性激活函数的导数为:
f
′
(
x
)
=
1
f^\prime(x)=1
f′(x)=1。这意味着无论输入值
x
x
x 是多少,其导数始终为 1。在神经网络的反向传播过程中,这个导数性质使得梯度在传播过程中不会发生缩放,即梯度在每一层的传递过程中保持不变。
优缺点
- 优点
- 计算简单:由于函数形式非常简单,只需要将输入值直接输出,不需要进行复杂的计算,因此计算效率极高。在处理大规模数据时,这种简单的计算可以显著减少计算时间和资源消耗。
- 易于理解和解释:线性激活函数的线性特性使得模型的输出和输入之间的关系非常直观,很容易理解和解释。例如,在一个预测销售额的模型中,如果使用线性激活函数,那么输入特征对输出销售额的影响是直接的线性关系,便于分析和决策。
- 缺点
- 缺乏非线性表达能力:线性激活函数无法引入非线性因素,因此对于具有复杂非线性关系的数据,使用线性激活函数的模型无法很好地拟合数据。例如,在图像识别、自然语言处理等领域,数据往往具有高度的非线性特征,线性激活函数的模型表现会非常差。
- 深层网络无意义:在多层神经网络中,如果每一层都使用线性激活函数,那么无论网络有多少层,整个网络的输出仍然是输入的线性组合,相当于一个单层的线性模型。这是因为多个线性变换的组合仍然是线性变换,无法发挥深度神经网络的优势来学习复杂的模式。