Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference
论文全程及链接:《Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference Timo》
项目地址:https://github.com/timoschick/pet
大家思考一个问题,BERT在预训练时学习到的知识或者说参数我们在fine-tunning的时候都有用到吗?
答案是不是的。大家看下图,BERT的预训练其中一个任务是MLM,就是去预测被【MASK】掉的token,采用的是拿bert的最后一个encoder(base版本,就是第12层的encoder的输出,也即下图左图蓝色框)作为输入,然后接全连接层,做一个全词表的softmax分类(这部分就是左图的红色框)。但在fine tuning的时候,我们是把MLM任务的全连接层抛弃掉,在最后一层encoder后接新的初始化层来做具体的下游任务。
想一个问题,能不能通过某些巧妙的设计,把MLM层学习到的参数也利用上?
答案当然是可以的,请继续往下看。
现在举一个二分类的例子,输入一条汽车论坛的评论,输出这个评论是属于【积极】or【消极】。但问题是现在我每个类别只有10个labeled数据,1K条unlabeled数据。怎么训练model?
直接做有监督训练?样本量太少,会过拟合。应该优先采用半监督学习的方法,如UDA、MixText这种,而PET采用的是另外一种巧妙的设计思想。
现在通过改造输入,如下图,
一个样例是"保养贵,配件贵,小毛病多,还有烧机油风险"。定义一个pattern函数,把它转变成以下形式"保养贵,配件贵,小毛病多,还有烧机油风险。真__!"。
这里定义一个verblizer作为映射函数,把label【积极】映射为好,把label【消极】映射为差。然后model对下划线__部分进行预测。BERT预训练时MLM任务是预测整个词表,而这里把词表限定在{好,差},cross entropy交叉熵损失训练模型。预测时,假如预测出好,即这个样例预测label就为积极,预测出差,这个样例就是消极。
这样做的好处是,BERT预训练时的MLM层的参数能利用上。而且,即使model没有进行fine tunning,这个model其实就会含有一定的准确率!想想,根据语义来说,没可能预测出 "保养贵,配件贵,小毛病多,还有烧机油风险。真好!" 比 "保养贵,配件贵,小毛病多,还有烧机油风险。真差!" 的概率还大吧!因为前面一句很明显是语义矛盾的。
上面定义的Pattern和verblizer,就是一个PVP(pattern-verbalizer pairs)。
Auxilliary Language Modeling
由于现在是用MLM做分类任务,所以可以引入无标注数据一起训练!
举个简单的例子,下图样例1是labeled数据,我们利用pattern把它改写后,对__部分做完形填空预测(即MLM任务)。样例2是一个unlabeled数据,我们就不对__部分做预测,而是对被【MASK】做预测。这里的【MASK】可以采用BERT的方法,随机对句子的15%token进行【MASK】。
这样做的好处是,能让model更适应于当前的任务,有点像在预训练模型上继续根据任务的domain和task继续做预训练,然后再做fine-tunning呢?详细的可以看我写的这篇博文。
ZHOU-JC:NLP系列之论文研读:Don't stop pretraining,继续预训练!37 赞同 · 5 评论文章Combining PVPs
引入一个问题,怎么评价我们的pattern定义得好不好?
举个例子,如下图,我们可以造两个pattern,又可以造两个verblizer。这样,图中所示,其实一共有4个PVP。我们怎么衡量哪一个PVP训练完后在测试集上的效果最好?
答案是我们也不知道,因为我们不能站在上帝视角从一开头就选出最佳的PVP,同样由于是小样本学习,也没有足够的验证集让我们挑选最佳的PVP。既然如此,解决方式就是知识蒸馏。
具体的,我们用20个labeled数据训练4个PVP模型,然后拿这四个PVP模型对1K条unlabeled数据进行预测,预测的结果用下式进行平均。
这里的 � 保持概率和为1, ��(�|�) 就是单个PVP模型对样本预测的概率分布, �(�) 就是PVP的权重。有uniform和weighted两种方式,uniform就是所有PVP的权重都为1,weighted就是把每个PVP的权重设置为它们在训练集上的准确率。最后还要对上式进行temperature=2的软化。
这就是在做知识的蒸馏。何谓知识的蒸馏?经过这样处理后,噪声减少了,利用多个PVP平均的思想把某些本来单个PVP预测偏差比较大的进行平均后修正。
这样子,利用训练好的PVPs对所有1K条unlabeled数据打上soft label,再用这1K条打上软标签的数据进行传统的有监督训练,训练完的model应用于下游任务的model。注意哦,这里就可以用轻量的模型来做fine tuning了哦,因为从20条labeled数据扩充到1K条有带有soft label的数据,labeled数据量大大增加,这时候轻量级的模型也能取得不错的结果,而且轻量模型对轻量部署、高并发等场景更加友好。
下图就是所有的流程,再总结一下步骤就是
- 第一步:先定义PVPs,然后对每个PVP用labeled据进行单独的训练,该步可以加入上面提到的Auxiliary Language Modeling一起训练;
- 第二步:用训练好的PVPs,对unlabled数据进行预测,并知识蒸馏,得到大量的soft label;
- 第三步:用第二步得到的带有soft label的data,用传统的fine tuning方法训练model。
IPET
在每个PVP训练的过程中,互相之间是没有耦合的,就是没有互相交换信息,IPET的意思就是想通过迭代,不断扩充上面训练PVP的数据集。
这里简单举个例子,现在有20个labeled数据,1K个unlabeled数据,定义5个PVP,第一轮,利用20个labeled数据分别训练PVP,第二轮,用第2~4个PVP来预测这1K unlabeled数据,然后选一些模型预测概率比较高的加入到第一个PVP的训练集上,同样用第1、3、4、5个PVP来训练这1K条,然后也将这部分加入到第2个PVP的训练集中,然后再训练一轮,训练后,重复,这样每一轮每个PVP的训练样本不断增多,而且PVP之间的信息也发生了交互。
实验
分析
Combining PVPs
作者发现不同PVP之间可能有很大的性能差别,如下图min就是最差的PVP,max就是最好的PVP,可以观察到它们之间的差别就很大。但是又不能站在上帝视角从一开始就选择最好的PVP,所以办法就是做commind PVPs,即上面所提到的知识蒸馏,而且发现蒸馏后会比采用单个最好的PVP效果还要好,并且发现uniform和weighted两个方法效果差不多。
Auxiliary Language Modeling
labeled数据越少,auxiliary task的提升效果越明显。
Iterative PER
iPET的效果,因为iPET是迭代多轮,每一轮每个PVP的训练集都会增大,从图可以看到每一轮的模型效果都是越来越好的。
In-Domain Pretraining
这里讨论了一个问题:PET效果比有监督训练好,是不是因为PET在大量无标签上打上软标签,扩大了有标签数据集?然后作者做了一个实验,有监督训练时,先在所有数据集上进行继续预训练(这一步作者认为相当于把无标签数据也加进来了),然后再fine funing。实验结果表明,即使这样,有监督效果也离PET有一定距离。
不过这里想略微吐槽:还可以这样来做比较的?感觉都不太公平hh。
参考:https://zhuanlan.zhihu.com/p/375934846 标签:PVP,Shot,Classification,训练,labeled,Language,1K,数据,model From: https://www.cnblogs.com/zle1992/p/17374325.html