CV损失函数与训练策略
一、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. 多模型融合