激活函数 SiLU 和 Swish 都是 深度学习 中用于神经网络中的非线性激活函数,旨在增强模型的表达能力和训练性能。实际上,SiLU(Sigmoid Linear Unit)和 Swish 本质上是同一个激活函数的两种不同名称。

1. SiLU 与 Swish

  • SiLU(Sigmoid Linear Unit)最早是由 Google 的研究人员提出的,它是 Sigmoid 和 线性 函数的组合。SiLU 的数学表达式为:SiLU(x)=x⋅σ(x)其中,σ(x) 是 Sigmoid 函数:σ(x)=11+e−x
  • Swish 是 SiLU 的另一个名字,尤其是在 Google 提出的论文中被称为 Swish 函数。Swish 与 SiLU 完全相同,表达式一样,只是在不同文献中用不同的名字。
    • Swish 的定义也是:
    Swish(x)=x⋅σ(x)因此,SiLU 和 Swish 实际上是同一个激活函数,不同的名称反映了不同的背景和应用场景。

2. SiLU / Swish 函数的数学表达式

SiLU 或 Swish 激活函数的形式可以写成:Swish(x)=x⋅σ(x)=x1+e−x

这里的 Sigmoid 函数 σ(x) 使得 SiLU 函数具有非线性特性,而 x 则是输入值。SiLU 函数将输入值 x 与 Sigmoid 函数的输出相乘,从而对其进行变换,得到了一个平滑的激活函数。

3. SiLU / Swish 的特性

  • 平滑性:SiLU 比 ReLU 更平滑,因为它不会像 ReLU 那样在负值域直接“消失”或变成零。SiLU 在负输入时仍然有非零输出,并且梯度是平滑的。
  • 非线性:SiLU 是非线性的,它结合了 Sigmoid 和线性部分,因此它能够学习复杂的特征。这使得 SiLU 在深层神经网络中比 ReLU 更加有效。
  • 避免死神经元问题:ReLU 的一个问题是它会在输入值小于零时输出零,这可能导致一些神经元在训练过程中变成“死神经元”,即不再更新。SiLU 不会这样,因为它的输出是平滑的,负值输入仍会输出较小的值,而不是零。
  • 无上限:SiLU 和 ReLU 一样,当输入值大时,输出会随着输入值增大而增大,因此没有上限,适合处理大规模的数据。

4. SiLU / Swish 与其他激活函数的比较

  • 与 ReLU 比较
    • ReLU:ReLU(x)=max⁡(0,x)
      • ReLU 会在负输入时输出零,可能导致“死神经元”问题。
      • 在深层网络中,ReLU 的平滑性较差,容易导致梯度消失。
    • SiLU / Swish:SiLU 是平滑的,避免了 ReLU 的死神经元问题,并且能够提供更稳定的训练过程。
  • 与 Sigmoid 比较
    • Sigmoid:σ(x)=11+e−x
      • Sigmoid 输出范围在 [0,1],适用于二分类问题,但可能会导致梯度消失,尤其在深度网络中不太有效。
    • SiLU / Swish:与 Sigmoid 相比,SiLU 的输出范围没有上限,并且 SiLU 的计算方式使得它对梯度消失问题的容忍度更高。
  • 与 Tanh 比较
    • Tanh:Tanh(x)=ex−e−xex+e−x
      • Tanh 的输出范围是 [−1,1],也是一种常见的非线性激活函数,但它也容易导致梯度消失,特别是在深层网络中。
    • SiLU / Swish:SiLU 是平滑的,避免了梯度消失问题,同时它的计算比 Tanh 更简单,因为没有指数项。

5. SiLU / Swish 的优点

  • 训练过程稳定:SiLU 提供了平滑的梯度,帮助网络避免梯度消失的问题,因此可以加速训练过程。
  • 增强了模型的表达能力:SiLU 是非线性的,能够捕捉复杂的模式,比传统的 ReLU 更具有表达能力。
  • 解决死神经元问题:在 ReLU 中,输入小于零的神经元会“死掉”,即不再更新,但 SiLU 不会出现这种问题,因为它在负输入时仍会输出小的非零值。
  • 支持深度网络:SiLU 的平滑性使得它在深层神经网络中表现得更好,特别是对于非常深的网络和复杂的任务。

6. SiLU / Swish 在深度学习中的应用

  • 图像分类:SiLU / Swish 激活函数被广泛应用于图像分类任务,尤其是在像 ResNet、DenseNet 这样的网络结构中,可以提高训练的稳定性。
  • 自然语言处理:在 NLP 任务中,SiLU / Swish 也显示出很好的效果,例如在 BERT 等预训练模型中,使用 SiLU 激活函数能够提高模型的性能。
  • 生成模型:在 GAN(生成对抗网络)和其他生成模型中,SiLU 由于其平滑的特性,能够帮助模型更好地生成高质量的样本。

7. 在 PyTorch 和 TensorFlow 中使用 SiLU

  • PyTorch 中使用 SiLU
    PyTorch 提供了一个内置的 SiLU 激活函数,使用起来非常简单:import torch import torch.nn as nn silu = nn.SiLU() # 定义 SiLU 激活函数 x = torch.randn(5) # 输入张量 output = silu(x) # 应用 SiLU 激活 print(output)
  • TensorFlow 中使用 SiLU
    TensorFlow 也提供了 SiLU 激活函数,可以通过 tf.keras.activations.silu 来使用:import tensorflow as tf x = tf.random.normal([5]) # 输入张量 output = tf.keras.activations.silu(x) # 应用 SiLU 激活 print(output)

8. 总结

  • SiLU(Swish) 是一种结合了 Sigmoid 和线性函数的平滑激活函数,相较于 ReLU 和 Sigmoid,它具有更好的平滑性、表达能力和训练稳定性。
  • 它可以有效避免死神经元问题,减少梯度消失,并且在深层神经网络中提供更稳定的训练过程。
  • SiLU 在许多深度学习任务中,特别是在图像分类、NLP 和生成模型中,表现出了优秀的性能。

如果你在深度学习中遇到训练不稳定的问题,可以尝试使用 SiLU 激活函数,它可能会提升模型的效果。