1. 损失函数
损失函数用于衡量模型预测结果与真实标签之间的差异。训练模型的目标通常是让损失不断减小。
MAE:平均绝对误差
计算预测值与真实值之间的绝对误差,再取平均:
MAE = (1/n) * Σ|y^hat - y|
特点:
- 对所有误差基本一视同仁
- 对异常值相对不敏感
- 鲁棒性较好
- 在误差为0的位置不可导,但实际可通过次梯度等方式优化
MSE:均方误差
计算预测值与真实值之间误差的平方,再取平均:
MSE = (1/n) * Σ(y^hat - y)^2
特点:
- 会放大较大的误差
- 对异常值比较敏感
- 梯度连续,通常更容易优化
- 常用于回归任务
例如真实值为10:
| 预测值 | 误差 | MAE贡献 | MSE贡献 |
|---|---|---|---|
| 12 | 2 | 2 | 4 |
| 20 | 10 | 10 | 100 |
MSE会明显加大对大误差的惩罚。
2. 交叉熵损失
交叉熵主要用于分类任务,用于衡量模型预测的概率分布与真实标签之间的差异。
例如模型预测:
猫:0.9
狗:0.1
真实标签:
猫:1
狗:0
模型给真实类别分配的概率越高,交叉熵越小。
二分类交叉熵 BCE
适用于二分类任务,或者一个样本可以同时属于多个类别的多标签分类任务。
其中:
-
y:真实标签,只能是0或1
-
p:模型预测属于正类的概率
BCE = -[y*log(p) + (1-y)*log(1-p)]
如果真实标签为1:
BCE = -log(p)
模型预测正确且非常自信,损失很小;预测错误且非常自信,损失会很大。
例如真实标签是正类:
| 预测正类概率 p | 损失趋势 |
|---|---|
| 0.99 | 很小 |
| 0.60 | 中等 |
| 0.10 | 很大 |
| 0.01 | 极大 |
二分类模型通常使用一个输出值,经过 Sigmoid 转换为0到1之间的概率。
多分类交叉熵 CCE
适用于一个样本只属于多个类别中的一个类别,例如猫、狗、鸟三分类。
假设真实类别是猫:
猫:0.7
狗:0.2
鸟:0.1
在真实标签使用 One-Hot 编码时,多分类交叉熵可简化为:
CCE = -log(真实类别对应的预测概率)
因此,虽然模型输出了所有类别的概率,但最终损失主要取决于真实类别对应的概率。
多分类模型通常输出多个 logits,再通过 Softmax 转换为概率分布。
实际框架中,交叉熵损失通常直接接收 logits,并在内部完成 Sigmoid 或 Softmax,这样数值稳定性更好。
3. 多任务中的总损失
复杂模型通常同时完成多个子任务,总损失由多个子损失加权组成:
total_loss =
a * box_loss
+ b * cls_loss
+ c * seg_loss
其中 a、b、c 是不同损失的权重。
权重的作用:
- 决定不同任务对参数更新的影响程度
- 权重过大,该任务可能主导训练
- 权重过小,该任务可能学习不足
- 不同损失的数值尺度不同,不能只比较原始数值大小
YOLO分割任务中常见:
- Box loss:约束预测框的位置和大小
- Classification loss:约束类别预测
- Segmentation loss:约束预测 Mask 与真实 Mask 的差异
- DFL loss:部分实现中用于优化边界框位置分布
训练时要同时观察:
- 训练损失
- 验证损失
- Box mAP
- Mask mAP
- Precision
- Recall
不能只因为训练 Loss 很低,就认为模型效果一定很好。