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,尤其是在更深的网络中其优势更为明显。

© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


