🏠 总目录📚 本教程 11 · 损失函数与训练策略
📑 本页目录(点开跳转)

CV损失函数与训练策略

30 分钟 | ⭐ 选对损失比调参重要


🎯 一句话

损失函数是你告诉模型「什么叫做得好」的唯一方式。选错损失,模型会非常努力地优化一个你并不想要的目标。这一章的核心是:让损失函数尽量贴近赛题的评价指标,尤其在分割(Dice)和不均衡分类(Focal)这两类场景。


一、CV损失函数体系

分类损失函数

损失函数 公式核心 适用场景 不适用场景
CrossEntropy -sum(y*log(p)) 多分类通用 -
BCE Loss -sum(ylog(p)+(1-y)log(1-p)) 二分类/多标签 -
BCE + Sigmoid BCE自动内含Sigmoid PyTorch中BCE默认含Sigmoid 手动加Sigmoid会重复
Focal Loss CE * (1-p)^gamma 目标检测(正负样本极度不均衡) 图像分类(基本不work)
Label Smoothing y_smooth = y*(1-eps) + eps/K 分类后期提分 标签本身不确定时
Bi-tempered Loss 双温度参数替代softmax 噪声标签场景 干净标签无额外收益

Focal Loss详解

维度 说明
出发点 目标检测中正负样本极度不均衡(1:1000)
核心公式 FL(p) = -alpha * (1-p)^gamma * log(p)
alpha参数 正负样本权重平衡,通常0.25
gamma参数 难分样本聚焦程度,论文推荐2
调优建议 论文经验值不是所有场景都有效,需根据验证集调整
关键结论 Focal Loss在图像分类和语义分割中基本不work,仅在目标检测中有效

Label Smoothing详解

维度 说明
原理 将one-hot硬标签软化: y_smooth = 1-eps(正确类), eps/(K-1)(其他类)
eps取值 通常0.05~0.1
效果 防止模型过度自信,增强泛化能力
本质 将离散标签空间变为连续分布
与MixUp关系 MixUp是样本空间连续化,Label Smoothing是标签空间连续化
适用阶段 分类后期提分,通常提升0.1~0.5个百分点

Bi-tempered Logistic Loss

维度 说明
问题 噪声标签导致模型学习错误信息
核心思想 用两个温度参数替代标准softmax
温度t1 控制对噪声标签的容忍度(>1更容忍)
温度t2 控制对困难样本的聚焦度(<1更聚焦)
适用 木薯叶等噪声标签分类任务
效果 比CE/Loss Smoothing对噪声标签更鲁棒

Soft Label

维度 说明
来源 知识蒸馏中Teacher模型的输出概率分布
思路 用连续概率分布替代one-hot硬标签作为训练目标
与Label Smoothing区别 Label Smoothing是均匀分配,Soft Label可用非均匀分布
效果 训练更稳定,泛化更好

二、分割损失函数

分割损失函数对比

损失函数 关注点 优势 劣势
BCE 像素级分类 稳定,梯度好 不关注全局结构
Dice Loss 区域重叠度 直接优化IoU相关指标 梯度不稳定(小目标)
IoU Loss 交并比 与评价指标一致 梯度不连续
BCE + Dice 像素+区域 互补,最常用 需调权重
Focal + Dice 难样本+区域 处理类别不均衡 分割中Focal收益有限

Dice Loss优化

维度 说明
原始Dice 2*
分母平方优化 将分母项平方后再求和: 2sum(xy)/(sum(x^2)+sum(y^2))
来源 VNet模型的做法
效果 梯度下降更稳定,避免小目标时梯度震荡
平滑系数 分母加smooth(如1e-5)防止除零

分割损失函数选择建议

场景 推荐损失 理由
Baseline BCE + Dice 互补,最稳定
类别不均衡 BCE + Dice + Class Weight 加权处理小类
小目标 BCE + Dice(square) 平方分母稳定梯度
噪声标签 BCE + Dice + Bi-tempered 对噪声更鲁棒

Lovasz Loss

维度 说明
核心思想 直接优化IoU指标的可凸松弛代理损失
与Dice Loss区别 Dice Loss是IoU的近似,Lovasz Loss是IoU的精确凸松弛
优势 理论上与IoU指标更一致,梯度更稳定
适用场景 语义分割中评价指标为IoU/mIoU时
实现 lovasz_losses.py (公开实现)
竞赛经验 分割任务后期提分,通常比Dice Loss更优0.1~0.3个百分点

