行莫
行莫
发布于 2025-12-26 / 24 阅读
0
0

常见的激活函数

常见的激活函数

目录

  1. 引言:激活函数的重要性
  2. 第一部分:经典激活函数
  3. 第二部分:新兴激活函数
  4. 第三部分:激活函数对比与选择
  5. 总结与回顾

引言:激活函数的重要性

激活函数的作用

激活函数是神经网络中的关键组件,它决定了:

  • 神经元是否激活:决定信号是否传递
  • 输出的范围:控制输出值的范围
  • 网络的非线性能力:让网络能够学习复杂模式
  • 梯度传播:影响反向传播中的梯度大小

为什么需要了解不同的激活函数?

不同的激活函数有不同的特性:

  • 计算效率:有些激活函数计算快,有些慢
  • 梯度特性:有些容易梯度消失,有些不会
  • 输出范围:适合不同的任务类型
  • 适用场景:不同的网络结构需要不同的激活函数

第一部分:经典激活函数

1.1 Sigmoid函数

函数定义

Sigmoid函数(S型曲线)是最早使用的激活函数之一:

$$
\sigma(x) = \frac{1}{1 + e^{-x}}
$$

函数图像特点

  • S型曲线,平滑连续
  • 输出范围:(0, 1)
  • 关于点(0, 0.5)对称
  • 单调递增

导数推导

第一步:写出函数

$$
\sigma(x) = \frac{1}{1 + e^{-x}} = (1 + e^{-x})^{-1}
$$

第二步:使用链式法则
设 $u = 1 + e^{-x}$,则 $\sigma(x) = u^{-1}$

$$
\frac{d\sigma}{dx} = \frac{d\sigma}{du} \cdot \frac{du}{dx}
$$

第三步:计算各部分导数

$$
\frac{d\sigma}{du} = -u^{-2} = -\frac{1}{(1 + e^{-x})^2}
$$

$$
\frac{du}{dx} = \frac{d}{dx}(1 + e^{-x}) = -e^{-x}
$$

第四步:组合结果

$$
\sigma'(x) = -\frac{1}{(1 + e^{-x})^2} \cdot (-e^{-x}) = \frac{e^{-x}}{(1 + e^{-x})^2}
$$

第五步:化简

$$
\sigma'(x) = \frac{e^{-x}}{(1 + e^{-x})^2} = \frac{1}{1 + e^{-x}} \cdot \frac{e^{-x}}{1 + e^{-x}}
$$

注意到:

  • $\frac{1}{1 + e^{-x}} = \sigma(x)$
  • $\frac{e^{-x}}{1 + e^{-x}} = \frac{e^{-x} + 1 - 1}{1 + e^{-x}} = 1 - \frac{1}{1 + e^{-x}} = 1 - \sigma(x)$

最终结果

$$
\sigma'(x) = \sigma(x)(1 - \sigma(x))
$$

导数特性分析

导数范围

  • 当 $x \to -\infty$ 时,$\sigma(x) \to 0$,$\sigma'(x) \to 0$
  • 当 $x = 0$ 时,$\sigma(0) = 0.5$,$\sigma'(0) = 0.5 \times 0.5 = 0.25$(最大值)
  • 当 $x \to +\infty$ 时,$\sigma(x) \to 1$,$\sigma'(x) \to 0$

结论:导数数值范围是 (0, 0.25),最大值为 0.25

有效输入范围分析

输出值有明显差异的范围

当输入值在 [-6, 6] 之间时:

  • $\sigma(-6) \approx 0.0025$(接近0)
  • $\sigma(6) \approx 0.9975$(接近1)
  • 输出值有明显差异

输出值有较好效果的范围

当输入值在 [-3, 3] 之间时:

  • $\sigma(-3) \approx 0.047$(接近0但可区分)
  • $\sigma(3) \approx 0.953$(接近1但可区分)
  • 输出值有比较好的效果

问题区域

  • 当输入值 < -6 或 > 6 时,输出值接近0或1,丢失部分信息
  • 导数接近0,网络参数更新极其缓慢,或者无法更新

优点

  1. 输出范围固定:(0, 1),适合表示概率
  2. 平滑可导:处处可导,适合梯度下降
  3. 单调递增:输入越大,输出越大
  4. 有界:输出不会无限大

