发布时间:2021-08-03 14:06:40来源:机器之心
机器之心报道
机器之心编辑部
CMU博士后研究员刘鹏飞:近代自然语言处理技术发展的第四范式可能是预训练语言模型加持下的PromptLearning。
近几年,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任务的神经网络出现,使得特征学习与模型训练相结合,研究者将研究重点转向了架构工程,即通过设计一个网络架构能够学习数据特征。
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方法的当前状态,并与其他研究领域建立联系。此外,该研究提出一些可能适合进一步研究的挑战性问题,并针对当前研究趋势进行了分析。
prompting的正确描述
在传统的用于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的基本数学公式,下面详细阐述了关于Prompting设计考虑:
预训练模型选择:有许多预训练LM可以用来计算P(x;θ)。在第3章中,研究者对预训练LM进行了初步的介绍;
Prompt工程:如果prompt指定了任务,那么选择正确的prompt不仅对准确率影响很大,而且对模型首先执行的任务也有很大影响。在第4章中,研究者讨论了应该选择哪个prompt作为f_prompt(x)方法;
Answer工程:根据任务的不同,会有不同的方式设计Z(Answer),可能会和映射函数一起使用。在第5章中,详细介绍了不同的设计方式;
扩展范式:如上所述,上面的公式仅仅代表了各种底层框架中最简单的一种,这些框架已经被提议用于执行各种prompting。在第6章中,研究者讨论了扩展这种基本范式以进一步提高结果或适用性的方法;
基于Prompt的训练策略:在第7章中,研究者总结了不同的训练策略并详细说明它们的相对优势。
下图1为本文结构概览:
Prompt工程
Prompt工程是创建prompting函数f_prompt(x)的过程,该函数可在下游任务上获得最有效的性能。在此前的许多工作中,这涉及到prompt模板工程,其中人类工程师或算法需要为模型预期执行的每个任务搜索最佳模板。如图1的「PromptEngineering」部分所示,首先要考虑prompt的形式,然后决定是采用手动还是自动的方式来创建所需形式的prompt,具体如下:
Prompt的形式
Prompt主要有两种主要类型:填充文本字符串空白的完形填空(Cloze)prompt,和用于延续字符串前缀的前缀(Prefix)prompt。
选择哪一个取决于任务和用于解决任务的模型。一般来说,对于有关生成的任务或使用标准自回归LM解决的任务,前缀prompt往往更有帮助,因为它们与模型从左到右的性质刚好吻合。对于使用掩码(Mask)LM解决的任务(比如,BERT),完形填空prompt则非常合适,因为它们与预训练任务的形式非常匹配。全文本重建模型则可以与完形填空prompt或前缀prompt一起使用。最后,对于一些涉及多个输入的任务,例如文本对分类,prompt模板必须包含至少两个输入的空间。
手工模板工程
创建prompt最自然的方式也许是基于手工创建比较直观的模板。例如,LAMA数据集提供了手工创建的完形填空模板来探索LM中的知识。Brown等在2020年创建了手工制作的前缀prompt来处理各种各样的任务,包括问答、翻译和常识推理的探索任务。
自动化模板学习
虽然手工制作模板的策略很直观,并且确实可以在一定程度上准确地解决各种任务,但这种方法也存在一些问题:
创建和对这些prompt进行实验需要大量的时间和经验,特别是对于一些复杂的任务,例如语义解析(Shin等,2021);
即使是经验丰富的prompt设计者可能也无法手工发现最佳的prompt(Jiang等,2020c)。
为了解决这些问题,很多研究提出了一些自动化模板设计过程的新方法。特别地,自动化搜索的prompt可以进一步被分为离散prompt(其中prompt是一个实际的文本字符串)和连续prompt(其中prompt直接在底层LM的嵌入空间中进行描述。
answer工程
与prompt工程相反,answer工程的目的是搜索一个answer空间Z和一个到原始输出Y的映射,从而得到一个有效的预测模型。图1中的answer挖掘工程部分说明了在执行answer工程时必须考虑的两个维度:确定answer形式和选择answer设计方法。
answer形式
answer的形式决定了它的粒度,一些常见的选择包括:
Token:预训练LM词汇表中的一个token,或者词汇子集;
Span:短的multi-tokenspan,这些通常与clozeprompt一起使用;
句子或文档:这些通常与前缀prompt一起使用。
answer空间设计方法
如何设计适当的answer空间Z,以及如果answer不用作最终输出,如何设计到输出空间Y的映射。可以采取多种策略来执行此设计。
与手动创建prompt一样,手动创建answer可能不是LM实现理想预测性能的最佳选择。因此,有一些关于自动answer搜索的工作,尽管少于搜索理想prompt的工作,但这些方法适用于离散answer空间和连续answer空间。
multi-prompt学习
以上探讨的prompt工程方法主要集中于为输入构建单个prompt。但是,大量的研究表明,多重prompt可以进一步提升prompting方法的效果,他们将这些方法称为multi-prompt学习方法。在实践中,有数种方法可以将单个prompt学习扩展至multi-prompt,如下图4所示,这些方法包括如下:
prompt集成
prompt增强
prompt合成
prompt分解
prompting方法的训练策略
通过上文提到的方法,现在如何获得适当的prompt和对应的answer已经非常清楚了。因此下一步研究者探讨了显式训练与prompting方法一致的模型的方法。
训练设置
在很多情况下,无需对下游任务的语言模型进行任何显式训练即可使用prompting方法,只需采用训练用于预测文本P(x)出现概率的语言模型并按原样用它填充为指定任务定义的完形填空或前缀prompt就行了。这在传统上被称为零样本设置,因为感兴趣任务的训练数据为零。
但学界依然有一些方法使用训练数据来训练与prompting方法一致的模型,它们包括全数据学习或少样本学习。prompting方法在少样本学习中非常有用,因为通常没有足够的训练示例来完全指定期望的行为,因此使用prompt将模型推向正确的方向特别有效。
参数更新方法
在基于prompt的下游任务学习中,通常存在两种类型的参数,即来自预训练模型和prompt的参数。哪类参数应该更新是一项重要的设计决策,可以在不同场景中产生不同程度的适用性。
研究者基于底层语言模型的参数是否需要调整、是否有额外的prompt参数和这些额外的prompt参数是否需要调整这三个方面总结以下5种调整策略,如下表6所示,它们分别为:
PromptlessFine-tuning
Tuning-freePrompting
Fixed-LMPromptTuning
Fixed-promptLMTuning
Prompt+LMFine-tuning
应用
根据研究者的调研,prompt方法在以下诸多领域具有广泛的应用:
知识探索(事实探索和语言学探索)
分类任务(文本分类和自然语言推理)
信息提取(关系提取、语义分析和命名实体识别)
NLP中的推理(常识推理和数学推理)
问答
文本生成
文本生成的自动评估
多模态学习
元应用(域自适应、除偏和数据集创建)
具体研究工作以及相应任务如下表7和8所示:
研究者为不同的prompt应用收集了一些有用的资源,并且设计用于少样本和零样本学习的一些数据集如下表9所示:
下表10展示了现有手动设计的常用prompt,它们可以看作是适用于未来研究和应用的现成资源。
Prompt相关研究主题
研究者总结了与prompt相关的主题,包括集成学习、少样本学习、更大规模上下文学习、查询重构、基于问答的多任务学习、可控生成、监督注意力和数据增强。
刘博士在知乎上也写了一篇文章介绍promoting,感兴趣的同学可以浏览查看:https://zhuanlan.zhihu.com/p/395115779。
©THEEND
转载请联系本公众号获得授权
投稿或寻求报道:content@jiqizhixin.com