共计 1921 个字符,预计需要花费 5 分钟才能阅读完成。
为什么损失函数如此重要?
在神经网络训练过程中,损失函数(Loss Function)就像是导航系统中的指南针。它量化了模型预测值与真实值之间的差距,并通过反向传播指导参数更新。如果选择不当,可能会导致:

- 梯度消失 :如使用 MSE 损失处理分类任务时,sigmoid 激活函数与 MSE 组合易产生饱和区
- 震荡不收敛 :学习率与损失函数曲率不匹配时,参数更新幅度不稳定
- 训练效率低下 :不合理的损失函数会使优化过程陷入局部最优
两大核心损失函数原理剖析
1. 均方误差(MSE)
适用于回归任务,数学表达式为:
$$ L_{MSE} = \frac{1}{2N}\sum_{i=1}^N (y_i – \hat{y}_i)^2 $$
其梯度计算过程(反向传播时使用):
$$ \frac{\partial L}{\partial w} = \frac{1}{N}\sum_{i=1}^N (\hat{y}_i – y_i) \cdot \frac{\partial \hat{y}_i}{\partial w} $$
2. 交叉熵损失(Cross-Entropy)
分类任务的首选,二分类形式为:
$$ L_{CE} = -\frac{1}{N}\sum_{i=1}^N [y_i \log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i)] $$
多分类情况(配合 Softmax):
$$ L_{CE} = -\frac{1}{N}\sum_{i=1}^N \sum_{c=1}^C y_{i,c} \log(\hat{y}_{i,c}) $$
PyTorch 实战演示
MSE 实现示例
import torch
import torch.nn as nn
# 模拟数据
y_true = torch.tensor([1.0, 2.0, 3.0], requires_grad=False)
y_pred = torch.tensor([1.5, 1.8, 2.9], requires_grad=True)
# 自定义 MSE 实现
mse_loss = 0.5 * torch.mean((y_pred - y_true)**2)
# PyTorch 内置实现
mse_loss = nn.MSELoss(reduction='mean')(y_pred, y_true)
# 反向传播
mse_loss.backward()
print(f"梯度值: {y_pred.grad}") # 输出: tensor([-0.1667, -0.0667, -0.0333])
交叉熵实战
# 分类任务示例
logits = torch.randn(3, 5, requires_grad=True) # 3 个样本 5 分类
labels = torch.tensor([1, 0, 4]) # 真实类别索引
# 内置交叉熵(自动包含 Softmax)ce_loss = nn.CrossEntropyLoss()(logits, labels)
# 手动实现(理解原理)softmax = torch.exp(logits) / torch.exp(logits).sum(dim=1, keepdim=True)
ce_loss = -torch.log(softmax[range(len(labels)), labels]).mean()
ce_loss.backward()
不同场景下的选型策略
- 回归任务 :优先考虑 MSE 或 MAE(异常值少用 MSE,多则用 MAE)
- 二分类 :Binary Cross-Entropy + Sigmoid
- 多分类 :Cross-Entropy + Softmax
- 多标签分类 :Binary Cross-Entropy(每个类别独立判断)
三大避坑指南
- 数值稳定性问题
- 交叉熵中应对 log 输入添加微小值:
torch.clamp(probs, min=1e-8) -
使用 PyTorch 内置函数(已做优化)
-
输出层与损失函数匹配
- 交叉熵不要接 Sigmoid(内置已包含)
-
MSE 通常接线性输出层
-
梯度爆炸预防
- 监控梯度范数:
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) - 合理初始化权重(如 Xavier 初始化)
延伸思考:类别不平衡问题
当正负样本比例悬殊时(如医疗影像中的病灶检测),标准交叉熵会偏向多数类。改进思路包括:
- 类别加权:
nn.CrossEntropyLoss(weight=torch.tensor([1.0, 5.0])) - Focal Loss:降低易分类样本的权重
- 采样策略调整
关键总结
- 理解损失函数的数学本质比记忆公式更重要
- PyTorch 内置实现已优化数值稳定性,优先使用
- 监控训练过程中的 loss 变化曲线是诊断问题的有效手段
- 没有 ’ 最好 ’ 的损失函数,只有 ’ 最适合 ’ 当前任务的
下次当你看到 loss 值震荡不降时,不妨回头检查:我的损失函数选对了吗?
正文完