缺点

  1. 梯度消失问题严重

    • 导数最大值为0.25
    • 在深层网络中,梯度会指数级衰减
    • 一般来说,sigmoid网络在5层之内就会产生梯度消失现象
  2. 激活值不是以0为中心的

    • 激活值总是偏向正数(输出范围0-1)
    • 导致梯度更新时,只会对某些特征产生相同方向的影响
    • 不利于优化
  3. 计算成本较高

    • 涉及指数运算,计算较慢
  4. 饱和问题

    • 当输入值很大或很小时,函数进入饱和区
    • 梯度接近0,参数难以更新

适用场景

主要用于

  • 二分类问题的输出层:输出概率值
  • 逻辑回归:作为输出层的激活函数

不推荐用于

  • 隐藏层:容易梯度消失
  • 深层网络:梯度消失问题严重
  • 需要快速训练的网络:计算成本高

1.2 Tanh函数

函数定义

Tanh函数(双曲正切函数)是Sigmoid的改进版:

$$
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
$$

另一种表示(通过Sigmoid表示):

$$
\tanh(x) = 2\sigma(2x) - 1 = \frac{2}{1 + e^{-2x}} - 1
$$

函数图像特点

  • S型曲线,平滑连续
  • 输出范围:(-1, 1)
  • 关于原点(0, 0)对称(零中心化)
  • 单调递增

导数推导

方法一:直接求导

$$
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
$$

使用商的导数法则:$\left(\frac{u}{v}\right)' = \frac{u'v - uv'}{v^2}$

设 $u = e^x - e^{-x}$,$v = e^x + e^{-x}$

$$
u' = e^x + e^{-x} = v
$$

$$
v' = e^x - e^{-x} = u
$$

$$
\tanh'(x) = \frac{u'v - uv'}{v^2} = \frac{v \cdot v - u \cdot u}{v^2} = \frac{v^2 - u^2}{v^2}
$$

展开:

$$
v^2 - u^2 = (e^x + e^{-x})^2 - (e^x - e^{-x})^2
$$

$$
= (e^{2x} + 2 + e^{-2x}) - (e^{2x} - 2 + e^{-2x}) = 4
$$

因此:

$$
\tanh'(x) = \frac{4}{(e^x + e^{-x})^2} = \frac{1}{\cosh^2(x)}
$$

方法二:通过Sigmoid表示

$$
\tanh(x) = 2\sigma(2x) - 1
$$

$$
\tanh'(x) = 2 \cdot \sigma'(2x) \cdot 2 = 4\sigma'(2x)
$$

$$
= 4\sigma(2x)(1 - \sigma(2x))
$$

注意到 $\sigma(2x) = \frac{1 + \tanh(x)}{2}$,代入得:

$$
\tanh'(x) = 4 \cdot \frac{1 + \tanh(x)}{2} \cdot \frac{1 - \tanh(x)}{2} = (1 + \tanh(x))(1 - \tanh(x))
$$

最终结果

$$
\tanh'(x) = 1 - \tanh^2(x)
$$

导数特性分析

导数范围

  • 当 $x \to -\infty$ 时,$\tanh(x) \to -1$,$\tanh'(x) \to 0$
  • 当 $x = 0$ 时,$\tanh(0) = 0$,$\tanh'(0) = 1$(最大值)
  • 当 $x \to +\infty$ 时,$\tanh(x) \to 1$,$\tanh'(x) \to 0$

结论:导数数值范围是 (0, 1],最大值为 1(比Sigmoid的0.25大4倍)。

优点

  1. 零中心化:输出范围(-1, 1),均值接近0,有利于优化
  2. 梯度特性更好:导数最大值是1,比Sigmoid的0.25大4倍
  3. 平滑可导:处处可导
  4. 单调递增:输入越大,输出越大

缺点

  1. 仍有梯度消失问题

    • 虽然比Sigmoid好,但在深层网络中仍可能梯度消失
    • 当输入值很大或很小时,导数接近0
  2. 计算成本较高

    • 涉及指数运算,计算较慢
  3. 饱和问题

    • 当输入值很大或很小时,函数进入饱和区

适用场景

主要用于

  • RNN/LSTM的隐藏层:在循环神经网络中仍有使用
  • 需要零中心化输出的场景:比Sigmoid更适合隐藏层

不推荐用于

  • 深层CNN:ReLU更适合
  • 需要快速训练的网络:计算成本高