Tversky Loss

维度 说明
核心公式 TL = 1 - (TP + eps) / (TP + alphaFP + betaFN + eps)
alpha/beta 控制FP和FN的权重,alpha+beta=1
与Dice关系 alpha=beta=0.5时退化为Dice Loss
不均衡调节 alpha<beta时更关注FN(漏检),适合小目标分割
Focal Tversky 加入Focal机制: FT = (1-TL)^gamma
适用场景 小目标分割、类别极度不均衡

ArcFace / Center Loss(分类辅助损失)

损失 核心思想 适用场景
ArcFace 在角度空间增加分类间隔(margin),使同类更紧凑、异类更分离 细粒度分类、图像检索
Center Loss 学习每个类别的中心,最小化样本到中心的距离 分类正则化
CosFace 在余弦空间增加间隔,比ArcFace训练更稳定 细粒度分类
SphereFace 在角度空间乘性间隔,最早的间隔损失 细粒度分类

损失函数选择决策

场景 推荐损失组合 理由
分类baseline CrossEntropy 简单稳定
分类不均衡 Focal Loss / Class Weight 关注难分样本
分类噪声标签 Bi-tempered Loss 对噪声鲁棒
分割baseline BCE + Dice 互补最稳定
分割冲分 BCE + Lovasz 与IoU指标更一致
分割小目标 BCE + Tversky(alpha<beta) 减少漏检
细粒度分类 CE + ArcFace 增加类间间隔

三、学习率调度策略

调度策略对比

策略 曲线特征 适用场景 参数
指数衰减 平滑持续下降 通用 decay_rate
固定步长衰减 阶梯式下降 通用 step_size, gamma
余弦退火 平滑下降到最低 竞赛常用 T_max, eta_min
余弦退火+重启 周期性下降重启 跳出局部最优 T_0, T_mult
OneCycleLR 先升后降 快速收敛 max_lr, pct_start
WarmUp + Cosine 先升后降 大模型训练必备 warmup_epochs

WarmUp详解

维度 说明
问题 训练初期离最优很远,大学习率容易跑偏
方案 前几个epoch用小学习率,平稳后再调高
比例 通常warmup占总训练的5%~10%
实现 线性从0增长到目标学习率
必要性 大模型(EfficientNet-B5+)训练时几乎必须
YOLOv5 内置WarmUp,默认前3个epoch

学习率调度选择建议

阶段 推荐策略 理由
Baseline CosineAnnealing 简单有效
大模型 WarmUp + CosineAnnealing 防止初期跑偏
冲分 CosineAnnealingWarmRestarts 周期重启跳出局部最优
快速实验 OneCycleLR 收敛最快

四、训练策略

输入尺寸与精度权衡

维度 说明
规律 输入图片尺寸越大,模型精度越高
原因 更多细节信息被保留
限制 显存随尺寸平方增长
实践 先用小尺寸(256/384)验证流程,再用大尺寸(512/640)冲分
分割特例 医学大图需从TIF裁剪,裁剪尺寸影响精度

交叉验证策略

策略 说明 适用场景
按图片划分 以大图为单位划分折 医学大图(入侵肾脏)
按切片划分 裁剪后按切片划分 切片间独立时
K折 K=4/5/8 通用
留出法 简单train/val划分 快速验证
分层划分 按类别比例划分 类别不均衡时

交叉验证与线上分数一致性

问题 说明
CV与LB不一致 本地交叉验证分数与线上排行榜分数不匹配
原因 验证集分布与测试集分布不一致
解决 对抗验证(Adversarial Validation)调整验证集
数据泄露 测试集存在泄露时LB不可靠
建议 以CV分数为主,LB为辅

SWA在CV中的应用

维度 说明
时机 训练末期最后5~10个epoch
方法 维持较高固定学习率,对权重取算术平均
效果 更稳健的最终模型,减少单次保存的随机性
CV验证 有交叉验证时SWA收益更明显

OHEM(在线困难样本挖掘)

维度 说明
原理 筛选模型预测错误且高置信度的困难负样本
实现 按OHEM ratio计算keep_number,只保留top-k困难样本
适用 目标检测(正负样本极度不均衡)
不适用 图像分类(容易过拟合训练集)
本质 等价于对困难样本做上采样
风险 过拟合训练集,需谨慎使用

五、自动调参

自动调参工具对比

