在深度学习中,损失函数 (Loss Function) 是连接模型预测与真实标签的桥梁,它定义了模型的优化目标。选择合适的损失函数往往能起到事半功倍的效果。本文将对深度学习中常见的损失函数进行梳理,从基础的回归/分类到进阶的难例挖掘和度量学习。
1. 回归任务 (Regression)
回归任务的目标是预测连续值。
1.1 MSE (L2 Loss)
均方误差 (Mean Squared Error):
$$ L = (y - \hat{y})^2 $$
- 特点:收敛快,但对异常值 (Outliers) 非常敏感(因为误差被平方放大了)。
1.2 MAE (L1 Loss)
平均绝对误差 (Mean Absolute Error):
$$ L = |y - \hat{y}| $$
- 特点:对异常值鲁棒,但在 0 点处不可导,梯度恒定可能导致收敛困难。
1.3 Smooth L1 Loss
结合了 L1 和 L2 的优点:
- 在误差较小时($|x| < 1$)使用 L2(平滑,可导)。
- 在误差较大时($|x| \ge 1$)使用 L1(梯度恒定,防止梯度爆炸)。
- 应用:Faster R-CNN 的边界框回归。
2. 分类任务 (Classification)
2.1 Cross Entropy (CE)
交叉熵损失是分类任务的标准配置:
$$ CE = - \sum y \log(p) $$
- 本质:衡量两个概率分布的距离(KL 散度)。
- 局限:对噪声标签敏感,且容易导致模型过度自信 (Over-confidence)。
2.2 Label Smoothing
为了解决 CE 的过度自信,Label Smoothing 将 One-hot 标签软化:
$$ y_{new} = (1 - \epsilon) y + \epsilon / K $$
- 作用:防止模型在训练集上过拟合,提升泛化能力。
3. 进阶:解决不平衡与难例
当数据存在严重的类别不平衡或大量简单负样本时,标准 CE 往往失效。
3.1 Focal Loss
最初用于目标检测 (RetinaNet),旨在解决 One-stage 检测器中极端的正负样本失衡。
- 公式:$FL(p_t) = -\alpha_t (1 - p_t)^\gamma \log(p_t)$
- 核心机制:
- $\gamma$ (Focusing Parameter):降低易分样本($p_t \approx 1$)的权重,迫使模型关注难分样本。
- $\alpha$ (Balancing Parameter):平衡正负样本比例。
- 价值:不仅用于检测,在长尾分类任务中也非常有效。
1 | # Focal Loss PyTorch 实现 |
4. 进阶:度量学习 (Metric Learning)
目标是学习一个特征空间,使得同类样本距离近,异类样本距离远。
4.1 Triplet Loss
$$ L = \max(d(a, p) - d(a, n) + margin, 0) $$
- 输入:三元组 (Anchor, Positive, Negative)。
- 难点:需要复杂的三元组挖掘 (Triplet Mining) 策略,否则训练效率极低。
4.2 InfoNCE (Contrastive Loss)
自监督学习(如 SimCLR, MoCo)的核心。
- 思想:将 Triplet 扩展到 N 个负样本,转化为一个 N+1 类的分类问题。
- 优势:利用大量负样本,学习到的特征更具判别性。
总结
- 回归:首选 Smooth L1 或 MSE。
- 分类:首选 Cross Entropy,配合 Label Smoothing。
- 不平衡/难例:必选 Focal Loss。
- 特征学习:尝试 InfoNCE 或 Triplet Loss。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 WPIRONMAN!
评论





