Skip to content

激活函数 (Activation Functions)

一句话定义:激活函数是神经网络中引入非线性的数学函数,它决定了神经元是否应该被”激活”(输出信号)。

没有激活函数,无论神经网络有多少层,最终都等价于一个线性变换(因为线性函数的组合还是线性的)。激活函数让网络能够学习复杂的非线性关系。


🎨 交互演示:激活函数对比 (Interactive)

Section titled “🎨 交互演示:激活函数对比 (Interactive)”

点击按钮切换显示不同的激活函数,直观对比它们的形状差异。

⚡ 激活函数对比

ReLUmax(0, x)
Sigmoid1 / (1 + e⁻ˣ)
GELUx · Φ(x)

💡 点击按钮切换显示不同的激活函数,观察它们的形状差异


  • 线性函数:像一条直线公路,车子只能匀速前进,无法转弯。
  • 激活函数:像交通信号灯,决定车子能不能通过、以什么速度通过。
    • ReLU:绿灯全速通过,红灯完全停止(负数直接变 0)。
    • Sigmoid:根据信号强度,平滑地从 0 加速到 1。
    • GELU:更智能的信号灯,会根据”概率”决定通行速度。

最常用的激活函数,简单高效。

ReLU 公式
ReLU(x)=max(0,x)\text{ReLU}(x) = \max(0, x)
  • x>0x > 0: 输出 xx(线性通过)
  • x0x \leq 0: 输出 00(完全抑制)
  • 优点: 计算快、缓解梯度消失
  • 缺点: “死亡 ReLU”问题(神经元永久失活)

将输出压缩到 (0, 1) 区间,常用于二分类输出层。

Sigmoid 公式
σ(x)=11+ex\sigma(x) = \frac{1}{1 + e^{-x}}
  • 输出范围: (0,1)(0, 1),可解释为概率
  • 优点: 平滑可导,输出有界
  • 缺点: 梯度消失、输出非零中心

Sigmoid 的改进版,输出零中心。

Tanh 公式
tanh(x)=exexex+ex\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
  • 输出范围: (1,1)(-1, 1),零中心
  • 优点: 比 Sigmoid 收敛更快
  • 缺点: 仍有梯度消失问题

现代 Transformer (BERT, GPT) 的标准选择。

GELU 公式
GELU(x)=xΦ(x)0.5x(1+tanh[2/π(x+0.044715x3)])\text{GELU}(x) = x \cdot \Phi(x) \approx 0.5x(1 + \tanh[\sqrt{2/\pi}(x + 0.044715x^3)])
  • Φ(x)\Phi(x): 标准正态分布的累积分布函数
  • 核心思想: 根据输入的”概率重要性”加权输出
  • 优点: 平滑、非单调、NLP 任务 SOTA
  • 论文: Hendrycks & Gimpel, 2016 (arXiv:1606.08415)

Google Brain 提出,自门控机制。

SiLU/Swish 公式
SiLU(x)=xσ(x)=x1+ex\text{SiLU}(x) = x \cdot \sigma(x) = \frac{x}{1 + e^{-x}}
  • 特点: 非单调、自门控(xx 乘以自己的 Sigmoid)
  • 优点: 深层网络表现优于 ReLU
  • 应用: EfficientNet, Llama 2/3

函数公式范围优点缺点典型应用
ReLUmax(0,x)\max(0,x)[0,+)[0, +\infty)计算快死亡神经元CNN, 通用
Sigmoid11+ex\frac{1}{1+e^{-x}}(0,1)(0, 1)概率输出梯度消失二分类输出
Tanhexexex+ex\frac{e^x-e^{-x}}{e^x+e^{-x}}(1,1)(-1, 1)零中心梯度消失RNN 隐藏层
GELUxΦ(x)x \cdot \Phi(x)(0.17,+)(-0.17, +\infty)平滑、SOTA计算稍慢Transformer
SiLUxσ(x)x \cdot \sigma(x)(0.28,+)(-0.28, +\infty)自门控计算稍慢Llama, EfficientNet

import torch
import torch.nn.functional as F
x = torch.linspace(-3, 3, 100)
# ReLU
relu_out = F.relu(x)
# Sigmoid
sigmoid_out = torch.sigmoid(x)
# Tanh
tanh_out = torch.tanh(x)
# GELU (Transformer 标准)
gelu_out = F.gelu(x)
# SiLU / Swish (Llama 使用)
silu_out = F.silu(x)
print(f"ReLU(-2): {F.relu(torch.tensor(-2.0)).item()}") # 0.0
print(f"Sigmoid(0): {torch.sigmoid(torch.tensor(0.0)).item()}") # 0.5
print(f"GELU(1): {F.gelu(torch.tensor(1.0)).item():.4f}") # 0.8413

场景推荐激活函数原因
CNN 图像分类ReLU / Leaky ReLU计算效率高
Transformer / NLPGELUBERT/GPT 标准配置
Llama / 现代 LLMSiLU (Swish)深层网络表现好
二分类输出层Sigmoid输出概率
多分类输出层Softmax输出概率分布
RNN 隐藏层Tanh零中心,梯度特性好


论文激活函数链接
Nair & Hinton, 2010ReLUICML 2010
Hendrycks & Gimpel, 2016GELUarXiv:1606.08415
Ramachandran et al., 2017SwisharXiv:1710.05941
Elfwing et al., 2018SiLUNeural Networks