每天给你送来NLP技术干货!
来自:高能AI
3个月前,JayJay介绍了 HuggingFace的多任务Prompt模型,一直在等中文NLP社区的动静,试想一下:多任务Prompt统一建模如果能显著提升zero-shot&few-shot性能,这将是NLP落地的一个有效途径。
不过,JayJay终于等到了!
前几天,XLNet作者杨植麟团队发布了首个中文多任务Prompt统一模型:ZeroPrompt,共收集了1000个中文任务数据(手动感叹!),大幅提升了zero-shot性能;令人惊讶的是:在部分测试任务上,zero-shot性能比有监督finetune还要好,整个测试任务上平均只相差4.7个点。
论文地址: https://arxiv.org/pdf/2201.06910.pdf
是的,你没有看错,ZeroPrompt居然构建了1000个任务数据集,如此庞大的数据集不仅仅是为了提升zero-shot性能而已,论文作者也一再强调另一种视角:任务数据规模的拓展是模型缩放的一种有效替代手段。正如下图所示:随着多任务训练任务的增加,大小模型之间的性能趋近一致。
上述构建的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性能,并不总是随着任务规模的增加而持续提升;
多任务训练中,如何选择更好的任务分布?
如何收集更多多样的任务数据,而当前的任务数据规模仍然是受限的。
投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。
方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。
记得备注呦
整理不易,还望给个在看!