Skip to content

激活函数

没有激活函数,多层神经网络等价于单层线性变换。激活函数提供非线性,让网络能拟合任意函数。

无激活: W2(W1x)=Wx——还是线性的\text{无激活: } W_2(W_1x) = Wx \quad \text{——还是线性的} 有激活: W2(f(W1x))——可以拟合任意函数\text{有激活: } W_2(f(W_1x)) \quad \text{——可以拟合任意函数}
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np
x = torch.linspace(-4, 4, 200)
# Sigmoid:输出 (0, 1),用于二分类输出层
sigmoid = torch.sigmoid(x)
# Tanh:输出 (-1, 1),零中心
tanh = torch.tanh(x)
# ReLU:最常用,简单高效
relu = F.relu(x)
# GELU:Transformer 标配
gelu = F.gelu(x)
# SwiGLU:Llama 等现代模型使用
swish = x * torch.sigmoid(x)
函数公式特点
Sigmoidσ(x)=11+ex\sigma(x) = \frac{1}{1+e^{-x}}有梯度消失,仅用于输出层
Tanhtanh(x)\tanh(x)零中心,仍有梯度消失
ReLUmax(0,x)\max(0, x)简单高效,最常用
GELUxΦ(x)x \cdot \Phi(x)Transformer 标配
SwiGLUxσ(βx)Wx \cdot \sigma(\beta x) \cdot WLlama 使用,性能更好
# Sigmoid 在 |x| > 3 时梯度接近 0
x = torch.tensor([5.0], requires_grad=True)
y = torch.sigmoid(x)
y.backward()
print(f"Sigmoid'(5.0) = {x.grad.item():.6f}") # ≈ 0.0066,几乎为 0
# ReLU 在 x > 0 时梯度恒为 1
x2 = torch.tensor([5.0], requires_grad=True)
y2 = F.relu(x2)
y2.backward()
print(f"ReLU'(5.0) = {x2.grad.item()}") # 1.0
  • 隐藏层:ReLU(简单场景)或 GELU(Transformer)
  • 二分类输出:Sigmoid
  • 多分类输出:Softmax
  • 回归输出:不用激活函数