深度学习中常用激活函数介绍
在深度学习中,激活函数的作用主要是引入非线性特性,提高模型的表达能力。具体如下:
- 解决线性不可分问题:激活函数可以将输入特征的复杂度提升,使得神经网络能够处理非线性问题,从而增强网络的分类和回归能力。
- 决定神经元激活状态:激活函数决定了某个神经元是否被激活,即输出值是否有用。这有助于网络学习到更加复杂的数据模式。
- 反向传播算法的基础:激活函数是实现反向传播算法的基础,它允许误差从输出层向输入层传递,使得网络能够通过梯度下降等方法进行有效的权重更新。
- 增加模型的非线性:通过引入非线性激活函数,可以构建更深的网络结构,使模型能够捕捉到数据的深层次特征。
- 影响网络的训练和预测:不同的激活函数具有不同的性质,如饱和性、单调性等,这些性质会影响神经网络的收敛速度和泛化能力。
激活函数的选择:
- 理解任务需求:
- 对于分类问题,尤其是二分类问题,Sigmoid 函数是一个不错的选择,因为它可以将输出压缩到0和1之间,表示概率。
- 对于多分类问题,Softmax 函数通常用于输出层,它可以将多个神经元的输出归一化为概率分布。
- 考虑网络架构:
- 对于深度神经网络,ReLU及其变体(如Leaky ReLU、Parametric ReLU)通常是首选,因为它们能够有效缓解梯度消失问题,加速网络训练。
- 在循环神经网络(RNN)中,Tanh 或 LSTM单元可能更合适,因为它们能够更好地处理序列数据。
- 实验验证:
- 不同的激活函数在不同的数据集上表现各异。最佳实践是通过交叉验证来测试不同激活函数的表现,从而选择最适合你模型的那个。
- 注意激活函数的性质:
- 考虑到激活函数的饱和性,Sigmoid 和 Tanh 函数在输入值非常大或非常小的时候会饱和,这可能导致梯度消失问题。
- ReLU函数在输入值为负时输出为零,这可能会导致某些神经元在训练过程中失活,即所谓的"死亡ReLU"现象。
常见激活函数如下:
1. Sigmoid
sigmoid函数将输入变换为(0,1)上的输出。它将范围(-inf,inf)中的任意输入压缩到区间(0,1)中的某个值:
优点:
- Sigmoid函数的输出范围是(0,1),这使得它可以用作输出层,为分类问题提供概率估计。
- Sigmoid函数容易求导,这使得在反向传播过程中可以轻松计算梯度。
- Sigmoid函数具有非线性特性,可以引入非线性因素,使神经网络能够更好地学习和表示复杂的模式。
缺点:
- Sigmoid函数存在饱和性问题,当输入的数值过大或过小,函数的梯度会变得非常小,这可能导致训练过程中的梯度消失问题。
- Sigmoid函数的输出不是以0为中心的,这可能会影响某些任务的数值稳定性,例如在二元分类问题中。
- Sigmoid函数对输入的数值范围非常敏感,如果输入的数值范围过大或过小,都可能影响模型的训练效果。
公式: S i g m o i d ( x ) = 1 1 + e − x Sigmoid(x) = \frac{1}{1 + e^{-x}} Sigmoid(x)=1+e−x1
2. LogSigmoid
优点:
- 平滑性:与Sigmoid相似,LogSigmoid激活函数也是平滑的,这有助于减少模型训练时的梯度消失问题。
- 输出范围:LogSigmoid的输出范围是(0,1),这使得它非常适合用作神经网络的输出层,特别是在二分类问题中。
- 易求导:LogSigmoid函数的求导相对容易,这使得在模型训练过程中进行反向传播变得简单。
缺点:
- 不是以0为中心:与Sigmoid函数一样,LogSigmoid的输出不是以0为中心的,这可能导致一些数值稳定性问题。
- 饱和性问题:与Sigmoid函数一样,LogSigmoid也存在饱和性问题,即在某些输入下,函数的梯度变得非常小,这可能导致训练困难。
公式: L o g S i g m o i d ( x ) = l o g ( 1 1 + e − x ) LogSigmoid(x) = log(\frac{1}{1 + e^{-x}}) LogSigmoid(x)=log(1+e−x1)
3. Tanh
tanh函数将输入变换为(0,1)上的输出。它将范围(-inf,inf)中的任意输入压缩到区间(0,1)中的某个值:
优点:
- 输出范围:Tanh的输出始终在-1到1之间,这使得它在某些应用中能够提供更好的数值稳定性。
- 计算效率:Tanh函数的计算相对简单,因此它在一些硬件上可能有更好的计算效率。
- 非线性:Tanh是一种非线性函数,能够增强神经网络的表达能力。
缺点:
- 不是以0为中心:Tanh的输出不是以0为中心,这可能导致一些数值稳定性问题。
- 梯度消失问题:与Sigmoid函数类似,Tanh也存在梯度消失问题。当梯度接近于0时,这会导致训练困难。
- 硬饱和问题:当输入值非常大或非常小的时候,Tanh可能会进入硬饱和区,导致梯度接近于0,从而影响模型的训练。
公式: T a n h ( x ) = 1 − e − 2 x 1 + e − 2 x Tanh(x) = \frac{1 - e^{-2x}}{1 + e^{-2x}} Tanh(x)=1+e−2x1−e−2x
4. ReLu
全称是Rectified Linear Unit。它在输入小于0时输出0,输入大于0时输出等于输入值。
优点:
- 计算速度快:由于ReLU激活函数在实现上只需要进行简单的阈值操作,因此计算速度非常快,适合用于大规模的神经网络。
- 缓解过拟合:ReLU具有稀疏性,能够有效缓解过拟合问题,提高模型的泛化能力。
- 增加非线性:ReLU具有非线性特性,能够增加神经网络的非线性表达能力,使得模型能够更好地学习和表示复杂的输入数据。
缺点:
- 负值不激活:ReLU在输入小于0时输出为0,这可能导致神经元在某些情况下无法被激活,从而影响模型的表达能力。
- 不稳定梯度:在训练过程中,ReLU的梯度可能会变得非常大或非常小,导致梯度爆炸或梯度消失问题,影响模型的训练效果。
- 不适合用于深度网络:在深度网络中,ReLU激活函数可能会导致神经元"死亡"问题,即某些神经元永远不会被激活,从而导致模型无法正确学习和表达数据。
公式: R e L u ( x ) = { x x > 0 0 x <= 0 ReLu(x)= \begin{cases} x& \text{x > 0}\\ 0& \text{x <= 0} \end{cases} ReLu(x)={x0x > 0x <= 0
5. LeakyReLu
LeakyReLU是一种改进的激活函数,相对于标准的ReLU函数,它引入了一个小的负斜率,使得在输入小于0的情况下,输出不再为0,而是有一个小的非零值。
优点:
- 解决神经元死亡问题:由于LeakyReLU允许负数通过,因此可以避免神经元死亡的问题。这有助于提高模型的表达能力,并减少模型训练时的梯度消失问题。
- 加速收敛速度:LeakyReLU由于允许负数通过,在训练过程中能够更快地达到收敛状态。这可以缩短模型的训练时间,提高训练效率。
- 增加非线性:LeakyReLU具有非线性特性,能够增加神经网络的非线性表达能力,使得模型能够更好地学习和表示复杂的输入数据。
缺点:
- 超参数调整:LeakyReLU引入了一个超参数负斜率,需要人工调整。调整不当可能会影响模型的训练效果和收敛速度。
- 计算量增加:由于LeakyReLU允许负数通过,因此相对于标准的ReLU函数,其计算量会有所增加。这可能会增加模型的训练时间和内存消耗。
- 不稳定性:LeakyReLU的负斜率值需要谨慎选择,如果设置不当,可能会导致模型训练不稳定或者出现其他问题。
公式: L e a k y R e L u ( x ) = { x x > 0 α ∗ x x <= 0 LeakyReLu(x)= \begin{cases} x& \text{x > 0}\\ \alpha * x& \text{x <= 0} \end{cases} LeakyReLu(x)={xα∗xx > 0x <= 0
6. PReLu
也称为Parametric ReLU。与LeakyReLU类似,PReLU也允许负数通过,但nn.PReLU的负斜率是一个可学习的参数,可以随着训练过程进行更新。
优点:
- 解决神经元死亡问题:与LeakyReLU一样,PReLU允许负数通过,可以避免神经元死亡的问题,提高模型的表达能力。
- 增加非线性:PReLU具有非线性特性,能够增加神经网络的非线性表达能力,使得模型能够更好地学习和表示复杂的输入数据。
- 可学习的参数:PReLU的负斜率是一个可学习的参数,随着训练过程进行更新。这有助于提高模型的泛化能力和训练效果。
缺点:
- 计算量增加:由于PReLU需要额外的参数来存储负斜率,因此相对于标准的ReLU函数,其计算量会有所增加。这可能会增加模型的训练时间和内存消耗。
- 超参数调整:虽然PReLU的负斜率是一个可学习的参数,但仍需要人工设定一个初始值。初始值的选择可能会影响模型的训练效果和收敛速度。
- 不稳定性:与LeakyReLU一样,PReLU的负斜率值需要谨慎选择,如果设置不当,可能会导致模型训练不稳定或者出现其他问题。
公式: P R e L u ( x ) = { x x > 0 α i ∗ x x <= 0 PReLu(x)= \begin{cases} x& \text{x > 0}\\ \alpha_i * x& \text{x <= 0} \end{cases} PReLu(x)={xαi∗xx > 0x <= 0
7. ELu
优点:
- 避免神经元死亡:与ReLU和LeakyReLU相比,ELU可以避免神经元死亡的问题。由于其负值区域的斜率为负,因此不会出现神经元完全不激活的情况。
- 更快收敛:ELU的梯度在输入为负值时相对较大,这有助于加快训练时的收敛速度。
- 实现非线性:ELU具有非线性特性,能够增加神经网络的非线性表达能力,使得模型能够更好地学习和表示复杂的输入数据。
- 避免梯度消失问题:ELU的输出梯度在输入为负值时较大,而在输入为正值时相对较小。这种特性有助于避免梯度消失问题,从而使得深层神经网络能够更好地训练和收敛。
缺点:
- 计算效率较低:由于ELU涉及到指数运算,相对于ReLU和LeakyReLU等线性运算,其计算效率较低。这可能会增加模型的训练时间和内存消耗。
- 参数设置问题:ELU涉及到两个可学习的参数,α和β。这两个参数的选择会对模型的训练效果和收敛速度产生影响,需要谨慎设置。
- 不稳定性:与ReLU和LeakyReLU相比,ELU的输出范围更大,因此其训练过程中可能会存在不稳定性问题。
公式: E L u ( x ) = { x x > 0 α i ∗ ( e x − 1 ) x <= 0 ELu(x) = \begin{cases} x& \text{x > 0}\\ \alpha_i * (e^x - 1)& \text{x <= 0} \end{cases} ELu(x)={xαi∗(ex−1)x > 0x <= 0
8. SeLu
全称为Scaled Exponential Linear Unit,是一种神经网络激活函数。
优点:
- 自归一化:SELU具有自归一化的特性,这意味着在训练过程中,神经网络的输入和输出会逐渐被归一化,使得网络的参数更新更加稳定。
- 避免梯度消失和爆炸:SELU的梯度在输入较小时较大,在输入较大时较小,这有助于避免梯度消失和梯度爆炸问题,使得深层神经网络能够更好地训练和收敛。
- 高效计算:相对于其他激活函数,SELU的计算效率较高,因为其涉及到的是简单的数学运算,不需要指数或对数运算。
缺点:
- 应用范围有限:虽然SELU具有自归一化的特性,但其在某些问题上的表现并不一定优于其他激活函数,因此其应用范围相对有限。
- 需要调整参数:SELU涉及到两个可学习的参数λ和γ,这两个参数的选择会对模型的训练效果和收敛速度产生影响,需要谨慎设置。
- 缺乏理论支持:SELU虽然在实际应用中表现良好,但其理论基础相对较弱,仍需要进一步的研究和探索。
公式: S e L u ( x ) = λ { x x > 0 α e x − α x <= 0 SeLu(x) = \lambda\begin{cases} x& \text{x > 0}\\ \alpha e^x - \alpha& \text{x <= 0} \end{cases} SeLu(x)=λ{xαex−αx > 0x <= 0
9. CeLu
优点:
- 避免梯度消失:CELU的梯度在输入较小时较大,有助于避免梯度消失问题,使得深层神经网络能够更好地训练和收敛。
- 连续可微:CELU是连续可微的,这意味着其可以在整个输入范围内进行微分,而不会出现梯度爆炸或梯度消失的问题。
- 计算效率高:CELU的计算过程相对简单,只需要进行指数运算和线性运算,因此其计算效率较高。
缺点:
- 参数设置问题:CELU涉及到两个可学习的参数β和α,这两个参数的选择会对模型的训练效果和收敛速度产生影响,需要谨慎设置。
- 无法解决梯度爆炸问题:虽然CELU可以避免梯度消失问题,但其无法解决梯度爆炸问题。在某些情况下,梯度可能会变得非常大,导致训练不稳定。
- 缺乏广泛应用:相对于其他激活函数,CELU的应用范围相对较窄,主要在一些特定的问题上使用。
公式: C e L u ( x ) = M a x ( 0 , x ) + M i n ( 0 , α ( e x α − 1 ) ) CeLu(x) = Max(0, x) + Min(0, \alpha(e^{\frac{x}{\alpha}} - 1)) CeLu(x)=Max(0,x)+Min(0,α(eαx−1))
10. GeLu
优点:
- 避免梯度消失:GELU的梯度在输入较小时较大,有助于避免梯度消失问题,使得深层神经网络能够更好地训练和收敛。
- 平滑性:GELU是一种平滑的激活函数,其输出在整个输入范围内变化较为平缓,有助于减少模型训练时的震荡和梯度爆炸问题。
- 高效计算:相对于其他激活函数,GELU的计算过程相对简单,只需要进行指数运算和线性运算,因此其计算效率较高。
缺点:
- 参数设置问题:GELU涉及到两个可学习的参数β和α,这两个参数的选择会对模型的训练效果和收敛速度产生影响,需要谨慎设置。
- 无法解决梯度爆炸问题:虽然GELU可以避免梯度消失问题,但其无法解决梯度爆炸问题。在某些情况下,梯度可能会变得非常大,导致训练不稳定。
- 缺乏广泛应用:相对于其他激活函数,GELU的应用范围相对较窄,主要在一些特定的问题上使用。
11. ReLu6
ReLU6 就是普通的ReLU但是限制最大输出为6,这是为了在移动端设备float16/int8的低精度的时候也能有很好的数值分辨率。
优点:
- 避免梯度爆炸:由于ReLU6限制了激活值的范围,因此可以有效地避免梯度爆炸问题,使得模型训练更加稳定。
- 计算效率高:如上所述,ReLU6的计算过程相对简单,因此可以提高模型的训练速度。
- 在某些问题上表现出色:在一些特定的问题上,例如图像分类和目标检测等任务,ReLU6表现出了良好的性能。
缺点:
- 限制了激活值的范围:由于ReLU6将激活值限制在[0,6]的范围内,可能会导致模型表达能力受限,影响模型的泛化能力。
- 无法解决梯度消失问题:虽然ReLU6可以避免梯度爆炸问题,但其无法解决梯度消失问题。在某些情况下,梯度可能会变得非常小,导致训练缓慢或者不收敛。
- 缺乏理论支持:相对于其他激活函数,ReLU6的理论基础相对较弱,缺乏深入的理论分析和证明。
12. SiLu
相对于ReLU函数,SiLU函数在接近零时具有更平滑的曲线,并且由于其使用了sigmoid函数,可以使网络的输出范围在0和1之间。这使得SiLU在一些应用中比ReLU表现更好,例如在语音识别中使用SiLU比ReLU可以取得更好的效果。
优点:
- 非线性表达能力:SiLU作为一种非线性激活函数,能够引入非线性特性,增加模型的表达能力,有助于提高模型的分类和回归性能。
- 平滑性:由于SiLU具有平滑的特性,可以缓解梯度消失或梯度爆炸问题,使得模型训练更加稳定。
- 计算效率高:SiLU的计算过程相对简单,具有较低的复杂度,可以加快模型的训练速度。
- 广泛应用:SiLU在许多深度学习模型中得到了广泛应用,如在图像分类、目标检测、语音识别等领域取得了良好的效果。
缺点:
- 缺乏理论支持:相对于其他激活函数,SiLU的理论基础相对较弱,缺乏深入的理论分析和证明。
- 需要调整参数:SiLU涉及到可学习的参数β,该参数的选择会对模型的训练效果和收敛速度产生影响,需要谨慎调整。
- 对输入的敏感性:SiLU对输入的敏感性较高,当输入数据的分布发生较大变化时,可能会导致模型性能下降。
公式: S i L u ( x ) = x 1 + e − x SiLu(x) = \frac{x}{1 + e^{-x}} SiLu(x)=1+e−xx
13. HardSwish
HardSwish是一种非线性激活函数,能够引入非线性特性,增加模型的表达能力。具有平滑的特性,其函数形式相对较为平滑,有助于缓解梯度消失或梯度爆炸问题。HardSwish的计算过程相对简单,具有较低的复杂度,可以提高模型的训练速度。
优点:
- 非线性表达能力:HardSwish作为一种非线性激活函数,能够引入非线性特性,增加模型的表达能力,有助于提高模型的分类和回归性能。
- 平滑性:由于HardSwish具有平滑的特性,可以缓解梯度消失或梯度爆炸问题,使得模型训练更加稳定。
- 计算效率高:HardSwish的计算过程相对简单,具有较低的复杂度,可以加快模型的训练速度。
- 避免数值溢出:相对于SiLU,HardSwish具有更好的数值稳定性,可以避免在训练过程中出现数值溢出的问题。
- 在嵌入式设备上的优势:由于HardSwish具有较低的计算复杂度,因此在嵌入式设备上使用时具有更好的性能和较低的功耗。
缺点:
- 缺乏理论支持:相对于其他激活函数,HardSwish的理论基础相对较弱,缺乏深入的理论分析和证明。
- 需要调整参数:虽然HardSwish的计算过程相对简单,但仍然涉及到可学习的参数β,该参数的选择会对模型的训练效果和收敛速度产生影响,需要谨慎调整。
- 对输入的敏感性:HardSwish对输入的敏感性较高,当输入数据的分布发生较大变化时,可能会导致模型性能下降。
公式: H a r d S w i s h ( x ) = { 0 x <= -3 x x >= 3 x ∗ ( x + 3 ) 6 -3 <= x <= 3 HardSwish(x)= \begin{cases} 0& \text{x <= -3}\\ x& \text{x >= 3}\\ x * \frac{(x + 3)}{6}& \text{-3 <= x <= 3} \end{cases} HardSwish(x)=⎩ ⎨ ⎧0xx∗6(x+3)x <= -3x >= 3-3 <= x <= 3
14. SoftPlus
特点是函数图像以0为渐近线,并在大于0的部分类似于ReLU函数。计算过程相对简单,具有较低的复杂度,可以提高模型的训练速度。
优点:
- 平滑性:由于SoftPlus函数图像以0为渐近线,因此其导数在输入为0时为1,可以避免ReLU中存在的神经元"死亡"问题。
- 计算效率高:SoftPlus的计算过程相对简单,具有较低的复杂度,可以加快模型的训练速度。
- 应用广泛:SoftPlus在许多深度学习模型中得到了广泛应用,如在图像分类、目标检测、语音识别等领域取得了良好的效果。
缺点:
- 对输入的敏感性:SoftPlus对输入的敏感性较高,当输入数据的分布发生较大变化时,可能会导致模型性能下降。
- 缺乏理论支持:相对于其他激活函数,SoftPlus的理论基础相对较弱,缺乏深入的理论分析和证明。
- 存在偏移现象:由于SoftPlus的函数图像以0为渐近线,因此存在偏移现象,这可能会对模型的性能产生影响。
公式: S o f t P l u s ( x ) = l o g ( 1 + e x ) SoftPlus(x) = log(1 + e^x) SoftPlus(x)=log(1+ex)
15. Mish
Mish是一种自正则化的非单调神经激活函数,与传统的激活函数(如ReLU、Sigmoid等)不同,Mish是一种非单调函数。这种非单调性可以帮助模型更好地捕获数据的复杂模式。Mish的输出范围是无界的,这有助于避免梯度饱和问题,使模型在训练过程中具有更好的梯度传播性能。Mish在整个输入范围内都是平滑的,这有助于减少模型训练时的梯度噪声,使模型更加稳定。Mish具有一定的自正则化效果,这有助于减少模型过拟合的风险,提高模型的泛化能力。
优点:
- 表达能力:由于nn.Mish具有非单调性和无界性,它能够为模型提供更强大的表达能力,有助于模型学习更复杂的特征表示。
- 训练稳定性:nn.Mish的平滑性有助于减少训练过程中的梯度噪声,使模型训练更加稳定,降低梯度消失或梯度爆炸的风险。
- 泛化能力:nn.Mish的自正则化效果有助于减少模型过拟合,提高模型在未见数据上的泛化能力。
缺点:
- 计算成本:相较于一些简单的激活函数(如ReLU),nn.Mish的计算成本较高,因为它涉及到指数运算和乘法运算。这可能导致模型训练和推理速度相对较慢。
- 参数调整:虽然nn.Mish在许多情况下表现良好,但仍需要针对特定任务进行参数调整。这可能增加了模型优化的复杂性。
- 缺乏理论支持:尽管nn.Mish在实验中表现出色,但其理论基础相对较弱。目前尚缺乏深入的理论分析来证明其在各种场景下的优越性。
公式: M i s h ( x ) = x ∗ T a n h ( l o g ( 1 + e x ) ) Mish(x) = x * Tanh(log(1 + e^x)) Mish(x)=x∗Tanh(log(1+ex))