查看原文
其他

从4篇最新论文详解NLP新范式——Continuous Prompt

张一帆 PaperWeekly 2022-07-04


©PaperWeekly 原创 · 作者 | 张一帆

学校 | 中科院自动化所博士生

研究方向 | 计算机视觉


近几年,NLP 技术发展迅猛,特别是 BERT 的出现,开启了 NLP 领域新一轮的发展。从 BERT 开始,对预训练模型进行 finetune 已经成为了整个领域的常规范式。但是从 GPT-3 开始,一种新的范式开始引起大家的关注并越来越流行:prompting。

首先我们根据综述文章 Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing [1] 对 prompt 的来源和大致思想做个介绍。

NLP 中的四种范式。

全监督学习,即仅在目标任务的输入输出样本数据集上训练特定任务模型,长期以来在许多机器学习任务中发挥着核心作用,同样的,全监督学习在 NLP 领域也非常重要。但是全监督的数据集对于学习高质量的模型来说是不充足的,早期的 NLP 模型严重依赖特征工程。随着用于 NLP 任务的神经网络出现,使得特征学习与模型训练相结合,研究者将研究重点转向了架构工程,即通过设计一个网络架构能够学习数据特征。

从 2017-2019 年开始,NLP 模型发生了翻天覆地的变化,这种全监督范式发挥的作用越来越小。具体而言,研究重点开始转向预训练、微调范式。在这一范式下,一个具有固定架构的模型通过预训练作为语言模型(LM),用来预测观测到的文本数据的概率。由于训练 LM 所需的原始文本数据需要足够丰富,因此,这些 LM 都是在比较大的数据集上训练完成。

之后,通过引入额外的参数,并使用特定任务的目标函数对模型进行微调,将预训练 LM 适应于不同的下游任务。在这种范式下,研究重点转向了目标工程,设计在预训练和微调阶段使用的训练目标(损失函数)。

当前我们正处于第二次巨变中,「预训练、微调」过程被称为「预训练、prompt 和预测」的过程所取代。在这种范式中,不是通过目标工程使预训练的语言模型(LM)适应下游任务,而是重新形式化(Reformulate)下游任务,使其看起来更像是在文本 prompt 的帮助下在原始 LM 训练期间解决的任务。

通过这种方式,选择适当的 prompt,该方法可以操纵模型的行为,以便预训练的 LM 本身可以用于预测所需的输出,有时甚至无需任何额外的特定任务训练。这种方法的优点是给定一组合适的 prompt,以完全无监督的方式训练的单个 LM 就能够用于解决大量任务。然而该方法也存在一个问题——这种方法引入了 prompt 挖掘工程的必要性,即需要找出最合适的 prompt 来让 LM 解决面临的任务。

目前的 Prompt Engineering 主要分为三种方法:Discrete Prompt,Continuous Prompt 以及 Hybrid Prompt。本文挑选了最新四篇 Continuous Prompt 相关的文章加以解读。
  1. WARP: Word-level Adversarial ReProgramming

  2. Prefix-Tuning: Optimizing Continuous Prompts for Generation

  3. The Power of Scale for Parameter-Efficient Prompt Tuning

  4. Multimodal Few-Shot Learning with Frozen Language Models

第一篇文章首次提出了 continuous prompt 的方法(从 adversarial programming 中得到的 insight),本文的输入需要可学习的 embedding,输出需要任务特定的输出层,也可以看作可学习的 prompt,第二篇文章中使用类似于 continuous prompt 类似的 prefix 加到 transformer 的每一层。

这个过程能否进一步简化呢?第三篇文章给出了答案,第三篇文章只对输入添加额外的 个可学习的 prompt,并得到了超越前人的结果。第四篇文章属于一篇应用,将 continuous prompt 成功的应用在了多模态领域。


WARP

论文标题:

WARP: Word-level Adversarial ReProgramming


收录会议:

ACL 2021


论文链接:

https://arxiv.org/abs/2101.00121


代码链接:

https://github.com/YerevaNN/warp


本文最大的贡献在于,不同于 Discrete Prompt 需要手工寻找或者学习离散的 token 作为 prompt,本文直接优化 embedding 作为 prompt,这给了我们的模型更多的自由度,并最终在下游任务中有更好的表现

文章的思路很简单,我们需要优化的参数就是两组 embedding 代表 prompt, 是对每一类的分类参数,有点类似于全连接层这种感觉。



如上图所示,具体来说,我们把 prompt tokens 插入到输入序列中,再经过 encoder 和一个 MLM head,然后通过 ,那么我们分类的概率可以通过如下公式计算:

