NLP中长尾、数据不均衡问题可落地解决方案

在真实的工业场景中,通常都会遇到长尾问题(部分类别数据很多,部分类别数据量极少,如下图所示)。例如比较典型的风控场景,负样本通常都是极少的,甚至有些负样本需要人工造。对于这样的场景,模型对于样本较少的类别拟合能力是不足的,甚至无法满足上线的要求。

目前比较通用的解决方案即采样和加权,但是如何采样,是欠采样还是过采样,如何加权权重怎么设置,这些都包含了较多的方法。本文将会先从这两个方案出发,再扩展到一些其它比较通用、有效的nlp长尾问题解决方案

采样

采样的方法主要是两种,过采样和欠采样。欠采样是指从过多的类别中采样出一部分数据,和类别较少的数据基本保持数量一致,欠采样的缺点很明显,丢失了训练数据,很容易让被采样的类别学习的不够充分出现欠拟合的情况。过采样是指从较少的类别中采样出更多的同类别数据,例如比较出名的SMOTE算法,但是该算法也容易引起一些噪音,并且在nlp领域并不适合,而nlp领域过采样的方法实际上还是数据增强。

数据增强的方式有很多,这里简单提一下,之后也会专门写一篇博客给大家带来nlp中数据增强的详细介绍。这里我简单把数据增强分为两个部分:

  • 原数据增强
  • embedding增强

原数据增强指的是对文本数据本身进行增强,生成更多可读的文本,比较常见的方法如下:

  • EDA 增删换
  • 基于MLM的词替换
  • SeqMix
  • 同义句生成模型
  • 回译

原数据增强的方法优点在于生成了实实在在的可读文本,但是这些文本和label可能存在不匹配的情况甚至完全读不通,因此在引入生成文本的时候,可以采用curriculum learning的方法,第一个epoch使用原数据训练,接下来的epoch每一轮添加20%(递增的)或者更多的增强数据,如下图。
在这里插入图片描述

embedding增强指的是对embedding层做一些处理,例如添加扰动,常见的方法如下:

  • 对抗训练
  • ConSERT
  • MixUp

请添加图片描述

对抗训练就不多说了,相信大家都比较清楚了,简单提一下ConSERT,即对embedding做一些类似增删改的操作。embedding增强的优势在于代码通用便于封装,能有效提升模型的泛化能力。

加权

说到加权,那就要提到loss function了,比较通用的方案就是对类别比较少的数据的loss给一个稍大的权重,权重一般由数据比例决定。这种加权的方法,目前比较有名的当属focal loss了,但是这个loss真的适合使用在文本分类的长尾问题中吗?我们来详细分析下。

