Prompt范式的缘起|Pattern-Exploiting Training
卷友们好,我是rumor。
我感觉我被卷到了。
昨天Prompt突然刷屏,我才知道有这么个事儿,还什么都没有学,人家领域综述都写好了。
说好了要当走在AI前沿的姐姐,这怎么能忍???
于是我赶紧上知乎学习,并且创建了Prompt
文件夹,连下几篇paper,大概缓解了16%的焦虑。
但刷了几篇博客后觉得自己对背景的理解还是不够,于是决定从头看起。今天就来记录下自己读PET的一些收获。
Prompt的思想,我理解就是设计不同的输入形态,激发语言模型的潜力,得到任务相关的输出,从而避免精调模式带来的灾难性遗忘问题。引用下CMU的刘鹏飞博士放在博客里的图:
他的综述想必大家都知道了,也推荐去读下他自己的博客:
博客:https://zhuanlan.zhihu.com/p/395115779
综述:https://arxiv.org/abs/2107.13586
Prompt的做法,从任务形式来说可以分为两种:
续写Prefix:用在GPT2-3那种单向LM预训练模型上,输入「好好学习,翻译成英文:」,输出「good good study」 完形填空:用在BERT那种MLM式预训练模型上,比如情感分类任务可以输入「这个饼不错,太X了」,输出「棒」
我最早是从GPT2知道第一种方法的,第二种之前WWM在探究知识存储能力的时候看到过,偏信息抽取任务,给定Subject和关系,模型给出Object,很好理解,也不用对输出进行特殊处理。
Prompt最近的突然兴起,主要是因为学者们把任务扩展到了NLU,之前大部分人听说的是做生成和信息抽取,而在统一了方法之后,现在可以做分类任务和匹配任务了,同时在少样本甚至正常场景,能追上精调的效果。
其实对于这个新范式,核心idea还是很好理解的。难就难在:
怎么样选取合适的Prompt,适配不同任务,同时把模型潜能激发出来 Answer实际上是不可控的,拿到answer后如何往标准化的Y映射 怎样利用Prompt机制精调一下模型
所以今天,我们就来看看Prompt范式的「开篇之作」PET,究竟是如何解决这些问题的。
Prompt的选取
PET针对不同任务手动设计了不同的Prompt,比如Yelp用户评价星级预测(a是句子):
MNLI句间关系推理(a、b是句子):
PET这里可以参考的地方有两点:
给出了分类任务、匹配任务的Prompt设计样例,让预训练模型可以做NLU任务 每种任务都给了多个Prompt,毕竟模型预训练时见到的句子太多了,谁也不确定哪种Prompt能从黑盒里捞出什么,用多种输入后再进行整合是比较保险的方式
其实手动设计不是高效的方式,同时期还有一篇LPAQA[1],主要探索了信息抽取任务自动化挖掘Prompt和答案整合方法,但LPAQA主要关注信息抽取领域,感兴趣的同学可以看下。
Answer的映射
对于答案也是手动定义,直接定义一个label到word的映射v
。比如在做文本相似度任务时,让1=Yes
,0=No
,这样直接看该单词的logits就能预测出结果的概率了。
在Yelp评价预测中,定义了五个映射:
在MNLI句间关系推理中,定义了多种映射:
训练范式
解决了输入和输出的不可控问题之后,接下来就是PET的重头,也是其名字Pattern-Exploiting Training的由来。
如何建模
以往模型只要对P(l|x)
建模就好了(l
是label),但现在我们加入了Prompt P
以及标签映射(作者叫verbalizer),所以这个问题就可以更新为:
其中M
表示模型,s相当于某个prompt下生成对应word的logits。再通过softmax,就可以得到概率:
通过这么两个公式,PET就把这种范式下的建模整明白了,能建模也就能inference甚至是训练了:
但是这样好像又变成精调了???
于是作者在训练时又加上了MLM loss,进行联合训练。
借鉴蒸馏思想
如果说上面的过程还是比较好理解,那下面PET的操作就开始fancy起来了。
首先让我们强调一下初心,Prompt种范式在早期的最大价值就是few-shot表现很好。所以PET这篇文章主要还是用Prompt来提升少样本的效果。
那要怎么提升效果呢?作者的思路是借鉴蒸馏的思想,先用少量监督数据训个模型A,然后用模型A去预测无标签数据,得到soft label(概率值),再用soft label去训练最后的模型B。
在我们常用的蒸馏套路中,要不然A比B强很多,要不然A比B多很多。于是PET采用了第二种方案,恰好就把多个Prompt利用起来了。
具体的操作是:
在少量监督数据上,给每个Prompt训练一个模型 对于无监督数据,将同一个样本的多个prompt预测结果进行集成,采用平均或加权(根据acc分配权重)的方式,再归一化得到概率分布,作为无监督数据的soft label 在得到的soft label上finetune一个最终模型
多轮的iPET
如果觉得上面的三步过于复杂,那就太小瞧作者了,他们又提出了iPET。
Iterative PET。
把所有模型集成到C上是不能满足作者的,因为那些模型没法相互学习。比如有的模型学到了worse的pattern,它得到的label就会misleading。
所以!
我们可以循环地进行上面三步,逐步扩大soft label的范围,这样下面新训的模型就能学到之前模型的知识!
模型效果
经过一系列操作,最终可以看到,PET在少样本的情况下完胜精调:
我???
不知道大家怎么想,其实我看完之后是有些懵的。
弱弱地说一句,我觉得上面的实验比较不太fair?
首先,是PET在训练时加上了MLM损失,在无监督语料上增量预训练,而我们都知道这本身就是可以提升效果的。其次,如果用精调的范式重复一系列上述操作,效果说不定也可以提上去。
除了单纯的效果比较,如果放到落地应用上来讲,算上那么多模型训练和调参的时间,我可能已经手工标了几千条数据了。。。
不过Anyway,大佬们都说好,身边几个同学也都说好。
可能是还没看到精彩的部分,我再接着读下面几篇吧。
参考资料
How Can We Know What Language Models Know?: https://aclanthology.org/2020.tacl-1.28.pdf
「走在前沿不掉队」