遇到的问题
这次关系抽取任务,在数据方面,遇到了两个问题。
- 样本类别不平衡
- 样本句子长度差距过大
关系最多实体对有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 loss、Focal 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