目标:系统掌握深度学习中核心激活函数的设计动机、数学公式、梯度特性与适用场景,建立"激活函数工具箱"的完整认知。

前置要求:了解基本的神经网络概念(前向传播、反向传播)和微积分基础(求导、链式法则)。

激活函数是神经网络的"灵魂"——它决定了神经元是否应该被激活,为网络引入非线性能力。没有激活函数,无论多少层的网络都只是一个线性变换。本文按演进脉络系统梳理各类激活函数,给出公式、形状、梯度特性和记忆小贴士。


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——这就是梯度消失问题的根源。

Sigmoid 函数图像

类比:调光开关。不管你怎么用力拧(输入多大),灯光亮度(输出)永远在 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 大得多,但两端仍然会梯度消失。

Tanh 函数图像

类比:升级版调光开关。灯光可以在 -1 到 1 之间变化(有正有负),中间位置(零点)灵敏度最高。

记忆小贴士:Tanh = “2 倍 Sigmoid 减 1”——$\tanh(x) = 2\sigma(2x) - 1$,把 Sigmoid 的 $(0, 1)$ 拉伸到 $(-1, 1)$。

适用场景:RNN、LSTM 中的隐藏层激活(在 ReLU 出现之前是默认选择),需要零中心输出时。

1.3 经典函数对比

特性SigmoidTanh
输出范围$(0, 1)$$(-1, 1)$
零中心
梯度最大值0.251
梯度消失严重较严重
主要用途输出层、门控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 函数图像

类比:单向阀门。水流(信号)正向时畅通无阻,反向时完全关闭——简单高效。

记忆小贴士: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 函数图像

类比:带应急通道的单向阀门。正向畅通,反向几乎关闭但留了一条缝——万一需要反向信号,还有路可走。

记忆小贴士: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$。处处连续,在零点处平滑过渡。

ELU 函数图像

类比:带缓冲的阀门。反向信号不是突然关闭,而是逐渐衰减——过渡更柔和。

记忆小贴士: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 函数图像

类比:概率门控。想象每个神经元前有一个"概率门"——输入值越大,门打开的概率越高(被保留);输入值越小,门关闭的概率越高(被抑制)。这个门不是硬开关,而是按正态分布的概率来决定。

记忆小贴士: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$ 处)。

SiLU 函数图像

类比:自门控。每个神经元自己决定"我要不要激活"——用 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,但在负区间有更明显的非零输出。同样是处处平滑、非单调的。

Mish 函数图像

类比:柔和的 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 ReLULeaky ReLU / PReLU负区间有梯度有漏洞的阀门
Transformer / NLPGELUBERT、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"]

  激活函数全家福对比

从上图可以看出,激活函数的发展遵循一条清晰的脉络:

  1. Sigmoid/Tanh 时代:早期神经网络的标配,但梯度消失严重
  2. ReLU 革命:解决了梯度消失,成为深度学习的基石
  3. ReLU 改进期:Leaky ReLU、PReLU、ELU、SELU 修补 ReLU 的缺陷
  4. 平滑时代:GELU、SiLU、Mish 引入平滑性和概率门控,成为 Transformer 时代的主流

理解了这条演进脉络,就掌握了激活函数设计的核心哲学:在非线性能力、梯度流、计算效率之间寻找最佳平衡点


延伸阅读:关于激活函数如何影响梯度传播的详细数学分析,以及 Batch Normalization 与激活函数的配合关系,可参考 大语言模型训练机制全解·第一篇 相关章节。