公式中的 是插入了 prompt 的序列, 是所有类别, 是预训练语言模型的的输出。
训练过程也很简单,就是在下游任务的数据集中通过梯度优化寻找使得 cross-entropy loss 最小的参数。

Experiments

实验过程中所有的 prompt tokens 都被初始化为 [MASK] 的 embedding。

在最常用的 benchmark GLUE上,WARP 取得了非常不错的效果,并且参数量少了好多个数量级。下表中的 # 表示训练的参数量。

再看一下 ablation, 即模型有 个 prompt 在里面, 表示使用最佳的 MNLI 参数初始化的 WARP 模型,可以看到当我们减少可训练 prompt 参数的数量时,性能下降,但模型仍然有效。

在 few-shot learning 的 setting 下,使用 SuperGLUE benchmark,WARP 超过了 PET 和 GPT-3

在可解释性方面,作者通过寻找距离 embedding 最近的 token 来进行离散化,我们摘取两个任务对应的 prompt 来看一看,可以看到基本上没有啥真实的语义信息。相比之下 就比较好解释了,对 MNLI 的“contradiction”类的 embedding 接近于 token “unless”。SST-2 任务中“negative”和“positive”类的 embedding 分别接近于“defective”和“important”。


Prefix-Tuning


论文标题:

Prefix-Tuning: Optimizing Continuous Prompts for Generation


论文链接:

https://arxiv.org/abs/2101.00190


代码链接:

https://github.com/XiangLi1999/PrefixTuning


将 prompt 用于 NLG 任务上,比如对一个数据表生成描述的任务上,任务的输入是一个数据表(比如 【名称:星巴克|类型:咖啡店】),输出是一段描述(星巴克出售咖啡)。

Prefix-Tuning 在该任务的输入前加上一个任务特定的连续序列(prefix),即下图下方红色的部分。与 prompt 相比,这里不再是真实的 token,而是连续序列。和 finetune 相比,finetune 优化的是整体的参数,而这里只对每个任务优化对应的 prefix。

Problem Statement考虑一个条件生成任务,其中输入是一个 context,输出是一个标记序列。我们关注两个任务,如下图右侧所示:在 table-to-text 中, 对应于线性化的数据表, 是文本描述;在 summarization 中, 是一篇文章, 是一个简短的总结。
我们的预训练生成模型记作 ,如下图顶部所示记 的 concatenation, 是输入 的序列号。记 个 step 的激活值, 是所有时间点上所有层的激活值, 层 transformer 在 step 时的激活值。一个自回归的语言模型的激活值按照如下方式进行生成:

最后一层 被用来计算 next token 的概率 。


接下来进入 prefix 的方法介绍,首先 highlevel 的说一下 intuition,然后仔细说说方法。

Intuition本文的 intuition 在于:相信有一个合适的上下文可以在不改变参数的情况下引导 LM。例如,如果我们想让 LM 生成一个单词(例如,Obama),我们可以将其常见的搭配作为上下文(例如,Barack)的前缀,LM 将为所需的单词分配更高的概率。这是对于一个单词的引导,那么是否存在一个 context 可以引导整个句子的生成呢?这是本文要回答的关键问题。

Method本文对 LM 每一层的输入添加一个 prefix ,或者对 source,target 端添加不同的 prefix ,这里使用 表示 prefix 的索引, 表示 prefix 的长度。prefix-tuning 初始化一个前缀矩阵 ,如果索引值属于 prefix 的 ids,那就从 prefix 矩阵中拿出该 id 对应的 embedding,如果不是,那么 就是上一步计算出来的 embedding。值得注意的是,即使是第二种情况, 也是和 相关的,因为在其左侧的文本里依然存在 prefix。
确定了隐变量,其实模型的训练方式就和之前的工作一样了,只不过这里只更新 prefix 的参数。但是实际实现的时候发现直接更新 的参数非常的不稳定,因此本文采取了一种方式重参数化的方式 ,将一个较小的矩阵 参数化到 。
Experiments:简单看看实验结果,对于 table-to-text 生成的实验,使用如下三个数据集,Prefix-tuning 以较少的参数量得到了大多数 metric 上较好的性能。

值得注意的是,数据量少的时候,在初始化方面 prefix-tunning 有独到的 trick,随机初始化的性能往往不是很好,将 prefix 初始化为一些真实 word 对应的激活值会比较有效。特别是将 prefix 用一些任务相关的词的激活值进行初始化,效果最好。



Prompt Tuning

论文标题:

The Power of Scale for Parameter-Efficient Prompt Tuning


收录会议:

EMNLP 2021


论文链接:

https://arxiv.org/abs/2104.08691


