Swish激活函数:深度学习中的自适应门控激活机制
本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!
1 Swish激活函数概述
Swish是一种自适应激活函数,由Google Research团队在2017年提出,其基本形式定义为f(x) = x · σ(x)
,其中σ表示sigmoid函数。Swish的设计受到了长短期记忆网络(LSTM) 和高速公路网络(highway network) 中使用sigmoid函数进行门控的启发。作为一种自门控激活函数,Swish使用相同的标量输入进行门控计算,简化了门控机制的同时保持了强大的表达能力。
Swish激活函数具有光滑性、非单调性和无上界有下界的特点。与传统的ReLU激活函数相比,Swish在所有点都是平滑可导的,这有助于优化过程的稳定性。当输入为负值时,Swish会产生小幅负输出而不是像ReLU那样直接截断为零,这种特性可能有助于保持信息的流动。
大量实验表明,Swish在深度神经网络中表现出色,在ImageNet数据集上,Swish为Mobile NASNet-A带来了0.9% 的top-1准确率提升,为Inception-ResNet-v2带来了0.6% 的提升。Swish的简单性和与ReLU的相似性使其能够轻松替换现有网络中的激活函数,无需改变模型的隐藏容量或参数数量。
本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!
往期文章推荐:
- 20.康威生命游戏:零玩家游戏的元胞自动机奇迹
- 19.梯度范数:概念、性质、应用与算法实现
- 18.LSTM:长短期记忆网络的原理、演进与应用
- 17.古德-杰弗里斯悖论:贝叶斯统计中的先验选择难题
- 16.BRLESC计算机:美国弹道研究实验室的科学计算先驱
- 15.磁带记录仪:从磁带到数字的数据存储之旅
- 14.振荡器:从基础原理到大模型计算的时钟心脏
- 13.SuperGLUE:自然语言理解的挑战与进步
- 12.奇异值:数据科学的数学基石与应用核心
- 11.GLUE:自然语言理解评估的黄金基准
- 10.MMLU:衡量大语言模型多任务理解能力的黄金基准
- 9.低秩矩阵:揭示高维数据中的简约之美
- 8.低秩分解技术:从理论到应用的全方位解读
- 7.DROP:挑战机器离散推理能力的阅读 comprehension 基准
- 6.Frank-Wolfe算法:深入解析与前沿应用
- 5.SQuAD:机器阅读理解领域的里程碑数据集
- 4.图灵完备性:计算理论的基石与无限可能
- 3.CrowS-Pairs:衡量掩码语言模型中社会偏见的挑战数据集
- 2.Pairwise排序损失:让机器学会排序的艺术
- 1.Winogender:衡量NLP模型性别偏见的基准数据集
2 历史背景与发展历程
Swish激活函数的发展经历了几个重要阶段。它最初作为Sigmoid-weighted Linear Unit (SiLU) 在2016年的GELU论文中被提出。2017年,该函数在强化学习领域被重新提出为Sigmoid-weighted Linear Unit (SiL)。2017年末,Google Research团队的Prajit Ramachandran、Barret Zoph和Quoc V. Le通过自动搜索技术重新发现了这一激活函数,并将其命名为Swish。
Google团队使用自动机器学习技术搜索最佳激活函数,通过结合穷尽搜索和强化学习方法,发现了多个表现优异的激活函数。研究结果表明,复杂的激活函数性能通常不如简单的激活函数,最佳激活函数可以用1或2个核心单元表示。优秀的激活函数通常具有共同结构:使用原始预激活x作为最终二进制函数的输入,即b(x, g(x))。
Swish与其他激活函数的关系十分有趣。当Swish中的参数β=1时,Swish等价于SiLU激活函数。当β=0时,Swish退化为线性函数f(x) = x/2。当β→∞时,Swish趋近于ReLU函数。这种灵活性使Swish能够平滑地在线性函数和ReLU函数之间进行插值。
表:Swish发展历程主要事件
年份 | 事件 | 贡献者 | 名称 |
---|---|---|---|
2016 | 首次提出 | Hendrycks等 | SiLU |
2017 | 强化学习应用 | Elfwing等 | SiL |
2017 | 自动搜索发现 | Google Research | Swish |
3 Swish的核心概念
3.1 数学定义
Swish激活函数的数学定义为:
f(x) = x · σ(x)
其中σ(x)是sigmoid函数,定义为:
σ(x) = 1 / (1 + e⁻ˣ)
Swish也可以定义为参数化版本,引入可调节的参数β:
f(x) = x · σ(βx)
参数β控制着函数的形状:当β=0时,函数变为线性函数f(x) = x/2;当β=1时,函数变为标准Swish/SiLU;当β→∞时,函数趋近于ReLU。
3.2 导数计算
Swish的导数计算如下:
f’(x) = σ(βx) + βx · σ(βx)(1 - σ(βx))
对于最常用的SiLU(β=1的情况),导数公式简化为:
f’(x) = σ(x)(1 + x(1 - σ(x)))
Swish的导数具有几个重要特性:在x=0处的值为1/2;在某些区域可以大于1,这使得梯度在反向传播时可能被放大;导数是平滑的,有助于优化过程的稳定性。
3.3 门控机制解释
Swish的设计受到门控机制的启发。在LSTM和高速公路网络中,sigmoid函数用于控制信息流动的量。Swish采用自门控机制,使用相同的标量输入进行门控,而不是像传统门控那样需要多个标量输入。这种自门控特性使Swish能够轻松替换以单个标量作为输入的激活函数(如ReLU),而无需改变隐藏容量或参数数量。
4 Swish的特性与优势分析
4.1 平滑性与非单调性
Swish是一个平滑函数,在所有点都是连续可导的。这与ReLU不同,ReLU在x=0处不可导。平滑性有助于优化过程的稳定性,使训练更加顺畅。
Swish还是一个非单调函数,当x<0时,函数曲线先下降后上升,这与大多数传统激活函数不同。非单调性可能是Swish表现优异的一个重要原因,尽管这一特性的确切影响尚不完全清楚。
4.2 无界性与有界性
Swish无上界但有下界。当x→∞时,Swish→∞;当x→-∞时,Swish→0。无界性有利于防止在训练缓慢时梯度逐渐趋于0,造成饱和问题。同时,有下界的特性提供了较强的正则化效果,较大的负输入会被化解。
4.3 与ReLU的对比
与ReLU相比,Swish有几个重要区别:
- 平滑性:Swish在所有点都是平滑的,而ReLU在x=0处不可导
- 负值区域:Swish允许少量负值通过,这可能有助于信息流动
- 有界性:当x→-∞时,Swish趋近于0,而不是像ReLU那样直接截断
这些特性使Swish在多数情况下能够比ReLU取得更好的性能,尤其是在深层网络中。
4.4 与GELU的对比
GELU(Gaussian Error Linear Units)是另一种与Swish相似的激活函数,定义为GELU(x) = x · Φ(x),其中Φ(x)是标准正态分布的累积分布函数。
Swish和GELU有一些共同点:
- 都是平滑函数
- 都可以看作是输入值被某个概率函数加权的结果
- 在实际应用中性能相近
主要区别包括:
- 计算复杂度:Swish的计算相对更简单
- 概率解释:GELU使用高斯分布,而Swish使用Sigmoid函数
- 参数化:Swish引入了可学习参数β
表:Swish与其他激活函数特性比较
特性 | Swish | ReLU | GELU | Sigmoid |
---|---|---|---|---|
平滑性 | 是 | 否 | 是 | 是 |
单调性 | 否 | 是 | 否 | 是 |
无上界 | 是 | 是 | 是 | 否 |
有下界 | 是 | 否 | 是 | 否 |
计算复杂度 | 中等 | 低 | 高 | 中等 |
5 Swish的应用实践
5.1 计算机视觉中的应用
Swish在计算机视觉任务中表现出色。在ImageNet数据集上,Swish为Mobile NASNet-A带来了0.9% 的top-1准确率提升,为Inception-ResNet-v2带来了0.6% 的提升。Swish特别适合与局部响应归一化结合使用,并且在40层以上的全连接网络中,Swish的效果远优于其他激活函数。
研究表明,Swish在更深的神经网络中优势更加明显。在40层全连接网络之内,Swish与其他激活函数的性能差距不明显,但在更深层的网络中,Swish表现出显著优势。
5.2 自然语言处理中的应用
在自然语言处理领域,Swish也取得了成功应用。Swish的变体SwishGLU成为了LLaMA系列模型FFN层的首选激活函数。SwishGLU结合了Swish激活函数和门控线性单元(GLU),定义为:
SwishGLU(x) = Swish(xW + b) ⊙ (xV + c)
其中⊙表示元素级乘法,W和V是权重矩阵。
5.3 实现方式
在大多数深度学习框架中,Swish的实现非常简单。在TensorFlow中,Swish可以通过一行代码实现:
# TensorFlow 实现
import tensorflow as tf
def swish(x):return x * tf.sigmoid(x)
或者直接使用内置函数:
# 使用TensorFlow内置Swish
tf.nn.silu(features, beta=1.0) # Silu是Swish的别名
在PyTorch中,Swish的实现也很简单:
# PyTorch 实现
import torch
def swish(x):return x * torch.sigmoid(x)
5.4 使用技巧
在使用Swish时,有几个实用技巧值得注意:
- 如果使用BatchNorm,应设置缩放参数(scale parameter)。由于ReLU是分段线性函数,一些高级库默认关闭缩放参数,但这种设置不适用于Swish
- 在训练Swish网络时,稍微降低用于训练ReLU网络的学习率效果很好
- 参数β可以作为可训练参数,让网络自动学习最佳值
本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!