目录
hi!又到每周分享的时刻了,希望大家能有收获呀!!!!!!!!!!!
什么是Prompting ?它和Fine-tuning有什么区别?这里引用CMU刘鹏飞博士放在博客里的图:
prompt是研究者们为下游任务设计的一种模板或者范式,这种范式能够帮助预训练模型回忆起自己预训练学到的知识,其实说白了就是将下游任务和预训练任务的统一(近似),比如说MLM。
对于输入文本x,经过函数fprompt(x)得到x′
x′=fprompt(x)
该函数首先会使用一个模板,通常为自然语言(就是一句通顺的话),因为预训练模型训练数据都是基于自然语言的,该模板一般包含两个空位置:用于填输入x的位置[x]和用于生成答案文本的z位置[Z]。
举个
假设输入是: x = " I love this movie."
使用的模板是
" [X] Overall, it was a [Z] movie."
那么通过范式得到的x′就是 "I love this movie. Overall it was a [Z] movie."
Fine-tuning:使用预训练模型去迁就我们的下游任务,也就是说根据具体的下游任务添加辅助loss然后反向梯度更新预训练模型中的参数,这样的话就不能很好的激发预训练模型的潜能。
Prompting:让我们的下游任务去迁就预训练模型,其实是尽量让下游任务和预训练相似,充分发挥预训练模型的潜能。
Prompt主要的几个难点(还有很多这里挑两个主要的):
1)如何选取模板?
2)MLM预测得token其实不可控,如何映射到label?
今天主要是想和大家分享三篇有关Prompt的论文。
论文地址:https://arxiv.org/pdf/2001.07676.pdf
可以看下左边的图这不是精调的过程吗?确实是精调的流程作者另外加入MLM Loss去联合训练。
其中l为label,v(l)为label的映射作者称为verbalizer,M为模型,P(x)就是模板,s其实就是模型对mask位置预测的logits,然后通过softmax就可以得到最大概率的token
模型的loss,原文中说主要loss还是 LCE,LMLM只是辅助loss,毕竟是预训练模型。
右边的图其实就是说,我先通过少量样本训练多个不同Prompt范式模型,然后用这些模型去对未标注的数据进行标注(soft label)(多个模型加权或者平均),然后拿这些带有soft label的数据去进行训练。充分发挥Prompt范式在小样本的作用。
对于模板的选取,其实说实话得根据具体任务来定,谁也不晓得到底哪个模板适合我的任务,一般来说会采用多个模板最后结果进行加权或者平均,这样的话会比较保险。PET其实就是这样做的
PET针对不同任务手动设计了不同的Prompt,比如Yelp用户评价星级预测(a是句子):
针对MNLI 任务(a、b都是句子):
PET其实是针对不同任务固定住label,预测是只需要在vocab中计算各个固定label的概率,然后选择概率最大的label作为本次预测得结果。
在Yelp评价预测中,定义了五个映射:
也是就是模型会对mask的位置做个预测(预测结果shape一般为 [batch_size, sep_len, vocab_size]),然后手动计算上诉映射空间中计算每个单词的概率,既:
P(lable)=max(p(terrible|x),p(bad|x),p(okay|x),p(good|x),p(great|x)))
其实在真实业务中我们的真实label可能非常的多而且长度也不一样,针对label长度不一样我们怎么去做mask呢,你可能会想到label长度不一样那么我规定所以label长度一样不就是了,这样是可行的针对新业务来说但是如果是以前的旧业务呢,label早已经固定好了,上千个场景每个场景有几十个label我都要一个个去重新定义label吗?
笔者这里提供一个自己实践的思路,其实我们可以固定mask的位数(一般取现有label集里最大的长度)对于长度达不到我设定的位数label可以进行padding。当然其实我们也可以不固定预测得label集,让模型预测得结果不可控(可能生成的token不在label集里),这样的话我们需要一个工具去做映射比如bm25等。
PE在少量样本的情况下是完胜微调的
论文地址:https://arxiv.org/pdf/2108.02035.pdf
下面给出一个例子说下本文的主要创新点,当我们要对一个句子进行分类时,可以尝试构建下面的模板:
A [MASK] question: x
比如MLM预测出在[MASK]位置概率最高的词是science,那该句可以被分类为science类别。
像PET其实是固定住了label集也就是说我最后预测得结果只能在我规定好的词中选择(其实就是做选择题)而不是完形填空,MLM在[MASK]位置可以预测出的单词是很多的,而不仅仅是类别数只有特定数量的,因此该问题很重要的一个部分是如何构建一个单词表到类别标签的映射。这个映射能让MLM在预测到类别标签的相关词时,就可以被分到指定类别去(笔者自己的实践只是将模型预测得结果使用bm25去和label集做映射,即与预测结果得分最高的label为本次预测结果)。
这样的一个映射,通常是由人来手工编辑或使用梯度下降搜索。但显然这样会带来覆盖范围不全导致的高偏差和高方差。知识库的组织结构,天然的带有范围关系,在知识库的图结构中,相关联的实体会有边相连,不相关的实体可能要经过很多跳才能找到关联,或无关联。因此如果能将外部的知识库信息融入,构建一个映射器(本文称语言表达器),就可以一定程度上避免手工构造和梯度下降带来的高偏差和高方差问题。
KPT旨在构建一个语言表达器,在单词空间和分类标签空间做一个映射。
因此KPT包含以下三个步骤:
KPT其实就是引入外部知识去扩展label集
举个例子
对于science了类别并不是仅仅"science"这个单词能够代表这个类别,我们可以通过外部知识去扩展,“mathematics”, "biology"等也可以表示science这个类别。
文中给了一个情感二分类标签词扩展的例子
在few-shot中,因为有少量的标注数据,所以去噪更容易。
对于每个标签词,我们为其分配一个可学习的权重参数,然后再将其归一化,得到:
在few-shot情况下,我们不需要进行校准,因为训练过程中这个参数会被训练到所需的范围。
需要解决三个问题
对于第1个问题:
本文简单的将词拆分成逐token的多个部分,并用PLM逐token预测的平均概率,作为整个词的概率。
对于第2个问题:
对于一些稀有词,PLM预测的概率不准确(其实是不稳定),且有偏差,因此,最好在扩展单词表中删去这些稀有词。然而,我们应该如何确定哪些是稀有词呢?本文使用MLM去预测句子上下文中这个单词的概率。
也即我们要预测的是下面这个概率的期望:
然而我们无法直接得到这个期望,只能用在上下文中预测的频率去估计,也即,使用这样一个近似:
最后我们删去那些概率低于阈值的扩展词。
针对第3个问题:
无论输入句子的标签如何,但有一些标签词天然地更不可能被预测到,这是由于标签词的先验分布具有很大差异。
本文的解决方案,仍然是利用标签词的上下文先验分布来校准预测的分布。
也即:
这个先验分布仍然和2一样,是使用少量无标注数据得到的。
我们简单地认为扩展词中每个词对于预测标签的贡献相同,因此我们对其进行简单平均,并用预测分数的均值作为该标签的预测分数,最后取出预测分数最大的类别,作为最后的结果。
我们既然已经得到了一个权重参数,我们将其视作扩展词中每个词对于预测标签的贡献度,因此我们将其进行加权平均。
其中
论文地址:https://arxiv.org/pdf/2103.10385.pdf
代码链接:https://github.com/THUDM/P-tuning
这篇论文和前两篇有点不大一样,前两篇prompt模板是通过人工手动构建的称为Hard-prompt 模板是固定好的不可学习的,而这篇论文模板是可以自动学习的称为Soft-prompt。
也就是,P-tuning的prompt Prompt不是显式的,不是我们可以看得懂的字符,而且一些隐式的、经过训练的、模型认为最好的prompt token。
P-tuning相比与PET、KPT省去了人工构建模板的过程,相对而言能减少模板对最终结果的影响(因为模板都不是固定的针对不同场景只能去尝试)。P-tuning训练的时候冻住了原来预训练模型参数,训练的时候只调整模板参数,按理说可以提高训练速度,节省内存。
Prompt范式的提出主要是为了解决小样本学习的问题,但是在数据量充足的情况下还是不如fine-tuning。而且在一些小模型的情况下表现得不是很work。
尽快Prompt有些缺点但是还是值得一试的,毕竟大部分情况下标注数据都是不那么充足的。
[1] Liu P, Yuan W, Fu J, et al. Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing[J]. arXiv preprint arXiv:2107.13586, 2021.
[2] Prompt范式的缘起|Pattern-Exploiting Training - 知乎
发布于 2021-11-28 19:58