美文网首页
利用Dice Loss来解决NLP任务中样本不平衡性问题

利用Dice Loss来解决NLP任务中样本不平衡性问题

作者: 烛之文 | 来源:发表于2021-05-20 12:27 被阅读0次

1 前言

今天分享一种利用Dice Loss来解决NLP任务中样本不平衡性问题的方法,该思路来自2020年ACL会议一篇paperDice Loss for Data-imbalanced NLP Tasks。在NLP任务,我们最常见用的目标函数就是交叉熵。在很多数据场景下,存在样本不平性的问题,使用交叉熵会有些缺陷,因为它在计算过程中将每类别的权重视为一样,这样模型在训练中就会偏向样本多的那个类别。针对该问题,也有在交叉熵上加一个权重系数,但这种方法多数是出于人为定义或者根据训练样本数量统计而来的,并不能目标函数在训练中自动去调节偏向权重。

为解决上述问题,有人提出Focal Loss的方法,该方法最先出于图像中目标检测的场景中,也可应用NLP领域,它在imbalanced data问题取得很不错的效果。有兴趣的读者可以阅读Focal Loss 原理及实践

在paper《Dice Loss for Data-imbalanced NLP Tasks》中,作者提出使用Dice Loss去解决NLP中imbalanced data问题。Dice Loss并不是作者首创的,而是很早从 Sørensen–Dice coefficient(Sorensen, 1948) or Tversky index (Tversky,1977) 演变而来的。作者认为,使用Dice Loss代替Cross Entropy,可以降低样本不平衡性的影响。此外,为了进一步降低大量的负样本的训练偏向影响,作者提出Self-adjusting Dice Loss。下面介绍下Dice Loss原理及应用效果。

2 Dice Loss

在介绍Dice Loss时,用二分类任务来展示它的原理及各种变体,也可以很容易推广其他类型的任务。

对于一训练集合D=\{X, Y\}, x_i为其中一个样本,对应的真实值为y_i=[y_{i0}, y_{i1}]p_i=[p_{i0}, p_{i1}]为两个类别的预测概率,其中y_{i0}, y_{i1} \in{0,1}, p_{i0},p_{i1} \in [0,1],前者为取值为0或1,后者取值范围为[0,1]。

2.1 交叉熵
在上述定义的二分类任务上,其交叉熵定义为:
CE=- \frac{1}{N}\sum_{i=1}^{N}\sum_{j \in \{0,1\}} y_{ij}logp_{ij}
从公式上可以看出,每个x_i样本对目标函数权重是一样的,这对于imbalanced data来说是不合适的,这就引出带权重的交叉熵损失函数。
Weighted \quad CE=- \frac{1}{N}\sum_{i=1}^{N}\lambda_i\sum_{j \in \{0,1\}} y_{ij}logp_{ij}
其中\lambda_i为对应的样本权重,但从实际情况来上,上述该目标函数存在\lambda_i取值困难的问题,当涉及的类别特别多时,不适当的取值都会给目标函数带来偏向的影响。

2.2 Dice Coefficient and Tversky Index
dice coefficient (DSC) 最开始是为了判断两个集合的相似度而定义的一个指标。给定两个集合A,B,则它们的dice coefficient可以定义为:
DSC(A,B)=\frac{2|A \cap B|}{|A|+|B|}
若把A看着是模型预测为正样本的集合,B为真实的正样本的集合,那么按照True Positive (TP), False Positive (FP), and False Negative (FN)来看DSC,则:
DSC=\frac{2TP}{2TP+FN+FP}=\frac{\frac{2TP}{TP+FN}\frac{TP}{TP+FP}}{\frac{TP}{TP+FN}\frac{TP}{TP+FP}}=\frac{2Pre*Rec}{Pre+Pec}=F1
可以看出,DSC与F1值的评价效果是一致的。难道我们一直常用的F1指标具备解决样本不平衡性问题,这点刷新了我的认知。带这个问题,继续往下介绍。

针对一个具体样例x_i来说,其DSC可以表示为:
DSC(x_i)=\frac{2p_{i1}y_{i1}}{p_{i1}+y_{i1}}
上述公式存在一个缺陷,当y_{i1}=0时,对函数没有影响,则会导致模型对这类样本训练无效。为解决该问题,可在分子与分母同时添加一个调节参数:
DSC(x_i)=\frac{2p_{i1}y_{i1}+\gamma}{p_{i1}+y_{i1}+\gamma}
在这个基础上,Milletari et al. (2016) 提出了一种变体,具体做法将分母项进行平方,目的是为了加快收敛速度。该变体可定义为DL:
DL(x_i)=\frac{2p_{i1}y_{i1}+\gamma}{p_{i1}^2+y_{i1}^2+\gamma}

此外,还衍生出Tversky index (TI),其原理跟DSC一致,但不同的是它更灵活去权衡False-Negatives and False Positives之间的影响。
TI(x_i)=\frac{p_{i1}y_{i1}+\gamma}{p_{i1}y_{i1}+\alpha p_{i1}y_{i0}+\beta p_{i0}y_{i1}+\gamma}

最后作者参考Focal Loss的原理,在DSC基础上添加一个(1-p)的调节影响,变为:
DSC(x_i)=\frac{2(1-p_{i1})p_{i1}y_{i1}+\gamma}{(1-p_{i1})p_{i1}+y_{i1}+\gamma}

以上定义的指标是越大越好,要转成训练的目标函数则需要变成负的,在这基础上,作者又进行+1调节。则上面涉及的目标函数汇总如下,其中FL为Focal Loss:


3 实验效果

作者挑选了NLP领域四种任务:part-of-speech tagging(POS), named entity recognition(NER), machine reading comprehension(MRC) and paraphrase identification(PI),进行试验对比,看看Dice Loss作为损失函数的效果。具体实验结果如下:


从实验结果来看,Dice Loss 两种变体DL与DSC损失函数相对交叉熵,Focal Loss都有明显的提升,其中DSC表现效果最好,最高有2%的提升。实验结果验证了Dice Loss在NLP任务上的优势。

结语

论文中验证了Dice Loss在NLP任务中样本不平衡问题的有效性,根据实验结果来看,具有很强的诱惑力。论文开源了代码:https://github.com/ShannonAI/dice_loss_for_NLP。目前笔者正在测试对比中,实验结果后续可以分享出来。

在回到前面提到的问题:应该这样理解,Dice Loss原理是与F1值是一致的,说明Dice Loss直接由F1导向的,所以训练的结果就偏向相对更为合理的F1评价指标。此外,论文题目是解决NLP任务中样本不平衡问题,其实这个样本不平衡问题存在界定问题,像NER任务中,对与预测的标签来说,就是样本不平衡(大部分是O标签)。此外,如二分类,一类2000个样本,一类1500个样本,这类算不算样本不平衡。所以,我的问题是,Dice Loss仅适合样本不平衡,最好是极度不平衡性问题?还是不论样本是否平衡,都能有效果。若真的适应各种分布下的数据集,那是不是要替换主流的交叉熵。这些问题,还是需要更多的实验来验证。

更多文章可关注:自然语言处理算法与实践

相关文章

网友评论

      本文标题:利用Dice Loss来解决NLP任务中样本不平衡性问题

      本文链接:https://www.haomeiwen.com/subject/aklvjltx.html