模型训练优化技巧:数据增强、知识蒸馏与调参
模型训练优化技巧:数据增强、知识蒸馏与调参
小模型精度不够?别急着换大模型。通过数据增强、知识蒸馏、训练策略调优,小模型也能涨好几个点。这篇讲我实际项目里常用的训练优化手段,都是不换模型就能提升精度的方法。
大家好,我是黒漂技术佬。
很多人训练模型就是 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']))
数据增强的原则
- 符合真实场景:增强出来的图要和实际推理时的图分布一致。比如实际都是正视角,就别加 90 度旋转。
- 强度适中:增强太猛,模型学不到东西;太弱,泛化不够。
- 先弱后强:一开始增强弱一点,模型收敛了再加强。
- 类别均衡:少的类别多增强,多的类别少增强,缓解数据不均衡。
二、知识蒸馏:用大模型教小模型
知识蒸馏(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 的蒸馏比分类复杂一些,常见做法:
- Logits 蒸馏:检测头输出的 logits 做蒸馏
- 特征蒸馏:中间特征图也做蒸馏(FitNets)
- 目标蒸馏:只对正样本区域蒸馏
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 随机缩放
模型对不同尺寸的鲁棒性更好。
四、标签与数据质量优化
标注质量检查
垃圾进垃圾出。标注质量差,再怎么训都没用。
常见标注问题:
- 框不准:偏大偏小、偏移
- 漏标:有的目标没标
- 错标:类别标错了
- 不一致:同一类目标有的标有的不标
检查方法:
- 随机抽几十张人工检查
- 训一版模型,找误检漏检严重的,回去看标注
- 用模型预测结果辅助检查标注
类别不均衡处理
有的类别样本多,有的少,模型偏向多的类别。
解决方法:
- 数据增强:少的类别多增强、多复制
- 损失加权:少的类别损失权重调高
- 过采样/欠采样:少的多抽,多的少抽
- 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,真实场景的业务指标才是标准
下一篇讲模型剪枝:去掉模型里冗余的参数和通道,进一步压缩体积、提升速度。
我是黒漂技术佬。
更多推荐


所有评论(0)