1.3 ReLU函数及其变体

1.3.1 ReLU(修正线性单元)

函数定义

ReLU函数是目前最常用的激活函数:

$$
\text{ReLU}(x) = \max(0, x) = \begin{cases}
x & \text{if } x > 0 \
0 & \text{if } x \leq 0
\end{cases}
$$

函数图像特点

  • 在 $x > 0$ 时是线性函数 $y = x$
  • 在 $x \leq 0$ 时输出为0
  • 简单、高效

导数推导

$$
\text{ReLU}'(x) = \begin{cases}
1 & \text{if } x > 0 \
0 & \text{if } x < 0
\end{cases}
$$

在 $x = 0$ 处的导数

  • 左导数:$\lim_{h \to 0^-} \frac{\text{ReLU}(0 + h) - \text{ReLU}(0)}{h} = \lim_{h \to 0^-} \frac{0 - 0}{h} = 0$
  • 右导数:$\lim_{h \to 0^+} \frac{\text{ReLU}(0 + h) - \text{ReLU}(0)}{h} = \lim_{h \to 0^+} \frac{h - 0}{h} = 1$

由于左导数 ≠ 右导数,ReLU在 $x = 0$ 处不可导

实际应用中,通常定义:

$$
\text{ReLU}'(x) = \begin{cases}
1 & \text{if } x > 0 \
0 & \text{if } x \leq 0
\end{cases}
$$

优点
  1. 计算简单高效

    • 只需要比较和选择操作
    • 没有指数运算,计算速度快
  2. 缓解梯度消失

    • 在正区间,梯度恒为1
    • 不会因为层数增加而梯度消失
  3. 稀疏激活

    • 负值输出为0,产生稀疏性
    • 减少计算量,提高效率
  4. 生物学合理性

    • 模拟神经元的阈值效应
缺点
  1. 死区问题(Dying ReLU)

    • 当输入为负时,输出为0,梯度也为0
    • 如果神经元一直输出0,可能永远无法激活
    • 导致部分神经元"死亡"
  2. 不是零中心化的

    • 输出范围[0, +∞),总是非负
    • 可能影响优化
  3. 在 $x = 0$ 处不可导

    • 虽然实际应用中影响不大,但理论上不完美
适用场景

主要用于

  • CNN的隐藏层:最常用的激活函数
  • 深层网络:缓解梯度消失
  • 需要快速训练的网络:计算效率高

不推荐用于

  • 输出层:输出范围不合适
  • 需要负值输出的场景:输出总是非负

1.3.2 Leaky ReLU(带泄漏的ReLU)

函数定义

Leaky ReLU是ReLU的改进版,解决死区问题:

$$
\text{LeakyReLU}(x) = \max(\alpha x, x) = \begin{cases}
x & \text{if } x > 0 \
\alpha x & \text{if } x \leq 0
\end{cases}
$$

其中 $\alpha$ 是一个小的正数,通常为 0.01

函数图像特点

  • 在 $x > 0$ 时是线性函数 $y = x$
  • 在 $x \leq 0$ 时是线性函数 $y = \alpha x$(斜率很小)

导数推导

$$
\text{LeakyReLU}'(x) = \begin{cases}
1 & \text{if } x > 0 \
\alpha & \text{if } x < 0
\end{cases}
$$

在 $x = 0$ 处,通常定义导数为 $\alpha$。

优点
  1. 解决死区问题

    • 负值区域有小的梯度($\alpha$)
    • 神经元不会完全"死亡"
  2. 保持ReLU的优点

    • 计算简单高效
    • 缓解梯度消失
缺点
  1. 需要选择超参数 $\alpha$

    • 通常设为0.01,但可能需要调优
  2. 不是零中心化的

    • 输出仍然偏向正数
适用场景

主要用于

  • ReLU的改进替代:当ReLU出现死区问题时
  • 需要负值输出的场景:允许小的负值输出

1.3.3 PReLU(参数化ReLU)

函数定义

PReLU是Leaky ReLU的推广,斜率 $\alpha$ 是可学习参数:

$$
\text{PReLU}(x) = \max(\alpha x, x) = \begin{cases}
x & \text{if } x > 0 \
\alpha x & \text{if } x \leq 0
\end{cases}
$$

其中 $\alpha$ 是可学习参数,通过反向传播更新。

导数推导

