常见的激活函数
目录
引言:激活函数的重要性
激活函数的作用
激活函数是神经网络中的关键组件,它决定了:
- 神经元是否激活:决定信号是否传递
- 输出的范围:控制输出值的范围
- 网络的非线性能力:让网络能够学习复杂模式
- 梯度传播:影响反向传播中的梯度大小
为什么需要了解不同的激活函数?
不同的激活函数有不同的特性:
- 计算效率:有些激活函数计算快,有些慢
- 梯度特性:有些容易梯度消失,有些不会
- 输出范围:适合不同的任务类型
- 适用场景:不同的网络结构需要不同的激活函数
第一部分:经典激活函数
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,网络参数更新极其缓慢,或者无法更新
优点
- 输出范围固定:(0, 1),适合表示概率
- 平滑可导:处处可导,适合梯度下降
- 单调递增:输入越大,输出越大
- 有界:输出不会无限大
缺点
-
梯度消失问题严重:
- 导数最大值为0.25
- 在深层网络中,梯度会指数级衰减
- 一般来说,sigmoid网络在5层之内就会产生梯度消失现象
-
激活值不是以0为中心的:
- 激活值总是偏向正数(输出范围0-1)
- 导致梯度更新时,只会对某些特征产生相同方向的影响
- 不利于优化
-
计算成本较高:
- 涉及指数运算,计算较慢
-
饱和问题:
- 当输入值很大或很小时,函数进入饱和区
- 梯度接近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),均值接近0,有利于优化
- 梯度特性更好:导数最大值是1,比Sigmoid的0.25大4倍
- 平滑可导:处处可导
- 单调递增:输入越大,输出越大
缺点
-
仍有梯度消失问题:
- 虽然比Sigmoid好,但在深层网络中仍可能梯度消失
- 当输入值很大或很小时,导数接近0
-
计算成本较高:
- 涉及指数运算,计算较慢
-
饱和问题:
- 当输入值很大或很小时,函数进入饱和区
适用场景
主要用于:
- 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
- 不会因为层数增加而梯度消失
-
稀疏激活:
- 负值输出为0,产生稀疏性
- 减少计算量,提高效率
-
生物学合理性:
- 模拟神经元的阈值效应
缺点
-
死区问题(Dying ReLU):
- 当输入为负时,输出为0,梯度也为0
- 如果神经元一直输出0,可能永远无法激活
- 导致部分神经元"死亡"
-
不是零中心化的:
- 输出范围[0, +∞),总是非负
- 可能影响优化
-
在 $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$。
优点
-
解决死区问题:
- 负值区域有小的梯度($\alpha$)
- 神经元不会完全"死亡"
-
保持ReLU的优点:
- 计算简单高效
- 缓解梯度消失
缺点
-
需要选择超参数 $\alpha$:
- 通常设为0.01,但可能需要调优
-
不是零中心化的:
- 输出仍然偏向正数
适用场景
主要用于:
- 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}
$$
优点
-
自适应斜率:
- 斜率 $\alpha$ 可以根据数据自动学习
- 比固定斜率的Leaky ReLU更灵活
-
可能获得更好的性能:
- 在某些任务上表现优于ReLU和Leaky ReLU
缺点
-
增加参数数量:
- 每个神经元或每层需要一个额外的参数
- 增加模型复杂度
-
需要更多计算:
- 需要计算和更新 $\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$ 处连续可导
优点
-
平滑可导:
- 在 $x = 0$ 处连续可导(当 $\alpha = 1$ 时)
- 比ReLU更平滑
-
零中心化输出:
- 负值区域输出接近-1(当 $\alpha = 1$ 时)
- 均值接近0,有利于优化
-
解决死区问题:
- 负值区域有梯度,不会完全"死亡"
缺点
-
计算成本较高:
- 涉及指数运算,比ReLU慢
-
需要选择超参数 $\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}
$$
优点
-
输出概率分布:
- 输出值在(0, 1)之间,且和为1
- 可以直接解释为概率
-
可导:
- 处处可导,适合梯度下降
-
数值稳定性(通过技巧):
- 可以通过减去最大值来提高数值稳定性:
$$
\text{Softmax}(x_i) = \frac{e^{x_i - \max(x)}}{\sum_{j=1}^{n} e^{x_j - \max(x)}}
$$
缺点
-
计算成本较高:
- 需要计算所有类别的指数和
- 类别数量多时计算量大
-
饱和问题:
- 当某个输入值很大时,对应的输出接近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)
$$
优点
-
平滑可导:
- 处处可导,梯度特性好
-
在Transformer中表现优秀:
- BERT、GPT等模型使用GELU
- 在某些任务上表现优于ReLU
-
概率解释:
- 基于高斯分布,有概率意义
缺点
-
计算成本较高:
- 涉及误差函数或tanh计算
- 比ReLU慢
-
实现复杂:
- 需要实现误差函数或使用近似
适用场景
主要用于:
- 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))
$$
优点
-
平滑可导:
- 处处可导,梯度特性好
-
在某些任务上表现优于ReLU:
- 在ImageNet等数据集上表现更好
-
非单调性:
- 在负值区域有小的负值输出
- 可能有助于优化
缺点
-
计算成本较高:
- 涉及Sigmoid计算
- 比ReLU慢
-
需要更多实验验证:
- 不是所有任务都表现更好
适用场景
主要用于:
- 实验性使用:在某些任务上可以尝试
- 需要平滑激活的场景:比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)
$$
优点
-
平滑可导:
- 处处可导,梯度特性好
-
无界:
- 输出无上界,可能有助于表达
-
在某些任务上表现优秀:
- 在某些数据集上表现优于Swish和ReLU
缺点
-
计算成本很高:
- 涉及tanh、ln、exp等多个运算
- 比ReLU慢很多
-
实现复杂:
- 需要多个函数组合
适用场景
主要用于:
- 实验性使用:在某些任务上可以尝试
- 对精度要求高的场景:可以牺牲速度换取精度
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 选择指南
隐藏层选择
推荐优先级:
-
ReLU:最常用,适合大多数情况
- ✅ 计算快
- ✅ 缓解梯度消失
- ❌ 有死区问题
-
Leaky ReLU:ReLU的改进
- ✅ 解决死区问题
- ✅ 保持ReLU的优点
-
GELU:Transformer模型
- ✅ 在Transformer中表现优秀
- ❌ 计算较慢
-
ELU:需要平滑和零中心化
- ✅ 平滑可导
- ✅ 零中心化
- ❌ 计算较慢
-
Tanh:RNN/LSTM
- ✅ 零中心化
- ❌ 容易梯度消失
-
Swish/Mish:实验性使用
- ✅ 在某些任务上表现好
- ❌ 计算较慢
不推荐:
- Sigmoid:容易梯度消失,只用于输出层
输出层选择
- 二分类:Sigmoid
- 多分类:Softmax
- 回归:Linear(无激活函数)或Tanh
3.3 实际应用建议
初学者:
- 隐藏层:使用 ReLU
- 输出层:二分类用 Sigmoid,多分类用 Softmax
进阶使用:
- 可以尝试 Leaky ReLU、GELU 等
- 根据具体任务选择
特殊场景:
- Transformer:使用 GELU
- RNN/LSTM:可以使用 Tanh 或 ReLU
- 深层网络:避免 Sigmoid,使用 ReLU 或其变体
总结与回顾
核心概念回顾
1. 激活函数的作用:
- 引入非线性
- 控制输出范围
- 影响梯度传播
2. 经典激活函数:
- Sigmoid:输出层(二分类),容易梯度消失
- Tanh:RNN隐藏层,零中心化
- ReLU:CNN隐藏层,最常用
- Softmax:输出层(多分类)
3. 新兴激活函数:
- GELU:Transformer模型
- Swish/SiLU:实验性使用
- Mish:实验性使用
- ELU:平滑激活
关键要点
-
Sigmoid的特点:
- 输入值在[-6, 6]之间输出值才会有明显差异
- 输入值在[-3, 3]之间才会有比较好的效果
- 导数范围(0, 0.25),容易梯度消失
- 激活值不是零中心化的
- 一般只用于二分类的输出层
-
ReLU的优势:
- 计算简单高效
- 缓解梯度消失
- 最常用的隐藏层激活函数
-
选择原则:
- 隐藏层:ReLU或其变体
- 输出层:根据任务类型选择
- 特殊模型:根据模型特点选择(如Transformer用GELU)
学习建议
- 理解每个激活函数的特性:公式、导数、优缺点
- 掌握选择原则:根据任务和模型选择
- 实践验证:在实际项目中尝试不同的激活函数
- 关注发展趋势:了解新兴激活函数的发展