2、问题定义:什么是类别不平衡?长尾分布与头部/尾部类别的概念

2.1 先从一个真实场景说起

我记得刚入行那会儿,接了一个自动驾驶的感知项目。客户给的数据集里,「汽车」这个类别占了 80%,而「行人」只有 12%,「自行车」更惨,不到 3%。剩下的像「摩托车」、「三轮车」、「动物」这些,加起来才 5%。

我当时没太在意,直接拿经典的两阶段检测器去训。结果呢?汽车检测的 mAP 高达 0.92,但自行车只有 0.15,动物几乎一个都检不出来。这就是典型的类别不平衡问题。

说白了,类别不平衡就是数据集中不同类别的样本数量相差悬殊。你想想看,模型训练时看到「汽车」的次数是「自行车」的 30 倍,它当然更擅长认汽车,对自行车就「视而不见」了。

核心定义:类别不平衡(Class Imbalance)是指在训练数据中,不同类别的样本数量存在显著差异,导致模型偏向于多数类,而忽略少数类。

2.2 长尾分布:现实世界的常态

为什么会这样?其实真实世界的数据分布,绝大多数都是长尾分布

长尾分布长什么样?我画个图给你描述一下:

  • 头部(Head):少数几个类别,占据了绝大部分样本。比如「汽车」、「人」、「背景」这些常见物体。
  • 尾部(Tail):大量类别,每个类别只有极少量样本。比如「雨伞」、「滑板」、「灭火器」这些罕见物体。
  • 中间(Mid):介于头部和尾部之间,样本数量中等。

嗯,这里要注意:长尾不是病,它是数据本身的自然属性。你想想看,现实世界中「汽车」就是比「独角兽」多得多,对吧?

我在项目中遇到过最夸张的一次,一个工业质检数据集,「良品」有 50 万张,「划痕」只有 200 张。比例是 2500:1。这种极端不平衡,如果不处理,模型直接躺平——全部预测为「良品」,准确率还能有 99.9%,但一点用都没有。

2.3 头部类别 vs 尾部类别

我们来明确一下这两个概念:

类别类型 样本数量 典型特征 常见例子
头部类别 多(通常 > 1000 张) 模型容易过拟合,但 recall 高 汽车、人、猫、狗
中间类别 中等(100 - 1000 张) 训练相对稳定,但仍有偏差 自行车、摩托车、椅子
尾部类别 少(通常 < 100 张) 模型几乎学不到有效特征 雨伞、滑板、灭火器、动物

我的经验:我个人习惯把「样本数 < 50」的类别称为「极端尾部」。这类类别如果不做特殊处理,基本等于白训。我曾经试过,一个只有 30 张图片的「消防栓」类别,训练完 mAP 只有 0.02,跟随机猜差不多。

2.4 为什么类别不平衡会让模型「学歪」?

你可能会问:模型不是应该自己学会平衡吗?

答案是:不会。模型天生就是「势利眼」

原因有三:

  1. 损失函数被多数类主导:比如交叉熵损失,每个样本的 loss 是平均的。头部类别有 10000 个样本,尾部只有 10 个,那总 loss 里 99.9% 都来自头部。模型优化时,自然优先照顾头部。
  2. 梯度更新偏向多数类:每次反向传播,多数类的梯度贡献远大于少数类。模型参数调整的方向,基本由头部类别决定。
  3. 尾部类别特征学习不足:尾部类别样本太少,模型无法学到鲁棒的特征。稍微有点噪声或遮挡,就认不出来了。

避坑指南:我曾经犯过一个错误——直接用原始不平衡数据训练,然后看整体 mAP 觉得还行(0.85)。但一分析每个类别的 AP,发现尾部类别几乎全挂。所以记住:只看整体指标是骗自己的,一定要看每个类别的细粒度指标。

2.5 不平衡程度的量化指标

怎么判断你的数据集是不是「严重不平衡」?我一般用这几个指标:

  • 不平衡比(Imbalance Ratio):最多样本类别数 / 最少样本类别数。比如汽车 10000 张,自行车 100 张,比值就是 100。一般认为 > 10 就算不平衡,> 100 就算严重。
  • 尾部类别占比:样本数少于某个阈值(比如 100)的类别数 / 总类别数。如果超过 30%,就要警惕了。
  • 有效样本数(Effective Number):这个我后面会详细讲,它考虑了样本之间的重叠信息,比单纯计数更科学。

嗯,这里要提醒一句:不平衡本身不是问题,问题是模型学不到尾部类别的有效特征。所以后面几章,我会带你一步步解决这个问题。

2.6 小结

这一章我们搞清楚了:

  • 类别不平衡就是样本数量分布不均
  • 长尾分布是现实世界的常态,头部类别多、尾部类别少
  • 模型会偏向头部类别,忽略尾部类别
  • 需要用量化指标来判断不平衡程度

下一章,我会讲「为什么常规训练方法在长尾数据上失效」,以及我踩过的那些坑。到时候见。