深度学习_神经网络_损失函数基础
🎯 一、什么是损失函数(Loss Function)
损失函数(Loss Function)用于衡量模型预测值与真实值之间的差距。
它是模型训练中优化器(如 SGD、Adam)调整参数的依据。
👉 简单理解:
- 模型预测越准 → Loss 越小。
- 模型预测越差 → Loss 越大。
训练目标就是 让 Loss 最小化 (minimize loss)。
🧩 二、回归任务的常见损失函数
回归任务(Regression)目标是预测连续值(如房价、温度、销量等)。最常用的损失函数是:
1️⃣ 均方误差(MSE, Mean Squared Error)—— L2 Loss
💡 定义公式:
LMSE=1n∑i=1n(yi−y^i)2L_{\text{MSE}} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2LMSE=n1i=1∑n(yi−y^i)2
- yiy_iyi: 真实值
- y^i\hat{y}_iy^i: 模型预测值
- nnn: 样本数
🧠 含义解释:
计算所有样本预测误差的平方的平均值。平方项让“大误差”惩罚更重,对异常值(outlier)敏感。
✅ 特点总结:
| 优点 | 缺点 |
|---|---|
| 数学性质好(可导、平滑) | 对离群点敏感(平方放大误差) |
| 常用于梯度下降训练 | 不适合有较多异常点的数据 |
💻 PyTorch 实现:
import torch
import torch.nn as nnloss_fn = nn.MSELoss()
y_pred = torch.tensor([2.5, 0.0, 2.1])
y_true = torch.tensor([3.0, -0.5, 2.0])
loss = loss_fn(y_pred, y_true)
print(loss.item())
2️⃣ 平均绝对误差(MAE, Mean Absolute Error)—— L1 Loss
💡 定义公式:
LMAE=1n∑i=1n∣yi−y^i∣L_{\text{MAE}} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|LMAE=n1i=1∑n∣yi−y^i∣
🧠 含义解释:
取预测值与真实值的绝对差的平均值。
✅ 特点总结:
| 优点 | 缺点 |
|---|---|
| 对异常值更鲁棒(不受平方放大影响) | 不可导点在 0 处(梯度不连续) |
| 更关注整体误差的平衡 | 收敛速度慢,优化不稳定 |
💻 PyTorch 实现:
import torch
import torch.nn as nnloss_fn = nn.L1Loss()
y_pred = torch.tensor([2.5, 0.0, 2.1])
y_true = torch.tensor([3.0, -0.5, 2.0])
loss = loss_fn(y_pred, y_true)
print(loss.item())
⚖️ L1 vs L2 对比总结:
| 项目 | L1(MAE) | L2(MSE) |
|---|---|---|
| 公式 | 平均绝对误差 | 平均平方误差 |
| 对异常值敏感度 | 低(鲁棒) | 高 |
| 导数连续性 | 不连续(0处) | 连续、平滑 |
| 收敛速度 | 较慢 | 较快 |
| 常见应用 | 噪声大、异常点多 | 噪声小、平滑优化 |
🔹 在实际应用中,也常用 Huber Loss 作为折中方案(小误差用 L2,大误差用 L1)。
🧠 三、分类任务的常见损失函数
分类任务(Classification)目标是预测类别标签(如猫/狗、0/1、A/B/C 等)。最常用的是 交叉熵损失 (Cross-Entropy Loss)。
1️⃣ 交叉熵损失(Cross-Entropy Loss)
💡 定义背景:
交叉熵 (Cross Entropy) 来自信息论,用来衡量两个概率分布之间的差距。
在分类任务中:
- 模型输出的是 预测概率分布 (y^\hat{y}y^)(通过 Softmax/Sigmoid)
- 真实标签是 真实分布 (yyy)(独热编码 one-hot)
💡 数学定义:
对于多分类问题:
LCE=−∑i=1Cyilog(y^i)L_{\text{CE}} = - \sum_{i=1}^{C} y_i \log(\hat{y}_i)LCE=−i=1∑Cyilog(y^i)
- CCC: 类别数
- yiy_iyi: 真实标签(one-hot)
- y^i\hat{y}_iy^i: 模型预测概率
在二分类时可简化为:
LBCE=−[ylog(y^)+(1−y)log(1−y^)]L_{\text{BCE}} = -[y \log(\hat{y}) + (1 - y) \log(1 - \hat{y})]LBCE=−[ylog(y^)+(1−y)log(1−y^)]
🧠 含义解释:
当模型预测的概率越接近真实标签(比如真实为“猫”,预测猫=0.99),损失越小。当预测概率偏离真实标签(比如真实为“猫”,预测猫=0.1),损失急剧增大。
✅ 特点总结:
| 优点 | 缺点 |
|---|---|
| 对概率输出 (Softmax) 天然匹配 | 对错误预测惩罚较大 |
| 数学性质良好、可导 | 对于极端预测 (0 或 1) 易产生数值不稳定 |
| 可清晰度量分类置信度 | 需要概率化输出(如 Sigmoid / Softmax) |
💻 PyTorch 实现:
(1) 二分类(Binary CrossEntropy)
import torch
import torch.nn as nnloss_fn = nn.BCELoss() # 输出需经过Sigmoid
y_pred = torch.tensor([0.9, 0.2, 0.8])
y_true = torch.tensor([1.0, 0.0, 1.0])
loss = loss_fn(y_pred, y_true)
print(loss.item())
⚠️ 若模型输出未经 Sigmoid,则使用
BCEWithLogitsLoss()(更稳定,内部自带 Sigmoid)。
(2) 多分类(CrossEntropyLoss)
import torch
import torch.nn as nnloss_fn = nn.CrossEntropyLoss()
y_pred = torch.tensor([[2.0, 0.5, 0.1], [0.3, 2.1, 0.2]]) # logits
y_true = torch.tensor([0, 1]) # 标签索引
loss = loss_fn(y_pred, y_true)
print(loss.item())
说明:
CrossEntropyLoss内部会自动执行 Softmax。
🔢 举个例子直观理解:
| 类别 | 真实标签 yyy | 预测概率 (猫/狗) | Loss 值 |
|---|---|---|---|
| 样本 1 | 猫 (1,0) | (0.9, 0.1) | 很小(预测准) |
| 样本 2 | 猫 (1,0) | (0.3, 0.7) | 较大(预测错) |
| 样本 3 | 狗 (0,1) | (0.4, 0.6) | 较小(预测对) |
🧮 四、回归 vs 分类的损失函数对比
| 任务类型 | 常用损失函数 | 适用场景 | 备注 |
|---|---|---|---|
| 回归 | MSE / MAE / Huber | 连续数值预测 | 预测误差的“距离” |
| 分类 | Cross-Entropy / BCE | 离散标签预测 | 概率分布差距 |
🧭 五、扩展:Huber Loss(平衡 L1 与 L2)
KaTeX parse error: Expected 'EOF', got '&' at position 60: … - \\hat{y})^2 &̲ \\text{if } |y…
当误差小于阈值 δ\deltaδ 时使用平方误差(平滑优化),当误差大于 δ\deltaδ 时使用绝对误差(抗异常)。
📌 总结一句话:
- 回归问题: 衡量预测值与真实值之间的“距离差”。
- 分类问题: 衡量预测概率分布与真实标签分布之间的“相似度差”。
优化目标:损失越小,模型预测越接近真实。

