本文系统总结深度学习中常见的损失函数,
- 从最基础的 MSE、MAE、交叉熵,
- 到分类中的 BCE、Focal Loss,
- 目标检测中的 IoU / GIoU / DIoU / CIoU,
- 语义分割中的 Dice Loss、Tversky Loss,
- 再到对比学习中的 Contrastive Loss、Triplet Loss,
- 以及 KL Divergence、CTC、GAN、扩散模型中的损失函数。
本文重点不是简单罗列公式,而是回答三个问题:
这个 Loss 到底在优化什么?
为什么要这样设计?
什么时候应该使用它?
1. 什么是损失函数?
在机器学习中,我们希望模型 预测结果
尽可能接近 真实标签
。
因此定义一个函数:

用来衡量:模型预测得有多差。也就是 Loss 越小 ⇒ 预测结果越接近目标。
训练过程就是不断调整模型参数
:

其中:
-
:输入 -
:真实标签 -
:模型预测,即 
-
:模型参数 -
:损失函数
2. Loss、Metric 和 Objective 有什么区别?
这是学习损失函数时非常容易混淆的地方。
2.1 Loss
Loss 用于:训练模型。例如 pytorch 中的实现:
loss = nn.CrossEntropyLoss()
然后反向传播更新模型参数:
loss.backward()
optimizer.step()
2.2 Metric
Metric 用于:评价模型效果。例如分类评价指标:
-
Accuracy
-
Precision
-
Recall
-
F1
-
AUC
医学图像分割评价指标:
-
Dice
-
IoU
-
HD95
具体公式例如:

2.3 Objective
Objective 可以理解为最终优化目标。
例如多任务学习:

这里整个
就是最终 Objective。
3. Loss 函数的总体分类
可以把深度学习 Loss 大致分成下面几大类:
| 回归 Loss | MSE、MAE、Huber | 回归 |
| 概率分布 Loss | KL Divergence | 蒸馏、分布匹配 |
| 二分类 Loss | BCE、BCEWithLogits | 二分类、多标签 |
| 多分类 Loss | CE、NLL | 多分类 |
| Margin Loss | Hinge、Margin Ranking | SVM、排序 |
| 不平衡 Loss | Focal、Class-Balanced | 长尾分类 |
| 分割 Loss | Dice、IoU、Tversky | 医学图像分割 |
| 检测 Loss | IoU、GIoU、DIoU、CIoU | 目标检测 |
| 度量学习 | Contrastive、Triplet | 表征学习 |
| 序列 Loss | CTC | OCR、语音 |
| 生成模型 | GAN Loss、VAE Loss、Diffusion Loss | 生成模型 |
| 正则化 | L1、L2、Elastic Net | 防止过拟合 |
| 多任务 | Weighted Sum | 多任务学习 |
下面逐个展开。
4. 回归损失函数
回归任务的目标通常是:

最经典的几种 Loss 是:
-
MSE
-
MAE
-
Smooth L1
-
Huber
-
Log-Cosh
5. MSE Loss
MSE(Mean Squared Error,均方误差)
定义:

也可以写成:
![L_{MSE} = \\mathbb{E} [(y-\\hat{y})^2]](https://www.wsisp.com/helps/wp-content/uploads/2026/09/20260903090350-6a9937f6e78b0.png)
5.1 为什么叫平方误差?
假设:

模型预测:

那么MSE:

如果预测错得更多:

那么:

所以 MSE 会:强烈惩罚大误差。
5.2 MSE 的梯度
对于:

对
求导:

误差越大,梯度越大。
因此:MSE 对异常值非常敏感。
5.3 MSE 的优点
-
简单
-
光滑
-
可导
-
优化稳定
-
大误差惩罚强
PyTorch 实现:
import torch.nn as nn
criterion = nn.MSELoss()
loss = criterion(pred, target)
6. MAE / L1 Loss
MAE:Mean Absolute Error
定义:

例如:

则:

6.1 MAE 和 MSE 的区别
假设:

MSE:

MAE:

因此:
MSE 会放大大误差,而 MAE 对异常值更加鲁棒。
6.2 MAE 的问题
绝对值:

在:

处不可导。虽然深度学习框架能够处理这个问题,但相比 MSE,它的优化通常不如 MSE 平滑。
PyTorch 实现:
criterion = nn.L1Loss()
7. MSE vs MAE
| 误差形式 | ![]() |
![]() |
| 大误差惩罚 | 强 | 弱 |
| 异常值敏感度 | 高 | 低 |
| 梯度 | 连续 | 0 点不可导 |
| 优化 | 容易 | 相对困难 |
| 鲁棒性 | 较差 | 较好 |
简单理解:
MSE:我非常讨厌大错误。
MAE:大错误和小错误按照线性比例处理。
8. Smooth L1 Loss
Smooth L1 是一种 MSE 和 MAE 的折中。
定义:

其中:

核心思想:
-
小误差:使用平方函数
-
大误差:使用绝对值函数
因此:小误差区域平滑,大误差区域鲁棒。
9. Huber Loss
Huber Loss 与 Smooth L1 非常接近。
定义:

其中:

当误差较小时:

当误差较大时:

因此:Huber Loss 是经典的鲁棒回归 Loss。
PyTorch 实现:
criterion = nn.HuberLoss(delta=1.0)
PyTorch 也将 SmoothL1Loss 和 HuberLoss 作为标准 Loss 提供。
10. Log-Cosh Loss
定义:

当
很小时:

所以类似 MSE。
当
很大时:

所以类似 MAE。
因此:Log-Cosh 也是一种平滑的鲁棒回归 Loss。
11. 回归 Loss 总结
| MSE | 平方误差 | 敏感 |
| MAE | 绝对误差 | 鲁棒 |
| Smooth L1 | MSE + MAE | 鲁棒 |
| Huber | MSE + MAE | 鲁棒 |
| Log-Cosh | 平滑 MAE | 较鲁棒 |
12. 二分类损失:Binary Cross Entropy
对于二分类:

模型输出:

BCE:
![\\boxed{ L_{BCE} = - [ y\\log p+ (1-y)\\log(1-p) ] }](2026-09-03by0ahmjm0cx.png)
为什么可以当作二分类的损失?
12.1 当真实标签是 1
如果:

那么:

所以:
-
→ Loss 很小 -
→ Loss 较小 -
→ Loss 很大
12.2 当真实标签是 0

得到:

如果模型错误地预测:

那么:

Loss 会非常大。
13. BCEWithLogitsLoss
实际深度学习中更推荐:
nn.BCEWithLogitsLoss()
而不是:
sigmoid()
+
BCELoss()
因为 BCEWithLogitsLoss 将 Sigmoid 与 BCE 合并计算,并使用数值稳定技巧,避免概率非常接近 0 或 1 时出现数值问题。
正确写法:
criterion = nn.BCEWithLogitsLoss()
logits = model(x)
loss = criterion(logits, target)
模型最后:
nn.Linear(…)
不要再手动 Sigmoid。
14. BCE 最适合什么任务?
BCE 非常适合:二分类
例如:
正常 / 患病
猫 / 狗
有目标 / 无目标
多标签分类
例如一个样本同时存在:
肺炎
胸腔积液
肺不张
气胸
每个标签都是独立的:

这种情况使用:
nn.BCEWithLogitsLoss()
而不是 CrossEntropyLoss。
15. Cross Entropy Loss
Cross Entropy 是深度学习分类任务中最重要的 Loss 之一。
对于
个类别:

如果标签是 one-hot:
![y=[0,0,1,0]](2026-09-03ln4arr2rscr.png)
那么:

16. 为什么 Cross Entropy 与 Softmax 配合?
Softmax:

其中
是模型输出的 logits。
Cross Entropy:

代入 Softmax:

得到:

这就是分类模型常见的 LogSumExp 结构。
PyTorch 的 CrossEntropyLoss 接收的是 未归一化 logits,而不是先 Softmax 后的概率,它内部等价于 LogSoftmax + NLLLoss。
所以:
criterion = nn.CrossEntropyLoss()
logits = model(x)
loss = criterion(logits, target)
不要:
logits = model(x)
prob = torch.softmax(logits, dim=1)
loss = criterion(prob, target)
17. NLL Loss
NLL:Negative Log Likelihood
定义:

PyTorch:
criterion = nn.NLLLoss()
log_prob = F.log_softmax(logits, dim=1)
loss = criterion(log_prob, target)
因此:

18. Cross Entropy 为什么有效?
假设真实类别:

模型预测:
class 0: 0.1
class 1: 0.1
class 2: 0.8
Loss:

如果模型预测:
class 0: 0.4
class 1: 0.5
class 2: 0.1
Loss:

所以:Cross Entropy 本质上是在惩罚模型给真实类别分配过低概率。
19. Label Smoothing
普通 One-Hot:
![y=[1,0,0]](2026-09-03oxqhxplanjt.png)
Label Smoothing 后:
![y=[1-\\epsilon,\\frac{\\epsilon}{C-1},\\frac{\\epsilon}{C-1}]](2026-09-033mfzcqr5ls1.png)
例如:

变成:
![[0.9,0.05,0.05]](2026-09-03idws5sa2oew.png)
目的:不让模型过度自信。
PyTorch 实现:
criterion = nn.CrossEntropyLoss(
label_smoothing=0.1
)
20. BCE 与 Cross Entropy 的区别
这是非常重要的知识点。
| 二分类 | √ | √ |
| 多分类 | × | √ |
| 多标签 | √ | × |
| 输出激活 | Sigmoid | Softmax |
| 类别之间是否互斥 | 否 | 是 |
例如:
多分类
一张图片只能是:
猫
狗
马
使用:
CrossEntropyLoss
多标签
一张医学影像可以同时:
肺炎 = 1
胸腔积液 = 1
气胸 = 0
使用:
BCEWithLogitsLoss
21. KL Divergence
KL:Kullback-Leibler Divergence
定义:

它衡量:
两个概率分布之间有多不一样。
21.1 KL 的直觉
假设教师模型:
![P=[0.7,0.2,0.1]](2026-09-03prjugg3eran.png)
学生模型:
![Q=[0.6,0.3,0.1]](2026-09-03glz245inw1b.png)
KL 用于约束:

因此经常用于:
-
Knowledge Distillation
-
VAE
-
分布对齐
-
概率模型
22. KL 与 Cross Entropy 的关系
交叉熵:

KL:

展开:

因为
与模型参数无关,所以在优化
时:最小化 KL 与最小化 Cross Entropy 有密切关系。
23. Hinge Loss
Hinge Loss 是 SVM 的经典损失。
标签:

定义:

如果:

那么:

否则:

它不仅要求分类正确,还要求:预测结果拥有足够大的 margin。Hinge Loss 是最大间隔分类器中的经典形式。
24. Focal Loss
在目标检测、医学影像等任务中经常存在:正负样本极度不平衡
例如:
背景:99.9%
目标:0.1%
普通 BCE 很容易被大量简单负样本支配。
Focal Loss 的思想是:
降低简单样本的权重,把注意力集中到困难样本。
定义:

其中:

25. 为什么 Focal Loss 有效?
假设:

这是一个非常容易的样本。
如果:

则:

这个样本的贡献被极大降低。
如果:

则:

困难样本仍然具有较大的 Loss。
所以:
FocalLoss = CrossEntropy + 困难样本加权
26. Focal Loss PyTorch 实现
import torch
import torch.nn.functional as F
def focal_loss(logits, targets, alpha=0.25, gamma=2.0):
bce = F.binary_cross_entropy_with_logits(
logits,
targets.float(),
reduction="none"
)
probs = torch.sigmoid(logits)
pt = torch.where(
targets == 1,
probs,
1 – probs
)
alpha_t = torch.where(
targets == 1,
alpha,
1 – alpha
)
loss = alpha_t * (1 – pt).pow(gamma) * bce
return loss.mean()
27. Class-Balanced Loss
Focal Loss 关注:
样本难度。
Class-Balanced Loss 关注:
类别数量不平衡。
一个经典思路是根据类别的有效样本数量:

定义类别权重:

其中
是该类别样本数。
样本越少:

因此少数类会得到更大的权重。
28. Dice Loss
Dice Loss 是医学图像分割中极其重要的 Loss。
Dice:

其中:
-
:预测概率 -
:Ground Truth
Dice Loss:

通常添加平滑项:

29. Dice 为什么特别适合分割?
医学图像通常存在:前景区域远小于背景区域。
例如:
肺部:90%
病灶:10%
甚至:
背景:99%
病灶:1%
Pixel-wise BCE 很容易被背景主导。
Dice 直接衡量:预测区域和真实区域的重叠程度,因此对类别不平衡更加友好。
30. Dice Loss 的代码
def dice_loss(pred, target, smooth=1e-6):
pred = pred.contiguous()
target = target.contiguous()
intersection = (pred * target).sum()
dice = (
2 * intersection + smooth
) / (
pred.sum() + target.sum() + smooth
)
return 1 – dice
31. BCE + Dice Loss
医学图像分割非常常见:

例如:
loss = bce_loss + dice_loss
为什么组合?
BCE:
关注每一个像素。
Dice:
关注整体区域重叠。
所以二者具有互补性。
32. IoU Loss
IoU :也叫 Jaccard Index

IoU Loss:

写成预测概率形式:

33. Dice 与 IoU 的关系
二者关系:

反过来:

例如:

则:

因此:Dice 和 IoU 本质上都在衡量区域重叠,但数值并不相同。
34. Tversky Loss
Dice 对 FP 和 FN 的惩罚相对对称。但医学分割中有时:漏诊比误检更加严重。
于是可以使用 Tversky Index:

其中:

Tversky Loss:

34.1 如何控制 FP/FN?
如果:

那么:

受到更大的惩罚。
也就是:更关注 Recall,减少漏检。
如果:

则更加惩罚:

即:更关注 Precision,减少误检。
35. Focal Tversky Loss
Tversky 还可以与 Focal 思想结合:

这样:对困难区域进行进一步强调。医学图像中小目标病灶分割经常可以考虑这种设计。
36. Boundary Loss
Dice/IoU 主要关注:区域重叠。但是对于一些医学图像:边界非常重要。
例如:
肿瘤边界
器官边界
血管边界
此时可以引入 Boundary Loss。其核心思想是:直接优化预测边界与真实边界之间的距离。
例如可以使用距离变换:

其中:

表示像素
到 Ground Truth 边界的距离。
37. Hausdorff Distance Loss
医学图像分割经常关注:Hausdorff Distance。
Hausdorff Distance:

它关注:最坏情况下的边界距离。
因此:
-
Dice 高
-
但某个边界位置偏差很大
仍然可能得到较大的 HD,这也是为什么医学分割不能只看 Dice。
38. 目标检测中的 Bounding Box Loss
目标检测通常同时需要优化:

其中:
-
分类 Loss
-
Objectness Loss
-
Bounding Box Regression Loss
Bounding Box Loss 的经典方法包括:
-
L1
-
Smooth L1
-
IoU Loss
-
GIoU Loss
-
DIoU Loss
-
CIoU Loss
39. IoU Bounding Box Loss
两个框:

IoU:

Loss:

问题是:当两个框没有重叠时,IoU = 0。此时不同位置的框:
IoU = 0
IoU = 0
IoU = 0
无法告诉模型:到底应该往哪个方向移动。
40. GIoU Loss
GIoU:

其中:
是同时包住两个 Bounding Box 的最小外接框。
Loss:

因此即使:

GIoU 仍然能够提供一定梯度信息。
41. DIoU Loss
DIoU 不仅考虑重叠面积,还考虑:两个框中心点之间的距离。
定义:

其中:
-
:两个中心点的欧氏距离 -
:外接框对角线长度
所以:DIoU 会直接推动预测框中心向真实框中心移动。
42. CIoU Loss
CIoU 在 DIoU 基础上进一步考虑:
-
Overlap
-
Center distance
-
Aspect ratio
定义:

其中:

因此:CIoU 同时优化位置、重叠和宽高比。
43. IoU 系列怎么理解?
可以记成:
IoU
│
├── GIoU:解决无重叠问题
│
├── DIoU:加入中心距离
│
└── CIoU:加入宽高比
所以:

44. Contrastive Loss
对比学习的目标不是直接预测类别,而是学习:什么样的样本应该接近,什么样的样本应该远离。
给定两个样本:

标签:

Contrastive Loss:

其中:

45. Contrastive Loss 的直觉
如果两个样本是正样本:

那么:

训练会让:

即:正样本越来越接近。
如果是负样本:

则:

只有:

才有 Loss。
因此:负样本只需要距离超过 margin 即可。
46. Triplet Loss
Triplet Loss 使用三个样本:
Anchor
Positive
Negative
分别记为:

目标:

定义:
![\\boxed{ L= \\max [ d(a,p)-d(a,n)+m, 0 ] }](2026-09-03m44iyu4j13w.png)
其中:
是 margin。
PyTorch 的 TripletMarginLoss 就采用这一基本形式,用 Anchor、Positive、Negative 三元组优化相对距离。
47. Triplet Loss 的直觉
假设:
,
margin:

则:

说明已经满足要求。
如果:

则:

需要继续优化。
48. Cosine Embedding Loss
对于两个向量:

Cosine Similarity:

Cosine Embedding Loss 的目标是:正样本 cosine similarity 高,负样本 cosine similarity 低。
非常适合:
-
文本匹配
-
图文对齐
-
Sentence Embedding
-
多模态学习
49. Ranking Loss
Ranking Loss 用于:
排序任务。
例如:
商品 A 应该排在商品 B 前面
定义:

其中:

例如:

表示:

50. CTC Loss
CTC:Connectionist Temporal Classification
主要用于:
-
OCR
-
ASR
-
手写识别
-
无明确对齐关系的序列预测
例如输入:
图像特征:
t1 t2 t3 t4 t5 t6
目标:
HELLO
但是我们并不知道:
H 对应 t1/t2?
E 对应 t3?
L 对应 t4/t5?
CTC 通过:对所有可能的对齐路径求和 解决这个问题。
51. CTC 的核心思想
定义:

其中:
-
:一种可能的对齐路径 -
:CTC collapse 操作 -
:最终标签序列
Loss:

因此:CTC 不需要人工提供每个时间步对应哪个字符。
52. VAE Loss
VAE:Variational Autoencoder
VAE 的 Loss 通常由两部分组成:

即:
VAE Loss
│
├── Reconstruction Loss
│
└── KL Divergence
53. Reconstruction Loss
例如图像重构:

它要求:

即:编码之后仍然能够恢复原始输入。
54. VAE 中的 KL Loss
VAE 希望:

接近:

通常:

因此:

如果:

则:

最终:

55. GAN Loss
GAN 包括:
- Generator(G):生成假样本。
- Discriminator (D):判断真假。
经典 GAN:
![\\boxed{ \\min_G\\max_D V(D,G) = E_{x\\sim p_{data}} [\\log D(x)] + E_{z\\sim p_z} [ \\log(1-D(G(z))) ] }](2026-09-03lj1howiuzfa.png)
56. Generator Loss
经典 GAN 中:
![L_G = E_z[ \\log(1-D(G(z))) ]](2026-09-03fq5dejtzquy.png)
实际训练中经常使用 Non-Saturating Loss:
![\\boxed{ L_G = -E_z[ \\log D(G(z)) ] }](2026-09-03h4sdoy3sxb2.png)
目标:让 Discriminator 把生成样本判断成真。
57. Diffusion Model Loss
扩散模型的核心是:向数据中不断加入噪声,再训练模型预测噪声。
前向过程:

其中:

模型:

预测噪声。最经典的训练 Loss:
![\\boxed{ L= E_{x_0,\\epsilon,t} \\left[ \\|\\epsilon- \\epsilon_\\theta(x_t,t)\\|^2 \\right] }](2026-09-03oyon1ifwkho.png)
也就是:让模型预测自己加进去的噪声。
58. L1/L2 Regularization
严格来说,L1/L2 不一定是任务 Loss,而是:参数正则化项。
L1 Regularization

作用:鼓励参数变成 0。因此可以产生:稀疏模型。
L2 Regularization

最终:

作用:抑制模型参数过大,降低过拟合风险。
59. Elastic Net
Elastic Net 同时结合:

所以:
L1 → 稀疏
L2 → 平滑
Elastic Net → 两者结合
60. 多任务学习 Loss
现实任务往往不是只有一个目标。
例如医学 AI:
输入 CT
│
├── 分类
├── 分割
└── 检测
分别得到:
,
,
最终:

61. 为什么需要 Loss Weight?
假设:

但是:

直接相加:

这意味着:Segmentation Loss 对梯度的影响可能远大于 Classification Loss。
因此需要:

例如:
,
62. 常见 Loss 组合
实际科研中,单独使用一个 Loss 并不一定是最好的选择。
常见组合包括:
分类

类别不平衡分类

或者:

二分类

医学图像分割

小目标分割
医学边界分割

多任务

63. 医学图像分割为什么经常使用 Dice + CE?
这是一个非常实用的问题。假设病灶只占1%,背景占99%
如果使用 BCE:
背景像素非常多
↓
BCE 被背景主导
↓
模型倾向于预测背景
而 Dice:
直接关注区域重叠
↓
降低类别不平衡影响
所以:

可以同时:
-
利用 CE 的像素级监督
-
利用 Dice 的区域级监督
64. Loss 函数应该如何选择?
可以记住下面这张表。
| 普通回归 | MSE |
| 异常值较多的回归 | MAE / Huber |
| 二分类 | BCEWithLogits |
| 多分类 | CrossEntropy |
| 多标签分类 | BCEWithLogits |
| 类别严重不平衡 | Focal / Weighted CE |
| 图像分割 | Dice + CE |
| 小目标分割 | Focal + Dice |
| 医学病灶分割 | Dice / Tversky |
| 边界敏感分割 | Dice + Boundary |
| 目标检测框回归 | IoU / GIoU / DIoU / CIoU |
| 图像检索 | Contrastive / Triplet |
| 表征学习 | Contrastive |
| 排序 | Ranking Loss |
| OCR / ASR | CTC |
| VAE | Reconstruction + KL |
| GAN | Adversarial Loss |
| Diffusion | Noise Prediction MSE |
| 多任务 | Weighted Sum |
65. 一个非常重要的问题:Loss 越小,模型一定越好吗?
不一定。
例如训练:

但是:

说明:
可能发生过拟合。
甚至:

但:

也可能出现。
因此一定要区分:
Training Loss
Validation Loss
Evaluation Metric
66. 为什么不能只看 Loss?
因为 Loss 和最终业务目标可能不同。例如医学分割:
训练:

但是论文最终报告:
Dice
IoU
HD95
Precision
Recall
Sensitivity
Specificity
因为:
Loss 是优化工具,Metric 是评价工具。
二者没有必要完全一致。
67. Loss 的梯度比 Loss 数值更加重要
深度学习真正更新的是:

参数更新:

因此设计 Loss 时不能只看:
Loss 数值是否合理。
更重要的是:
梯度是否能够提供有效的优化方向。
68. 为什么很多 Loss 会出现梯度消失?
例如 Sigmoid:

其导数:

当:

或者:

都有:

因此:
Sigmoid 饱和会导致梯度变小。
这也是为什么实际二分类中推荐:
BCEWithLogitsLoss
而不是手动:
Sigmoid + BCELoss
69. Reduction 是什么意思?
PyTorch Loss 经常有:
reduction="mean"
或者:
reduction="sum"
或者:
reduction="none"
假设:
loss = [1, 2, 3, 4]
mean

sum

none
![L=[1,2,3,4]](2026-09-03sveh03yantm.png)
70. 为什么 reduction="none" 很重要?
因为很多高级 Loss 需要:
先计算每个样本的 Loss,再进行加权。
例如 Focal:
loss = criterion(
logits,
target,
reduction="none"
)
然后:
loss = weight * loss
最后:
loss = loss.mean()
这也是实现自定义 Loss 的常见方式。
71. PyTorch 常见 Loss API 对照
PyTorch 当前 torch.nn 提供了大量标准损失,包括:
L1Loss
MSELoss
SmoothL1Loss
HuberLoss
BCELoss
BCEWithLogitsLoss
CrossEntropyLoss
NLLLoss
KLDivLoss
MarginRankingLoss
HingeEmbeddingLoss
MultiMarginLoss
MultiLabelMarginLoss
CosineEmbeddingLoss
TripletMarginLoss
TripletMarginWithDistanceLoss
CTCLoss
PoissonNLLLoss
GaussianNLLLoss
这些都可以在 PyTorch 官方 API 中找到。
72. 一张图理解所有 Loss
可以把 Loss 看成下面这棵树:
Loss Function
│
├── Regression
│ ├── MSE
│ ├── MAE
│ ├── Smooth L1
│ └── Huber
│
├── Classification
│ ├── BCE
│ ├── Cross Entropy
│ ├── NLL
│ ├── Hinge
│ └── Focal
│
├── Distribution
│ └── KL Divergence
│
├── Segmentation
│ ├── Dice
│ ├── IoU
│ ├── Tversky
│ ├── Focal Tversky
│ └── Boundary
│
├── Object Detection
│ ├── L1
│ ├── Smooth L1
│ ├── IoU
│ ├── GIoU
│ ├── DIoU
│ └── CIoU
│
├── Metric Learning
│ ├── Contrastive
│ ├── Triplet
│ └── Cosine
│
├── Sequence
│ └── CTC
│
├── Generative
│ ├── VAE
│ ├── GAN
│ └── Diffusion
│
└── Regularization
├── L1
├── L2
└── Elastic Net
73. 最重要的 Loss 对比表
| MSE | 惩罚平方误差 | 回归 |
| MAE | 惩罚绝对误差 | 鲁棒回归 |
| Huber | 小误差 MSE,大误差 MAE | 鲁棒回归 |
| BCE | 二分类概率误差 | 二分类 |
| CE | 多类别概率误差 | 多分类 |
| Focal | 关注困难样本 | 类别不平衡 |
| KL | 分布之间的差异 | 蒸馏/VAE |
| Dice | 区域重叠 | 分割 |
| IoU | 区域交并比 | 分割/检测 |
| Tversky | 分别控制 FP/FN | 医学分割 |
| GIoU | 解决无重叠框 | 检测 |
| DIoU | 加入中心距离 | 检测 |
| CIoU | 加入宽高比 | 检测 |
| Contrastive | 正样本近、负样本远 | 对比学习 |
| Triplet | 相对距离排序 | 度量学习 |
| CTC | 无需显式对齐 | OCR/ASR |
| VAE Loss | 重构 + 分布约束 | VAE |
| GAN Loss | 对抗训练 | GAN |
| Diffusion MSE | 预测噪声 | Diffusion |
74. 最后:如何真正理解 Loss?
不要死记公式。
建议按照下面四个问题理解任何一个 Loss。
第一问:它在比较什么?
例如:
MSE:

Dice:

KL:

Triplet:

第二问:它在惩罚什么?
MSE:
大误差。
Focal:
困难样本。
Dice:
区域不重叠。
Tversky:
FP/FN。
CIoU:
框的位置、重叠和形状。
第三问:它解决了什么问题?
例如:
MSE
↓
基础回归
Huber
↓
MSE 对异常值敏感
↓
鲁棒回归
Focal
↓
CE 被大量简单样本支配
↓
困难样本学习
Dice
↓
CE/BCE 被背景支配
↓
类别不平衡分割
Tversky
↓
FP/FN 惩罚不对称
↓
医学分割
CIoU
↓
IoU 无法描述中心距离和宽高比
↓
更好的 Bounding Box Regression
75. 一句话记住整个 Loss 体系
可以把深度学习 Loss 的演化理解成:
误差→概率→类别→难样本→区域→边界→距离→分布→多任务
最基础的是:

分类:

不平衡:

分割:

检测:

表征学习:

分布学习:

生成模型:

最终复杂模型往往不是使用单一 Loss,而是:

因此真正的 Loss 设计,本质上是在回答:
“我希望模型具有什么样的行为?”
如果希望模型预测数值准确,就使用回归 Loss;如果希望分类概率准确,就使用 Cross Entropy;如果希望关注困难样本,就使用 Focal;如果希望预测区域重叠,就使用 Dice/IoU;如果希望学习表示之间的相似关系,就使用 Contrastive/Triplet;如果同时存在多个目标,就组合多个 Loss。
这也是深度学习中一个非常重要的思想:
Loss Function ≈ 我们对“什么叫做预测得好”的数学定义
参考资料
-
PyTorch torch.nn Loss 官方文档:包含 L1、MSE、BCE、CrossEntropy、KL、CTC、Triplet 等标准实现。
-
PyTorch CrossEntropyLoss:详细说明 logits、class index、class probability、weight、ignore_index 和 label_smoothing 等机制。
-
PyTorch BCEWithLogitsLoss:Sigmoid 与 BCE 的数值稳定实现,并支持 pos_weight 处理正负样本不平衡。
-
PyTorch TripletMarginLoss:Anchor、Positive、Negative 三元组及 margin-based 距离优化。
-
scikit-learn Hinge Loss 文档:介绍二分类和多分类 Hinge Loss。
网硕互联帮助中心






评论前必须登录!
注册