2019问题等价性判别比赛记录
2019年下半年参加的一场比赛,复赛排名13。本次比赛提供的是一个法律领域的短文本匹配任务,这题的难点在于A榜中存在较多的对抗样本, 并且B榜中的对抗性样本较A榜中更多。 所以这次比赛中除去系统的准确性外,系统的鲁棒性也是很重要。
训练集构建
本次比赛中数据集以问题组的方式给出, 问题组中的问题分为等价性和不等价问题形式。
<Questions number="0">
<EquivalenceQuestions>
<question>什么是公益诉讼?</question>
<question>公益诉讼的定义?</question>
<question>公益诉讼的概念</question>
<question>公益诉讼的定义是什么?</question>
</EquivalenceQuestions>
<NotEquivalenceQuestions>
<question>环境公益诉讼的原告是什么意思?</question>
<question>什么样的鉴定依据算是民事公益诉讼</question>
<question>检察机关提起公益诉讼是什么意思</question>
<question>什么是行政诉讼?</question>
</NotEquivalenceQuestions>
</Questions>
训练集的构建:这题在构建训练样本可以有多种形式。通过等价问句之间互相组合可以生成正样本,等价问句和不等价问句之间互相组合可以生成负样本,这样可以生成8万多条训练样本。考虑到两个问句的顺序调换,每个epoch可以生成16万多条训练样本。 在比赛结束时发现很多人都是直接按照讨论区baseline给出的分割方式生成了8万条文本数据。
但根据这种方式构建的数据集进行训练时线下dev分数在几个epoch后就达到了95+,线上分数在86-89左右。 分析原因后我们认为这种方式在经过shuffle后,在划分数据集时发生了数据泄露。 因此相同类型的question需要group在一起,我们预先按8:2的比例对数据集进行了划分了train和dev集,然后分别在对其生成正负样本并shuffle。
同时在这个比赛中,针对对抗性样本,我们尝试了多种方式增加模型的鲁棒性。
数据增强
在这个比赛中,A榜的对抗性样本比例不大,B榜中的比例较大。由于测试集中有许多对抗样本,具体来看我们发现现有的数据中存在如下类型的攻击性样本:
特殊符号,文本截断,乱序,随机插入,随机删除,同义词,疑问词添加。
针对这个问题,我们发现构建对抗样本进行数据增强能够显著的提高模型的鲁棒性。 我们的构建方式有如下几种:
- 同义词替换
- 谐音替换
- 回译
- 疑问句表达替换
模型优化
在对数据进行分析后, 我们对模型做了如下的优化。
预训练语言模型
在模型的构建上我们首先尝试了ESIM模型, 但是在这个比赛中ESIM模型的效果远不如基于bert的sentence pair classification方法。 后续的比赛中我们以bert为基线模型,线上效果为89分左右。 考虑到google给出的预训练模型是基于字的,后续我们将bert-base-chinese换为哈工大的bert-wwm-chinese,由于wwm基于词进行mask,并且额外加入了一些中文语料进行训练,这给我们的模型的线上表现提升了近一个点。
对抗模型
Fast Gradient Method
与CV任务相比,而NLP问题中,输入是离散的单词序列,一般以one-hot vector的形式呈现,如果直接在raw text上进行扰动,那么扰动的大小和方向可能都没什么意义。Goodfellow在17年的ICLR[1]中提出了可以在连续的embedding上做扰动。
加入干扰的目的是使模型预测分类为正确类别的概率最低, 其思路是通过对样本x加入扰动\(r_{adv}\), 并共同优化\(loss_{adv}\) 和原先分类器的 \(loss_{cl}\) ,实现对抗训练,这个可以用下图的公式表示
因为r不可微分,这里的扰动可以用如下的替代方案来近似计算:
选择的扰动\(r_{adv}\)目的是最小化loss函数,从而提升鲁棒性。由于这里的g为\(loss_{cl}\)的梯度,对应的是梯度上升,因此取-g方向。g//|g| 是用二范式做了一个scale,进行了归一化处理,从而得到了一个单位向量,乘以epsilon(我们可以通过它来控制扰动的大小),得到模型最害怕的一个扰动,也就是\(r_{adv}\)。
通过该种方式, 我们在验证集上能提升0.5-1个点。 另外值得注意的是:
- 进行对抗学习的时候,我们需要将dropout设置成0,即固定网络结构,使得对抗学习在固定的网络结构中进行
- 二范式norm中计算的是,每个样本的输入序列中出现过的词组成的矩阵的梯度norm。
模型
在模型的构建上我们首先尝试了ESIM模型, 但是在这个比赛中ESIM模型的效果远不如基于bert的sentence pair classification方法。 以此作为基线模型,我们尝试了对bert后接其他模型做了尝试,其中以bert+bigru 以及 bert+2-layerliner的模型效果最佳, 使用RoBERTa-wwm-ext预训练模型后,我们在A榜上的单模达到了0.9146的成绩。 另外,由于A榜存在leak的原因,部分选手在这道赛题A榜中的成绩虚高,我们队伍也发现了leak,将我们0.89的模型加入后处理在线上达到了0.95的分数,因为考虑到B榜leak会消失,我们后续提交过程中没有再使用。
在B榜中,我们对之前使用的模型进行了集成,线上成绩0.782.
总结
这次比赛有几个遗憾:
- 一个缺憾是我们在A榜时成绩较高,这导致了我们在A榜中虽然考虑许多种的优化方式,但是在A榜并没有带来分数上的提升后就放弃了这部分优化。 比如focal loss, 由于之前的数据分割方式,我们的数据比例偏差不大,由于模型效果较好,在A榜上没有提升,因此我们没有基于其继续训练模型。 B榜的数据由于攻击性样本远多于A榜,大部分模型效果表现较差,我们后期对阈值做了修正,提升了模型的性能。
- 另一个遗憾是我们在A榜上发现数据增强效果一般,我们未做数据增强便达到了91.46. 因此没有做深入研究,比赛前一天我们紧急做的数据增强处理, 并且由于时间限制,模型未训练完全便匆忙提交,这也导致了我们的模型可能未达到最佳性能。
- 最后就是由于机器限制,没有尝试robert-wwm-large。