$$
\text{PReLU}'(x) = \begin{cases}
1 & \text{if } x > 0 \
\alpha & \text{if } x < 0
\end{cases}
$$

对参数 $\alpha$ 的导数(用于更新 $\alpha$):

$$
\frac{\partial \text{PReLU}}{\partial \alpha} = \begin{cases}
0 & \text{if } x > 0 \
x & \text{if } x \leq 0
\end{cases}
$$

优点
  1. 自适应斜率

    • 斜率 $\alpha$ 可以根据数据自动学习
    • 比固定斜率的Leaky ReLU更灵活
  2. 可能获得更好的性能

    • 在某些任务上表现优于ReLU和Leaky ReLU
缺点
  1. 增加参数数量

    • 每个神经元或每层需要一个额外的参数
    • 增加模型复杂度
  2. 需要更多计算

    • 需要计算和更新 $\alpha$ 的梯度
适用场景

主要用于

  • 需要自适应激活的场景:让网络自己学习最优斜率
  • 大型网络:参数增加的影响相对较小

1.3.4 ELU(指数线性单元)

函数定义

ELU函数是另一种ReLU的改进:

$$
\text{ELU}(x) = \begin{cases}
x & \text{if } x > 0 \
\alpha(e^x - 1) & \text{if } x \leq 0
\end{cases}
$$

其中 $\alpha$ 通常设为 1

函数图像特点

  • 在 $x > 0$ 时是线性函数
  • 在 $x \leq 0$ 时是指数函数,平滑过渡

导数推导

$$
\text{ELU}'(x) = \begin{cases}
1 & \text{if } x > 0 \
\alpha e^x & \text{if } x < 0
\end{cases}
$$

在 $x = 0$ 处:

  • 左导数:$\lim_{x \to 0^-} \alpha e^x = \alpha$
  • 右导数:$1$
  • 当 $\alpha = 1$ 时,在 $x = 0$ 处连续可导
优点
  1. 平滑可导

    • 在 $x = 0$ 处连续可导(当 $\alpha = 1$ 时)
    • 比ReLU更平滑
  2. 零中心化输出

    • 负值区域输出接近-1(当 $\alpha = 1$ 时)
    • 均值接近0,有利于优化
  3. 解决死区问题

    • 负值区域有梯度,不会完全"死亡"
缺点
  1. 计算成本较高

    • 涉及指数运算,比ReLU慢
  2. 需要选择超参数 $\alpha$

    • 通常设为1,但可能需要调优
适用场景

主要用于

  • 需要平滑激活的场景:比ReLU更平滑
  • 需要零中心化输出的场景:输出均值接近0

1.4 Softmax函数

函数定义

Softmax函数是多分类问题中常用的激活函数:

$$
\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}
$$

其中 $n$ 是类别数量,$x_i$ 是第 $i$ 个类别的输入值。

函数特点

  • 将多个实数映射到(0, 1)区间
  • 所有输出的和为1:$\sum_{i=1}^{n} \text{Softmax}(x_i) = 1$
  • 输出可以解释为概率分布

导数推导

情况1:对 $x_i$ 求导($i = k$)

$$
\frac{\partial \text{Softmax}(x_k)}{\partial x_k} = \frac{\partial}{\partial x_k} \left(\frac{e^{x_k}}{\sum_{j=1}^{n} e^{x_j}}\right)
$$

使用商的导数法则:

设 $u = e^{x_k}$,$v = \sum_{j=1}^{n} e^{x_j}$

$$
u' = e^{x_k}
$$

$$
v' = \frac{\partial}{\partial x_k} \sum_{j=1}^{n} e^{x_j} = e^{x_k}
$$

$$
\frac{\partial \text{Softmax}(x_k)}{\partial x_k} = \frac{u'v - uv'}{v^2} = \frac{e^{x_k} \sum_{j=1}^{n} e^{x_j} - e^{x_k} \cdot e^{x_k}}{(\sum_{j=1}^{n} e^{x_j})^2}
$$

$$
= \frac{e^{x_k}(\sum_{j=1}^{n} e^{x_j} - e^{x_k})}{(\sum_{j=1}^{n} e^{x_j})^2} = \frac{e^{x_k}}{\sum_{j=1}^{n} e^{x_j}} \cdot \frac{\sum_{j=1}^{n} e^{x_j} - e^{x_k}}{\sum_{j=1}^{n} e^{x_j}}
$$

