前几天,XLNet作者杨植麟团队发布了首个中文多任务Prompt统一模型:ZeroPrompt,共收集了1000个中文任务数据(手动感叹!),大幅提升了zero-shot性能;令人惊讶的是:在部分测试任务上,zero-shot性能比有监督finetune还要好,整个测试任务上平均只相差4.7个点。
论文地址: https://arxiv.org/pdf/2201.06910.pdf
是的,你没有看错,ZeroPrompt居然构建了1000个任务数据集,如此庞大的数据集不仅仅是为了提升zero-shot性能而已,论文作者也一再强调另一种视角:任务数据规模的拓展是模型缩放的一种有效替代手段。正如下图所示:随着多任务训练任务的增加,大小模型之间的性能趋近一致。
推荐文章
- 浙大博士导师深度整理:Tensorflow 和 Pytorch 的笔记(包含经典项目实战)
- Python 程序员需要掌握的机器学习“四大名著”发布啦
- 值得收藏,这份机器学习算法资料着实太香
- 比 PyTorch 的官方文档还香啊,吃透PyTorch中文版来了
- 赶快收藏,PyTorch 常用代码段PDF合辑版来了
上述构建的1000个任务数据是不同的任务类型,那么如何将这些不同的任务统一起来用一个模型统一建模呢?
好在:我们NLPer正处于Prompt-based Learning新时代,Prompt有很多优势,比如:1)对齐LM目标并激发LM能力;2)少调参数、提升参数效率;3)知识挖掘等。
Prompt除了这些优势,还有一点会被大家忽略:Prompt可以对不同的NLP任务进行范式统一,统一为相同的数据形式。同时,受益于生成式预训练语言模型的强大(如本文采取的T5),我们就可以统一建模了!
看到这里,或许我们可以真正明白ZeroPrompt是“多任务Prompt统一模型”的真正含义了!
看到这里,或许你还会发出疑问:ZeroPrompt不还是靠数据规模来“大力出奇迹”吗?没错,大力真的可以出奇迹!但真要做到这一点,JayJay认为还有很多问题需要思考,比如:
-
多任务训练时,如何对不同任务类型更好地统一建模,Prompt如何设计?
-
应该选择哪些任务数据进行多任务训练呢?
-
对未见领域的新任务,如何自动构建Prompt?
基于以上,接下来就和JayJay一起一探究竟吧~
ZeroPrompt的整体框架
上图给出了两种不同的NLP范式:1)传统的预训练-微调范式;2)ZeroPrompt 整体的pipeline。
ZeroPrompt的整体流程主要包括:
-
构建多任务Prompt统一模型,主要包括:1)构建多任务数据集;2)设计Prompt;3)基于预训练LM模型多任务预训练;本文采取T5作为初始化的LM;
-
评估未见任务的zeroshot性能,主要工作是:基于【Prompt遗传搜索算法】,针对未见的新任务构建自适应的Prompt。
这里着重介绍【Prompt遗传搜索算法】,这一算法主要是为了在未见的新任务中构建Prompt。
在之前的很多工作中都指出:不同的Prompt通常会导致zero-shot性能差异较大,手动编写的Prompt通常也不是最理想的。这主要是因为在zero-shot情况下,训练集中没有可以直接复用的Prompt,同时也无法验证哪些Prompt更好。
为了解决这一问题,论文提出了【Prompt遗传搜索算法】——GPS:验证Prompt在开发集上的性能、并通过语言模型迭代产生更好的Prompt。
通过上述可以看出,为了验证Prompt的效果,就需要构建开发集,论文将这一设置归纳为“zero-shot adaptation with fewshot validation”。虽然这样的设置与之前的工作大不相同,但论文认为这更符实际情况,毕竟我们总能拿到少量标注数据进行验证(对每个类别标签采样8个示例进行验证)。
综上,ZeroPrompt不同于传统的zero-shot设置(如上图),还需要构建一个开发集来验证Prompt的效果。
多任务数据集构建
如上图,ZeroPrompt共收集1000+任务数据,主要来自于学术界的公开数据集和工业界的生产数据集,包括情感分析、新闻分类、推断、NER、MRC、摘要等多个任务。其中,公开数据集共80个。
在一共的1110个任务数据上,有824个用作多任务预训练,剩余的286个数据是进行zero-shot测试的未见任务。
此外,为了模仿真实世界中NLP数据昂贵的这一事实,论文在构建训练数据时:分类任务的每个类别标签采样128个示例,生成任务采样256个示例。
为了严格测试zero-shot性能,论文还将Train阶段的数据进行二次过滤,保证Test数据不出现在Train中。
Prompt设计
我们所熟知的一种最简单的Prompt模板形式为:
上述P为人工Prompt,X为输入文本,MASK进行填槽;
如上图,ZeroPrompt将上述P拓展为三部分:
-
特定任务的soft prompt:连续的prompt embedding,zero-shot测试时采取训练集合相似的数据分布进行初始化;
-
候选标签verbalizer prompt:将所有候选的标签信息拼接在一起;
-
任务描述prompt:初始的描述prompt人工进行构建;
上图给出的是一个分类任务的prompt示意图,我们再来看NER任务:
还有摘要任务:
实验结果
1、整体效果
上图给出的是ZeroPrompt的效果,主要结论是:
-
ZeroPrompt显著提升T5的zero-shot性能,从37.8提升到68.76,一共提升近31个点;
-
ZeroPrompt显著提升CPM2和盘古的zero-shot性能,提升近28个点;
-
ZeroPrompt的zero-shot性能与RoBERTa-large有监督finetune可比或更好(如上图红色标识);
-
ZeroPrompt与finetuned的RoBERTa-large相比,整体只差4.7个点,而ZeroPrompt没有使用任何标记数据进行微调。原论文表示:这是“令人欣喜”的结果。
2、任务规模对zero-shot性能的影响
有上图可以看出:随着任务数量从20升至800个,不同参数大小模型间的差距变得很小,FLOPs提升30倍!
3、消融实验
1)Prompt设计的影响:
此处不再贴图,直接PO结论:【特定任务的soft prompt】 和 【候选标签verbalizer prompt】对最终结果有正向收益。
2)Prompt设计的影响:
结论是:本文的【Prompt遗传搜索算法】好于之前的LM-BFF、翻译等方式。
3)跨任务迁移性能:
在跨任务类型的zero-shot性能测试上,只能从某些任务类型中受益,而利用其他任务的更多标记数据并没有持续提升。
总结
ZeroPrompt是一种多任务Prompt预训练方法(JayJay归纳为多任务Prompt统一模型),可以显著提升zero-shot泛化性能。
需要不断强调的是:ZeroPrompt是一种“zero-shot adaptation with fewshot validation”设置,也是为了构建效果更好的Prompt。
不过,ZeroPrompt也有一些需要继续解决的问题:
-
跨任务迁移的zero-shot性能,并不总是随着任务规模的增加而持续提升;
-
多任务训练中,如何选择更好的任务分布?
-
如何收集更多多样的任务数据,而当前的任务数据规模仍然是受限的。
技术交流
目前已开通了技术交流群,群友已超过1000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
- 方式①、发送如下图片至微信,长按识别,后台回复:加群;
- 方式②、微信搜索公众号:机器学习社区,后台回复:加群;
- 方式③、可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。