开启成长之旅!这是我参加「日新方案 12 月更文应战」的第6天,点击检查活动详情。

  • 前语
  • 一,数据层面处理办法
    • 1.1,数据扩展
    • 1.2,数据(重)采样
      • 数据采样办法总结
    • 1.3,类别平衡采样
  • 二,算法(丢失函数)层面处理办法
    • 2.1,Focal Loss
    • 2.2,丢失函数加权
  • 参阅资料

前语

在机器学习的经典假设中往往假设练习样本各类别数目是均衡的,但在实践场景中,练习样本数据往往都是不均衡(不平衡)的。比方在图画二分类问题中,一个极点的比方是,练习集中有 95 个正样本,但是负样本只要 5 个。这种类别数据不均衡的情况下,假如不做不平衡样本的处理,会导致模型在数目较少的类别上呈现“欠学习”现象,即或许在测试集上完全丧失对负样本的预测才能。

除了常见的分类、回归使命,类似图画语义分割、深度估量等像素级别使命中也是存在不平衡样本问题的。

处理不平衡样本问题的处理办法一般有两种:

  1. 从“数据层面”下手:分为数据采样法和类别平衡采样法。
  2. 从“算法层面”下手:价值敏感办法。

留意本文只介绍不平衡样本的处理思维和战略,不触及详细代码,在实践项目中,需要针对详细人物,结合不平衡样本的处理战略来规划详细的数据集处理或丢失函数代码,然后处理对应问题。

一,数据层面处理办法

数据层面的处理办法总的来说分为数据扩展和采样法,数据扩展会直接改动数据样本的数量和丰厚度,采样法的实质是使得输入到模型的练习集样本趋向于平衡,即各类样本的数目趋向于共同。

数据层面的采样处理办法首要有两种战略:

  1. 数据重采样办法,发生在数据预处理阶段,会改动全体练习集的数目和散布。
  2. 类别平衡采样办法,发生在数据加载阶段(这儿的加载是指加载到模型中,不是指从硬盘中读取文件),经过设置采样战略来使得不同类别样本送入模型练习总的次数是近似的。

1.1,数据扩展

所谓数据不平衡,其实便是某些类其他数据量太少,那就直接添加一些呗,简略直接。假如有的选,那肯定是优先挑选从头采纳数据的办法了,当然大部分时分咱们都没得选,这个时分最有用的办法自然是经过数据增强来扩展数据了。

数据增强的手法有多种,常见的如下:

  • 水平 / 竖直翻转
  • 90,180,270 旋转
  • 翻转 + 旋转(旋转和翻转其实是确保了数据特征的旋转不变性能被模型学习到,卷积层面的办法能够参阅论文 ACNet)
  • 亮度,饱和度,对比度的随机改变
  • 随机裁剪(Random Crop)
  • 随机缩放(Random Resize)
  • 加含糊(Blurring)
  • 加高斯噪声(Gaussian Noise)

值得留意的是数据增强手法的使用必须结合详细使命而来,除了前三种以外,其他的要慎重考虑。由于不同的使命场景下数据特征依赖不同,比方高斯噪声,在天池铝材缺点检测竞赛中,假如高斯噪声添加不妥,有些图片原本在采集的时分相机就对焦禁绝,导致工件难以看清,倘若再添加高斯含糊属性,部分图片样本基本就废了。

参阅文章 怎么针对数据不平衡做处理。

尽管目前深度学习框架中都自带了一些数据增强函数,但更多更强的数据增强手法能够使用一些图画增强库,比方 imgaug 这个 python 库。

模型练习过程中,pytorch 框架怎么在数据构建 pipeline 阶段使用 imgaug 库能够参阅文章 数据增强-imgaug。

1.2,数据(重)采样

简略的数据重采样办法分为数据上采样over-samplingup-sampling,也叫数据过采样) 或 也叫数据欠采样数据下采样(under-samplingdown-sampling )。

1,对于样本数目较少的类别,可用数据过采样办法over-sampling),即经过仿制办法使得该类图画数目增至与样本最多类的样本数共同。