注意到:

  • $\frac{e^{x_k}}{\sum_{j=1}^{n} e^{x_j}} = \text{Softmax}(x_k) = S_k$
  • $\frac{\sum_{j=1}^{n} e^{x_j} - e^{x_k}}{\sum_{j=1}^{n} e^{x_j}} = 1 - S_k$

结果

$$
\frac{\partial \text{Softmax}(x_k)}{\partial x_k} = S_k(1 - S_k)
$$

情况2:对 $x_i$ 求导($i \neq k$)

$$
\frac{\partial \text{Softmax}(x_k)}{\partial x_i} = \frac{\partial}{\partial x_i} \left(\frac{e^{x_k}}{\sum_{j=1}^{n} e^{x_j}}\right)
$$

设 $u = e^{x_k}$,$v = \sum_{j=1}^{n} e^{x_j}$

$$
u' = 0 \quad (\text{因为 } x_k \text{ 不依赖于 } x_i)
$$

$$
v' = \frac{\partial}{\partial x_i} \sum_{j=1}^{n} e^{x_j} = e^{x_i}
$$

$$
\frac{\partial \text{Softmax}(x_k)}{\partial x_i} = \frac{0 \cdot v - u \cdot e^{x_i}}{v^2} = -\frac{e^{x_k} e^{x_i}}{(\sum_{j=1}^{n} e^{x_j})^2}
$$

$$
= -\frac{e^{x_k}}{\sum_{j=1}^{n} e^{x_j}} \cdot \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}} = -S_k S_i
$$

综合结果

$$
\frac{\partial \text{Softmax}(x_k)}{\partial x_i} = \begin{cases}
S_k(1 - S_k) & \text{if } i = k \
-S_k S_i & \text{if } i \neq k
\end{cases}
$$

优点

  1. 输出概率分布

    • 输出值在(0, 1)之间,且和为1
    • 可以直接解释为概率
  2. 可导

    • 处处可导,适合梯度下降
  3. 数值稳定性(通过技巧):

    • 可以通过减去最大值来提高数值稳定性:

    $$
    \text{Softmax}(x_i) = \frac{e^{x_i - \max(x)}}{\sum_{j=1}^{n} e^{x_j - \max(x)}}
    $$

缺点

  1. 计算成本较高

    • 需要计算所有类别的指数和
    • 类别数量多时计算量大
  2. 饱和问题

    • 当某个输入值很大时,对应的输出接近1,其他接近0
    • 梯度可能很小

适用场景

主要用于

  • 多分类问题的输出层:将输出转换为概率分布
  • 需要概率解释的场景:输出可以解释为各类别的概率

不推荐用于

  • 隐藏层:计算成本高,且不需要概率解释
  • 二分类问题:Sigmoid更简单

第二部分:新兴激活函数

2.1 GELU函数

函数定义

GELU函数(Gaussian Error Linear Unit)在Transformer模型中广泛使用:

$$
\text{GELU}(x) = x \cdot \Phi(x)
$$

其中 $\Phi(x)$ 是标准正态分布的累积分布函数(CDF):

$$
\Phi(x) = \frac{1}{2}\left(1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right)
$$

其中 $\text{erf}(x)$ 是误差函数。

近似形式(更常用,计算更快):

$$
\text{GELU}(x) \approx 0.5x \left(1 + \tanh\left(\sqrt{\frac{2}{\pi}}\left(x + 0.044715x^3\right)\right)\right)
$$

函数图像特点

  • 平滑、非单调(在负值区域)
  • 输出范围:(-∞, +∞),但在负值区域输出接近0

导数推导

精确形式的导数

$$
\text{GELU}'(x) = \Phi(x) + x \cdot \phi(x)
$$

其中 $\phi(x) = \frac{1}{\sqrt{2\pi}} e^{-\frac{x^2}{2}}$ 是标准正态分布的概率密度函数(PDF)。

推导过程

使用乘积法则:$(uv)' = u'v + uv'$

设 $u = x$,$v = \Phi(x)$

$$
u' = 1
$$

$$
v' = \Phi'(x) = \phi(x) = \frac{1}{\sqrt{2\pi}} e^{-\frac{x^2}{2}}
$$

因此:

$$
\text{GELU}'(x) = 1 \cdot \Phi(x) + x \cdot \phi(x) = \Phi(x) + x \cdot \phi(x)
$$