本文有一个非常有意思的地方,如下图所示。prompt-tuning 作为 prompt-design 和 model tuning 之间一个折中的方法,随着模型大小的增大,一度赶上了 model tuning 的性能。使用很少的参数做 tuning 性能大大超出手工设计的  prompt。

回忆一下,第一篇文章中输入需要可学习的 embedding,输出需要任务特定的输出层,第二篇文章中 prefix 加到 transformer 的每一层,这个过程能否进一步简化呢?本文给出了答案,本文只对输入添加额外的 个可学习的 token。除此之外,本文还提出了 prompt ensembling 的方法,即为一个 task 学习多个 prompt。
同样的,本文 follow 预训练模型 text-to-text 的方法,将 中的 定义为可以表示某一类标签的 token 序列, 是输入的一系列 token,加上 prompt 和它的参数,任务又可以写为 。模型训练的时候就是最大化 的概率,但是只有 可以被更新。

Design Decisions. 三种方法进行 prompt 初始化:(i) 随机,效果一般不好。(ii) 在词表中找几个,让 prompt 的参数接近真实 embedding。(iii) 根据 task 来决定,比如情感分析,我们可以将 prompt 初始化为“negative, positive, happy”等。

这里比较有意思的实验是关于 zero-shot learning 的,本文有个观点:因为我们限制了模型参数不被调整,prompt-tuning 阻止模型对数据集进行过拟合,毕竟几个 prompt 并不是 over-parameterized 的,所以 prompt-tuning 也许对domain shift 更加鲁棒。

文章在一个 source domain 上训练出 prompt,然后将他直接用于 target 数据集进行 evaluation。结果如下所示,prompt-tuning 显示出了比 model fine-tuneing 更鲁棒的结果。


Frozen
论文标题:
Multimodal Few-Shot Learning with Frozen Language Models


论文链接:
https://arxiv.org/abs/2106.13884

prefix 或 prompt 已在文本领域“势不可挡”,那能不能将其应用到多模态领域呢?

本文提出一种叫做“Frozen”的模型结构,它的主要思想是:利用图像编码器把图像作为一种动态的 prefix,与文本一起送入 LM 中,从而更好地获得 LM 中的先验知识,此外,为了将 LM 中的知识迁移到多模态领域,在训练时选择冻结 LM 的参数,仅优化图像编码器有关参数,模型结构如下图所示:

主要包括两个部分:

  1. 预训练自回归语言模型:使用了 7billion 参数 transformer 模型,在公开数据集 C4 上进行训练。

  2. 视觉编码器:以 NF-ResNet-50 为 backbone,目标是将输入的原生图像转化为连续的序列,以便与文本一起送入语言模型中。
视觉前缀的构造方式:将视觉编码器的输出映射为 的矩阵, 为嵌入维度, 可以看作 token 的个数,经过测试, 时效果最佳。

训练过程稍微有点特殊,训练时统一使用 Conceptual Captions 作为训练集,Conceptual Captions 的输入是一张图片,输出是关于此图片的描述,所以在训练时语言模型是在做生成任务。训练时还固定了 LM 的所有参数,仅优化视觉编码器的参数。这是因为 few-shot 场景下数据较少,若不固定 LM 的话,反而会破坏 LM 原有的信息,甚至使模型产生灾难性遗忘。

训练时的输入是形如(image, text)的一堆 pair,但是 few-shot 场景下可能会输入多个(image, text)pair,所以在位置编码上使用了相对位置编码,从而保证 image 相对于 text 是在其前面的。

总的来说 本文将文本中的 Prefix 应用到了图片、文本多模态领域,将图片作为 prefix,与文本一起送入语言模型中,利用 Image Caption 数据集训练了一个生成式语言模型。在 VQA、OKVQA、miniImageNet 等多个数据集验证了迁移学习的效果,在 few-shot 场景下验证了 prefix 对模型的提升。

通过将图片作为prefix,从而将文本中的静态 prefix 转化为动态 prefix,能更好的适应不同的任务。但是,由于 Visiual Encoder 和文本的处理比较简单,模型效果离 SOTA 有一定的距离。



Conclusion

总的来说,discrete prompt 和 continuous prompt 各有优劣,discrete 学到的 prompt 自然带有解释性,但是离散的 token 本身就比较难优化,目前的方法也是近似的挑选而已。continuous prompt 最近的结果表现得更好,不需要考虑映射回离散的词空间,有更大的自由度。这部分也能和 CV,多模态更紧密地结合。


参考文献

[1] https://arxiv.org/abs/2107.13586



更多阅读




#投 稿 通 道#

 让你的文字被更多人看到 



如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 


PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。


📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算


📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿


△长按添加PaperWeekly小编




🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧



·

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存