神经网络激活函数: ​​Swish

内容分享3周前发布
0 0 0

Swish 函数是深度学习领域中一个超级重大且高效的激活函数。是由谷歌的研究人员在 2017 年的一篇论文中提出的。

什么是 Swish 函数?

函数定义:swish(x) = x * σ(x)

其中:

  • x是输入值。
  • σ(x)是 Sigmoid 函数,计算公式为 σ(x) = 1 / (1 + e^(-x))。

所以,Swish 函数也可以写成:swish(x) = x / (1 + e^(-x))


函数图像

  • 形状: 它看起来像是一条平滑的曲线,与 ReLU 有些类似,但在原点 (x=0) 附近不是直角转折,而是有一个平滑的过渡。
  • 左侧: 当 x趋近于负无穷时,函数值趋近于 0,但不会等于 0(有“软”的底部,类似 Leaky ReLU)。
  • 右侧: 当 x趋近于正无穷时,函数值趋近于 x本身,行为类似线性函数。
  • 原点: 在 x=0处,swish(0) = 0 * σ(0) = 0 * 0.5 = 0。

关键特性平滑且非单调

  • 平滑: 它在整个定义域内都是可导的,没有像 ReLU 在零点那样的不可导点。
  • 非单调: 虽然函数整体是递增的,但其导数并不是永远为正。在 x为较大的负值时,函数值会略微下降到低于 0,然后再上升。

为什么 Swish 函数表现优异?(与 ReLU 对比)

特性

ReLU

Swish

优势解释

平滑性

不平滑(在 x=0 处不可导)

平滑(处处可导)

平滑性使得优化过程更稳定,梯度下降更顺畅。

负值处理

“Dead ReLU”问题: 输入为负时,梯度恒为0,神经元可能“死亡”且无法恢复。

“软”的底部: 输入为负时,输出为较小的负值,梯度不为零。

有效缓解了神经元死亡问题,让负区间的信息也能得到必定程度的保留和更新。

非单调性

单调

非单调(有小幅下降)

这个特性被认为可以增强模型的表达能力和优化效果,在某些情况下比单纯的单调函数更好。

上界

无上界

无上界

和 ReLU 一样,不会导致梯度饱和(与 Sigmoid/Tanh 相比)。

下界

有下界(为 0)

有“软”下界(可略低于 0)

软下界提供了更强的梯度流,可能使模型更容易训练。


优点

  • 无上界: 防止梯度在正区间饱和(解决 Sigmoid/Tanh 的问题)。
  • 有下界: 提供正则化效果,增加稳定性。
  • 平滑: 易于优化,梯度计算更稳定。
  • 缓解 Dead ReLU 问题: 负值输入仍有梯度,神经元利用率更高。

缺点与注意事项

  • 计算成本较高: 由于需要计算 Sigmoid 函数,它的计算量比 ReLU 大。虽然对于现代硬件来说一般不是大问题,但在极端追求效率的场景下仍需思考。
  • 非万能: 尽管在许多任务上表现优于 ReLU,但它并非在所有模型和数据集上都是最佳选择。ReLU 及其变体(如 Leaky ReLU, PReLU)依旧超级强劲且被广泛使用。

如何使用 Swish?

在现代主流深度学习框架中,Swish 一般已经作为内置函数提供。

  • TensorFlow / Keras:
from tensorflow.keras.activations import swish
# 或者在层中直接使用字符串
model.add(tf.keras.layers.Dense(128, activation='swish'))
  • PyTorch:
import torch.nn.functional as F
# PyTorch 中它被称为 SiLU (Sigmoid Linear Unit),与 Swish 是同一个函数
x = F.silu(x)
# 或者使用 nn 模块
import torch.nn as nn
self.activation = nn.SiLU()

实验结果

在原始论文和后续的大量实践中,Swish 函数在图像分类(如 ImageNet)、机器翻译、生成模型等众多任务上,持续地 表现优于或等同于 ReLU,尤其是在更深的网络中其优势更为明显。

神经网络激活函数: ​​Swish

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...