优点

  1. 平滑可导

    • 处处可导,梯度特性好
  2. 在Transformer中表现优秀

    • BERT、GPT等模型使用GELU
    • 在某些任务上表现优于ReLU
  3. 概率解释

    • 基于高斯分布,有概率意义

缺点

  1. 计算成本较高

    • 涉及误差函数或tanh计算
    • 比ReLU慢
  2. 实现复杂

    • 需要实现误差函数或使用近似

适用场景

主要用于

  • Transformer模型:BERT、GPT等
  • 需要平滑激活的场景:比ReLU更平滑

2.2 Swish/SiLU函数

函数定义

Swish函数(也被称为SiLU,Sigmoid Linear Unit)由Google提出:

$$
\text{Swish}(x) = x \cdot \sigma(x) = \frac{x}{1 + e^{-x}}
$$

其中 $\sigma(x)$ 是Sigmoid函数。

函数图像特点

  • 平滑、非单调(在负值区域)
  • 在 $x < 0$ 时输出为负值
  • 在 $x > 0$ 时输出为正值

导数推导

使用乘积法则:$(uv)' = u'v + uv'$

设 $u = x$,$v = \sigma(x)$

$$
u' = 1
$$

$$
v' = \sigma'(x) = \sigma(x)(1 - \sigma(x))
$$

因此:

$$
\text{Swish}'(x) = 1 \cdot \sigma(x) + x \cdot \sigma(x)(1 - \sigma(x))
$$

$$
= \sigma(x) + x \cdot \sigma(x)(1 - \sigma(x))
$$

$$
= \sigma(x)[1 + x(1 - \sigma(x))]
$$

$$
= \sigma(x)[1 + x - x\sigma(x)]
$$

注意到 $x\sigma(x) = \text{Swish}(x)$,所以:

$$
\text{Swish}'(x) = \sigma(x) + \text{Swish}(x)(1 - \sigma(x))
$$

另一种形式(更简洁):

$$
\text{Swish}'(x) = \sigma(x) + x \cdot \sigma(x)(1 - \sigma(x))
$$

优点

  1. 平滑可导

    • 处处可导,梯度特性好
  2. 在某些任务上表现优于ReLU

    • 在ImageNet等数据集上表现更好
  3. 非单调性

    • 在负值区域有小的负值输出
    • 可能有助于优化

缺点

  1. 计算成本较高

    • 涉及Sigmoid计算
    • 比ReLU慢
  2. 需要更多实验验证

    • 不是所有任务都表现更好

适用场景

主要用于

  • 实验性使用:在某些任务上可以尝试
  • 需要平滑激活的场景:比ReLU更平滑

2.3 Mish函数

函数定义

Mish函数是Swish的改进:

$$
\text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x))
$$

其中 $\ln(1 + e^x)$ 是softplus函数。

函数图像特点

  • 平滑、无界
  • 在负值区域输出为小的负值
  • 在正值区域输出接近线性

导数推导

使用乘积法则和链式法则:

设 $u = x$,$v = \tanh(\ln(1 + e^x))$

$$
u' = 1
$$

对 $v$ 求导,使用链式法则:

设 $w = \ln(1 + e^x)$,则 $v = \tanh(w)$

$$
\frac{dw}{dx} = \frac{d}{dx} \ln(1 + e^x) = \frac{e^x}{1 + e^x} = \sigma(x)
$$

$$
\frac{dv}{dw} = \tanh'(w) = 1 - \tanh^2(w)
$$

因此:

$$
v' = (1 - \tanh^2(w)) \cdot \sigma(x) = (1 - \tanh^2(\ln(1 + e^x))) \cdot \sigma(x)
$$

最终:

$$
\text{Mish}'(x) = \tanh(\ln(1 + e^x)) + x \cdot (1 - \tanh^2(\ln(1 + e^x))) \cdot \sigma(x)
$$

优点

  1. 平滑可导

    • 处处可导,梯度特性好
  2. 无界

    • 输出无上界,可能有助于表达
  3. 在某些任务上表现优秀

    • 在某些数据集上表现优于Swish和ReLU

缺点

  1. 计算成本很高

    • 涉及tanh、ln、exp等多个运算
    • 比ReLU慢很多
  2. 实现复杂

    • 需要多个函数组合

适用场景

