3. Swish激活函数:数学定义、函数图像与一阶导数推导

好,咱们进入正题。Swish这个激活函数,说实话我第一次看到它的时候,第一反应是——这不就是带了个门的ReLU吗?后来仔细一琢磨,发现事情没那么简单。

我个人习惯把Swish看作是ReLU的“平滑版本”。它由Google Brain团队在2017年提出,论文里说它在深层网络上往往比ReLU表现更好。嗯,我在项目中确实验证过这一点,尤其是在Transformer类的模型里,Swish几乎成了标配。

3.1 数学定义

Swish的数学表达式非常简洁:

Swish(x) = x · σ(βx)

其中σ(x)就是标准的Sigmoid函数:

σ(x) = 1 / (1 + e^(-x))

这里的β是一个可学习的参数,或者是一个常数。当β=1时,就是我们最常见的Swish。当β趋近于无穷大时,Swish会退化成ReLU。当β=0时,Swish就变成了线性函数x/2。

核心要点:Swish的本质是“输入x”与“Sigmoid门控”的逐元素乘积。这个门控机制让网络可以自适应地决定每个神经元的信息流动。

3.2 函数图像分析

咱们来看看Swish长什么样。我直接画了个图,你感受一下:

Swish激活函数图像 (β=1) 0 -4 4 4 2 -2 Swish ReLU 负值区域有轻微输出 (非零饱和)

从图上你能看到几个关键特征:

  • 单侧有界性:当x→+∞时,Swish(x)≈x;当x→-∞时,Swish(x)→0。这一点和ReLU很像,但Swish在负半轴不是完全死掉的。
  • 非单调性:Swish在负半轴有一个“下凹再回升”的过程。具体来说,它在x≈-1.28处取得最小值,大约为-0.28。这个特性很有意思——它允许梯度在负半轴有微小的反向传播。
  • 平滑性:整个函数是无限可微的,不像ReLU在0点处有个“尖角”。

我的经验:曾经有个项目,用ReLU训练一个50层的ResNet,死活不收敛。换成Swish之后,loss曲线立马就顺了。后来分析发现,是因为某些层的输入分布偏移到了负半轴,ReLU直接砍掉了所有负值,导致梯度消失。Swish保留了负半轴的微小信号,反而救了整个网络。

3.3 一阶导数推导

好,接下来咱们动手推一下Swish的导数。这个推导其实不难,但有几个细节容易踩坑。

设f(x) = x · σ(x),其中σ(x) = 1/(1+e^(-x))。

根据乘积法则:

f'(x) = σ(x) + x · σ'(x)

现在需要求σ'(x)。Sigmoid的导数有一个非常优雅的形式:

σ'(x) = σ(x) · (1 - σ(x))

这个公式怎么来的?我简单推一下:

σ(x) = 1/(1+e^(-x))
σ'(x) = e^(-x) / (1+e^(-x))²
      = [1/(1+e^(-x))] · [e^(-x)/(1+e^(-x))]
      = σ(x) · [1 - σ(x)]

嗯,最后一步用到了1 - σ(x) = e^(-x)/(1+e^(-x))这个恒等式。

把σ'(x)代回去:

f'(x) = σ(x) + x · σ(x) · (1 - σ(x))
      = σ(x) · [1 + x · (1 - σ(x))]
      = σ(x) · [1 + x - x · σ(x)]

这就是Swish的一阶导数表达式。如果你觉得这个形式不够直观,可以写成另一种等价形式:

f'(x) = σ(x) + x · σ(x) · (1 - σ(x))
      = σ(x) + x · σ(x) - x · σ²(x)
      = σ(x) · (1 + x) - x · σ²(x)

重要结论:Swish的导数可以看作是一个“门控”版本的导数。当x很大时,σ(x)→1,f'(x)→1;当x很小(负很大)时,σ(x)→0,f'(x)→0。但在中间区域,导数有一个“隆起”,最大值出现在x≈1.28处,约为1.1。

3.4 导数图像与梯度特性

咱们再画个导数图看看:

Swish一阶导数图像 (β=1) 0 -4 4 1.0 0.5 y=1 最大值 ≈ 1.1 (在x≈1.28处) 最小值 ≈ 0 (在x→-∞处)

从导数图你能看出几个有意思的点:

  • 梯度不饱和:在正半轴,导数趋近于1,不会像Sigmoid那样饱和到0。这意味着深层网络的梯度可以顺畅地反向传播。
  • 负半轴有梯度:虽然很小,但毕竟不是0。这避免了ReLU的“神经元死亡”问题——那些输出为负的神经元仍然能接收到梯度信号。
  • 梯度隆起:在x≈1.28处,导数超过1,达到约1.1。这个“超线性”区域有助于加速收敛。

注意:虽然Swish的负半轴梯度非零,但数值很小(接近0)。如果你发现网络在训练初期loss下降很慢,可以检查一下是不是大量神经元的输出落到了负半轴。我曾经遇到过这种情况,后来通过调整初始化方式解决了。

3.5 与ReLU的梯度对比

咱们用表格直观对比一下:

特性 Swish ReLU
负半轴梯度 接近0但非零 严格为0
正半轴梯度 趋近于1 恒为1
0点处可导性 可导(光滑) 不可导(尖点)
梯度最大值 ≈1.1 1
神经元死亡风险

说白了,Swish在梯度流方面比ReLU更“温柔”。它不会一刀切地杀死负半轴的信号,而是给它们留了一条“小缝”。这个特性在深层网络中尤其重要——你想想看,50层网络,每层都砍掉一半信号,传到后面还剩多少?

我的建议:如果你在训练一个超过20层的网络,或者你的网络中有残差连接,我强烈建议试试Swish。虽然计算量比ReLU大一点(多了一次Sigmoid计算),但带来的收敛稳定性提升往往值得这个代价。

好,关于Swish的数学定义、图像和导数推导,咱们就聊到这儿。记住一句话:Swish的本质是“带自适应门控的线性单元”,它的梯度流特性让它成为深层网络的理想选择。


公众号:蓝海资料掘金营,微信deep3321