共计 1476 个字符,预计需要花费 4 分钟才能阅读完成。
梯度消失问题的本质
梯度消失是指深层神经网络在反向传播过程中,梯度随着层数的增加呈指数级衰减的现象。从数学上看,这是链式法则的连乘效应导致的。假设每层的梯度为 $\frac{\partial L}{\partial W_i} = \frac{\partial L}{\partial y_n} \prod_{k=i}^{n-1} \sigma'(z_k)W_k^T$,其中 $\sigma’$ 是激活函数的导数。当 $|\sigma'(z_k)W_k| < 1$ 时,连乘会导致梯度趋近于零。

传统激活函数与 ReLU 对比
传统 Sigmoid($\sigma(x)=\frac{1}{1+e^{-x}}$) 和 Tanh 函数存在饱和区,其导数最大值分别为 0.25 和 1.0。而 ReLU(Rectified Linear Unit) 定义为 $f(x)=max(0,x)$,具有以下优势:
- 正区间导数为 1,彻底避免了梯度衰减
- 计算复杂度仅为比较和乘法操作
- 稀疏激活性更符合生物学特性
PyTorch 实现示例
基础 ReLU 实现
import torch.nn as nn
class SimpleReLUNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 512)
self.relu = nn.ReLU(inplace=True) # 原地操作节省内存
self.fc2 = nn.Linear(512, 10)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x) # 关键激活层
return self.fc2(x)
LeakyReLU 调优建议
# 负斜率通常设为 0.01-0.2
leaky_relu = nn.LeakyReLU(negative_slope=0.1)
# 与 He 初始化配合使用效果更佳
nn.init.kaiming_normal_(layer.weight, mode='fan_in', nonlinearity='leaky_relu')
MNIST 性能对比实验
from torchvision import datasets, transforms
# 实验配置
epochs = 15
batch_size = 64
activations = {'ReLU': nn.ReLU(), 'LeakyReLU': nn.LeakyReLU(0.1), 'Sigmoid': nn.Sigmoid()}
for name, act in activations.items():
model = nn.Sequential(nn.Linear(784, 256),
act,
nn.Linear(256, 10)
).to(device)
# 训练过程...
# 记录每个 epoch 的 test accuracy
讨论与进阶建议
ReLU 的局限性
- 神经元死亡问题 :当输入始终为负时,梯度永远为 0
- 输出非零中心化 :可能影响后续层的学习效率
激活函数选型指南
- CNN 视觉任务:优先尝试 ReLU 系列
- RNN 时序建模:Tanh 可能表现更好
- 极深层网络:Swish/GELU 更稳定
与 BatchNorm 的协同
# 推荐使用顺序
conv -> bn -> relu # 优于 conv -> relu -> bn
思考题
- Transformer 中 GELU 的平滑特性更适合处理文本数据的连续表示
- 可通过梯度直方图统计和梯度范数监测来设计验证实验
实验环境参考
- GPU: NVIDIA RTX 3090
- PyTorch 1.12.1
- 学习率: 0.001 (Adam 优化器)
- Batch Size: 64
(注:完整实验代码需包含数据加载、训练循环和评估逻辑,此处为简洁展示核心结构)
正文完
发表至: 未分类
近一天内
