本文系统总结深度学习中常见的损失函数,
- 从最基础的 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 | 典型任务 |
|---|---|---|
| 回归 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,均方误差)
定义:
也可以写成:
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
| 特性 | MSE | 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 总结
| Loss | 核心思想 | 异常值 |
|---|---|---|
| MSE | 平方误差 | 敏感 |
| MAE | 绝对误差 | 鲁棒 |
| Smooth L1 | MSE + MAE | 鲁棒 |
| Huber | MSE + MAE | 鲁棒 |
| Log-Cosh | 平滑 MAE | 较鲁棒 |
12. 二分类损失:Binary Cross Entropy
对于二分类:
模型输出:
BCE:
为什么可以当作二分类的损失?
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:
那么:
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:
Label Smoothing 后:
例如:
变成:
目的:不让模型过度自信。
PyTorch 实现:
criterion = nn.CrossEntropyLoss(
label_smoothing=0.1
)
20. BCE 与 Cross Entropy 的区别
这是非常重要的知识点。
| 问题 | BCE | Cross Entropy |
|---|---|---|
| 二分类 | √ | √ |
| 多分类 | × | √ |
| 多标签 | √ | × |
| 输出激活 | Sigmoid | Softmax |
| 类别之间是否互斥 | 否 | 是 |
例如:
多分类
一张图片只能是:
猫
狗
马
使用:
CrossEntropyLoss
多标签
一张医学影像可以同时:
肺炎 = 1
胸腔积液 = 1
气胸 = 0
使用:
BCEWithLogitsLoss
21. KL Divergence
KL:Kullback-Leibler Divergence
定义:
它衡量:
两个概率分布之间有多不一样。
21.1 KL 的直觉
假设教师模型:
学生模型:
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
分别记为:
目标:
定义:
其中: 是 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:
56. Generator Loss
经典 GAN 中:
实际训练中经常使用 Non-Saturating Loss:
目标:让 Discriminator 把生成样本判断成真。
57. Diffusion Model Loss
扩散模型的核心是:向数据中不断加入噪声,再训练模型预测噪声。
前向过程:
其中:
模型:
预测噪声。最经典的训练 Loss:
也就是:让模型预测自己加进去的噪声。
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 函数应该如何选择?
可以记住下面这张表。
| 任务 | 首选 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
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 对比表
| 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.nnLoss 官方文档:包含 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。