2,而对于样本数较多的类别,可使用数据欠采样Under-sampling,也叫数据欠采样)办法。对于深度学习和核算机视觉范畴的使命来说,下采样并不是直接随机丢掉一部分图画,正确的下采样战略是: 在批处理练习时(数据加载阶段 dataloader),对于样本较多的类别,严格控制每批(batch)随机抽取的图画数目,使得每批读取的数据中正负样本是均衡的(类别均衡)。以二分类使命为例,假设原始数据散布情况下每批处理练习正负样本平均数量份额为 9:1,如仅使用下采样战略,则可在每批随机挑选练习样本时每 9 个正样本只取 1 个作为该批练习集的正样本,负样本挑选战略不变,这样可使得每批读取的练习数据中正负样本时平衡的。

数据过采样和欠采样示意图如下所示。

深度学习炼丹-不平衡样本的处理

数据采样办法总结

数据过采样和欠采样实质的简略了解便是“添加图片”和“删图片”:

  • 过采样:重复正份额数据,实践上没有为模型引进更多方法数据,过火着重正份额数据,会扩展正份额噪音对模型的影响。
  • 欠采样:丢掉大类其他部分数据,和过采样一样会存在过拟合的问题。

同时两种数据重采样办法都是会改动数据原始散布的,比方数据过采样添加较小类其他样本数,数据欠采样削减较大类其他样本数,有或许发生模型过拟合等问题

这儿的较小类其他意思是样本数目较少的类别,较大类别即样本数目较多的类别。

以上内容都是对处理类别不平衡问题中数据采样办法的战略描绘,但想要在实践使命中处理问题,还要求咱们加深对使命(task)的剖析、对数据的了解剖析,以及要求咱们有更多的数据处理、数据采样的代码经验,即良好的战略 + 娴熟的东西。

需要留意的是,由于只是使用数据上采样战略有或许会引起模型过拟合问题,所以在实践使命中,更为稳妥的数据采样战略哇往往是将上采样和下采样结合起来使用。

1.3,类别平衡采样

前面的数据重采样战略是着重于类别样本数量,而另一类采样战略则是直接着重于类别本身,不改动数据整体样本数,即类别平衡采样办法。其简略战略是把样本按类别分组,每个类别生成一个样本列表,练习过程中随机挑选 1 个或几个类别,然后从每个类别所对应的样本列表中随机挑选样本,这样可确保每个类别参加练习的机会比较均衡。

上述类别平衡办法过于简略,实践使用中有许多限制,比方在类别数许多的多分类使命中(如 ImageNet 数据集)。由此,在类别平衡采样的基础上,国内海康威视研究院提出了一种“类别重组采样”的平衡办法

类别重组法是在《解析卷积神经网络》这本书中看到的,可惜没在网上找到原论文和代码,但这个办法感觉仍是很有用的,且也比较好复现。

如下图所示,类别重组办法步骤如下:

深度学习炼丹-不平衡样本的处理

  1. 对原始样本的每个类其他样本别离排序好,核算每个类其他样本数目,并记录样本数最多的那个类其他样本数量 max_num
  2. 基于最大样本数 max_num 发生一个随机数列表,然后用此列表中的随机数对各自类其他样本数求余,得到对应索引值列表 index_listrandom.shuffle(list(range(max_num)))
  3. 根据该索引值列表 index_list,从该类的图画数据中提取图画,生成该类的图画随机列表。
  4. 最终吧一切类其他随机列表连接在一同后一同随机打乱次第,即可得到最终的图画列表,能够发现最终的这个图画随机列表中每个类其他样本数目是共同的(样本数较少的类别,图画会存在多次采样)。然后每轮(epoch)都对此列表进行遍历数据用于模型练习,如此重复。

深度学习炼丹-不平衡样本的处理

类别重组法对有点很明显,在规划好重组代码函数后,只需要原始图画列表即可,一切操作都在内存中在线完成,易于完成且更通用。其实仔细深究能够发现,海康提出的这个类别重组法和前面的数据采样办法是很类似的,其实质都是经过采样(sampler)战略让类别不均衡的各类数据在每轮练习中呈现的次数是共同的

二,算法(丢失函数)层面处理办法

