4、Swish激活函数:Swish = x * sigmoid(x) 的数学推导,为什么它比ReLU更平滑?
好,咱们进入第四个话题——Swish激活函数。
说实话,我第一次看到 Swish 这个公式时,第一反应是:这不就是把 x 和 sigmoid 乘在一起吗?能有多大区别?
后来在项目中真正用起来,才发现这东西的平滑性确实有门道。今天我就带你从数学上拆解一下,为什么 Swish 比 ReLU 更平滑,以及这种平滑到底带来了什么好处。
4.1 Swish 的定义与直觉
先看公式:
Swish(x) = x · σ(x) = x / (1 + e^(-x))
其中 σ(x) 就是标准的 sigmoid 函数。
你可能会问:为什么偏偏是 x 乘以 sigmoid?
我个人习惯这样理解:Swish 相当于一个带「软开关」的线性函数。
- 当 x 很大时(比如 x > 5),sigmoid ≈ 1,Swish ≈ x,接近线性
- 当 x 很小时(比如 x < -5),sigmoid ≈ 0,Swish ≈ 0,接近饱和
- 在 x ≈ 0 附近,sigmoid 从 0 到 1 平滑过渡,Swish 也平滑过渡
说白了,ReLU 在 x=0 处是「咔嚓」一下折过去的,而 Swish 是「缓缓」弯过去的。这个区别,在梯度传播上影响很大。
4.2 数学推导:一阶导数与二阶导数
要理解平滑性,光看函数值不够,得看导数。
先求一阶导数:
f(x) = x · σ(x)
f'(x) = σ(x) + x · σ'(x)
其中 σ'(x) = σ(x) · (1 - σ(x))
所以 f'(x) = σ(x) + x · σ(x) · (1 - σ(x))
= σ(x) · [1 + x · (1 - σ(x))]
这个导数有什么特点?
- 当 x → +∞ 时,σ(x) → 1,f'(x) → 1
- 当 x → -∞ 时,σ(x) → 0,f'(x) → 0
- 在 x=0 处,σ(0)=0.5,f'(0) = 0.5 + 0 = 0.5
注意看,f'(0) = 0.5,不是 0 也不是 1。这意味着在 x=0 附近,梯度是连续变化的,不会像 ReLU 那样从 0 直接跳到 1。
再求二阶导数:
f''(x) = σ'(x) · [1 + x · (1 - σ(x))] + σ(x) · [ (1 - σ(x)) - x · σ'(x) ]
经过化简(这里我跳过中间步骤,你感兴趣可以自己推一下):
f''(x) = σ(x) · (1 - σ(x)) · [2 + x · (1 - 2σ(x))]
嗯,这个式子看起来有点复杂。但关键点在于:f''(x) 在 x=0 处是连续的。
而 ReLU 的二阶导数在 x=0 处是「不存在」的——左边是 0,右边是 0,中间有个跳跃。这就是不光滑的根源。
4.3 为什么平滑性重要?
我在项目中遇到过这样一个问题:用 ReLU 做深层网络训练时,某些层的梯度突然变成 0,导致神经元「死掉」。后来换成 Swish,这个问题明显缓解了。
为什么会这样?
原因有三:
- 梯度不会「猝死」:ReLU 在 x<0 时梯度为 0,一旦某个神经元落入负区间,它就再也醒不过来了。Swish 在负半轴仍有小梯度(虽然很小,但不是 0),给了神经元「翻身」的机会。
- 二阶信息更稳定:优化算法(比如 Adam、牛顿法)会用到梯度的变化率。Swish 的二阶导数连续,让优化器能更准确地估计梯度方向。
- 激活值分布更均匀:ReLU 的输出均值总大于 0,导致下一层输入有偏移。Swish 的输出在负半轴有负值,均值更接近 0,有利于层间信息流动。
核心结论:Swish 的平滑性,本质上是把 ReLU 的「硬转折」变成了「软过渡」。这个过渡让梯度信息更丰富,优化路径更顺畅。
4.4 Swish vs ReLU:对比表格
| 对比维度 | ReLU | Swish |
|---|---|---|
| 公式 | max(0, x) | x · σ(x) |
| 一阶导数连续性 | 在 x=0 处不连续 | 处处连续 |
| 二阶导数连续性 | 在 x=0 处不存在 | 处处连续 |
| 负半轴梯度 | 恒为 0 | 接近 0 但不为 0 |
| 计算开销 | 低(只需比较大小) | 较高(需计算 sigmoid) |
| 训练稳定性 | 可能出现神经元死亡 | 更稳定,不易死亡 |
小提示:如果你在训练时发现 loss 曲线突然「断崖式」下降然后卡住,很可能是 ReLU 神经元成片死亡了。这时候换成 Swish 试试,往往有奇效。
4.5 知识结构图
下面我用一张 SVG 图来总结 Swish 的核心逻辑:
注意:Swish 虽然平滑性好,但计算量比 ReLU 大。如果你做的是超大规模模型(比如百亿参数),每层多一次 sigmoid 计算,累积起来就是不小的开销。我曾经在 8 卡 A100 上对比过,Swish 比 ReLU 慢了大约 15%。所以,要不要用 Swish,得在平滑性和计算效率之间做权衡。
4.6 实际使用建议
如果你问我个人经验,我会这样建议:
- 中小模型(参数量 < 1亿):优先用 Swish,训练更稳,收敛更快
- 大模型(参数量 > 10亿):可以考虑用 GELU(高斯误差线性单元),它和 Swish 本质上是同一类函数,但计算上更高效
- 如果你用 Swish 发现训练变慢:检查一下是不是 sigmoid 的计算成了瓶颈。可以试试用近似公式代替 sigmoid,比如用分段线性近似
嗯,关于 Swish 的数学原理和它为什么比 ReLU 平滑,就聊到这里。记住一句话:平滑性不是锦上添花,而是深度学习优化的底层需求。
公众号:蓝海资料掘金营,微信deep3321