模型训练优化技巧:数据增强、知识蒸馏与调参

小模型精度不够?别急着换大模型。通过数据增强、知识蒸馏、训练策略调优,小模型也能涨好几个点。这篇讲我实际项目里常用的训练优化手段,都是不换模型就能提升精度的方法。

大家好,我是黒漂技术佬。

很多人训练模型就是 default 参数跑一遍,精度不够就换更大的模型。其实同样的模型,调一调训练策略,精度涨 3-5 个点很正常。尤其是边缘部署,小模型 + 好训练 > 大模型 + 随便训。

这篇讲数据增强、知识蒸馏、训练参数调优,都是不换模型就能涨点的方法。


一、数据增强:最有效的涨点手段

数据是深度学习的燃料,数据质量和多样性直接决定模型上限。

基础增强

这些是标配,几乎所有训练都要加:

增强方式作用常用参数
随机裁剪增加位置多样性0.8-1.0 比例
随机翻转左右镜像概率 0.5
颜色抖动亮度、对比度、饱和度幅度 0.1-0.3
随机旋转角度变化±15度以内
缩放变换多尺度训练0.5-1.5 倍

Mosaic 增强

YOLO 系列标配,把四张图拼成一张:

  • 好处:增加小目标、丰富背景、batch 里变相有更多样本
  • 注意:训练后期可以关掉,最后几轮用正常图稳定一下

MixUp 增强

两张图按比例混合,标签也按比例混合:

img = img1 * lam + img2 * (1 - lam)
label = label1 * lam + label2 * (1 - lam)

提升模型的泛化能力,对分类任务效果明显。

Copy-Paste

把一个目标抠出来,贴到另一张图上:

  • 好处:增加目标出现的位置、背景多样性
  • 特别适合:目标少、类别不均衡的数据集

Albumentations 库

Python 里做数据增强首选 Albumentations,比 torchvision 快、功能多:

import albumentations as A

transform = A.Compose([
    A.RandomCrop(width=640, height=640),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.3),
    A.HueSaturationValue(hue_shift_limit=10, sat_shift_limit=20, val_shift_limit=10, p=0.3),
    A.GaussNoise(var_limit=(10, 50), p=0.2),
    A.MotionBlur(blur_limit=3, p=0.1),
], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))

数据增强的原则

  1. 符合真实场景:增强出来的图要和实际推理时的图分布一致。比如实际都是正视角,就别加 90 度旋转。
  2. 强度适中:增强太猛,模型学不到东西;太弱,泛化不够。
  3. 先弱后强:一开始增强弱一点,模型收敛了再加强。
  4. 类别均衡:少的类别多增强,多的类别少增强,缓解数据不均衡。

二、知识蒸馏:用大模型教小模型

知识蒸馏(Knowledge Distillation)是边缘部署的神器:用一个大的「教师模型」指导小的「学生模型」训练,小模型能学到大模型的「暗知识」,精度比自己训高很多。

原理

普通训练:学生模型只学 hard label(是/不是)
蒸馏训练:学生模型学教师模型的 soft label(各类别概率分布)

教师模型(大、准) → 输出软标签 → 学生模型(小、快)学习

软标签包含了类别之间的相似性信息,比如「猫和狗比猫和汽车更像」,这是 hard label 没有的。

温度参数 T

soft_label = softmax(logits / T)
  • T=1:正常 softmax
  • T 越大:输出越平滑,类别间的差异信息越明显
  • 一般取 3-10

损失函数

总损失 = 蒸馏损失(学教师) + 硬标签损失(学真实标签)

loss = α * distill_loss + (1 - α) * hard_loss

α 一般取 0.5-0.7,蒸馏损失权重更大一些。

YOLO 蒸馏怎么做?

YOLO 的蒸馏比分类复杂一些,常见做法:

  1. Logits 蒸馏:检测头输出的 logits 做蒸馏
  2. 特征蒸馏:中间特征图也做蒸馏(FitNets)
  3. 目标蒸馏:只对正样本区域蒸馏

Ultralytics 有现成的蒸馏功能,配置一下就能用:

# 蒸馏配置
distill:
  teacher: yolov8m.pt  # 教师模型
  ratio: 0.5           # 蒸馏损失比例
  temperature: 4       # 温度

蒸馏的收益

  • 一般能涨 1-3 个点 mAP
  • 小模型收益更明显(nano 涨得比 small 多)
  • 几乎没有推理成本,学生模型还是原来的大小和速度

💡 我的经验:售货柜项目用 v8m 当老师教 v8n,mAP 涨了 2.7 个点,推理速度完全没变。白嫖的精度提升,必做。


三、训练参数调优

学习率(最重要的超参数)

学习率太大:震荡不收敛
学习率太小:收敛慢、容易卡在局部最优

学习率调度器
  • Cosine Annealing:余弦退火,先高后低,效果好,YOLO 默认就是这个
  • StepLR:固定步长衰减,简单稳定
  • Warmup:前几轮学习率慢慢升上去,稳定训练初期
怎么找合适的学习率?

Ultralytics 自带学习率查找:

yolo lr_find model=yolov8n.pt data=data.yaml

自动找一个最合适的初始学习率。

Batch Size

  • 大 batch:训练稳定,梯度准,但显存占得多
  • 小 batch:泛化可能更好,但训练慢