首先focal loss主要是应用在目标检测的场景,该场景负样本的box明显会比正样本多很多,并且这个是一个二分类的问题(当然也可以扩展到多分类,后续会说),我们先看看损失函数长什么样
F L ( p ) = − α t ( 1 − p t ) γ log ⁡ ( p t ) , p t = { p ,  when  y = 1 1 − p ,  when  y = 0 \mathbf{F L}(p)=-\alpha_t \left(1-p_{t}\right)^{\gamma} \log \left(p_{t}\right), p_{t}=\left\{\begin{aligned} p, & \text { when } y=1 \\ 1-p, & \text { when } y=0 \end{aligned}\right. FL(p)=αt(1pt)γlog(pt),pt={p,1p, when y=1 when y=0
其中 p p p表示的是模型输出的概率值, α \alpha α γ \gamma γ是两个超参数,其中 α \alpha α就是所谓的loss的权重,但是问题来了,这里的权重实际上会受到 γ \gamma γ的干扰。

那这里的 γ \gamma γ是啥意思呢,我们分析下,如果是一个比较好分的正样本,那么得到的概率值就会比较大, p t p_t pt就大, ( 1 − p t ) (1-p_t) (1pt)就小再加上 γ \gamma γ整个loss值就会偏小,如果是难分的正样本, ( 1 − p t ) γ (1-p_t)^{\gamma} (1pt)γ就大对应的loss就大,负样本同理不再赘述。所以说 γ \gamma γ实际上是让模型更加关注那些难分的样本,对于好分的样本权重小,变相就降低了关注度。如下图所示,红色框表示的就是易分的样本,绿色框表示的是难分的样本。

请添加图片描述

我们回到权重 α \alpha α,因为引入了 γ \gamma γ项导致权重并不是完全由 α \alpha α控制,所以我们需要花大量的时间和资源来调参。其次在文本分类中很多时候都是多分类,那对于多分类的情况该怎么使用focal loss呢,其实思路也很简单,把 p t p_t pt的值修改为cross entropy的结果,最重要的是要给每一个类别配置一个 α \alpha α γ \gamma γ,这就导致需要调的参数更多了,下图是在目标检测场景作者的调参数据,其实还是挺耗时耗力的。

请添加图片描述

很多小伙伴在使用focal loss的时候都没有注意到多分类的情况要使用多个超参,并且都用了paper中默认的超参,导致结果不但效果没有升还降低了。

最后再提一点,我们真的需要 γ \gamma γ参数吗?如果说那些难分的样本是离群点,我们对这些数据过多的关注反而会起反作用,所以在工业场景中,这种较难的badcase不如另辟蹊径,例如多造一些类似的样本效果会来的更快一些。

最后让我们回到权重上,如果想简单给loss一个权重,把上述的 γ \gamma γ参数去除,保留 α \alpha α就足矣,记得每个类别要有一个 α \alpha α
C E ( p t ) = − α t log ⁡ ( p t ) \mathrm{CE}\left(p_{\mathrm{t}}\right)=-\alpha_{\mathrm{t}} \log \left(p_{\mathrm{t}}\right) CE(pt)=αtlog(pt)

训练策略

除了上述的两种常规方法,再给大家介绍一些实用的可在工业场景中落地的tricks。

分阶段训练

对特征提取层和分类器解耦,先学习表示层,再学习分类层。因为不均衡的数据并不会影响表示层的效果,因此分阶段训练,优先保证表示层的效果,然后在第二个阶段来训练分类层。

这个方法实际上就是目前主流的预训练模型的方案很类似,拿bert举例,bert的预训练阶段就可以看成是在学习表示层,微调阶段是针对实际的任务学习分类层,只不过我们通常会对表示层的参数也进行更新。这也是为什么预训练模型对于长尾问题通常也会得到一个还不错的结果。

表示层的学习没有啥特殊的,你可以把全量数据针对分类结果进行训练,或者每个epoch采样数据来训练表示层。这里主要说一下分类层的训练,分类层训练有四种方案。

  • Classifier Re-training(cRT), 固定表示层的参数,只更新分类层。

  • Nearest Class Mean classifier(NCM),先计算下表示层每个类别下样本的均值,然后在预测阶段,直接计算新样本和哪个类别样本距离近就分到哪个类别,建议使用余弦相似度来计算距离,归一化能缓解权重不均衡。

  • τ \tau τ-normalized classifier,思路很简单就是给分类层的参数做归一化,让不同类别的参数不会因为数据不均衡导致权重差距较大,归一化方法如下图,其中 τ ∈ ( 0 , 1 ) \tau \in(0,1) τ(0,1) 取0的话就是不归一化
    w ~ i = w i ∥ w i ∥ τ \tilde{w}_{i}=\frac{w_{i}}{\left\|w_{i}\right\|^{\tau}} w~i=wiτwi

  • Learnable weight scaling (LWS),最后一种方法和上一种方法类似
    w i ~ = f i ∗ w i \widetilde{w_{i}}=f_{i} * w_{i} wi =fiwi
    只不过归一化的方法变成了一个可训练的参数 f i f_i fi如果把 f i f_i fi看成是
    f i = 1 ∥ w i ∥ τ f_{i}=\frac{1}{\left\|w_{i}\right\|^{\tau}} fi=wiτ1
    就和第三种方案一样了。

最后看下效果对比

请添加图片描述

Label Embedding

在普通的训练过程中,只会在最后loss的计算阶段会用到label信息,是否可以在其它阶段就应用起来呢?这就是label embedding。一般我们在使用lstm时,通常会采用最后一个时刻的值来做为句子embedding然后给到分类层,对于bert类模型一般使用的cls的值。

请添加图片描述

但实际上,不同类别的样本每个token对于目标的权重可能是不同的,那如果对每个token的值做一个加权求和来表示句子embedding是否是更合理呢?如下图

请添加图片描述

我们事先对label做一个转文本的处理,然后把文本转换成对应的embedding,如果你的类别很难表示成文本信息,那么你可以直接把类别乘一个embedding matrix得到embedding,然后把label embedding与每一个token的embedding做类attention处理得到权重,再对token embedding进行加权求和得到最终的句子embedding。

预测阶段和普通的方法略有不同,需要把所有label的embedding都计算一遍,最后判断哪个结果最大就属于哪一个类别。label embedding提前引入了一些label信息来加快模型的收敛,从而缓解长尾问题带来的负面影响。

Prompt

这一块算是今年nlp中最热门的了,每周都有相关的新paper,prompt最大的优势在于能处理小样本问题、数据不均衡问题,但是在工业场景直接上肯定是不现实的,毕竟prompt要在大模型上才有可能效果超过fine tune,包括最近的p-tuning v2也只对large版本的模型做了实验,估计base版本的效果依旧拉跨。但是,prompt也有其作用,我们可以用小样本来得到一个效果还不错的模型,再用这个模型在海量的无标签数据上生成伪标签,没错就是IPET的思想,从而变相的增加样本数较少的类别的数量。

这里简单介绍下prompt,思路很简单,把分类问题转换成mlm的完形填空,例如下图中在做新闻分类,在需要分类的语句前面拼接一条语句“XX新闻”,然后让模型预测出XX,在使用的时候只需要判断下对XX得到的文本哪个对应的标签概率值更大即可。
请添加图片描述

Contrastive Learning

对比学习的核心思想是拉近同类样本的距离,不同类别的数据尽可能的拉远,如下图
请添加图片描述

在nlp中实现对比学习很简单,把同类别的数据作为正例,不同类别的数据作为负例即可,如果同类样本少还可才采用SimCSE的思想,dropout两次来创建更多的正例。nlp的对比学习一般采用InfoNCELoss,这里就不再扩展开讲了,感兴趣的小伙伴自行百度吧。

总结

本文介绍了一些在工业场景中能解决或缓解长尾问题的方案,从数据、权重到各种trick。经过笔者的实际验证,以上的方基本都会有少许的效果提升。如果你真的没有过多的时间来尝试这些方法,建议从数据的角度出发,人工标注或者造更多的数据出来,这个可能是成本最低的方案。

References

Joint Embedding of Words and Labels for Text Classification

Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference

Data Augmentation Approaches in Natural Language Processing: A Survey

Focal Loss for Dense Object Detection

ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer

SUPERVISED CONTRASTIVE LEARNING FOR PRE-TRAINED LANGUAGE MODEL FINE-TUNING

DECOUPLING REPRESENTATION AND CLASSIFIER FOR LONG-TAILED RECOGNITION

Few-Shot Text Classification with Triplet Networks, Data Augmentation, and Curriculum Learning

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NLP问题分类数据集是用于训练和评估自然语言处理NLP)模型的数据集,用于将输入的文本分类为预定义的类别或标签。在构建NLP问题分类数据集时,需要收集大量的文本数据,并为每个文本样本提供一个或多个标签,以指示该样本属于哪个类别。这些标签可以是预先定义好的,也可以通过人工标注进行创建。 构建NLP问题分类数据集的过程通常包括以下步骤: 1. 数据收集:从各种来源收集大量的文本数据,例如网络上的新闻文章、社交媒体上的帖子和评论、电子书等。 2. 数据预处理:对文本数据进行清洗和预处理,例如去除特殊符号、停用词和标点符号,将文本转换为小写,将文本分割成单词等。 3. 标签分配:为每个文本样本分配一个或多个标签,以指示其所属的类别。标签可以是分类问题的预定义类别,也可以是从数据人工标注得到的。 4. 训练和评估:将数据集划分为训练集和测试集,使用训练集来训练NLP模型,并使用测试集评估模型的性能。 5. 数据增强:在数据集上应用各种数据增强技术,例如同义词替换、近义词插入和重排等,以增加数据的多样性和模型的鲁棒性。 一个好的NLP问题分类数据集应具有以下特点: 1. 多样性:包含来自不同领域、不同风格和不同主题的文本样本,以确保模型在各种情况下都能良好地分类。 2. 均衡性:各个类别的样本数量大致相等,以避免模型对某些类别过度偏向。 3. 真实性:数据的样本应有真实性,反映真实世界的文本分类问题。 4. 标签一致性:标签的定义清晰明确,不会存在歧义,以便模型正确理解和分类文本。 通过构建和使用NLP问题分类数据集,可以帮助我们开发出更准确和鲁棒的NLP模型,使其能够自动识别和分类文本的不同问题和主题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值