1-监督学习损失
1. 损失函数的本质:为什么它决定了模型学什么
模型的学习,本质上是在一个由参数
损失函数
换个角度看,若假设数据
2. 统一视角:经验风险、最小二乘与最大似然估计
2.1 经验风险最小化
设数据集
ERM(经验风险最小化)的目标是找到使
2.2 最大似然估计(MLE)
假设数据由概率密度
对数似然为
求
其中
3. 从概率假设推导常见损失
3.1 MSE(均方误差)
概率假设:高斯噪声
设真实标签
即
推导 MSE
负对数似然为
忽略常数项,经验风险为
即 MSE。结论:MSE 对应高斯噪声假设(
MSE 的梯度
设
梯度大小与误差
3.2 MAE(平均绝对误差)
概率假设:拉普拉斯噪声
MAE 对应的概率假设是拉普拉斯分布:
取负对数:
即 MAE。
MAE 的梯度(不可微点处理)
MAE 在
其中
MAE 的特点:梯度大小恒为
3.3 Huber Loss
MSE 在大误差时梯度过大(
其中
- 小误差区间(
):使用 MSE,保证快速收敛 - 大误差区间(
):使用 MAE,限制梯度的增长,防止离群点主导更新
Huber Loss 是对噪声不是高斯而是重尾分布(heavy-tailed)数据的一种鲁棒损失,在强化学习的值函数估计和目标检测(如 YOLO)中应用广泛。
3.4 BCE / Sigmoid Cross-Entropy(二元交叉熵)
概率假设:伯努利分布
设二分类问题中
即伯努利分布。负对数似然为
这就是 BCE(Binary Cross-Entropy)。注意这里 Sigmoid 与 Cross-Entropy 的结合不是巧合——Sigmoid 将输出压缩到
BCE 梯度推导
设
利用
结论:二分类 Cross-Entropy 对 logits 的梯度正好是预测概率与真实标签的残差
梯度大小与置信度的关系
梯度
- 低置信度时(
, 或 , ):残差 ,梯度接近最大值,参数大步更新 - 高置信度时(
, ):残差 ,梯度接近 0,参数几乎不更新(模型已”确信”当前预测正确)
这与 MSE 的行为不同——MSE 的梯度始终与误差成比例,但对大置信度预测仍有非零梯度(梯度消失体现在激活函数饱和,Sigmoid 两端梯度趋近 0,但若
3.5 Softmax Cross-Entropy(多分类交叉熵)
概率假设:多项分布
设多分类问题中
即多项分布,其概率质量函数为
负对数似然为
即 Categorical Cross-Entropy(多分类交叉熵)。
Softmax 的梯度(关键推导)
由
其中
在独热编码假设下(
结论:多分类 Cross-Entropy 对 logits 的梯度 = 预测概率与真实标签的残差
为什么 Cross-Entropy 常与 Softmax 配对
Softmax 的作用是将任意实数向量
3.6 Multi-label BCE(多标签二元交叉熵)
多标签分类中,每个标签独立存在,不施加互斥约束。设
负对数似然为
每个标签独立计算 BCE,梯度同样为
3.7 Label Smoothing(标签平滑)
问题引入
标准 Cross-Entropy 鼓励模型对真实类别输出接近 1 的概率,对其他类别输出接近 0 的概率——这种**硬目标(hard target)**会导致过拟合,且在模型犯错时给予极大的梯度(当
Label Smoothing 的形式
设平滑参数
即以
注意:部分实现使用”均匀分布”作为平滑目标(
概率视角
Label Smoothing 等价于假设数据标签不是完全确信的,而是以
对梯度的影响
使用 Label Smoothing 后,梯度变为
当
4. 类别不平衡的处理
4.1 代价敏感学习(Cost-Sensitive Learning)
标准 BCE / Cross-Entropy 对所有样本一视同仁。若正例(
设正例权重
实践中通常用类别频率的倒数作为权重:
或者设类别权重向量(class weights)
4.2 Focal Loss
类别不平衡的另一解法是 Focal Loss(Lin et al., 2017, RetinaNet)。核心思想是降低易分类样本的贡献,聚焦于难分类样本:
其中:
是聚焦参数(focusing parameter):当 时退化为标准 BCE;当 时,置信度高的样本( )的损失被 因子大幅衰减,而置信度低的样本的损失几乎不受影响 是可选的类别平衡权重(与代价敏感学习结合)
直觉解释:当模型对某样本的预测已经接近标签(如
4.3 类权重的实践设置
| 方法 | 说明 | 适用场景 |
|---|---|---|
| 无权重 | 标准 BCE / Cross-Entropy | 类别大致平衡 |
| 逆频率权重 | 中度不平衡(~10:1) | |
| 有效样本数权重 | 高度不平衡 | |
| Focal Loss | 目标检测等极不平衡场景 | |
| 阈值调整 | 保持损失函数不变,在推理时调整分类阈值 | 已知特定类别的召回需求 |
5. 任务目标与评测指标不一致的处理
损失函数定义的优化目标与评测指标(evaluation metric)往往不同——这是训练中的常见矛盾。
典型案例:二分类问题中,我们用 BCE 作为损失函数,但评测时关心 F1 分数而非 accuracy。模型可能通过将所有预测推向某一极端(使 accuracy 最大化)来最小化 BCE,但这导致 precision 或 recall 失衡,F1 分数不高。
解决方案:
- 加权损失:在 BCE 中引入类权重,使损失函数反映 F1 的优化需求
- 调整决策阈值:用 BCE 训练模型,推理时在
区间搜索最优分类阈值以最大化 F1(这不改变训练目标,但改变了决策边界) - 自定义损失:直接以 F1 或其他指标的可微近似作为损失函数(但 F1 的离散性使直接优化困难,常用平滑近似)
- 指标监控:始终将评测指标作为独立的 validation 监控指标,而非仅看 loss——若 loss 下降但评测指标不提升,说明损失函数与任务目标存在根本性偏差,需要重新设计损失函数
6. 工程实践
6.1 如何根据任务选择损失函数
| 任务类型 | 推荐损失函数 | 概率假设 | 关键考量 |
|---|---|---|---|
| 标准回归(低噪声) | MSE | 高斯噪声 | 快速收敛,对离群点敏感 |
| 鲁棒回归(有离群点) | Huber Loss( | 重尾噪声 | 权衡收敛速度与鲁棒性 |
| 二分类 | BCE(Sigmoid + Cross-Entropy) | 伯努利分布 | 梯度为 |
| 多分类(互斥) | Softmax + Cross-Entropy | 多项分布 | 梯度为 |
| 多标签分类 | Multi-label BCE(独立 Sigmoid) | 独立伯努利分布 | 各标签独立,无竞争假设 |
| 类别不平衡二分类 | BCE + class weight 或 Focal Loss | 代价敏感伯努利 | Focal Loss 对难分类样本聚焦 |
| 目标检测(RetinaNet) | Focal Loss | — | 解决正负样本极端不平衡 |
| 标签有噪声/需正则化 | Label Smoothing | 标签噪声假设 | 防止硬目标过拟合 |
| 有界回归(0~1) | MSE + Sigmoid 输出 或 BCE 风格 | 高斯/伯努利混合 | 保证输出在目标范围内 |
6.2 如何监控 loss 曲线判断训练状态
正常训练曲线的特征
- Loss 持续下降:前 100 个 step 应看到明显下降(10%~30%),若不下降则初始化或学习率有问题
- Loss 下降速率趋于平缓:收敛阶段应呈现对数下降,趋于平台
- Train loss ≈ Val loss:若两者差距过大(Train loss 远低于 Val loss)则过拟合,Train loss 远高于 Val loss 则欠拟合
异常曲线的诊断
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| Loss 在前几个 step 变为 NaN | 学习率过大,梯度爆炸 | 减小学习率,启用梯度裁剪(clip_grad_norm_) |
| Loss 几乎不下降(平缓) | 学习率过小或陷入饱和 | 增大学习率;检查激活函数是否饱和;检查初始化 |
| Loss 下降但验证集性能不提升 | 损失函数与评测指标不一致;数据泄露 | 重新设计损失或调整阈值;检查数据分割 |
| Loss 周期性振荡 | 学习率过大或 batch size 太小 | 减小学习率;增大 batch size |
| 训练 loss 缓慢上升 | 梯度爆炸或损失函数数值不稳定 | 启用梯度裁剪;检查 Softmax/BCE 的数值安全实现 |
经验监控频率:实践中建议每 100~1000 个 step 记录一次 loss,每 epoch 结束时计算一次验证集指标。若 loss 曲线出现非单调跳跃,首先检查梯度范数是否异常。
6.3 处理异常标签、噪声标签、缺失标签
异常标签(Label Outliers)
指标签值超出合法范围(如回归目标为负数、分类标签超过
- 数据清洗:训练前检测并修正超出范围的标签(首选方案)
- 损失裁剪:对回归损失进行裁剪,如
,防止个别异常标签主导梯度 - 标签过滤:将异常标签对应的样本从训练集中移除或标记为无效
噪声标签(Noisy Labels)
指部分标签存在标注错误。对于噪声标签:
- Label Smoothing:以一定概率将标签视为噪声,平滑到其他类别
- 混合损失:结合带噪标签的损失和标签置信度的加权损失(如 “Co-teaching” 等方法)
- 鲁棒损失:MAE / Huber Loss 对噪声标签比 MSE 更鲁棒(因为大误差的梯度被截断)
- EMA 目标更新:对标签使用移动平均的软目标(Label Refinery),使标签随训练缓慢更新
缺失标签(Missing Labels)
多标签场景中,部分标签可能标记缺失(即”未知”而非”负”)。处理方法:
- 忽略缺失标签:仅在有标注的标签上计算损失,使用布尔掩码(mask)跳过缺失位置:
- 半监督学习:将缺失标签视为潜在变量,利用未标注数据辅助训练(如 Label Propagation)
- 两阶段处理:训练时仅用有标签样本,推理时使用完整标签集合
7. 常见陷阱
陷阱 1:回归任务中使用 Cross-Entropy
Cross-Entropy 要求预测值在
陷阱 2:多分类问题中混用 Sigmoid 和 Softmax
对于多分类(
若各类不互斥(多标签),则必须使用独立 Sigmoid——这正是多分类与多标签的根本区别。
陷阱 3:忽略数值稳定性
BCE 的计算涉及
# 正确做法(数值稳定)
loss = -(y * torch.clamp(log_pred, min=-100) + (1-y) * torch.clamp(log(1-pred), min=-100))陷阱 4:类别不平衡时仅用 Accuracy 评估
在极度不平衡的数据集(如 99% 负例,1% 正例)中,模型将所有样本预测为负例即可获得 99% 的 accuracy,但完全无法检测正例。必须使用 Precision / Recall / F1 / AUC 等不平衡敏感的评测指标,同时用加权损失或 Focal Loss 从训练目标层面解决不平衡。
陷阱 5:Loss 下降但评测指标不提升时不调整
Loss 与评测指标的关系并非单调。常见情况:Focal loss 训练中 loss 可能上升(因为模型更聚焦于困难样本,简单样本损失降低),但 mAP(mean Average Precision)实际在提升。若只看 loss,会误判为训练失败。解决方案是独立监控评测指标,不可将 loss 作为唯一成功标准。
8. 分类 / 回归 / 多标签损失选择表
| 场景 | 损失函数 | 输出层激活 | 评测指标 | 说明 |
|---|---|---|---|---|
| 标准二分类 | BCE(Sigmoid + Cross-Entropy) | Sigmoid | Accuracy, AUC, F1 | 标准配置 |
| 类别不平衡二分类 | BCE + class weight / Focal Loss | Sigmoid | Precision, Recall, F1 | Focal Loss 中 |
| 标准多分类(互斥) | Softmax + Cross-Entropy | Softmax | Accuracy, Top-1/5 | 梯度恒为 |
| 类别不平衡多分类 | Cross-Entropy + class weight | Softmax | Macro-F1, Weighted-F1 | class weight 为各类频率倒数 |
| 标签需要正则化 | Softmax + Cross-Entropy + Label Smoothing | Softmax + Smoothing | — | |
| 多标签分类 | Multi-label BCE | 独立 Sigmoid | Hamming Loss, Example-F1 | 各标签独立,无互斥 |
| 标准回归 | MSE | Linear | MSE, MAE, | 对离群点敏感 |
| 鲁棒回归 | Huber Loss | Linear | MAE, Huber(自定义) | |
| 有界回归(0~1) | MSE + Sigmoid 输出 | Sigmoid | MSE on bounded target | 输出约束在目标范围 |
| 目标检测(RetinaNet) | Focal Loss | Sigmoid | mAP | 解决正负样本极端不平衡 |
| 序列建模(NLP) | Cross-Entropy(token-level) | Softmax | Perplexity, BLEU | 按 token 计算交叉熵 |