深度学习_神经网络_损失函数基础 - 详解

一、什么是损失函数(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=1n(yiy^i)2

  • yiy_iyi: 真实值
  • y^i\hat{y}_iy^i: 模型预测值
  • nnn: 样本数

含义解释:
计算所有样本预测误差的平方的平均值。平方项让“大误差”惩罚更重,对异常值(outlier)敏感。

特点总结:

优点缺点
数学性质好(可导、平滑)对离群点敏感(平方放大误差)
常用于梯度下降训练不适合有较多异常点的数据

PyTorch 实现:

import torch
import torch.nn as nn
loss_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=1nyiy^i

含义解释:
取预测值与真实值的绝对差的平均值。

特点总结:

优点缺点
对异常值更鲁棒(不受平方放大影响)不可导点在 0 处(梯度不连续)
更关注整体误差的平衡收敛速度慢,优化不稳定

PyTorch 实现:

import torch
import torch.nn as nn
loss_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=1Cyilog(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^)+(1y)log(1y^)]

含义解释:
当模型预测的概率越接近真实标签(比如真实为“猫”,预测猫=0.99),损失越小。当预测概率偏离真实标签(比如真实为“猫”,预测猫=0.1),损失急剧增大。

特点总结:

优点缺点
对概率输出 (Softmax) 天然匹配对错误预测惩罚较大
数学性质良好、可导对于极端预测 (0 或 1) 易产生数值不稳定
可清晰度量分类置信度需要概率化输出(如 Sigmoid / Softmax)

PyTorch 实现:

(1) 二分类(Binary CrossEntropy)

import torch
import torch.nn as nn
loss_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 nn
loss_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δ 时使用绝对误差(抗异常)。


总结一句话:

  • 回归问题: 衡量预测值与真实值之间的“距离差”。
  • 分类问题: 衡量预测概率分布与真实标签分布之间的“相似度差”。

优化目标:损失越小,模型预测越接近真实。
请添加图片描述

posted @ 2025-12-09 17:19  gccbuaa  阅读(46)  评论(0)    收藏  举报