激活函数
没有激活函数,多层神经网络等价于单层线性变换。激活函数提供非线性,让网络能拟合任意函数。
为什么需要非线性?
Section titled “为什么需要非线性?”常用激活函数
Section titled “常用激活函数”import torchimport torch.nn.functional as Fimport matplotlib.pyplot as pltimport 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 | 有梯度消失,仅用于输出层 | |
| Tanh | 零中心,仍有梯度消失 | |
| ReLU | 简单高效,最常用 | |
| GELU | Transformer 标配 | |
| SwiGLU | Llama 使用,性能更好 |
梯度消失问题
Section titled “梯度消失问题”# Sigmoid 在 |x| > 3 时梯度接近 0x = 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 时梯度恒为 1x2 = 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
- 回归输出:不用激活函数