边缘模型一般 batch size 不用太大,16-32 就够了。显存不够可以用梯度累积。

优化器

  • SGD:经典,泛化好,但需要调学习率
  • Adam/AdamW:自适应学习率,省心,收敛快
  • AdamW + 权重衰减:目前主流选择

YOLOv8 默认 SGD,其实 AdamW 也不错,可以都试试。

权重衰减(Weight Decay)

L2 正则化,防止过拟合。一般 0.0005 左右。

数据少的话调大一点,数据多可以调小。

训练轮数 Epochs

  • 太少:没收敛
  • 太多:过拟合,浪费时间

一般 100-300 epochs 差不多。看验证集 mAP 不再涨了就可以停。

输入尺寸多尺度训练

训练时随机用不同分辨率:

imgsz: 640
scale: 0.5  # 0.5x 到 1.5x 随机缩放

模型对不同尺寸的鲁棒性更好。


四、标签与数据质量优化

标注质量检查

垃圾进垃圾出。标注质量差,再怎么训都没用。

常见标注问题:

  • 框不准:偏大偏小、偏移
  • 漏标:有的目标没标
  • 错标:类别标错了
  • 不一致:同一类目标有的标有的不标

检查方法:

  1. 随机抽几十张人工检查
  2. 训一版模型,找误检漏检严重的,回去看标注
  3. 用模型预测结果辅助检查标注

类别不均衡处理

有的类别样本多,有的少,模型偏向多的类别。

解决方法:

  1. 数据增强:少的类别多增强、多复制
  2. 损失加权:少的类别损失权重调高
  3. 过采样/欠采样:少的多抽,多的少抽
  4. Focal Loss:关注难样本,缓解不均衡

难例挖掘(Hard Example Mining)

训完一版模型,把误检和漏检的样本挑出来,加入训练集再训一轮。

循环几次,精度逐步提升。实际项目里这是最有效的涨点手段之一。


五、训练的一般流程

我做项目的标准训练流程:

第一轮:基线

  • 默认参数,小模型,训练 100 epochs
  • 看 baseline 精度大概多少
  • 分析哪些类别差、哪些场景差

第二轮:数据优化

  • 补充差的类别的数据
  • 检查并修正标注
  • 加上合适的数据增强
  • 再训一版,看数据层面能涨多少

第三轮:训练调优

  • 调学习率、优化器、增强强度
  • 加知识蒸馏
  • 目标是把小模型训到极限

第四轮:迭代优化

  • 测实际场景效果
  • 收集 bad case
  • 补充数据、再训
  • 循环直到满足需求

六、实际案例:售货柜训练优化

分享一下售货柜商品识别的训练优化过程:

Baseline:YOLOv8n,默认参数

  • mAP:89.2%
  • 问题:小包装商品漏检多、反光场景误检多

优化 1:数据增强加强

  • 加了颜色抖动、高斯噪声、运动模糊(模拟摄像头模糊)
  • Mosaic 增强全程开启
  • 结果:mAP → 91.5%(+2.3%)

优化 2:补充难例数据

  • 收集了反光、遮挡、部分露出的场景
  • 每个类别补充了 50-100 张
  • 结果:mAP → 93.8%(+2.3%)

优化 3:知识蒸馏

  • 用 YOLOv8m 当教师模型
  • 温度 4,蒸馏比例 0.5
  • 结果:mAP → 95.1%(+1.3%)

优化 4:参数调优

  • 学习率从 0.01 调到 0.005
  • 加了 5 轮 warmup
  • 训练 200 epochs
  • 结果:mAP → 95.6%(+0.5%)

总共涨了 6.4 个点,模型还是那个 yolov8n,速度没变,精度提升一大截。


七、常见的坑

坑 1:增强太猛

颜色抖动幅度过大、旋转角度太大,增强出来的图和真实场景差太远,反而掉点。
解决:增强要符合实际推理场景,先弱后强。

坑 2:蒸馏教师模型不对

教师模型精度还不如学生模型,蒸馏反而有害。
解决:教师模型精度一定要比学生高,一般大 1-2 个档位。

坑 3:盲目堆 epoch

训几百轮以为精度会更高,其实早就过拟合了。
解决:看验证集 mAP,连续 20 轮不涨就早停。

坑 4:只看 mAP 不看实际效果

mAP 高不代表业务效果好。
解决:一定要在真实场景下测,看误检漏检率,看业务指标。

坑 5:数据分布不一致

训练数据和实际推理数据分布不一样,训练集精度高,实际一塌糊涂。
解决:训练数据要覆盖真实场景的各种情况(光照、角度、遮挡等)。


八、本篇小结

  • 数据增强是最有效的涨点手段,Mosaic + 颜色抖动 + 翻转为标配
  • 知识蒸馏用大模型教小模型,白嫖 1-3 个点精度,推理零成本
  • 训练调优:学习率最重要,Cosine + Warmup 是标配
  • 数据质量 > 模型大小,标注差再大的模型也没用
  • 训练流程:先 baseline → 数据优化 → 训练调优 → 难例迭代
  • 不要只看 mAP,真实场景的业务指标才是标准

下一篇讲模型剪枝:去掉模型里冗余的参数和通道,进一步压缩体积、提升速度。

我是黒漂技术佬。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