云计算百科
云计算领域专业知识百科平台

深度学习损失函数详解:从 MSE、Cross Entropy 到 Dice、Focal、IoU、Contrastive Loss,一文掌握所有常见 Loss

本文系统总结深度学习中常见的损失函数,

  • 从最基础的 MSE、MAE、交叉熵,
  • 到分类中的 BCE、Focal Loss,
  • 目标检测中的 IoU / GIoU / DIoU / CIoU,
  • 语义分割中的 Dice Loss、Tversky Loss,
  • 再到对比学习中的 Contrastive Loss、Triplet Loss,
  • 以及 KL Divergence、CTC、GAN、扩散模型中的损失函数。

本文重点不是简单罗列公式,而是回答三个问题:

  • 这个 Loss 到底在优化什么?

  • 为什么要这样设计?

  • 什么时候应该使用它?


  • 1. 什么是损失函数?

    在机器学习中,我们希望模型 预测结果 $\\hat{y}$ 尽可能接近 真实标签 $y$

    因此定义一个函数:

    \\mathcal{L}(y,\\hat{y})

    用来衡量:模型预测得有多差。也就是 Loss 越小 ⇒ 预测结果越接近目标。

    训练过程就是不断调整模型参数 $\\theta$

    \\boxed{ \\theta^* = \\arg\\min_{\\theta} \\mathcal{L}(f_\\theta(x),y) }

    其中:

    • $x$:输入

    • $y$:真实标签

    • $f_\\theta(x)$:模型预测,即 \\hat{y}

    • $\\theta$:模型参数

    • $\\mathcal{L}$:损失函数


    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

    具体公式例如:

    Dice= \\frac{2TP}{2TP+FP+FN}


    2.3 Objective

    Objective 可以理解为最终优化目标。

    例如多任务学习:

    \\mathcal{L} = \\lambda_1\\mathcal{L}_{cls} + \\lambda_2\\mathcal{L}_{seg} + \\lambda_3\\mathcal{L}_{contrast}

    这里整个 $\\mathcal{L}$就是最终 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. 回归损失函数

    回归任务的目标通常是:

    \\hat{y}\\approx y

    最经典的几种 Loss 是:

    • MSE

    • MAE

    • Smooth L1

    • Huber

    • Log-Cosh


    5. MSE Loss

    MSE(Mean Squared Error,均方误差)

    定义:

    \\boxed{ L_{MSE} = \\frac{1}{N} \\sum_{i=1}^{N} (y_i-\\hat{y}_i)^2 }

    也可以写成:

    L_{MSE} = \\mathbb{E} [(y-\\hat{y})^2]


    5.1 为什么叫平方误差?

    假设:

    y=10

    模型预测:

    \\hat{y}=8

    那么MSE:

    L=(y-\\hat{y})^2=4

    如果预测错得更多:

    \\hat{y}=5

    那么:

    L=(10-5)^2=25

    所以 MSE 会:强烈惩罚大误差。


    5.2 MSE 的梯度

    对于:

    L=(y-\\hat{y})^2

    $\\hat{y}$求导:

    \\frac{\\partial L}{\\partial\\hat{y}} = 2(\\hat{y}-y)

    误差越大,梯度越大。

    因此: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

    定义:

    \\boxed{ L_{MAE} = \\frac{1}{N} \\sum_{i=1}^{N} |y_i-\\hat{y}_i| }

    例如:

    y=10,\\quad \\hat{y}=8

    则:

    L=|10-8|=2


    6.1 MAE 和 MSE 的区别

    假设:

    e=10

    MSE:

    L=10^2=100

    MAE:

    L=|10|=10

    因此:

    MSE 会放大大误差,而 MAE 对异常值更加鲁棒。


    6.2 MAE 的问题

    绝对值:

    |x|

    在:

    x=0

    不可导。虽然深度学习框架能够处理这个问题,但相比 MSE,它的优化通常不如 MSE 平滑。

    PyTorch 实现:

    criterion = nn.L1Loss()


    7. MSE vs MAE

    特性MSEMAE
    误差形式 $e^2$ |e|
    大误差惩罚
    异常值敏感度
    梯度 连续 0 点不可导
    优化 容易 相对困难
    鲁棒性 较差 较好

    简单理解:

    MSE:我非常讨厌大错误。

    MAE:大错误和小错误按照线性比例处理。


    8. Smooth L1 Loss

    Smooth L1 是一种 MSE 和 MAE 的折中。

    定义:

    L(x)= \\begin{cases} \\frac{1}{2}x^2, & |x|<\\beta\\\\ |x|-\\frac{1}{2}\\beta, & |x|\\geq\\beta \\end{cases}

    其中:

    x=y-\\hat{y}

    核心思想:

    • 小误差:使用平方函数

    • 大误差:使用绝对值函数

    因此:小误差区域平滑,大误差区域鲁棒。


    9. Huber Loss

    Huber Loss 与 Smooth L1 非常接近。

    定义:

    L_\\delta(r) = \\begin{cases} \\frac{1}{2}r^2, & |r|\\leq\\delta\\\\ \\delta(|r|-\\frac{1}{2}\\delta), & |r|>\\delta \\end{cases}

    其中:

    r=y-\\hat{y}

    当误差较小时:

    L\\sim MSE

    当误差较大时:

    L\\sim MAE

    因此:Huber Loss 是经典的鲁棒回归 Loss。

    PyTorch 实现:

    criterion = nn.HuberLoss(delta=1.0)

    PyTorch 也将 SmoothL1Loss 和 HuberLoss 作为标准 Loss 提供。


    10. Log-Cosh Loss

    定义:

    \\boxed{ L(x)=\\log(\\cosh(x)) }

    $x$ 很小时:

    \\log\\cosh(x)\\approx\\frac{x^2}{2}

    所以类似 MSE。

    当 $x$ 很大时:

    \\log\\cosh(x)\\approx |x|-\\log2

    所以类似 MAE。

    因此:Log-Cosh 也是一种平滑的鲁棒回归 Loss。


    11. 回归 Loss 总结

    Loss核心思想异常值
    MSE 平方误差 敏感
    MAE 绝对误差 鲁棒
    Smooth L1 MSE + MAE 鲁棒
    Huber MSE + MAE 鲁棒
    Log-Cosh 平滑 MAE 较鲁棒

    12. 二分类损失:Binary Cross Entropy

    对于二分类:

    y\\in\\{0,1\\}

    模型输出:

    p=P(y=1|x)

    BCE:

    \\boxed{ L_{BCE} = - [ y\\log p+ (1-y)\\log(1-p) ] }


    为什么可以当作二分类的损失?

    12.1 当真实标签是 1

    如果:

    y=1

    那么:

    L=-\\log p

    所以:

    • $p=0.99$ → Loss 很小

    • $p=0.9$  → Loss 较小

    • $p=0.1$ → Loss 很大


    12.2 当真实标签是 0

    y=0

    得到:

    L=-\\log(1-p)

    如果模型错误地预测:

    p=0.99

    那么:

    L=-\\log(0.01)

    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 非常适合:二分类

    例如:

    正常 / 患病
    猫 / 狗
    有目标 / 无目标

    多标签分类

    例如一个样本同时存在:

    肺炎
    胸腔积液
    肺不张
    气胸

    每个标签都是独立的:

    y_i\\in\\{0,1\\}

    这种情况使用:

    nn.BCEWithLogitsLoss()

    而不是 CrossEntropyLoss。


    15. Cross Entropy Loss

    Cross Entropy 是深度学习分类任务中最重要的 Loss 之一。

    对于 $C$ 个类别:

    \\boxed{ L_{CE} = -\\sum_{c=1}^{C} y_c\\log p_c }

    如果标签是 one-hot:

    y=[0,0,1,0]

    那么:

    L=-\\log p_3


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

    Softmax:

    p_i= \\frac{e^{z_i}} {\\sum_j e^{z_j}}

    其中 $z_i$ 是模型输出的 logits。

    Cross Entropy:

    L=-\\log p_y

    代入 Softmax:

    L = -\\log \\frac{e^{z_y}} {\\sum_j e^{z_j}}

    得到:

    \\boxed{ L = -z_y + \\log\\sum_j e^{z_j} }

    这就是分类模型常见的 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

    定义:

    \\boxed{ L_{NLL} = -\\log P(y|x) }

    PyTorch:

    criterion = nn.NLLLoss()

    log_prob = F.log_softmax(logits, dim=1)

    loss = criterion(log_prob, target)

    因此:

    \\boxed{ CrossEntropy = LogSoftmax + NLLLoss }


    18. Cross Entropy 为什么有效?

    假设真实类别:

    y=2

    模型预测:

    class 0: 0.1
    class 1: 0.1
    class 2: 0.8

    Loss:

    -\\log0.8 \\approx0.223

    如果模型预测:

    class 0: 0.4
    class 1: 0.5
    class 2: 0.1

    Loss:

    -\\log0.1 \\approx2.303

    所以:Cross Entropy 本质上是在惩罚模型给真实类别分配过低概率。


    19. Label Smoothing

    普通 One-Hot:

    y=[1,0,0]

    Label Smoothing 后:

    y=[1-\\epsilon,\\frac{\\epsilon}{C-1},\\frac{\\epsilon}{C-1}]

    例如:

    \\epsilon=0.1

    变成:

    [0.9,0.05,0.05]

    目的:不让模型过度自信。

    PyTorch 实现:

    criterion = nn.CrossEntropyLoss(
    label_smoothing=0.1
    )


    20. BCE 与 Cross Entropy 的区别

    这是非常重要的知识点。

    问题BCECross Entropy
    二分类
    多分类 ×
    多标签 ×
    输出激活 Sigmoid Softmax
    类别之间是否互斥

    例如:

    多分类

    一张图片只能是:



    使用:

    CrossEntropyLoss

    多标签

    一张医学影像可以同时:

    肺炎 = 1
    胸腔积液 = 1
    气胸 = 0

    使用:

    BCEWithLogitsLoss


    21. KL Divergence

    KL:Kullback-Leibler Divergence

    定义:

    \\boxed{ D_{KL}(P\\|Q) = \\sum_x P(x) \\log \\frac{P(x)}{Q(x)} }

    它衡量:

    两个概率分布之间有多不一样。


    21.1 KL 的直觉

    假设教师模型:

    P=[0.7,0.2,0.1]

    学生模型:

    Q=[0.6,0.3,0.1]

    KL 用于约束:

    Q\\approx P

    因此经常用于:

    • Knowledge Distillation

    • VAE

    • 分布对齐

    • 概率模型


    22. KL 与 Cross Entropy 的关系

    交叉熵:

    H(P,Q) = -\\sum_xP(x)\\log Q(x)

    KL:

    D_{KL}(P\\|Q) = \\sum_xP(x)\\log\\frac{P(x)}{Q(x)}

    展开:

    D_{KL}(P\\|Q) = H(P,Q)-H(P)

    因为 $H(P)$  与模型参数无关,所以在优化 $Q$ 时:最小化 KL 与最小化 Cross Entropy 有密切关系。


    23. Hinge Loss

    Hinge Loss 是 SVM 的经典损失。

    标签:

    y\\in\\{-1,+1\\}

    定义:

    \\boxed{ L= \\max(0,1-yf(x)) }

    如果:

    yf(x)\\geq1

    那么:

    L=0

    否则:

    L>0

    它不仅要求分类正确,还要求:预测结果拥有足够大的 margin。Hinge Loss 是最大间隔分类器中的经典形式。


    24. Focal Loss

    在目标检测、医学影像等任务中经常存在:正负样本极度不平衡

    例如:

    背景:99.9%
    目标:0.1%

    普通 BCE 很容易被大量简单负样本支配。

    Focal Loss 的思想是:

    降低简单样本的权重,把注意力集中到困难样本。

    定义:

    \\boxed{ L_{Focal} = -\\alpha_t(1-p_t)^\\gamma\\log(p_t) }

    其中:

    p_t= \\begin{cases} p,&y=1\\\\ 1-p,&y=0 \\end{cases}


    25. 为什么 Focal Loss 有效?

    假设:

    p_t=0.99

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

    如果:

    \\gamma=2

    则:

    (1-p_t)^2 = 0.01^2 = 0.0001

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

    如果:

    p_t=0.2

    则:

    (1-p_t)^2=0.64

    困难样本仍然具有较大的 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 关注:

    类别数量不平衡。

    一个经典思路是根据类别的有效样本数量:

    E_n= \\frac{1-\\beta^n}{1-\\beta}

    定义类别权重:

    w_n= \\frac{1-\\beta}{1-\\beta^n}

    其中 $n$ 是该类别样本数。

    样本越少:

    n\\downarrow \\Rightarrow w_n\\uparrow

    因此少数类会得到更大的权重。


    28. Dice Loss

    Dice Loss 是医学图像分割中极其重要的 Loss。

    Dice:

    \\boxed{ Dice= \\frac{2\\sum_i p_i g_i} {\\sum_i p_i+\\sum_i g_i} }

    其中:

    • $p_i$:预测概率

    • $g_i$:Ground Truth

    Dice Loss:

    \\boxed{ L_{Dice}=1-Dice }

    通常添加平滑项:

    Dice= \\frac{ 2\\sum_i p_ig_i+\\epsilon }{ \\sum_i p_i+\\sum_i g_i+\\epsilon }


    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

    医学图像分割非常常见:

    \\boxed{ L= \\lambda_1L_{BCE} + \\lambda_2L_{Dice} }

    例如:

    loss = bce_loss + dice_loss

    为什么组合?

    BCE:

    关注每一个像素。

    Dice:

    关注整体区域重叠。

    所以二者具有互补性。


    32. IoU Loss

    IoU :也叫 Jaccard Index

    IoU= \\frac{|P\\cap G|} {|P\\cup G|}

    IoU Loss:

    \\boxed{ L_{IoU}=1-IoU }

    写成预测概率形式:

    IoU= \\frac{ \\sum_i p_ig_i }{ \\sum_i p_i+\\sum_i g_i-\\sum_i p_ig_i }


    33. Dice 与 IoU 的关系

    二者关系:

    \\boxed{ Dice= \\frac{2IoU}{1+IoU} }

    反过来:

    \\boxed{ IoU= \\frac{Dice}{2-Dice} }

    例如:

    IoU=0.8

    则:

    Dice= \\frac{1.6}{1.8} \\approx0.889

    因此:Dice 和 IoU 本质上都在衡量区域重叠,但数值并不相同。


    34. Tversky Loss

    Dice 对 FP 和 FN 的惩罚相对对称。但医学分割中有时:漏诊比误检更加严重。

    于是可以使用 Tversky Index:

    \\boxed{ TI= \\frac{TP} {TP+\\alpha FP+\\beta FN} }

    其中:

    \\alpha+\\beta=1

    Tversky Loss:

    \\boxed{ L_{Tversky}=1-TI }


    34.1 如何控制 FP/FN?

    如果:

    \\beta>\\alpha

    那么:

    FN

    受到更大的惩罚。

    也就是:更关注 Recall,减少漏检。

    如果:

    \\alpha>\\beta

    则更加惩罚:

    FP

    即:更关注 Precision,减少误检。


    35. Focal Tversky Loss

    Tversky 还可以与 Focal 思想结合:

    \\boxed{ L_{FT} = (1-TI)^\\gamma }

    这样:对困难区域进行进一步强调。医学图像中小目标病灶分割经常可以考虑这种设计。


    36. Boundary Loss

    Dice/IoU 主要关注:区域重叠。但是对于一些医学图像:边界非常重要。

    例如:

    肿瘤边界
    器官边界
    血管边界

    此时可以引入 Boundary Loss。其核心思想是:直接优化预测边界与真实边界之间的距离。

    例如可以使用距离变换:

    L_{boundary} = \\sum_x p(x)d_G(x)

    其中:

    d_G(x)

    表示像素 $x$ 到 Ground Truth 边界的距离。


    37. Hausdorff Distance Loss

    医学图像分割经常关注:Hausdorff Distance。

    Hausdorff Distance:

    HD(A,B) = \\max \\left\\{ \\sup_{a\\in A}\\inf_{b\\in B}d(a,b), \\sup_{b\\in B}\\inf_{a\\in A}d(a,b) \\right\\}

    它关注:最坏情况下的边界距离。

    因此:

    • Dice 高

    • 但某个边界位置偏差很大

    仍然可能得到较大的 HD,这也是为什么医学分割不能只看 Dice。


    38. 目标检测中的 Bounding Box Loss

    目标检测通常同时需要优化:

    L= L_{cls} + L_{obj} + L_{box}

    其中:

    • 分类 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

    两个框:

    A,\\ B

    IoU:

    IoU= \\frac{|A\\cap B|} {|A\\cup B|}

    Loss:

    \\boxed{ L_{IoU}=1-IoU }

    问题是:当两个框没有重叠时,IoU = 0。此时不同位置的框:

    IoU = 0
    IoU = 0
    IoU = 0

    无法告诉模型:到底应该往哪个方向移动。


    40. GIoU Loss

    GIoU:

    \\boxed{ GIoU = IoU - \\frac{|C-(A\\cup B)|}{|C|} }

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

    Loss:

    \\boxed{ L_{GIoU}=1-GIoU }

    因此即使:

    IoU=0

    GIoU 仍然能够提供一定梯度信息。


    41. DIoU Loss

    DIoU 不仅考虑重叠面积,还考虑:两个框中心点之间的距离。

    定义:

    \\boxed{ L_{DIoU} = 1-IoU + \\frac{\\rho^2(b,b^{gt})}{c^2} }

    其中:

    • $\\rho$:两个中心点的欧氏距离

    • $c$:外接框对角线长度

    所以:DIoU 会直接推动预测框中心向真实框中心移动。


    42. CIoU Loss

    CIoU 在 DIoU 基础上进一步考虑:

    • Overlap

    • Center distance

    • Aspect ratio

    定义:

    L_{CIoU} = 1-IoU + \\frac{\\rho^2(b,b^{gt})}{c^2} + \\alpha v

    其中:

    v= \\frac{4}{\\pi^2} \\left( \\arctan\\frac{w^{gt}}{h^{gt}} - \\arctan\\frac{w}{h} \\right)^2

    因此:CIoU 同时优化位置、重叠和宽高比。


    43. IoU 系列怎么理解?

    可以记成:

    IoU

    ├── GIoU:解决无重叠问题

    ├── DIoU:加入中心距离

    └── CIoU:加入宽高比

    所以:

    \\boxed{ CIoU = IoU + Center + AspectRatio }


    44. Contrastive Loss

    对比学习的目标不是直接预测类别,而是学习:什么样的样本应该接近,什么样的样本应该远离。

    给定两个样本:

    z_i,z_j

    标签:

    y= \\begin{cases} 1,&\\text{similar}\\\\ 0,&\\text{different} \\end{cases}

    Contrastive Loss:

    \\boxed{ L = yD^2 + (1-y) \\max(0,m-D)^2 }

    其中:

    D=\\|z_i-z_j\\|


    45. Contrastive Loss 的直觉

    如果两个样本是正样本:

    y=1

    那么:

    L=D^2

    训练会让:

    D\\rightarrow0

    即:正样本越来越接近。

    如果是负样本:

    y=0

    则:

    L=\\max(0,m-D)^2

    只有:

    D<m

    才有 Loss。

    因此:负样本只需要距离超过 margin 即可。


    46. Triplet Loss

    Triplet Loss 使用三个样本:

    Anchor
    Positive
    Negative

    分别记为:

    a,p,n

    目标:

    d(a,p)<d(a,n)

    定义:

    \\boxed{ L= \\max [ d(a,p)-d(a,n)+m, 0 ] }

    其中:m 是 margin。

    PyTorch 的 TripletMarginLoss 就采用这一基本形式,用 Anchor、Positive、Negative 三元组优化相对距离。


    47. Triplet Loss 的直觉

    假设:

    d(a,p)=0.3d(a,n)=0.5

    margin:

    m=0.2

    则:

    L= \\max(0,0.3-0.5+0.2)=0

    说明已经满足要求。

    如果:

    d(a,n)=0.4

    则:

    L= 0.3-0.4+0.2 = 0.1

    需要继续优化。


    48. Cosine Embedding Loss

    对于两个向量:

    x_1,x_2

    Cosine Similarity:

    cos(x_1,x_2) = \\frac{x_1^Tx_2} {\\|x_1\\|\\|x_2\\|}

    Cosine Embedding Loss 的目标是:正样本 cosine similarity 高,负样本 cosine similarity 低。

    非常适合:

    • 文本匹配

    • 图文对齐

    • Sentence Embedding

    • 多模态学习


    49. Ranking Loss

    Ranking Loss 用于:

    排序任务。

    例如:

    商品 A 应该排在商品 B 前面

    定义:

    L= \\max(0,-y(x_1-x_2)+m)

    其中:

    y\\in\\{-1,+1\\}

    例如:

    y=1

    表示:

    x_1>x_2


    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 的核心思想

    定义:

    P(y|x) = \\sum_{\\pi\\in B^{-1}(y)} P(\\pi|x)

    其中:

    • $\\pi$:一种可能的对齐路径

    • $B$:CTC collapse 操作

    • $y$:最终标签序列

    Loss:

    \\boxed{ L_{CTC} = -\\log P(y|x) }

    因此:CTC 不需要人工提供每个时间步对应哪个字符。


    52. VAE Loss

    VAE:Variational Autoencoder

    VAE 的 Loss 通常由两部分组成:

    \\boxed{ L_{VAE} = L_{reconstruction} + \\beta L_{KL} }

    即:

    VAE Loss

    ├── Reconstruction Loss

    └── KL Divergence


    53. Reconstruction Loss

    例如图像重构:

    L_{rec} = \\|x-\\hat{x}\\|^2

    它要求:

    \\hat{x}\\approx x

    即:编码之后仍然能够恢复原始输入。


    54. VAE 中的 KL Loss

    VAE 希望:

    q(z|x)

    接近:

    p(z)

    通常:

    p(z)=N(0,I)

    因此:

    L_{KL} = D_{KL} (q(z|x)\\|p(z))

    如果:

    q(z|x) = N(\\mu,\\sigma^2)

    则:

    \\boxed{ L_{KL} = -\\frac12 \\sum_i (1+\\log\\sigma_i^2-\\mu_i^2-\\sigma_i^2) }

    最终:

    L= L_{rec}+\\beta L_{KL}


    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))) ] }


    56. Generator Loss

    经典 GAN 中:

    L_G = E_z[ \\log(1-D(G(z))) ]

    实际训练中经常使用 Non-Saturating Loss:

    \\boxed{ L_G = -E_z[ \\log D(G(z)) ] }

    目标:让 Discriminator 把生成样本判断成真。


    57. Diffusion Model Loss

    扩散模型的核心是:向数据中不断加入噪声,再训练模型预测噪声。

    前向过程:

    x_t = \\sqrt{\\bar{\\alpha}_t}x_0 + \\sqrt{1-\\bar{\\alpha}_t}\\epsilon

    其中:

    \\epsilon\\sim N(0,I)

    模型:

    \\epsilon_\\theta(x_t,t)

    预测噪声。最经典的训练 Loss:

    \\boxed{ L= E_{x_0,\\epsilon,t} \\left[ \\|\\epsilon- \\epsilon_\\theta(x_t,t)\\|^2 \\right] }

    也就是:让模型预测自己加进去的噪声。


    58. L1/L2 Regularization

    严格来说,L1/L2 不一定是任务 Loss,而是:参数正则化项。


    L1 Regularization

    \\boxed{ L_{L1} = \\lambda \\sum_i|w_i| }

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


    L2 Regularization

    boxed{ L_{L2} = \\lambda \\sum_iw_i^2 }

    最终:

    L= L_{task} + \\lambda\\|w\\|_2^2

    作用:抑制模型参数过大,降低过拟合风险。


    59. Elastic Net

    Elastic Net 同时结合:

    L_{Elastic} = \\lambda_1\\|w\\|_1 + \\lambda_2\\|w\\|_2^2

    所以:

    L1 → 稀疏
    L2 → 平滑
    Elastic Net → 两者结合


    60. 多任务学习 Loss

    现实任务往往不是只有一个目标。

    例如医学 AI:

    输入 CT

    ├── 分类
    ├── 分割
    └── 检测

    分别得到:

    L_{cls}L_{seg} ,L_{det}

    最终:

    \\boxed{ L= \\lambda_1L_{cls} + \\lambda_2L_{seg} + \\lambda_3L_{det} }


    61. 为什么需要 Loss Weight?

    假设:

    L_{cls}=0.1

    但是:

    L_{seg}=10

    直接相加:

    L=10.1

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

    因此需要:

    L= \\lambda_{cls}L_{cls} + \\lambda_{seg}L_{seg}

    例如:

    \\lambda_{cls}=1 ,\\lambda_{seg}=0.1


    62. 常见 Loss 组合

    实际科研中,单独使用一个 Loss 并不一定是最好的选择。

    常见组合包括:

    分类

    L=CE


    类别不平衡分类

    L=Focal

    或者:

    L=WeightedCE


    二分类

    L=BCE


    医学图像分割

    L=Dice+BCE


    小目标分割

    L=Focal+Dice


    医学边界分割

    L=Dice+Boundary


    多任务

    L= \\lambda_1L_1+ \\lambda_2L_2+ \\cdots+ \\lambda_nL_n


    63. 医学图像分割为什么经常使用 Dice + CE?

    这是一个非常实用的问题。假设病灶只占1%,背景占99%

    如果使用 BCE:

    背景像素非常多

    BCE 被背景主导

    模型倾向于预测背景

    而 Dice:

    直接关注区域重叠

    降低类别不平衡影响

    所以:

    \\boxed{ Dice+CE }

    可以同时:

    • 利用 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 越小,模型一定越好吗?

    不一定。

    例如训练:

    Loss\\downarrow

    但是:

    Validation\\ Loss\\uparrow

    说明:

    可能发生过拟合。

    甚至:

    Train\\ Dice\\uparrow

    但:

    Validation\\ Dice\\downarrow

    也可能出现。

    因此一定要区分:

    Training Loss
    Validation Loss
    Evaluation Metric


    66. 为什么不能只看 Loss?

    因为 Loss 和最终业务目标可能不同。例如医学分割:

    训练:

    L=DiceLoss

    但是论文最终报告:

    Dice
    IoU
    HD95
    Precision
    Recall
    Sensitivity
    Specificity

    因为:

    Loss 是优化工具,Metric 是评价工具。

    二者没有必要完全一致。


    67. Loss 的梯度比 Loss 数值更加重要

    深度学习真正更新的是:

    \\nabla_\\theta L

    参数更新:

    \\theta \\leftarrow \\theta - \\eta\\nabla_\\theta L

    因此设计 Loss 时不能只看:

    Loss 数值是否合理。

    更重要的是:

    梯度是否能够提供有效的优化方向。


    68. 为什么很多 Loss 会出现梯度消失?

    例如 Sigmoid:

    \\sigma(x)=\\frac1{1+e^{-x}}

    其导数:

    \\sigma'(x) = \\sigma(x)(1-\\sigma(x))

    当:

    x\\rightarrow+\\infty

    或者:

    x\\rightarrow-\\infty

    都有:

    \\sigma'(x)\\rightarrow0

    因此:

    Sigmoid 饱和会导致梯度变小。

    这也是为什么实际二分类中推荐:

    BCEWithLogitsLoss

    而不是手动:

    Sigmoid + BCELoss


    69. Reduction 是什么意思?

    PyTorch Loss 经常有:

    reduction="mean"

    或者:

    reduction="sum"

    或者:

    reduction="none"

    假设:

    loss = [1, 2, 3, 4]

    mean

    L=2.5

    sum

    L=10

    none

    L=[1,2,3,4]


    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:

    y-\\hat y

    Dice:

    Prediction \\cap GroundTruth

    KL:

    P\\ vs.\\ Q

    Triplet:

    d(a,p)\\ vs.\\ d(a,n)


    第二问:它在惩罚什么?

    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 的演化理解成:

    误差→概率→类别→难样本→区域→边界→距离→分布→多任务

    最基础的是:

    MSE,\\ MAE

    分类:

    BCE,\\ CE

    不平衡:

    Focal

    分割:

    Dice,\\ IoU,\\ Tversky

    检测:

    IoU,\\ GIoU,\\ DIoU,\\ CIoU

    表征学习:

    Contrastive,\\ Triplet

    分布学习:

    KL

    生成模型:

    VAE,\\ GAN,\\ Diffusion

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

    \\boxed{ L_{total} = \\sum_i \\lambda_iL_i }

    因此真正的 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。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 深度学习损失函数详解:从 MSE、Cross Entropy 到 Dice、Focal、IoU、Contrastive Loss,一文掌握所有常见 Loss
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!