前言

​ 暑假的比赛数据集分类极度不平衡,最多的有两万,最少的只有50多,因为是NLP,我个人是通过调百度接口回译来拓展数据集,耗时耗力还可能没效果。勉强将最少类别拓展到了5000,再重采样train的效果还行,最后还用伪标签训练了一波(这个稳定提升0.1%因为是测试集上过拟合)有大佬带飞最后也就第5名 差一名就有3000rmb了

但是数据不均衡这类问题总是很关键and常见(这类也被称为Long Tail Classification)故在此学习记录,日后实现过的会继续贴详细代码,当然遇到trick也会在此记录。

现在主要都是从知乎回答里总结出来的。

数据处理方法

数据增强类

重采样

重采样是最简单和常见的方法了,但是越简单缺点越明显。

单纯的重采样:

  • 少样本过采样,多样本欠采样。pandas.sample可以很方便实现
  • 缺点是导致样本过多特征丢失,样本过少会过拟合,且数量差别越大缺点越明显。

但是仍有许多在此基础上改进的算法比如SMOTE见下文

SMOTE

参考知乎

基本算法流程:

  • 通过KNN寻找当前需要拓展点最近的K个点,随机0,1权重
  • 新的点为K个点*权重平均

看似简单弊端很多,但是通过时间的‘洗礼’现在也渐渐变的成熟了,比如不再通过原始数据KNN,而是通过特征数据KNN。最后附上sklearn已经封装好的SMOTE的Github

生成数据

​ 在NLP中可以通过提取近义词、关键字、回译来生成新的数据,来增加少数据这就是我2021.8.1比赛用的方法

高端点可以使用Gan或者其他半监督自监督模型Long-Tailed Classification by Keeping the Good and Removing the Bad Momentum Causal Effect诸如此类。

论文还是看少了啊

Mosaic

​ 这个在ultralytics-YOLOv3被提出(有撞车现象),在CV方向中小目标的AP一般比中目标和大目标低很多。虽然数据集中也包含大量的小目标类别,但比较麻烦的是小目标的分布并不均匀 也可以看作BBox类别不均衡

​ Mosaic要随机使用x张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。由于拼接图像的挑选组合是随机的,拼接图像的多样性防止了过拟合的发生。可以提升1%

​ 然后对loss设置一个阈值,如果小于这个阈值则采用拼接后的数据训练一个iterater否则采用原来数据训练一个iterater具体可参考Stitcher,代码分析可以看另一篇

Mix up

同样是CV方向,先读取一张图片,图像两侧填充,缩放到640*640大小,即Image_1,假设人脸检测框为红色框。再随机选取一张图片,图像上下填充,也缩放到640*640大小,即Image_2,假设人脸检测框为蓝色框。然后设置一个融合系数,比如上图中,设置为0.5,将Image_1和Image_2,加权融合,得到最终Image。最终的Image人脸的红色框和蓝色框是叠加存在的。

​ 在训练的最后15个epoch,这Mix up,mosaic会被关闭掉不追求sota不关应该也没大问题吧。而在此之前,Mosaic和Mixup数据增强,都是打开的,这个细节需要注意。由于采取了更强的数据增强方式,作者在研究中发现,ImageNet预训练将毫无意义,因此,所有的模型,均是从头开始训练的。参考知乎yolox讲解

困难样本挖掘

OHEM(online hard negative/example mining)听说是度量学习常用的方法。我也没学过

但是hard negative/example mining 你肯定听说过(RCNN里使用的)。

具体思想是先正负样本均衡训练一遍,再预测负样本,将hard negative分离出来加入负样本训练集中再重新训练。大众比喻是错题集针对训练

模型类

focal loss

​ 对于每一类出现的概率可能会不相同,直接修改loss函数,对loss进行加权,详情可见论文Focal Loss for Dense Object Detection

简单可以表示为

$\gamma$​,$\alpha$​为超参数,一般为1

模型融合

对,模型融合也能降bias

模型融合最基本的就是投票法了,容易实现的效果都可见一般。

另一个就是使用最广泛的加权投票:先权重加权再相加,选取概率最大的,个人实验平均加权就投票多了0.3%。

当然这里面也有各种trick,比如有最简单的按照类别数目的倒数来做加权按照“有效”样本数加权根据样本数优化分类间距的loss加权(个人感觉不太行)等等。对于这类方法,还可以用bayesian对每个样本做uncertainty估计,来refine决策边界,再或者后面接一个线性回归层自己训练。这类方法目前应该是使用的最广泛的,可以看一下这个2015年的survey paper但是哪一类最有效我也还没全试过

解耦

解耦特征和分类器(decoupling representation & classifier):最近的研究发现将特征学习和分类器学习解耦,把不平衡学习分为两个阶段,在特征学习阶段正常采样,在分类器学习阶段平衡采样,可以带来更好的长尾学习结果

To be Continued

读论文去了