深度学习入门:通过反向传播与模型训练示意图理解神经网络工作原理

1次阅读
没有评论

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

image.webp

神经网络基础概念

神经网络模仿人脑的工作方式,由多层神经元(节点)组成。每层神经元接收前一层的数据,经过加权求和和激活函数处理后传递给下一层。这个过程称为 前向传播(Forward Propagation)。

深度学习入门:通过反向传播与模型训练示意图理解神经网络工作原理

  • 输入层:接收原始数据(如图像像素、文本向量)
  • 隐藏层:进行特征提取和转换(可以有多个)
  • 输出层:产生最终预测结果

前向传播计算预测值后,我们需要衡量预测值与真实值的差距——这就是 损失函数 (Loss Function)的作用。然后通过 反向传播(Backpropagation)将误差从输出层向输入层传递,调整各层权重参数。

反向传播的可视化理解

想象神经网络是一个多层瀑布系统:

  1. 水流(数据)从顶部(输入层)向下流动(前向传播)
  2. 在底部测量水质误差(计算损失)
  3. 将误差信息逆流向上传递(反向传播)
  4. 根据误差调整每层的阀门开度(权重更新)

这个过程中,梯度(Gradient)就是告诉我们每个阀门应该调大还是调小的指示牌。数学上,梯度是损失函数对各个权重的偏导数。

实战 PyTorch 代码示例

import torch
import torch.nn as nn
import torch.optim as optim

# 1. 定义一个简单的全连接网络
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(10, 5)  # 输入 10 维,输出 5 维
        self.fc2 = nn.Linear(5, 2)   # 输出 2 分类

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 2. 准备模拟数据
data = torch.randn(100, 10)  # 100 个样本,每个 10 维特征
labels = torch.randint(0, 2, (100,))  # 100 个 0 / 1 标签

# 3. 初始化模型、损失函数和优化器
model = SimpleNet()
criterion = nn.CrossEntropyLoss()  # 交叉熵损失
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 随机梯度下降

# 4. 训练循环
for epoch in range(100):
    # 前向传播
    outputs = model(data)
    loss = criterion(outputs, labels)

    # 反向传播和优化
    optimizer.zero_grad()  # 清空历史梯度
    loss.backward()        # 反向传播计算梯度
    optimizer.step()       # 更新权重

    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')

关键要素详解

计算图(Computational Graph)

PyTorch 自动构建的计算图记录了所有操作的历史:

  1. 前向传播时记录操作步骤
  2. 反向传播时沿着这个图回溯计算梯度
  3. 整个过程对用户透明,极大简化了开发

优化器选择

  • SGD:基础但需要精细调参
  • Adam:自适应学习率,新手友好
  • RMSprop:适合非平稳目标

学习率设置

  • 太大:损失震荡无法收敛
  • 太小:训练缓慢可能卡在局部最优
  • 实践建议:从 0.01 开始尝试

常见问题与解决方案

梯度消失 / 爆炸

症状
– 梯度消失:下层权重几乎不更新
– 梯度爆炸:损失值突然变成 NaN

解决方法

  • 使用 ReLU 等改良的激活函数
  • 应用 Batch Normalization
  • 梯度裁剪(Gradient Clipping)

过拟合

  • 增加 Dropout 层
  • 使用 L2 正则化
  • 获取更多训练数据

GPU 加速实践

只需两行代码即可利用 GPU:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
data = data.to(device)

GPU 可以显著加速矩阵运算,尤其当:
– 网络层数多
– 批量尺寸大
– 输入维度高

思考题:扩展到卷积神经网络

卷积神经网络 (CNN) 的反向传播有何不同?

  1. 卷积核的权重共享特性如何影响梯度计算?
  2. 池化层的反向传播该如何实现?
  3. 如何可视化 CNN 中的梯度传播路径?

建议尝试修改我们的示例代码,将全连接层替换为卷积层,观察训练过程的变化。

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