损失函数

损失函数(Loss Function) 是机器学习和深度学习的“指挥棒”——它用来衡量模型的预测结果真实标签之间的差距。它在深度学习中的作用如下:

  • 量化误差:把抽象的“准不准”变成一个具体的数值(比如 0.5 或 3.2),为模型优化提供明确目标。
  • 提供梯度:在神经网络中,损失函数的值通过反向传播计算出梯度,这个梯度就是模型参数更新的方向和幅度(是调大还是调小权重)。
  • 决定模型性格:选择不同的损失函数,模型会关注不同的侧重点(比如更看重整体准确率,还是更看重避免把“癌症”误诊为“健康”)。

常见的损失函数

1 多分类交叉熵 CrossEntropyLoss

交叉熵损失(Cross-Entropy Loss) 用来衡量两个概率分布之间的差异。

在机器学习中,它通常用来比较:

  • 真实分布(Ground Truth):样本的真实标签分布(例如,一张图片是“猫”的概率为 1,是“狗”的概率为 0)。
  • 预测分布(Prediction):模型输出的概率分布(例如,模型预测是“猫”的概率为 0.8,是“狗”的概率为 0.2)。

通俗理解:如果模型的预测概率越接近真实情况(比如把猫预测为 0.99),交叉熵损失就越;如果预测得越离谱(比如把猫预测为 0.1),交叉熵损失就越。它本质上是在计算预测结果带来的“惊讶程度”(信息论中的信息量)。

假设共有 $ C $ 个类别,公式为:

L=−∑i=1Cyilog⁡(pi) L = -\sum_{i=1}^{C} y_i \log(p_i) L=i=1Cyilog(pi)

  • $ y_i $:第 $ i $ 个类别的真实标签(0 或 1,在独热编码中只有一个为 1)。

  • $ p_i $:模型预测第 $ i $ 个类别的概率(经过 Softmax 激活后的值,介于 0 和 1 之间)。

  • $ \log $:通常指自然对数(以 $ e $ 为底)。

  • 优点:对概率分布差异敏感,梯度良好,适合端到端训练;在多分类任务中表现优异。

  • 缺点:对标签噪声较敏感;预测概率过于自信时可能过拟合。

  • 适用场景:图像分类、文本分类、多类别语义分割等绝大多数多分类任务。

2 二分类交叉熵 BCEWithLogitsLoss

这是交叉熵在二分类($ C=2 $)时的特例。通常用 $ y $ 表示真实标签(0 或 1),$ p $ 表示模型预测为正类的概率。公式简化为:

L=−[ylog⁡(p)+(1−y)log⁡(1−p)] L = -\left[ y \log(p) + (1-y) \log(1-p) \right] L=[ylog(p)+(1y)log(1p)]

  • 当真实标签 $ y=1 $ 时,损失为 $ -\log(p) $(预测越接近 1,损失越小)。
  • 当真实标签 $ y=0 $ 时,损失为 $ -\log(1-p) $(预测越接近 0,损失越小)。

注意BCEWithLogitsLoss 在 PyTorch 中是将 Sigmoid 激活与二分类交叉熵合并在一起的计算方式,数值稳定性更好,建议直接使用,而非分开调用 Sigmoid + BCELoss

  • 优点:形式简洁,计算高效;对正负样本不平衡问题可配合 pos_weight 参数进行缓解。
  • 缺点:对类别极度不平衡的数据需要额外处理(如加权或重采样)。
  • 适用场景:垃圾邮件检测、疾病筛查、点击率预测(CTR)等二分类任务。

3 均方误差 MSELoss

也叫 L2 损失,是最标准的回归损失。

L=1N∑i=1N(yi−y^i)2 L = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 L=N1i=1N(yiy^i)2

  • 优点:处处可导,梯度形式简单;在大误差时梯度大,收敛较快;有明确的解析解(线性回归中)。
  • 缺点:对离群点(异常大或小的值)非常敏感。因为误差被平方了,如果某个点预测差得很远,损失会急剧增大,迫使模型优先拟合这个异常点,从而牺牲整体性能。
  • 适用场景:房价预测、温度估计、股票价格预测等连续值回归任务;以及部分信号重建任务(如自编码器)。

4 平均绝对误差 L1Loss

也叫 L1 损失。

L=1N∑i=1N∣yi−y^i∣ L = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i| L=N1i=1Nyiy^i

  • 优点:对离群点不敏感,比较稳健,不会因个别极端值导致模型偏离。
  • 缺点:在误差很小的时候,梯度绝对值始终为 1(或 -1),不会随误差减小而减小,导致模型在接近最优解时难以精细调整,容易在最优值附近震荡,收敛精度不如 MSE。
  • 适用场景:数据中存在较多异常值或噪声的回归任务;以及对鲁棒性要求高于精度的场景(如某些金融或传感器数据分析)。

5 平滑 L1 损失 Smooth L1 Loss

L={0.5(yi−y^i)2,if ∣yi−y^i∣<1∣yi−y^i∣−0.5,otherwise L = \begin{cases} 0.5 (y_i - \hat{y}_i)^2, & \text{if } |y_i - \hat{y}_i| < 1 \\ |y_i - \hat{y}_i| - 0.5, & \text{otherwise} \end{cases} L={0.5(yiy^i)2,yiy^i0.5,if yiy^i<1otherwise

  • 优点:结合了 MSE 和 MAE 的优势——当误差较小时,表现得像 MSE(梯度平滑,收敛精度高);当误差较大时,表现得像 MAE(梯度饱和,防止梯度爆炸,对离群点鲁棒)。
  • 缺点:引入了一个额外的超参数(阈值,通常设为 1 或可调),需要根据具体任务调整。
  • 适用场景目标检测中边界框回归(Bounding Box Regression)的首选损失;也适用于需要兼顾鲁棒性和精度的其他回归任务,如姿态估计中的坐标回归。

损失函数选择建议(速查表)

任务类型 推荐损失 理由
多分类 CrossEntropyLoss 标准选择,梯度稳定,效果最好
二分类 BCEWithLogitsLoss 数值稳定,可与不平衡处理结合
回归(无异常值) MSELoss 收敛快,精度高
回归(有异常值) L1Loss / Smooth L1 Loss 鲁棒性强,不受离群点干扰
目标检测边框回归 Smooth L1 Loss 平衡鲁棒性与收敛精度
多标签分类 BCEWithLogitsLoss(逐标签) 每个类别独立做二分类

补充说明:损失函数的选择并非一成不变,实际应用中常需结合任务特性、数据分布和模型结构进行实验验证。此外,还可根据需求设计自定义损失组合损失(如分类损失 + 回归损失联合训练),以更好地驱动模型朝期望方向优化。

更多推荐