目标:系统掌握深度学习中核心激活函数的设计动机、数学公式、梯度特性与适用场景,建立"激活函数工具箱"的完整认知。
前置要求:了解基本的神经网络概念(前向传播、反向传播)和微积分基础(求导、链式法则)。
激活函数是神经网络的"灵魂"——它决定了神经元是否应该被激活,为网络引入非线性能力。没有激活函数,无论多少层的网络都只是一个线性变换。本文按演进脉络系统梳理各类激活函数,给出公式、形状、梯度特性和记忆小贴士。
1. 经典激活函数(Classical Activations)
早期神经网络使用的激活函数,奠定了激活函数设计的基础思想。
1.1 Sigmoid
简介:将任意实数映射到 $(0, 1)$ 区间,曾是二分类输出层的标配。形状像一个平滑的"S"形阶梯。
$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$导数:
$$ \sigma'(x) = \sigma(x)(1 - \sigma(x)) $$形状与梯度:函数形状为 S 形曲线,输出范围 $(0, 1)$。梯度在 $x = 0$ 处最大(0.25),向两端迅速趋近于 0——这就是梯度消失问题的根源。
类比:调光开关。不管你怎么用力拧(输入多大),灯光亮度(输出)永远在 0 到 1 之间,而且拧到极端位置时再怎么拧也没变化(梯度消失)。
记忆小贴士:Sigmoid = “S 形”——输出像概率(0 到 1),导数 = $\sigma(1 - \sigma)$,最大值只有 0.25。
数值示例:以 $x = 1.0$ 为例手算:
$$ \sigma(1.0) = \frac{1}{1 + e^{-1}} = \frac{1}{1 + 0.368} = 0.731 $$$$ \sigma'(1.0) = 0.731 \times (1 - 0.731) = 0.731 \times 0.269 = 0.197 $$可见即使在 $x = 1.0$ 这样并不极端的位置,梯度已经从最大值 0.25 衰减到 0.197。当 $x = 5$ 时,$\sigma'(5) \approx 0.0067$,梯度几乎消失。
致命缺陷:
- 梯度消失:深层网络中梯度连乘后趋近于 0,权重无法更新
- 输出非零中心:输出恒为正,导致梯度更新呈锯齿形,收敛变慢
- 指数运算开销:$e^{-x}$ 计算成本较高
适用场景:二分类输出层、门控机制(LSTM、GRU 的门),不建议用于隐藏层。
1.2 Tanh(双曲正切)
简介:Sigmoid 的"零中心"版本。将输入映射到 $(-1, 1)$ 区间,解决了 Sigmoid 输出非零中心的问题。
$$ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} = 2\sigma(2x) - 1 $$导数:
$$ \tanh'(x) = 1 - \tanh^2(x) $$形状与梯度:形状与 Sigmoid 类似,但输出范围 $(-1, 1)$,零中心。梯度最大值为 1(在 $x = 0$ 处),比 Sigmoid 的 0.25 大得多,但两端仍然会梯度消失。
类比:升级版调光开关。灯光可以在 -1 到 1 之间变化(有正有负),中间位置(零点)灵敏度最高。
记忆小贴士:Tanh = “2 倍 Sigmoid 减 1”——$\tanh(x) = 2\sigma(2x) - 1$,把 Sigmoid 的 $(0, 1)$ 拉伸到 $(-1, 1)$。
适用场景:RNN、LSTM 中的隐藏层激活(在 ReLU 出现之前是默认选择),需要零中心输出时。
1.3 经典函数对比
| 特性 | Sigmoid | Tanh |
|---|---|---|
| 输出范围 | $(0, 1)$ | $(-1, 1)$ |
| 零中心 | 否 | 是 |
| 梯度最大值 | 0.25 | 1 |
| 梯度消失 | 严重 | 较严重 |
| 主要用途 | 输出层、门控 | RNN 隐藏层 |
经典激活函数的梯度消失问题严重制约了深层网络的训练。2012 年,ReLU 的引入彻底改变了这一局面——它从根本上解决了梯度消失问题,使得训练深层网络成为可能。
2. ReLU 家族(ReLU Family)
2.1 ReLU(Rectified Linear Unit)
简介:深度学习中最重要、最常用的激活函数。规则极其简单:正数保留,负数归零。
$$ \text{ReLU}(x) = \max(0, x) = \begin{cases} x & \text{if } x > 0 \\ 0 & \text{if } x \leq 0 \end{cases} $$导数:
$$ \text{ReLU}'(x) = \begin{cases} 1 & \text{if } x > 0 \\ 0 & \text{if } x \lt 0 \end{cases} $$形状与梯度:形状为折线形——左半边是 0,右半边是 45 度斜线。正区间梯度恒为 1,不会梯度消失。
类比:单向阀门。水流(信号)正向时畅通无阻,反向时完全关闭——简单高效。
记忆小贴士:ReLU = “Rectified Linear Unit”——“整流"就是"只保留正的”,$\max(0, x)$。
优势:
- 计算极快:只需一次比较操作
- 梯度不消失:正区间梯度恒为 1
- 稀疏激活:约 50% 的神经元输出为 0,天然正则化
数值示例:ReLU 的计算极其简单。以 $x = 2.5$ 和 $x = -1.3$ 为例:
- $x = 2.5$:$\text{ReLU}(2.5) = 2.5$,梯度 $= 1$——信号完整保留
- $x = -1.3$:$\text{ReLU}(-1.3) = 0$,梯度 $= 0$——信号被完全阻断
与 Sigmoid 对比:同样是 $x = 2.5$,Sigmoid 输出 0.924、梯度 0.070;ReLU 输出 2.5、梯度 1。ReLU 的梯度是 Sigmoid 的 14 倍——这就是深层网络能训练的关键。
致命缺陷——Dead ReLU 问题:如果一个神经元的输入始终为负(比如学习率过大导致权重更新过猛),它的输出永远是 0,梯度永远是 0,这个神经元就"死了",再也无法恢复。
适用场景:CNN 和大多数隐藏层的默认选择。使用时注意学习率不宜过大。
2.2 Leaky ReLU
简介:为解决 Dead ReLU 问题,给负区间一个微小的斜率(通常 0.01),让"死神经元"有复活的机会。
$$ \text{LeakyReLU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases} $$其中 $\alpha$ 通常取 0.01。
导数:
$$ \text{LeakyReLU}'(x) = \begin{cases} 1 & \text{if } x > 0 \\ \alpha & \text{if } x \leq 0 \end{cases} $$形状与梯度:形状类似 ReLU,但左半边不是水平线,而是一条斜率为 $\alpha$ 的直线。
类比:带应急通道的单向阀门。正向畅通,反向几乎关闭但留了一条缝——万一需要反向信号,还有路可走。
记忆小贴士:Leaky = “有漏洞的”——ReLU 在负区间"漏"了一点梯度($\alpha x$)。
适用场景:担心 Dead ReLU 问题时的替代选择。效果通常与 PReLU 相近。
2.3 PReLU(Parametric ReLU)
简介:Leaky ReLU 的参数化版本——负区间的斜率 $\alpha$ 不再是固定值,而是可学习的参数。
$$ \text{PReLU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases} $$其中 $\alpha$ 通过反向传播自动学习。
类比:智能阀门。不仅有应急通道,通道的大小还是自动调节的——网络自己决定负区间该保留多少信号。
记忆小贴士:P = “Parametric”——参数化的 Leaky ReLU,$\alpha$ 由网络自己学。
适用场景:数据量较大时(否则 $\alpha$ 容易过拟合),ImageNet 分类任务中有不错的表现。
2.4 ELU(Exponential Linear Unit)
简介:结合 ReLU 和 Sigmoid 的优点。正区间与 ReLU 相同,负区间用指数函数实现软饱和,输出趋近于 $-\alpha$。
$$ \text{ELU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha(e^x - 1) & \text{if } x \leq 0 \end{cases} $$其中 $\alpha$ 通常取 1。
导数:
$$ \text{ELU}'(x) = \begin{cases} 1 & \text{if } x > 0 \\ \text{ELU}(x) + \alpha & \text{if } x \leq 0 \end{cases} $$形状与梯度:正区间是直线,负区间是平滑的指数曲线,趋近于 $-\alpha$。处处连续,在零点处平滑过渡。
类比:带缓冲的阀门。反向信号不是突然关闭,而是逐渐衰减——过渡更柔和。
记忆小贴士:E = “Exponential”——负区间用指数函数,输出均值更接近零。
适用场景:需要比 ReLU 更好的归一化特性时。缺点是负区间有指数运算,计算成本略高。
2.5 SELU(Scaled ELU)
简介:ELU 的缩放版本,经过精心设计的缩放因子 $\lambda$ 和参数 $\alpha$,使得网络在适当条件下可以自归一化——无需 Batch Normalization。
$$ \text{SELU}(x) = \lambda \begin{cases} x & \text{if } x > 0 \\ \alpha(e^x - 1) & \text{if } x \leq 0 \end{cases} $$其中 $\lambda \approx 1.0507$,$\alpha \approx 1.6733$。
自归一化原理:如果权重使用 LeCun 初始化,且网络是全连接的前馈网络,SELU 能保证每层输出的均值和方差自动保持稳定——像有一个隐形的 Batch Normalization。
类比:自带水平仪的建筑。每层楼(每一层)自动保持水平(均值为 0,方差为 1),不需要人工校准(Batch Norm)。
记忆小贴士:S = “Scaled”——缩放版 ELU,$\lambda$ 和 $\alpha$ 是精心计算的魔法数字。
适用场景:全连接网络中替代 ReLU + Batch Norm 的方案。注意:仅在全连接前馈网络中有理论保证,CNN 和 RNN 中效果未被证实。
2.6 ReLU 家族对比
| 激活函数 | 负区间行为 | 可学习参数 | Dead ReLU | 计算开销 |
|---|---|---|---|---|
| ReLU | 置零 | 无 | 有 | 极低 |
| Leaky ReLU | 小斜率 $\alpha$ | 无 | 无 | 低 |
| PReLU | 可学习 $\alpha$ | 有 | 无 | 低 |
| ELU | 指数衰减 | 无 | 无 | 中 |
| SELU | 缩放指数衰减 | 无 | 无 | 中 |
ReLU 家族解决了梯度消失问题,但分段线性函数在零点不可导、不够平滑。Transformer 时代的到来催生了一批平滑激活函数——处处可导、兼具线性和非线性特性。
3. 平滑激活函数(Smooth Activations)
3.1 GELU(Gaussian Error Linear Unit)
简介:Transformer 系列模型(BERT、GPT、ViT)的默认激活函数。核心思想是用高斯分布的累积分布函数对输入做"软门控"——输入越大越可能被保留,越小越可能被抑制。
$$ \text{GELU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right] $$其中 $\Phi(x)$ 是标准正态分布的累积分布函数(CDF),$\text{erf}$ 是误差函数。
常用近似:
$$ \text{GELU}(x) \approx 0.5x\left[1 + \tanh\left(\sqrt{\frac{2}{\pi}}\left(x + 0.044715x^3\right)\right)\right] $$形状与梯度:形状近似 ReLU,但在零点附近是平滑的曲线而非折线。负区间不是严格的零,而是逐渐衰减到接近零。梯度在零点附近有平滑过渡。
类比:概率门控。想象每个神经元前有一个"概率门"——输入值越大,门打开的概率越高(被保留);输入值越小,门关闭的概率越高(被抑制)。这个门不是硬开关,而是按正态分布的概率来决定。
记忆小贴士:GELU = “Gaussian Error Linear Unit”——用高斯分布的 CDF 做门控。$x \cdot \Phi(x)$ = 输入乘以"这个输入有多大概率是正的"。
适用场景:Transformer 架构的默认选择(BERT、GPT、ViT 等)。在 NLP 和 CV 任务中广泛验证有效。
3.2 SiLU / Swish
简介:Google 提出的激活函数,与 GELU 非常相似(在实际应用中几乎等价)。形式更简洁,是 Sigmoid 的"自门控"版本。
$$ \text{SiLU}(x) = x \cdot \sigma(x) = \frac{x}{1 + e^{-x}} $$其中 $\sigma(x)$ 是 Sigmoid 函数。当 $\beta = 1$ 时,$\text{Swish}(x) = x \cdot \sigma(\beta x)$ 等价于 SiLU。
导数:
$$ \text{SiLU}'(x) = \sigma(x) + x \cdot \sigma(x)(1 - \sigma(x)) = \sigma(x)(1 + x(1 - \sigma(x))) $$形状与梯度:形状与 GELU 几乎相同——零点附近平滑,负区间有微小的非零输出(存在一个全局最小值约 -0.278 在 $x \approx -1.28$ 处)。
类比:自门控。每个神经元自己决定"我要不要激活"——用 Sigmoid 函数作为门,输入本身就是门的控制信号。
记忆小贴士:SiLU = “Sigmoid Linear Unit”——$x$ 乘以 $\sigma(x)$。Swish 是它的广义版本(带参数 $\beta$)。
适用场景:EfficientNet、部分大语言模型。效果通常略优于 ReLU,但计算成本稍高。
3.3 Mish
简介:另一个平滑非单调激活函数,形式为 $\text{Mish}(x) = x \cdot \tanh(\text{softplus}(x))$。
$$ \text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x)) $$形状与梯度:形状类似 SiLU/GELU,但在负区间有更明显的非零输出。同样是处处平滑、非单调的。
类比:柔和的 ReLU。比 ReLU 更"温柔"——负区间不完全关闭,正区间也不是直线。
记忆小贴士:Mish = “Mish”——$x \cdot \tanh(\text{softplus}(x))$,$\text{softplus} = \ln(1 + e^x)$ 是 ReLU 的平滑近似。
适用场景:YOLOv4 等目标检测模型中使用。效果与 SiLU 相近,选择主要看具体任务。
3.4 平滑激活函数对比
| 激活函数 | 公式 | 零点导数 | 典型应用 |
|---|---|---|---|
| GELU | $x \cdot \Phi(x)$ | $\approx 0.5$ | BERT、GPT、ViT |
| SiLU/Swish | $x \cdot \sigma(x)$ | $0.5$ | EfficientNet、部分 LLM |
| Mish | $x \cdot \tanh(\text{softplus}(x))$ | $\approx 0.6$ | YOLOv4 |
以上激活函数都用于隐藏层。输出层的激活函数则取决于任务类型——回归用线性,二分类用 Sigmoid,多分类用 Softmax。
4. 输出层激活函数(Output Layer Activations)
4.1 Softmax
简介:多分类任务的标准输出函数。将一组任意实数(logits)转化为概率分布——所有输出为正且和为 1。
$$ \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} $$其中 $C$ 是类别数,$z_i$ 是第 $i$ 个类别的 logit。
性质:
- 输出 $\in (0, 1)$,且 $\sum_i \text{Softmax}(z_i) = 1$
- 保序:输入的大小关系不变(大的 logit 对应大的概率)
- 温度控制:$\text{Softmax}(z_i / \tau)$ 中,$\tau$ 越小分布越尖锐(越"自信"),$\tau$ 越大分布越平滑(越"均匀")
类比:投票系统。每个候选人(类别)有一个得票数(logit),Softmax 把得票数转化为得票率(概率),所有人得票率之和为 100%。
记忆小贴士:Softmax = “软化版的 Max”——不是取最大值(hard max),而是给所有选项一个概率(soft version)。
适用场景:多分类任务的输出层,配合交叉熵损失使用。
4.2 LogSoftmax
简介:Softmax 取对数,数值上更稳定。与 NLLLoss 配合等价于 CrossEntropyLoss。
$$ \text{LogSoftmax}(z_i) = \log\left(\frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}}\right) = z_i - \log\sum_{j=1}^{C} e^{z_j} $$数值稳定性:直接计算 $\log(\text{Softmax}(z_i))$ 可能因 $e^{z_i}$ 溢出导致数值不稳定。LogSoftmax 通过改写为 $z_i - \log\sum e^{z_j}$ 避免了这个问题。
适用场景:PyTorch 中建议使用 nn.CrossEntropyLoss(内部已包含 LogSoftmax),避免手动组合 Softmax + log + NLLLoss。
4.3 Sigmoid(输出层)
在输出层中,Sigmoid 用于二分类或多标签分类(每个标签独立判断是/否)。
- 二分类:输出一个概率 $p$,表示"属于正类的概率"
- 多标签分类:输出 $C$ 个独立概率,每个用 Sigmoid 激活
与 Softmax 的区别:Softmax 的输出互相竞争(和为 1),Sigmoid 的输出相互独立。
5. 特殊用途激活函数
以下激活函数在特定场景下有独特优势。
5.1 Softplus
简介:ReLU 的平滑近似版本,处处可导。
$$ \text{Softplus}(x) = \ln(1 + e^x) $$导数:$\text{Softplus}'(x) = \sigma(x)$(恰好是 Sigmoid)。
形状:形状类似 ReLU,但零点附近是平滑曲线。输出恒为正。
记忆小贴士:Softplus = “软化的正部”——$\ln(1 + e^x)$ 是 $\max(0, x)$ 的平滑近似。
适用场景:需要平滑的正数激活时(如方差预测),或作为其他激活函数的组件(如 Mish)。
5.2 Hardswish
简介:Swish 的分段线性近似,计算效率更高。
$$ \text{Hardswish}(x) = x \cdot \frac{\text{ReLU6}(x + 3)}{6} = \begin{cases} 0 & \text{if } x \leq -3 \\ x & \text{if } x \geq 3 \\ \frac{x(x + 3)}{6} & \text{otherwise} \end{cases} $$记忆小贴士:Hardswish = “硬化的 Swish”——用分段线性函数近似 Swish,避免指数运算。
适用场景:移动端和边缘设备(MobileNetV3),在保持精度的同时降低计算成本。
5.3 ReLU6
简介:ReLU 加上上限截断,输出被限制在 $[0, 6]$。
$$ \text{ReLU6}(x) = \min(\max(0, x), 6) $$记忆小贴士:ReLU6 = “ReLU 截断到 6"——防止激活值过大,适合低精度推理。
适用场景:移动端网络、量化模型(INT8 推理时激活值范围已知,便于量化)。
6. 激活函数选择指南
| 场景 | 推荐激活函数 | 核心原因 | 记忆关键词 |
|---|---|---|---|
| CNN 隐藏层(默认) | ReLU | 计算快,梯度不消失 | 单向阀门 |
| 担心 Dead ReLU | Leaky ReLU / PReLU | 负区间有梯度 | 有漏洞的阀门 |
| Transformer / NLP | GELU | BERT、GPT 验证有效 | 高斯门控 |
| 大语言模型 | SiLU / Swish | 平滑,效果好 | 自门控 |
| 二分类输出层 | Sigmoid | 输出概率 | S 形曲线 |
| 多分类输出层 | Softmax | 输出概率分布 | 软化 Max |
| 多标签分类 | Sigmoid(每个标签) | 标签独立 | 独立概率 |
| 移动端 / 边缘设备 | Hardswish / ReLU6 | 计算高效 | 硬化 Swish |
| 自归一化网络 | SELU | 无需 Batch Norm | 魔法数字 |
| 回归输出层 | 无激活(线性) | 输出任意值 | 恒等映射 |
7. 激活函数演进脉络
flowchart TD
Sigmoid["Sigmoid"] --> Tanh["Tanh"]
Tanh --> ReLU["ReLU"]
ReLU --> LeakyReLU["Leaky ReLU"]
LeakyReLU --> PReLU["PReLU"]
ReLU --> ELU["ELU"]
ELU --> SELU["SELU"]
ReLU --> GELU["GELU"]
Sigmoid --> SiLU["SiLU / Swish"]
ReLU --> Softplus["Softplus"]
Softplus --> Mish["Mish"]
SiLU --> Hardswish["Hardswish"]
ReLU --> ReLU6["ReLU6"]
Softmax["Softmax"] --> LogSoftmax["LogSoftmax"]
从上图可以看出,激活函数的发展遵循一条清晰的脉络:
- Sigmoid/Tanh 时代:早期神经网络的标配,但梯度消失严重
- ReLU 革命:解决了梯度消失,成为深度学习的基石
- ReLU 改进期:Leaky ReLU、PReLU、ELU、SELU 修补 ReLU 的缺陷
- 平滑时代:GELU、SiLU、Mish 引入平滑性和概率门控,成为 Transformer 时代的主流
理解了这条演进脉络,就掌握了激活函数设计的核心哲学:在非线性能力、梯度流、计算效率之间寻找最佳平衡点。
延伸阅读:关于激活函数如何影响梯度传播的详细数学分析,以及 Batch Normalization 与激活函数的配合关系,可参考 大语言模型训练机制全解·第一篇 相关章节。