文本分类中的样本不均衡问题
数据层面解决方法
从数据层面解决样本不均衡的问题核心是通过人为控制正负样本的比例, 分成欠采样和过采样两种.
负样本欠采样
正负样本比例过大, 如达到了1: 100
时, 可以通过从负样本中欠采样, 强行将正负样本的比例控制在相对的低比例, 如1: 10
. 这种舍弃部分样本的方式, 是肯定会损失样本信息的, 因此欠采样的重点是如何采样, 使得被丢弃的负样本信息损失最少.
而由于欠采样肯定是会带来信息损失的, 在需要控制样本量级的场景下比较合适.
迭代采样
使用全部正样本, 以及候选集随机采样小部分负样本, 训练第一轮分类器
用第一轮训练得到的分类器, 对剩余所有负样本进行预测, 将会有一部分负样本被分类成正样本
从被误分类成正阳本的负样本中采样若干负样本, 与第一轮训练使用的所有样本组成新的训练集, 训练得到第二轮分类器
重复这个过程直到:
第N轮迭代得到的分类器, 可以将剩余全部负样本正确分类
或得到需要数量的负样本
这种方法考虑的是最大限度的利用负样本中差异性较大的负样本, 从而在控制正负样本比例的基础上采样出了最有代表意义的负样本.
正样本过采样 / 数据增强
过采样不会损失样本. 直接对正样本有放回的重复采样, 相当于是对一些正样本复制得到. 这种方法容易照成过拟合, 原因是在某一点上存在多个同样的样本会导致输入空间中不平滑的分布, 从而学习出一个不平滑的决策边界. 在训练数值型模型时, 可以使用SMOTE方法及其改进版过采样, 但这些方法在NLP任务中, 对文本的输入就用不了了.
损失层面解决方法
每个样本都会对一个batch内的梯度产生贡献, 从损失函数层面解决不平衡的角度为放大正样本对梯度的贡献, 缩小负样本对梯度的贡献.
以二分类为例, 交叉熵损失为:
类别加权Loss
类别加权Loss相比于原始的交叉熵, 添加了参数, 直白地控制正负样本对整体损失的贡献, 超参数一般取样本数量的反比. 例如有100个正样本, 10000个负样本, 则取正样本损失前的超参数为, 负样本前的即为. 一定程度上解决了样本不均衡的问题.
Focal Loss
更难分类的样本(表现为预测值与真实值差别很大)我们更关注, 应当进一步放大其产生的loss
而接近正确的分类虽然也会造成损失, 但这部分损失我们并不关心, 应当进一步缩小
不能完全抛弃, 否则在训练过程中样本刚越过阈值, 被分类正确后, 就不会产生误差了, 影响进一步的提升, 得不到训练, 甚至在之后的训练步中被错误分类
从公式中可以看出, 在Focal Loss的作用下, 易分样本对模型的提升效果非常小, 模型主要关注难以分类的样本. 对于分类难度中间的样本, 对模型的提升仍然具有效果, 这点比超过一定阈值就不再贡献梯度的损失函数要更好.
GHM Loss
可以看到Focal Loss的重点是关注难以分类的样本, 这些样本对模型的优化贡献最大. 但GHM(Gradient Harmonizing Mechanism) Loss认为让模型过多关注那些特别难分的样本是存在问题的. 样本中的离群点(Outliers)在模型已经收敛后仍然会被判别错误, 属于超难分类的样本. 让模型取关注这些样本, 会使得模型过度地去拟合噪音, 损伤了泛化性, 造成了过拟合现象.
而且难分样本会带来更大的梯度, 衡量梯度模长与样本数量的关系, 如下图, 可以看到除了大量易分样本, 分类困难的样本数量也非常多, 这些样本可能是标注错误的噪音离群点, 过多的关注这些十分困难的分类样本, 不仅不会提升模型的分类效果, 反而会对模型质量带来一定的损伤.
因此GHM Loss在控制每个样本对梯度贡献的权重时, 选择使用样本梯度模长所在的一定范围内, 如果在这个范围内样本数量较多, 对其梯度加以抑制.
半监督学习
参考资料
最后更新于
这有帮助吗?