工具 特点 适用场景
NNI (Microsoft) 支持多种搜索算法,可视化 通用超参搜索
Optuna 贝叶斯优化,易用 轻量级搜索
Ray Tune 分布式搜索 大规模搜索
AutoAugment 专门搜索增强策略 数据增强优化

需要搜索的关键超参数

超参数 搜索范围 优先级
学习率 1e-5 ~ 1e-3 最高
输入尺寸 256/384/512/640
Batch Size 8/16/32/64
增强强度 弱/中/强
权重衰减 0/1e-4/1e-3
Label Smoothing 0/0.05/0.1

六、CV训练实战流程

1. 小尺寸(256)快速验证数据管线和训练流程
2. 切换到中等尺寸(384/512)正式训练
3. 选择最优模型架构(EfficientNet-B3~B5)
4. 加入高级增强(MixUp/CutMix/Mosaic)
5. 调优损失函数(BCE+Dice/Focal+Dice)
6. 加入SWA/EMA提升泛化
7. 多折交叉验证 + TTA
8. 多模型融合

🔗 这一章连到哪里

去哪为什么
ML基础 09 优化器与学习率CosineAnnealing / OneCycle / 分层学习率的原理
ML基础 10 正则化全家桶Label Smoothing、Dropout 与损失函数的关系
ML基础 08 反向传播Dice / Focal 这些损失为什么梯度不稳,得从梯度怎么回传看起

✅ 检查点

  1. 为什么说「选对损失比调参重要」?
  2. Focal Loss 解决什么问题?它和「调整类别权重」的区别是什么?
  3. 分割任务为什么常用 Dice Loss 而不是纯交叉熵?两者组合的理由是什么?
  4. 当评价指标不可微时(如 mAP、SMAPE 的某些变体),该怎么办?
  5. Label Smoothing 在什么场景下不该用?
👀 答案
  1. 因为损失函数定义了「优化方向」,调参只是决定「走多快」。方向错了,走得越快离目标越远。🔗 更深一层:[数学原理第 1 章]会告诉你损失函数其实是在声明你对数据噪声的假设
  2. Focal Loss 降低「已经分对的容易样本」的权重,让模型把注意力集中在难样本上。和类别权重的区别:类别权重是「按类别」加权(整个少数类都加权),Focal 是「按难度」加权(哪怕是多数类里的难样本也会被重视)。所以不均衡且难样本集中时,Focal 更对症
  3. 因为交叉熵是逐像素独立算的,而 Dice 直接优化的是区域重叠度——和分割的评价指标一致。在前景占比很小时(医学影像的病灶),纯交叉熵会被大量背景像素主导,模型学会「全预测背景」也能有很低的 loss。组合的理由:交叉熵提供稳定的逐像素梯度(训练更稳),Dice 提供和指标一致的区域级信号——互补。
  4. 用一个可微的代理损失训练,再用真实指标做模型选择和后处理调优。具体:①选一个和指标相关性高的可微损失训练 ②在验证集上用真实指标搜后处理参数(阈值、NMS 参数)③用真实指标做早停和模型选择。⭐ 很多赛题里,后处理阈值的搜索带来的提升比换损失更大。
  5. 需要精确概率的场景(要用输出概率做决策/排序阈值时,平滑会系统性压低置信度)②做知识蒸馏的教师模型(需要真实的概率分布)③标签本身已经很干净且类别边界清晰时,收益很小甚至为负。

🛑 可以停在这里

走神救援
损失函数定义「优化方向」,调参只决定「走多快」——方向错了走越快越远。核心原则:让损失尽量贴近赛题的评价指标Focal Loss 按「难度」加权(降低已分对的容易样本的权重),类别权重按「类别」加权——不均衡且难样本集中时 Focal 更对症。分割用 Dice + 交叉熵组合:交叉熵逐像素独立(前景占比小时会被背景主导,「全预测背景」也能低 loss),Dice 直接优化区域重叠度和指标一致;组合是因为交叉熵给稳定的逐像素梯度、Dice 给和指标一致的区域信号。⭐指标不可微时:用可微代理损失训练 + 在验证集上用真实指标搜后处理参数+ 用真实指标做早停选模型——很多赛题里后处理阈值搜索的提升比换损失更大。⚠️Label Smoothing 三个不该用的场景:需要精确概率、蒸馏的教师模型、标签已很干净时。

打卡记录保存在你的浏览器里,首页能看到总进度