在简明扼要:红到发紫的prompt是什么?中笔者从四大范式的发展入手简单介绍了Prompt的思想,并在OpenPrompt工具包如何使用?–【踩坑记录】中记录了使用OpenPrompt的细节,这篇文章笔者想要介绍一些Prompt的细节~
目录
- Prompt预测步骤与数学描述
-
- step1: Prompt Addition
- step2: Answer Search
- step3: Answer Mapping
- Prompt 难题
- Prompt 研究重点
-
- 1. Pre-trained Models :如何选择语言模型?
- 2. Prompt Enginering :如何构造模板?
-
- 3. Answer Engineering :答案如何映射到标签?
-
- 4. Multi-Prompt Engineering :如何设计多个 prompt 获得更好的效果?
- 5. Prompt-based Training Strategies :模型参数如何训练?
- 总结
Prompt预测步骤与数学描述
step1: Prompt Addition
这个步骤要完成两件事情:
- 选择一个模板,这个模板中要有两个空,一个空[x]用来填入输入的句子,另一个空[Z]为将来的预测结果。
- 在[x]中填入输入的字符串。
下图中最下面一行就是X’
step2: Answer Search
将X’输入语言模型,得到“最高分”输出
step3: Answer Mapping
LM得到的输出,可能与下游任务需要的输出标签不一致,比如在下面这个例子中说LM的最高分输出为【很】,应该对应下游任务的输出标签【正向】。将LM输出映射为输出标签的过程就是answer mapping
函数形式表达为:
这里的map函数也别称为Verbalizer
Prompt 难题
对应prompt的三个步骤,需要解决以下三个问题:
- 输入端:怎么样选取合适的Prompt,适配不同任务,同时把模型潜能激发出来(怎么 把Prompt结合输入的句子构成模型的输入)
- 训练:怎样利用Prompt机制精调模型
- 输出端:模型的输出( Answer)可能与标签不同,拿到answer后如何往标准化的Y(标签空间)映射
Prompt 研究重点
1. Pre-trained Models :如何选择语言模型?
如何选择语言模型在第三范式时就已经是一个重要的问题了。语言模型可以分为从左至右的语言模型和双向的语言模型。
- Left-to-Right LM:从左至右的语言模型,是一种自回归模型,具有从左到右的顺序性,比如:“This is a good movie” good出现的概率与前面出现的单词有关。
- Bidirectional LM:双向的语言模型,用上下文来预测mask的值。比如 “This is a [mask] movie” ,mask的预测与整个句子都有关。
如果下游任务是翻译, 比如说 “ 好好学习,翻译成英文是:____” 需要预测的位置总在最右边,这就比较适合于 Left-to-Right的语言模型。如果下游任务是完形填空,比如说 “ 我去了北京?__ 我去了上海” 需要预测的位置在中间,与上下文都有关系,就应该选择一个双向的语言模型。
2. Prompt Enginering :如何构造模板?
在这一步中,首先需要考虑prompt的形式,然后决定采用手动还是自动的方式来创建Prompt。
prompt形式
有两种:
- 完形填空 cloze prompt : 用在如BERT-MLM式预训练模型上。如:「这个饼不错 ],太 [Z] 了。Z一般在句中
- 前缀提示 prefix prompt :用在如GPT2-3单向LM预训练模型上。如:「好好学习」,翻译成英文:[Z]一般在句末
选择哪种prompt 取决于任务和用于解决任务的模型。
- 对于有关生成的任务或使用标准自回归 LM 解决的任务,前缀 prompt 往往更有帮助,因为它们与模型从左到右的性质刚好吻合
- 对于使用掩码 (Mask) LM 解决的任务则完形填空 prompt合适,因为它们与预训练任务的形式非常匹配
- 全文本重建模型则可以与完形填空 prompt 或前缀 prompt 一起使用。
prompt创建方式
- 手工模板创建
- 手工制作模板的策略很直观,且可以在一定程度上准确地解决各种任务,但方法也存在一些问题:创建和对这些 prompt 进行实验需要大量的时间和经验,特别是对于一些复杂的任务,例如语义解析等即使是经验丰富的 prompt 设计者可能也无法手工发现最佳的prompt
- 自动化模板创建
- 自动化搜索的 prompt 可以进一步被分为离散 prompt(其中prompt 是一个实际的文本字符串)和连续 prompt(其中 prompt 直接在底层LM 的嵌入空间中进行描述。
3. Answer Engineering :答案如何映射到标签?
Answer 工程的目的是搜索一个 answer 空间 Z 和一个到原始输出 Y 的映射,从而得到一个有效的预测模型。需考虑的两个维度:确定 answer 形式和选择 answer 设计方法。
answer 形式
answer 的形式决定了它的粒度,一些常见的选择包括:
- Token:预训练 LM 词汇表中的一个 token,或者词汇子集;
- Span:短的 multi-token span,这些通常与 cloze prompt 一起使用;
- 句子或文档:这些通常与前缀 prompt 一起使用。
补充:token是分词后的基本单元,“我很开心”分词为“我,很,开心”,这里就是三个token。span是一个范围,可以是一个或多个token组成。下图中的开心就是由span表示的。
比较好理解的是,对于机器翻译这样的任务,比较适合用句子来描述答案,对于分类任务,比较适合和用span或者token来描述答案。
answer 设计方法
下一个需要回答的问题是,如果答案不用作最终输出,如何设计适当的答案空间Z,以及如何映射到输出空间Y。也就是将下图中的“很”映射为“正向”,不映射为“负向”。有两种创建方式:手动创建 answer 和自动搜索answer
4. Multi-Prompt Engineering :如何设计多个 prompt 获得更好的效果?
前面探讨的 prompt 工程方法主要集中于为输入构建单个 prompt。大量的研究表明,多重 prompt 可以进一步提升 prompting 方法的效果。常见的方法:
- prompt ensembling:集成学习,把多个prompt通过某种加权方法组合到一起。如图(a)
- prompt augmentation:启发式学习。对 prompt 进行数据增强。如图(b)
- prompt composition:将复合的prompt句子,拆解成多个小段prompt,最后再组合在一起训练。如图(C)
- prompt decomposition:由于一些任务的mask工作使用句子数量有限(如词性标注任务)固只能通过decomposition将一个句子拆分成多个部分后,再对每个部分做prompt单独训练。如图(D)
5. Prompt-based Training Strategies :模型参数如何训练?
在上一篇博客解释“为什么Prompt最大的优点是适用于零样本学习”时,已经提到了模型训练参数的问题,在这一部分我们再详细展开来看一下每一种策略的优缺点。
在基于Prompt的下游任务学习中,通常存在两种类型的参数,即来自预训练模型的参数和Prompt的参数。根据(i) 底层LM的参数(LM params)是否被调优,(ii)是否有额外的与Prompt相关的参数(Additional),(iii)如果有额外的与提示相关的参数,这些参数是否被调优,总结了5种调优策略(如下图所示)。
- Prompt less Fine-tuning:直接使用下游任务进行训练,不用prompt,更新预训练参数;优点:简单,不需要设计prompt;缺点:小数据集上容易过拟合或者不稳定
- Tuning-free Prompting:基于prompt直接生成答案,无需调参。优点:简单高效;缺点:需要较重的prompt设计
- Fixed-LM Prompt Tuning:固定预训练参数,调整prompt参数,使下游任务更好作
用于prompt的产生;优点:适合小样本学习;缺点:不适合零样本学习,prompt模版通常不再是人工设计的
- Fixed-Prompt LM Tunin:固定prompt参数,调整预训练参数
- Prompt+LM Fine-tuning:调整prompt参数,调整预训练参数。适合大数据集,小数据集易过拟合
总结
简要介绍Prompt
OpenPrompt工具demo实现
加上本篇文章,笔者分别用三篇博客完成了下面这些内容的介绍,希望有所帮助。
参考:
国科大胡玥老师自然语言处理课件
https://mp.weixin.qq.com/s/vyKCCjAEbuOxpKOd6zhz3w