本文由「大千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技术!

往期文章推荐:

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技术!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