什么是Long tail(长尾)问题?
在BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition这篇论文中提到了这个词汇的解释:
解释:少数类(头类)占用大部分数据,而大多数(尾类)只有少量的数据。(自动驾驶中的Corner cases就是属于长尾数据问题的一种)
长尾问题的影响?
举个例子,在一个欺诈识别的案例中,好坏样本的占比是1000:1,而如果我们直接拿这个比例去学习模型的话,因为扔进去模型学习的样本大部分都是好的,就很容易学出一个把所有样本都预测为好的模型,而且这样预测的概率准确率还是非常高的。
而模型最终学习的并不是如何分辨好坏,而是学习到了”好 远比 坏的多“这样的先验信息,凭着这个信息把所有样本都判定为“好”就可以了。这样就背离了模型学习去分辨好坏的初衷了。
所以,样本不均衡带来的根本影响是:模型会学习到训练集中样本比例的这种先验性信息,以致于实际预测时就会对多数类别有侧重(可能导致多数类精度更好,而少数类比较差)。
如何解决长尾问题?
1. 样本层面
1.1 采样
·欠采样:减少多数类的数量(随机欠采样,NearMiss,ENN),但是当head class和tail class类别样本量悬殊巨大时,用欠采样是不切实际的。
·过采样:尽可能多地增加少数类的样本数量(随机过采样或数据增强),可能导致过拟合。
·还可以结合两者做混合采样(Smote+ENN)
1.2 数据增强
·基于样本变换的数据增强:单样本增强:几何变换、颜色变换、随机裁剪、随机擦除、添加噪声等;多样本增强:组合及转换多个样本,mixup、mosaic等。
·基于深度学习的数据增强:利用生成模型(如VAE、GAN)来生成样本,更复杂但生成的样本也更多样。
2. 损失函数层面
2.1 重加权
主要在训练loss中,给不同的类别的loss设置不同的权重,对tail类别loss设置更大的权重,权重可以设置为样本数量的倒数,或者样本数量平方根的倒数(更平滑一些),这是在class level上调整权重。也可以在sample level上调整权重,困难样本的权重大,简单样本的权重小。
2.2 OHEM
OHEM(Online Hard Example Mining),即在线难样本挖掘,选择一些hard examples作为训练的样本,针对性地改善模型效果。
2.3 Focal loss
对标准的交叉熵损失引入系数因子,实现根据预测准确度自适应调整样本对损失的贡献程度。
3. 模型层面
3.1 采样+集成学习
重复组合少数类样本与抽样的同样数量的多数类样本,训练若干的分类器进行集成学习。
3.2 异常检测
类别不平衡很极端的情况下(比如少数类只有几十个样本),将分类问题考虑成异常检测(anomaly detection)问题可能会更好。异常检测是通过数据挖掘方法发现与数据集分布不一致的异常数据,也被称为离群点、异常值检测等等。
参考链接: