首页 > 其他分享 >Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference

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

时间:2023-05-05 15:46:52浏览次数:64  
标签:PVP Shot Classification 训练 labeled Language 1K 数据 model

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

相关文章

  • 获取WebView发送给服务端的Accept-Language请求头
    1,WebView没有提供获取Accept-Language请求头的接口2,WebView的publicWebResourceResponseshouldInterceptRequest(WebViewview,WebResourceRequestrequest){}回调中WebResourceRequest不包含Accept-Language请求头,即使客户端向服务器端发送的请求中包含该请求头3,javascr......
  • KQL(Kibana Query Language)
    官方文档官方博客版权声明:本文所有权归作者!商业用途转载请联系作者授权!非商业用途转载,请标明本文链接及出处!赞成、反驳、不解的小伙伴,欢迎一起交流!......
  • 快照snapshot与物化视图materializ…
    一、快照1.权限grantcreatesnapshottozjbf;2.创建create  snapshot  SP_TEST refresh    complete     startwithsysdatenextsysdate+5/(24*60*60) as           select  *  from      SELECT*FROMSP_TESTWHERE......
  • This dataset does not have valid histogram required for classification method, r
     此数据集没有分类方法所需的有效直方图,请运行“计算统计信息”工具生成直方图。参考1:https://blog.csdn.net/soderayer/article/details/125409022参考2:https://blog.csdn.net/aGang_Gg/article/details/86690749 计算栅格统计信息......
  • 开源大模型(large language model, LLM)介绍
    作为如今LLM圈内绝对的领头羊,OpenAI并没有遵从其创立初衷,无论是ChatGPT早期所使用的的GPT3、GPT3.5还是此后推出的GPT4模型,OpenAI都因“暂无法保证其不被滥用”为由拒绝了对模型开源,开启了订阅付费模式。对于大型科技企业而言,不管是出于秀肌肉还是出于商业竞争目的,自研LLM都是一......
  • HW2:classification
    HW2任务描述音位分类预测(Phonemeclassification),我们有音频->音位这样的训练数据,想要训练一个模型,学习这样的对应关系,然后给定音频,预测其音位音位音位(phoneme),是人类某一种语言中能够区别意义的最小语音单位,是音位学分析的基础概念。每种语言都有一套自己的音位系统。音频处......
  • 【提示学习】Exploiting Cloze Questions for Few Shot Text Classification and Natu
    论文信息名称内容论文标题ExploitingClozeQuestionsforFewShotTextClassificationandNaturalLanguageInference论文地址https://arxiv.org/abs/2001.07676研究领域NLP,文本分类,提示学习,PET提出模型PET(Pattern-ExploitingTraining)来源EACL2021阅读摘要  目前......
  • 自然语言处理(Natural Language Processing,NLP)简要
    自然语言处理(NaturalLanguageProcessing,NLP)简要一、发展状况二、发展优势三、发展瓶颈四、具体研究方向五、自然语言处理工具六、未来发展方向自然语言处理(NaturalLanguageProcessing,NLP)是计算机科学和人工智能领域的一个重要研究方向,其目的是使计算机能够理......
  • 18c新特性——PDB snapshot Carousel 快照轮转
    一、关于PDB快照轮转18c新特性PDB快照轮转(SnapshotCarousel)提供了在pdb级别下手工或者自动生成快照的功能。PDB快照主要有两个作用:通过闪回恢复数据到快照时间点使用快照PDB查询历史数据CDB需要使用localundo并处于归档模式下。每个PDB快照都会关联一个快照名称,可以在创建时定义......
  • how to create one command line configuration tool with shell language on Linux A
    howtocreateonecommandlineconfigurationtoolwithshelllanguageonLinuxAllInOne如何在Linux上用shell语言创建一个命令行配置工具RaspberryPiconfigurationtool$sudoraspi-config#等价于,直接修改$sudovim/boot/config.txt$DISPLAY#设......