如果说神经网络的架构是它的"身体",那么损失函数 就是它的"感官",而反向传播则是它的"进化机制"。通过这两者的结合,模型才能知道自己错在哪里,并朝着正确的方向不断修正。
1. 损失函数的核心作用
损失函数(Loss Function)在训练中扮演着两个至关重要的角色:
- 衡量差距:计算实际输出(Outputs)与目标输出(Targets)之间的距离。Loss 越小,说明模型预测越准。
- 提供依据:为模型参数的更新提供方向。
2. 常见的损失函数
文件介绍了三种不同场景下的损失函数:
① L1Loss
- 计算方式:计算预测值与真实值之差的绝对值平均数。
- 数学公式:
.
② MSELoss (均方误差)
- 计算方式:计算差值的平方平均数。
- 特点:对离群点(误差大的点)非常敏感,误差越大,惩罚越重。
③ CrossEntropyLoss (交叉熵损失)
这是分类任务 中最常用的损失函数。它结合了 LogSoftmax 和 NLLLoss。
- 作用:衡量两个概率分布之间的差异。当模型对正确类别的预测概率越高,损失值就越低。
3. 反向传播:参数更新的秘密
计算出 Loss 之后,我们该如何调整网络中的权重(Weights)呢?这就是 Backward Propagation 的任务。
核心步骤:
- 调用 .backward():当你对 Loss 值调用此方法时,PyTorch 会利用数学中的链式法则 ,自动计算出 Loss 对网络中每个节点(参数)的梯度(Gradient)。
- 梯度属性 :在反向传播之前,参数的
grad属性为空;执行后,每个参数都会获得一个梯度值。 - 意义:梯度告诉了我们:如果要减小 Loss,这个参数应该往大调还是往小调。
4. 代码实战:在模型中使用损失函数
文件展示了如何在之前搭建的 CIFAR-10 网络中集成损失计算:
Python
import torch
from torch import nn
# 1. 定义交叉熵损失函数
loss = nn.CrossEntropyLoss()
# 2. 实例化网络
tudui = Tudui()
# 3. 训练循环模拟
for data in dataloader:
imgs, targets = data
# 前向传播:得到实际输出
outputs = tudui(imgs)
# 计算损失:对比输出与目标
result_loss = loss(outputs, targets)
# 反向传播:计算每个节点的梯度
result_loss.backward()
# 打印当前的损失值
print(f"Current Loss: {result_loss.item()}")
5. 总结:训练的闭环逻辑
通过分析该文件,我们补全了模型训练的最后一块拼图:
- Forward(前向) :数据流过网络,得到结果,计算 Loss。
- Backward(反向) :根据 Loss 计算各层的 Gradients(梯度)。
- Optimize(优化):利用梯度更新权重(下一节内容)。