Swish 激活函数的定义

Swish 激活函数由 Google Brain 团队提出,其数学表达式为:
$f(x) = x \cdot \sigma(\beta x)$
其中 $\sigma$ 是 Sigmoid 函数,$\beta$ 是可学习的参数或固定超参数。当 $\beta=1$ 时,Swish 退化为原始形式;$\beta=0$ 时等效于线性函数 $f(x)=x/2$。


自门控机制原理

Swish 的核心特性是自门控(Self-Gated),即输入 $x$ 通过 Sigmoid 函数生成一个介于 $(0,1)$ 的权重,动态缩放原始输入。这种机制与 LSTM 中的门控类似,但完全由输入自身驱动。

  • 动态调节:对于较大的正输入,Sigmoid 输出接近 1,Swish 近似线性;对于负输入,Sigmoid 输出接近 0,抑制神经元激活。
  • 平滑性:Swish 处处连续可导,且导数界于 $(0,1.1]$,利于梯度传播。

关键特性

  1. 无界性
    Swish 在正区间无上界,可避免类似 ReLU 的神经元“死亡”问题。

  2. 非单调性
    虽然整体趋势单调,但小负值区域存在轻微下降($\beta>0$ 时),可能增强表达能力。

  3. 导数特性
    导数公式为:
    $f'(x) = \sigma(\beta x) + \beta x \cdot \sigma(\beta x)(1-\sigma(\beta x))$
    梯度不易消失,且存在自调整效应。


PyTorch 实现示例

import torch
import torch.nn as nn

class Swish(nn.Module):
    def __init__(self, beta=1.0, trainable=False):
        super().__init__()
        if trainable:
            self.beta = nn.Parameter(torch.tensor(beta))
        else:
            self.beta = beta

    def forward(self, x):
        return x * torch.sigmoid(self.beta * x)


与 ReLU 的对比优势

  • 训练稳定性:Swish 的平滑性使得损失曲面更平缓,初始训练速度可能慢于 ReLU,但后期收敛更稳。
  • 模型泛化:实验显示在深层网络中(如 ResNet-152),Swish 相比 ReLU 能提升约 0.5-1% 的准确率。
  • 鲁棒性:对超参数 $\beta$ 不敏感,通常固定为 1 即可。

注意事项

  • 计算成本:因包含 Sigmoid 运算,比 ReLU 慢约 20-30%。
  • 初始化建议:使用标准初始化(如 Kaiming)时需注意 $\beta$ 的尺度,过大可能导致梯度爆炸。

更多推荐