首先我们需要了解什么是预训练语言模型,以及其带来的Pretrain + Fine-tuning 的范式。如果不了解的同学,可以参考我关于BERT的文章。
在很长的一段时间内,NLP的任务采用的都是 Pretrain + Fine-tuning(Model Tuning)的解决方案,但是这种方案,需要对于每个任务都重新 fine-tune 一个新的模型,且不能共用。但是对于一个预训练的大语言模型来说,这就仿佛好像是对于每个任务都进行了定制化,十分不高效。是否存在一种方式,可以将预训练语言模型作为电源,不同的任务当作电器,仅需要根据不同的电器(任务),选择不同的插座,对于模型来说,即插入不同的任务特定的参数,就可以使得模型适配该下游任务。Prompt Learning 就是这个适配器,它能高效得进行预训练语言模型的使用。
这种方式大大地提升了预训练模型的使用效率,如下图:
所以什么是 Prompt
, 字面上来讲,Prompt 就是提示:
例如我们有人忘记了某个事情,我们给予特定的提示,他就可以想起来,例如我们说:
白日依山尽,
大家自然而然地会想起来下一句诗:黄河入海流。
亦或者,搜索引擎,可以根据我们的输入,进行输出的提示:
那么在NLP中 Prompt
代表的是什么呢?
例如,下图的BERT/BART/ERNIE 均为预训练语言模型,对于人类提出的问题,以及线索,预训练语言模型可以给出正确的答案。
TL;DR:
的提示,BART知道人类想要问的是文章的摘要Prompt 更严谨的定义如下:
Prompt is the technique of making better use of the knowledge from the pre-trained model by adding additional texts to the input.
Prompt 是一种为了更好的使用预训练语言模型的知识,采用在输入段添加额外的文本的技术。
Prompt 的工作流包含以下4部分:
具体的步骤如下图,我们将一步步进行拆解分析。
首先我们需要构建一个模版Template,模版的作用是将输入和输出进行重新构造,变成一个新的带有mask slots的文本,具体如下:
例如:
对于我们构造的prompt,我们需要知道我们的预测词和我们的label 之间的关系,并且我们也不可能运行z是任意词,这边我们就需要一个映射函数(mapping function)将输出的词与label进行映射。例如我们的这个例子,输出的label 有两个,一个是 ,一个是 ,我们可以限定,如果预测词是fantastic
则对应 ,如果是 boring
则对应 .
到了这边我们就只需要选择合适的预训练语言模型,然后进行mask slots [z] 的预测。例如下图,得到了结果 fantastic
, 我们需要将其代入[z] 中。
第四步骤,对于得到的 answer
,我们需要使用 Verbalizer
将其映射回原本的label。
例如:fantastic 映射回 label:
在知乎中有个提问:
现代的deep learning 就是为了规避 feature engineering,可是prompt 这边选择了template和answer不还是 feature engineering吗?
从这个问题中我们可以发现,确实如果使用BERT的 fine-tuning 范式(下图左),我们是不需要使用任何的人工特征构造,而使用prompt-based的方法的话,需要人工参与的部分包含了以下部分:
下面我们会先进行每个需要人工engineering 的部分进行详细讲解,然后再分析为什么我们还需要prompt 这种范式。
如何构造合适的Prompt 模版?对于同一个任务,不同的人可能构造不同的Template。
且每个模版都具有合理性。Tempalte的选择,对于Prompt任务起到了很重大的作用,就算一个word的区别,也坑导致10几个点的效果差别,论文GPT Understands, Too 给出了如下的结果:
对于不同的template,可以从以下两种角度进行区分:
具体的思维导图如下:
在给定一个任务或者Prompt,如何对 label 空间 和 answer 空间进行映射?
在上图,我们的label 空间 � 是: Positive, Negative
, 答案空间 � 可以是表示positive或者negative 的词,例如 Interesting/Fantastic/Happy/Boring/1-Star/Bad
,具体的答案空间 �的选择范围可以由我们指定。我们可以指定一个 � 对应1-N个字符/词。
具体的答案空间的选择可以有以下三个分类标注:
具体的思维导图如下:
Pre-trained Model Choice(预训练模型选择)
在定义完模版以及答案空间后,我们需要选择合适的预训练语言模型对 prompt 进行预测,如何选择一个合适的预训练语言模型也是需要人工经验判别的。
具体的预训练语言模型分类可以分为如下5类,具体参考:Huggingface Summary of the models
基于此,例如下图想要做summary 任务,我们可以选择更合适的 BART 模型。
其他分类标准也可参考:
如何对已有的 Prompt 进行任务增强以及拓展,具体可以从以下几个方面进行探讨:
具体的思维导图如下:
Prompt-based 模型在训练中,有多种训练策略,可以选择哪些模型部分训练,哪些不训练。
可以根据训练数据的多少分为:
也可以根据不同的参数更新的部分,对于prompt-based 的模型,主要分为两大块
一个是预训练模型,一个是 Prompts 参数。
这两个部分,都可以独立选择参数训练选择。
对于
这些训练策略均可以两两组合,下面举例说明:
如果只有预训练语言模型,没有prompts,然后fine-tuning,即是bert 的常规使用。
如果使用精调预训练语言模型+连续训练好的固定prompts,就是 BERT + Transferred Continuous Prompt for text classification
如果使用精调预训练语言模型+可训练的prompts,就是 BERT + Continuous Prompt for text classification
如果使用固定预训练语言模型无prompt,只是插入task-specific模块到预训练语言模型中,就是BERT + Adapter for text classification
如果使用固定预训练语言模型和离散固定的prompt,就是GPT3 + Discrete Prompts for Machine Translation
如果使用固定预训练语言模型和连续固定的prompt,就是 GPT3 + Continuous Prompts for Machine Translation
如果使用固定预训练语言模型和可训练的prompt,就是 BART + Continuous Prompts for Machine Translation
对于不同的策略,需要进行不同的选择,我们往往需要考虑以下两点:
而只有像GPT-3 这种超大的语言模型的时候,我们才能直接使用,不需要任何的fine-tuning.
Prompt Learning 的优势有哪些呢?我们可以从四个角度进行分析。
Prompting 方法是现在NLP的第四范式。其中现在NLP的发展史包含
我们可以发现,在四个范式中,预训练语言模型,和下游任务之间的距离,变得越来越近,直到最后Prompt Learning是直接完全利用LM的能力。
Prompt 可以作为连接多模态的一个契机,例如 CLIP 模型,连接了文本和图片。相信在未来,可以连接声音和视频,这是一个广大的待探索的领域。
原文:https://zhuanlan.zhihu.com/p/442486331
既然来了,说些什么?