主要用于

  • 实验性使用:在某些任务上可以尝试
  • 对精度要求高的场景:可以牺牲速度换取精度

2.4 ELU函数

(已在第一部分1.3.4节详细介绍,此处不再重复)


第三部分:激活函数对比与选择

3.1 激活函数对比表

激活函数公式输出范围导数范围计算成本梯度消失零中心化主要用途
Sigmoid$\frac{1}{1+e^{-x}}$(0, 1)(0, 0.25)严重输出层(二分类)
Tanh$\tanh(x)$(-1, 1)(0, 1]中等RNN隐藏层
ReLU$\max(0, x)$[0, +∞){0, 1}缓解CNN隐藏层
Leaky ReLU$\max(\alpha x, x)$(-∞, +∞){α, 1}缓解ReLU改进
PReLU$\max(\alpha x, x)$(-∞, +∞){α, 1}缓解自适应激活
ELU$x$ if $x>0$ else $\alpha(e^x-1)$(-α, +∞)(0, 1]缓解平滑激活
GELU$x \cdot \Phi(x)$(-∞, +∞)(0, 1]缓解Transformer
Swish$x \cdot \sigma(x)$(-∞, +∞)(0, 1]缓解实验性
Mish$x \cdot \tanh(\ln(1+e^x))$(-∞, +∞)(0, 1]很高缓解实验性
Softmax$\frac{e^{x_i}}{\sum e^{x_j}}$(0, 1), 和为1复杂-输出层(多分类)

3.2 选择指南

隐藏层选择

推荐优先级

  1. ReLU:最常用,适合大多数情况

    • ✅ 计算快
    • ✅ 缓解梯度消失
    • ❌ 有死区问题
  2. Leaky ReLU:ReLU的改进

    • ✅ 解决死区问题
    • ✅ 保持ReLU的优点
  3. GELU:Transformer模型

    • ✅ 在Transformer中表现优秀
    • ❌ 计算较慢
  4. ELU:需要平滑和零中心化

    • ✅ 平滑可导
    • ✅ 零中心化
    • ❌ 计算较慢
  5. Tanh:RNN/LSTM

    • ✅ 零中心化
    • ❌ 容易梯度消失
  6. Swish/Mish:实验性使用

    • ✅ 在某些任务上表现好
    • ❌ 计算较慢

不推荐

  • Sigmoid:容易梯度消失,只用于输出层

输出层选择

  • 二分类:Sigmoid
  • 多分类:Softmax
  • 回归:Linear(无激活函数)或Tanh

3.3 实际应用建议

初学者

  • 隐藏层:使用 ReLU
  • 输出层:二分类用 Sigmoid,多分类用 Softmax

进阶使用

  • 可以尝试 Leaky ReLUGELU
  • 根据具体任务选择

特殊场景

  • Transformer:使用 GELU
  • RNN/LSTM:可以使用 TanhReLU
  • 深层网络:避免 Sigmoid,使用 ReLU 或其变体

总结与回顾

核心概念回顾

1. 激活函数的作用

  • 引入非线性
  • 控制输出范围
  • 影响梯度传播

2. 经典激活函数

  • Sigmoid:输出层(二分类),容易梯度消失
  • Tanh:RNN隐藏层,零中心化
  • ReLU:CNN隐藏层,最常用
  • Softmax:输出层(多分类)

3. 新兴激活函数

  • GELU:Transformer模型
  • Swish/SiLU:实验性使用
  • Mish:实验性使用
  • ELU:平滑激活

关键要点

  1. Sigmoid的特点

    • 输入值在[-6, 6]之间输出值才会有明显差异
    • 输入值在[-3, 3]之间才会有比较好的效果
    • 导数范围(0, 0.25),容易梯度消失
    • 激活值不是零中心化的
    • 一般只用于二分类的输出层
  2. ReLU的优势

    • 计算简单高效
    • 缓解梯度消失
    • 最常用的隐藏层激活函数
  3. 选择原则

    • 隐藏层:ReLU或其变体
    • 输出层:根据任务类型选择
    • 特殊模型:根据模型特点选择(如Transformer用GELU)

学习建议

  1. 理解每个激活函数的特性:公式、导数、优缺点
  2. 掌握选择原则:根据任务和模型选择
  3. 实践验证:在实际项目中尝试不同的激活函数
  4. 关注发展趋势:了解新兴激活函数的发展

评论