共计 1768 个字符,预计需要花费 5 分钟才能阅读完成。
神经网络基础概念
神经网络模仿人脑的工作方式,由多层神经元(节点)组成。每层神经元接收前一层的数据,经过加权求和和激活函数处理后传递给下一层。这个过程称为 前向传播(Forward Propagation)。

- 输入层:接收原始数据(如图像像素、文本向量)
- 隐藏层:进行特征提取和转换(可以有多个)
- 输出层:产生最终预测结果
前向传播计算预测值后,我们需要衡量预测值与真实值的差距——这就是 损失函数 (Loss Function)的作用。然后通过 反向传播(Backpropagation)将误差从输出层向输入层传递,调整各层权重参数。
反向传播的可视化理解
想象神经网络是一个多层瀑布系统:
- 水流(数据)从顶部(输入层)向下流动(前向传播)
- 在底部测量水质误差(计算损失)
- 将误差信息逆流向上传递(反向传播)
- 根据误差调整每层的阀门开度(权重更新)
这个过程中,梯度(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 自动构建的计算图记录了所有操作的历史:
- 前向传播时记录操作步骤
- 反向传播时沿着这个图回溯计算梯度
- 整个过程对用户透明,极大简化了开发
优化器选择
- 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) 的反向传播有何不同?
- 卷积核的权重共享特性如何影响梯度计算?
- 池化层的反向传播该如何实现?
- 如何可视化 CNN 中的梯度传播路径?
建议尝试修改我们的示例代码,将全连接层替换为卷积层,观察训练过程的变化。
正文完