类别不平衡问题的实质是导致样本数目较少的类别呈现“欠学习”这一机器学习现象,直观表现是较小样本的丢失函数权重占比也较少。一个很自然的处理办法是添加小样本错分的惩罚价值,并将此价值直接体现在方针函数(丢失函数)里,这便是“价值敏感”的办法。“价值敏感”办法的实质能够了解为调整模型在小类别上的留意力。

2.1,Focal Loss

Focal Loss 是在二分类问题的穿插熵(CE)丢失函数的基础上引进的,首要是为了处理 one-stage 方针检测中正负样本份额严峻失衡的问题,该丢失函数下降了很多简略负样本在练习中所占的权重,也可了解为一种困难样本发掘,经实践证明 Focal Lossone-stage 方针检测中仍是很有用的,但是在多分类中不一定有用。

Focal Loss 作者经过在穿插熵丢失函数上加上一个调整因子(modulating factor(1−pt)(1-p_t)^\gamma,把高置信度 pp(易分样本)样本的丢失下降一些。Focal Loss 界说如下:

FL(pt)=−(1−pt)log(pt)={−(1−p)log(p),ify=1−plog(1−p),ify=0FL(p_t) = -(1-p_t)^\gamma log(p_t) = \left\{\begin{matrix} -(1-p)^\gamma log(p), & if \quad y=1 \\ -p^\gamma log(1-p), & if\quad y=0 \end{matrix}\right.

Focal Loss 有两个性质:

  • 当样本被过错分类且 ptp_t 值较小时,调制因子接近于 1loss 几乎不受影响;当 ptp_t 接近于 1,调质因子(factor)也接近于 0简略分类样本的丢失被削减了权重,全体而言,相当于添加了分类禁绝确样本在丢失函数中的权重。
  • \gamma 参数平滑地调整简略样本的权重下降率,当 =0\gamma = 0 时,Focal Loss 等同于 CE Loss\gamma 在添加,调制因子的作用也就添加,试验证明 =2\gamma = 2 时,模型作用最好。

直观地说,调制因子削减了简略样本的丢失奉献,并扩展了样本取得低丢失的范围。例如,当=2\gamma = 2 时,与 CECE 相比,分类为 pt=0.9p_t = 0.9 的样本的损耗将下降 100 倍,而当 pt=0.968p_t = 0.968 时,其损耗将下降 1000 倍。这反过来又添加了过错分类样本的重要性(对于 pt≤0.5pt≤0.5=2\gamma = 2,其丢失最多削减 4 倍)。在练习过程关注对象的排序为正难 > 负难 > 正易 > 负易。

1. 正难 3. 正易,\gamma 衰减
2. 负难,\alpha 衰减 4. 负易,、\alpha、\gamma衰减

在实践中,咱们一般选用带 \alphaFocal Loss

FL(pt)=−(1−pt)log(pt)FL(p_t) = -\alpha (1-p_t)^\gamma log(p_t)

作者在试验中选用这种方法,发现它比非 \alpha 平衡方法(non-\alpha-balanced)的精确度稍有提高。试验标明 \gamma 取 2,\alpha 取 0.25 的时分作用最佳。

更多了解参阅 focal loss 论文。

2.2,丢失函数加权

除了 Focal Loss 这种高明的丢失函数战略外,针对图画分类问题,还有一种简略直接的丢失函数加权办法,即在核算丢失函数过程中,对每个类其他丢失做加权处理,详细的 PyTorch 完成方法如下:

weights = torch.FloatTensor([1, 1, 8, 8, 4]) # 类别权重别离是 1:1:8:8:4
# pos_weight_weight(tensor): 1-D tensor,n 个元素,别离代表 n 类的权重,
# 为每个批次元素的丢失指定的手动从头缩放权重,
# 假如你的练习样本很不均衡的话,是非常有用的。默认值为 None。
criterion = nn.BCEWithLogitsLoss(pos_weight=weights).cuda()

参阅资料

  • 《解析卷积神经网络》
  • 怎么针对数据不平衡做处理
  • 10 Techniques to deal with Imbalanced Classes in Machine Learning