NLP中的样本不平衡、长句问题

遇到的问题

这次关系抽取任务,在数据方面,遇到了两个问题。

  • 样本类别不平衡
  • 样本句子长度差距过大

关系最多实体对有4W多个,最少的只有十几条。
句子长度从短句(个位数长度)到300不等。

从验证集分析后,模型对于训练样本中关系数目少以及长句均不是有很好地表现。

从数据的角度进行提升自然想到了数据增强。

1.数据层面的思路

1.1数据增强

在机器学习中,对于结构化数据的样本不平衡问题,常见的做法有过采样以及欠采样。
数据不平衡的处理(文本)

但对于文本数据,embedding之后的向量的插值是否意义?或者对于一个句子,我用个编码器将其变为sentence vertor,然后进行采样?这样做法十分少见。

经过调研,对于文本数据,数据增强两个思路。

  • 增、删、换、替【随机增加、删除词、词序交换、同义词替换】
  • 生成【回译、生成模型】

对于第一个,参考这个论文对应的工具包EDA_NLP

对于生成,回译通常是调用现有翻译工具的API来进行,生成模型也有相关论文,个人想到就是生成对抗网络,编码解码的方式来重构文本。

但是,如果要保留文本中特定的信息,比如实体、关系,用生成模型就会很不稳定;回译没有测试过,但应该也会有噪声。

因此,最终对于不平衡的样本就采用了EDA的方式,在原来工具包基础上进行了修改,主要是固定实体的位置,保证其不被替换,删除。

1.2深度预训练

结合语料的预训练模型

参考:邱锡鹏老师团队的文章:How to Fine-Tune BERT for Text Classification?里面有提到如何用Bert融合语料进行深入预训练。项目仓库

其实就是在bert的基础上,继续用其预训练的办法,mask LM与next sentence prediction。主要看你的语料适合哪一种。

但其实,如果是中文的语料,ERNIE的效果可能会更好。BERT和ERNIE谁更强?

2.模型层面的思路

2.1损失函数的设计

样本不平衡会导致什么问题?答案很显然,如果1:99的样本,全部预测为0,(负样本)也会有99%的正确率。

从损失函数的角度,就是误分类的代价太小了,全部预测为负样本,意味着我只分错一个样本,而其他都分对了,这是因为对于错分与正确分类,我是平等的看待。
做法:

  • 根据样本量加权。这个在深度学习框架中有自带的包,加权交叉熵。
  • 提高误分类的代价。在CV领域一个比较好的做法:Focal Loss.
    可以看这两篇文章:理解focal lossFocal loss的思考剖析focal loss
  • 个人思考:考虑到这个数据的特点,在长句表现不好,长句也是另一种类别不平衡。是否可以对于句子长度进行惩罚,提高长句的误分类代价。

Focal Loss的效果
试着简单写了多标签分类的例子,直观体验下focal loss。

alpha = 0.5
gamma = 2
labels = np.array([1,0,1,0])
logits = np.array([0.7,0.25,0.1,0.8])
log_logits = np.log(logits)
log_logits_neg = np.log(1-logits)
pos = labels * (labels - logits )
neg = (1 - labels) * logits
fl_loss = 0. - alpha * (pos ** gamma) * log_logits - (1 - alpha) * (neg ** gamma) * log_logits_neg
---------------
y_true = tf.cast(tf.convert_to_tensor(labels),dtype = tf.float32)
y_pred = tf.cast(tf.convert_to_tensor(logits),dtype = tf.float32)
tf.nn.sigmoid_cross_entropy_with_logits(y_true,y_pred)

fl loss = [0.01605037, 0.00899006, 0.93254696, 0.51502013]
ce loss = [0.40318602, 0.8259394 , 0.64439666, 1.1711006 ]

结果十分直观,可以看出,对focal loss而言,误分类与正确分类的损失不是一个数量级,相差较多。而交叉熵的Loss则没有那么明显。

这边有两个超参数 γ 与 α \gamma与\alpha γα

  • γ \gamma γ的作用就是加大力度,无论是正类负类, γ \gamma γ越大,分正确与分错误的差距就会越大。
  • α \alpha α的作用在于针对不平衡的问题,如果 α \alpha α=0.25,那么对于负类错分的损失就会比正类错分的损失更大。这就一定程度减小了,全部预测为负类的情况。
    这其实是创作者引入了α-balanced loss后,最终形成focal loss。

有用的链接

在文本分类任务中,有哪些论文中很少提及却对性能有重要影响的tricks?
炼丹笔记三:数据增强
CV层面解读focal loss

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值