CMU 博士后研究员刘鹏飞:近代自然语言处理技术发展的第四范式可能是预训练语言模型加持下的 Prompt Learning。
近几年,NLP 技术发展迅猛,特别是 BERT 的出现,开启了 NLP 领域新一轮的发展。从 BERT 开始,对预训练模型进行 finetune 已经成为了整个领域的常规范式。但是从 GPT-3 开始,一种新的范式开始引起大家的关注并越来越流行:prompting。近段时间以来,我们可以看到大量有关 prompting 的论文出现。从清华大学开源的论文列表 thunlp / PromptPapers 中,我们可以看到大量的相关研究。项目地址:https://github.com/thunlp/PromptPapers作为一个值得关注、学习的新方向,近日来自 CMU 的博士生刘鹏飞新推出的一篇相关综述论文作为学习资源备受推崇。论文地址:https://arxiv.org/pdf/2107.13586.pdf全监督学习,即仅在目标任务的输入输出样本数据集上训练特定任务模型,长期以来在许多机器学习任务中发挥着核心作用,同样的,全监督学习在 NLP 领域也非常重要。但是全监督的数据集对于学习高质量的模型来说是不充足的,早期的 NLP 模型严重依赖特征工程。随着用于 NLP 任务的神经网络出现,使得特征学习与模型训练相结合,研究者将研究重点转向了架构工程,即通过设计一个网络架构能够学习数据特征。然而,从 2017-2019 年开始,NLP 模型发生了翻天覆地的变化,这种全监督范式发挥的作用越来越小。具体而言,研究重点开始转向预训练、微调范式。在这一范式下,一个具有固定架构的模型通过预训练作为语言模型(LM),用来预测观测到的文本数据的概率。由于训练 LM 所需的原始文本数据需要足够丰富,因此,这些 LM 都是在比较大的数据集上训练完成。之后,通过引入额外的参数,并使用特定任务的目标函数对模型进行微调,将预训练 LM 适应于不同的下游任务。在这种范式下,研究重点转向了目标工程,设计在预训练和微调阶段使用的训练目标(损失函数)。当前我们正处于第二次巨变中,「预训练、微调」过程被称为「预训练、prompt 和预测」的过程所取代。在这种范式中,不是通过目标工程使预训练的语言模型(LM)适应下游任务,而是重新形式化(Reformulate)下游任务,使其看起来更像是在文本 prompt 的帮助下在原始 LM 训练期间解决的任务。通过这种方式,选择适当的 prompt,该方法可以操纵模型的行为,以便预训练的 LM 本身可以用于预测所需的输出,有时甚至无需任何额外的特定任务训练。这种方法的优点是给定一组合适的 prompt,以完全无监督的方式训练的单个 LM 就能够用于解决大量任务。然而该方法也存在一个问题——这种方法引入了 prompt 挖掘工程的必要性,即需要找出最合适的 prompt 来让 LM 解决面临的任务。该综述研究试图通过提供 prompting 方法的概述和形式化定义,以及使用这些 prompt 的预训练语言模型的概述,来梳理这一迅速发展领域的当前知识状态。然后该论文对 prompt 方法进行了深入的讨论,包括 prompt 工程、answer 工程等基础和多 prompt 学习方法、prompt 相关的训练方法等更高级的概念。然后,该研究列出了已有的基于 prompt 学习方法的多种应用,并探讨了不同应用场景中如何选择合适的训练方法。最后,该研究尝试在研究生态系统中定位 prompt 方法的当前状态,并与其他研究领域建立联系。此外,该研究提出一些可能适合进一步研究的挑战性问题,并针对当前研究趋势进行了分析。在传统的用于 NLP 任务的监督学习系统中,输入 x 通常是文本数据,并基于模型 P(y|x; θ) 预测输出 y。但是,监督学习面临的一个主要问题是,即为了训练模型 P(y|x; θ),必须要有用于训练任务的监督数据,但找到这种适用数据是比较困难的。在 NLP 中,基于 Prompt 的学习方法试图通过学习 LM 来规避这一问题,该 LM 对文本 x 本身的概率 P(x; θ) 进行建模并使用该概率来预测 y,从而减少或消除了训练模型对大型监督数据集的需求。本节中研究者对最基本的 Prompt 形式进行了数学描述,其中包含许多有关 Prompt 的工作,并且可以扩展到其他内容。具体来说,基础 Prompt 分三步预测得分最高的 ^y,即 prompt 添加、answer 搜索和 answer 映射。下表 2 为 prompting 方法的术语和符号。下表 3 为不同任务的输入、模板和 answer 示例:现在有了 Prompting 的基本数学公式,下面详细阐述了关于 Prompting 设计考虑:预训练模型选择:有许多预训练 LM 可以用来计算 P(x; θ)。在第 3 章中,研究者对预训练 LM 进行了初步的介绍;
Prompt 工程:如果 prompt 指定了任务,那么选择正确的 prompt 不仅对准确率影响很大,而且对模型首先执行的任务也有很大影响。在第 4 章中,研究者讨论了应该选择哪个 prompt 作为 f_prompt(x) 方法;
Answer 工程:根据任务的不同,会有不同的方式设计 Z (Answer),可能会和映射函数一起使用。在第 5 章中,详细介绍了不同的设计方式;
扩展范式:如上所述, 上面的公式仅仅代表了各种底层框架中最简单的一种,这些框架已经被提议用于执行各种 prompting。在 第 6 章中,研究者讨论了扩展这种基本范式以进一步提高结果或适用性的方法;
基于 Prompt 的训练策略:在第 7 章中,研究者总结了不同的训练策略并详细说明它们的相对优势。
Prompt 工程是创建 prompting 函数 f_prompt(x) 的过程,该函数可在下游任务上获得最有效的性能。在此前的许多工作中,这涉及到 prompt 模板工程,其中人类工程师或算法需要为模型预期执行的每个任务搜索最佳模板。如图 1 的「Prompt Engineering」部分所示,首先要考虑 prompt 的形式,然后决定是采用手动还是自动的方式来创建所需形式的 prompt,具体如下:Prompt 主要有两种主要类型:填充文本字符串空白的完形填空(Cloze)prompt,和用于延续字符串前缀的前缀 (Prefix) prompt。选择哪一个取决于任务和用于解决任务的模型。一般来说,对于有关生成的任务或使用标准自回归 LM 解决的任务,前缀 prompt 往往更有帮助,因为它们与模型从左到右的性质刚好吻合。对于使用掩码 (Mask) LM 解决的任务(比如,BERT),完形填空 prompt 则非常合适,因为它们与预训练任务的形式非常匹配。全文本重建模型则可以与完形填空 prompt 或前缀 prompt 一起使用。最后,对于一些涉及多个输入的任务,例如文本对分类,prompt 模板必须包含至少两个输入的空间。创建 prompt 最自然的方式也许是基于手工创建比较直观的模板。例如, LAMA 数据集提供了手工创建的完形填空模板来探索 LM 中的知识。Brown 等在 2020 年创建了手工制作的前缀 prompt 来处理各种各样的任务,包括问答、翻译和常识推理的探索任务。虽然手工制作模板的策略很直观,并且确实可以在一定程度上准确地解决各种任务,但这种方法也存在一些问题:为了解决这些问题,很多研究提出了一些自动化模板设计过程的新方法。特别地,自动化搜索的 prompt 可以进一步被分为离散 prompt(其中 prompt 是一个实际的文本字符串)和连续 prompt(其中 prompt 直接在底层 LM 的嵌入空间中进行描述。与 prompt 工程相反,answer 工程的目的是搜索一个 answer 空间 Z 和一个到原始输出 Y 的映射,从而得到一个有效的预测模型。图 1 中的 answer 挖掘工程部分说明了在执行 answer 工程时必须考虑的两个维度:确定 answer 形式和选择 answer 设计方法。answer 的形式决定了它的粒度,一些常见的选择包括:Token:预训练 LM 词汇表中的一个 token,或者词汇子集;
Span:短的 multi-token span,这些通常与 cloze prompt 一起使用;
句子或文档:这些通常与前缀 prompt 一起使用。
如何设计适当的 answer 空间 Z,以及如果 answer 不用作最终输出,如何设计到输出空间 Y 的映射。可以采取多种策略来执行此设计。与手动创建 prompt 一样,手动创建 answer 可能不是 LM 实现理想预测性能的最佳选择。因此,有一些关于自动 answer 搜索的工作,尽管少于搜索理想 prompt 的工作,但这些方法适用于离散 answer 空间和连续 answer 空间。以上探讨的 prompt 工程方法主要集中于为输入构建单个 prompt。但是,大量的研究表明,多重 prompt 可以进一步提升 prompting 方法的效果,他们将这些方法称为 multi-prompt 学习方法。在实践中,有数种方法可以将单个 prompt 学习扩展至 multi-prompt,如下图 4 所示,这些方法包括如下:prompt 集成
prompt 增强
prompt 合成
prompt 分解
通过上文提到的方法,现在如何获得适当的 prompt 和对应的 answer 已经非常清楚了。因此下一步研究者探讨了显式训练与 prompting 方法一致的模型的方法。在很多情况下,无需对下游任务的语言模型进行任何显式训练即可使用 prompting 方法,只需采用训练用于预测文本 P(x) 出现概率的语言模型并按原样用它填充为指定任务定义的完形填空或前缀 prompt 就行了。这在传统上被称为零样本设置,因为感兴趣任务的训练数据为零。但学界依然有一些方法使用训练数据来训练与 prompting 方法一致的模型,它们包括全数据学习或少样本学习。prompting 方法在少样本学习中非常有用,因为通常没有足够的训练示例来完全指定期望的行为,因此使用 prompt 将模型推向正确的方向特别有效。在基于 prompt 的下游任务学习中,通常存在两种类型的参数,即来自预训练模型和 prompt 的参数。哪类参数应该更新是一项重要的设计决策,可以在不同场景中产生不同程度的适用性。研究者基于底层语言模型的参数是否需要调整、是否有额外的 prompt 参数和这些额外的 prompt 参数是否需要调整这三个方面总结以下 5 种调整策略,如下表 6 所示,它们分别为:Promptless Fine-tuning
Tuning-free Prompting
Fixed-LM Prompt Tuning
Fixed-prompt LM Tuning
Prompt+LM Fine-tuning
根据研究者的调研,prompt 方法在以下诸多领域具有广泛的应用:知识探索(事实探索和语言学探索)
分类任务(文本分类和自然语言推理)
信息提取(关系提取、语义分析和命名实体识别)
NLP 中的推理(常识推理和数学推理)
问答
文本生成
文本生成的自动评估
多模态学习
元应用(域自适应、除偏和数据集创建)
具体研究工作以及相应任务如下表 7 和 8 所示:研究者为不同的 prompt 应用收集了一些有用的资源,并且设计用于少样本和零样本学习的一些数据集如下表 9 所示:下表 10 展示了现有手动设计的常用 prompt,它们可以看作是适用于未来研究和应用的现成资源。研究者总结了与 prompt 相关的主题,包括集成学习、少样本学习、更大规模上下文学习、查询重构、基于问答的多任务学习、可控生成、监督注意力和数据增强。刘博士在知乎上也写了一篇文章介绍 promoting,感兴趣的同学可以浏览查看:https://zhuanlan.zhihu.com/p/395115779。 理论Prompt LearningCMU博士后研究员刘鹏飞