bp前馈全连接神经网络入门指南:从理论到PyTorch实战

1次阅读
没有评论

共计 1776 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点:初学者常踩的坑

刚接触神经网络时,我曾在实现反向传播时遇到过梯度消失的困扰——当网络层数较深时,梯度会指数级衰减,导致浅层参数几乎不更新。后来发现这与激活函数的选择密切相关:

  • Sigmoid 函数的饱和区:当输入值较大时,梯度会接近 0,尤其深层网络叠加时这种现象更明显
  • ReLU 的死亡问题:如果学习率设置过大,部分神经元可能永远输出 0 并无法恢复
  • 权重初始化不当:比如全零初始化会导致所有神经元行为一致,失去多样性

激活函数对比实验

在隐层尝试了三种典型激活函数的效果差异:

  1. Sigmoid:输出范围(0,1),容易导致梯度消失
  2. Tanh:输出范围(-1,1),梯度消失问题比 Sigmoid 略好
  3. ReLU:计算简单且能缓解梯度消失,但要注意死亡神经元问题

实际测试时,ReLU 配合 He 初始化在大多数场景表现最优。以下是 PyTorch 中的实现对比:

# PyTorch 2.0+
import torch.nn as nn

# Sigmoid 层
self.sigmoid = nn.Sequential(nn.Linear(in_features, out_features),
    nn.Sigmoid())

# ReLU 层(推荐)self.relu = nn.Sequential(nn.Linear(in_features, out_features),
    nn.ReLU(inplace=True)
)

PyTorch 完整实现

网络结构定义

class MLP(nn.Module):
    def __init__(self, input_size=784, hidden_size=256, num_classes=10):
        super(MLP, self).__init__()
        # 第 1 个全连接层(输入层→隐层)self.fc1 = nn.Linear(input_size, hidden_size)
        # 第 2 个全连接层(隐层→输出层)self.fc2 = nn.Linear(hidden_size, num_classes)
        # Dropout 层(防止过拟合)self.dropout = nn.Dropout(p=0.5)

    def forward(self, x):
        # 展开输入图像(MNIST 为 28x28→784)x = x.view(-1, 28*28)
        # 第一层:线性变换 +ReLU 激活
        x = F.relu(self.fc1(x))
        # 随机失活部分神经元
        x = self.dropout(x)
        # 输出层(不需激活函数,CrossEntropyLoss 包含 Softmax)x = self.fc2(x)
        return x

训练流程关键代码

# 初始化模型(使用 He 初始化)model = MLP()
for m in model.modules():
    if isinstance(m, nn.Linear):
        nn.init.kaiming_normal_(m.weight, mode='fan_in')

# 定义损失函数(含 L2 正则化)criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), 
                            lr=0.001, 
                            weight_decay=1e-5)  # L2 正则化系数

# 学习率衰减策略
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, 
                                          step_size=10, 
                                          gamma=0.1)

生产环境注意事项

  1. 参数初始化
  2. ReLU 网络建议使用 He 初始化(kaiming_normal_
  3. Sigmoid/Tanh 建议使用 Xavier 初始化(xavier_normal_

  4. 学习率设置

  5. 初始值通常取 0.001~0.1
  6. 配合学习率衰减(如 StepLR 或 ReduceLROnPlateau)

  7. 正则化策略

  8. L2 正则化(weight_decay)建议值 1e-5~1e-3
  9. Dropout 率通常设为 0.2~0.5

MNIST 实验效果

经过 20 轮训练后:

配置 测试准确率
基线模型(无优化) 96.2%
+ Dropout 97.1%
+ L2 正则化 97.5%
完整优化方案 98.3%

bp 前馈全连接神经网络入门指南:从理论到 PyTorch 实战(示例图:损失 / 准确率变化曲线)

延伸思考

  1. 如何用卷积层替代全连接层优化图像分类任务?
  2. 当训练数据量较小时,哪些技巧可以防止过拟合?
  3. 批归一化 (BatchNorm) 会对全连接网络产生什么影响?

希望这篇笔记能帮你少走弯路!遇到问题欢迎在评论区交流~

正文完
 0
评论(没有评论)