Prompt的目的是将Fine-tuning的下游任务目标转换为Pre-training的任务.
Prompt-Tuning起源于GPT-3的提出《Language Models are Few-Shot Learners》(NIPS2020)[3],其认为超大规模的模型只要配合好合适的模板就可以极大化地发挥其推理和理解能力。 其开创性提出 in-context learning 概念,即无须修改模型即可实现few-shot/zero-shot learning。同时引入了demonstrate learning,即让模型知道与标签相似的语义描述,提升推理能力。
Prompt本质上是对下游任务的指令,可以作为一种信息增强 。简单的来说,就是告诉模型需要做什么任务,输出什么内容。上文我们提及到的离散或连续的模板,本质上就是一种对任务的提示。当数据集不同(乃至样本不同)的时候,我们期望模型能够自适应的选择不同的模板,这也相当于说不同的任务会有其对应的提示信息。 例如在对电影评论进行二分类的时候,最简单的提示模板是“. It was [mask].”,但是其并没有突出该任务的具体特性,我们可以为其设计一个能够突出该任务特性的模板,例如“The movie review is . It was [mask].”,然后根据mask位置的输出结果通过Verbalizer映射到具体的标签上。这一类具备任务特性的模板可以称之为 指令(Instruction) 。
回顾第一节我们介绍的几个预训练语言模型,我们发现目前绝大多数的双向预训练语言模型都包含Masked Language Modeling(MLM),单向预训练语言模型都包含Autoregressive Language Modeling(ALM),这些任务是预训练目标,本质上是预测被mask的位置的词,在训练时让模型理解语言的上下文信息。之所以设计Template和指令,就是希望在下游任务时能够复用这些预训练的目标,避免引入新的参数而导致过拟合。因此,我们可以将Prompt升华到一个新的高度,即 Prompt Tuning的本质是复用预训练语言模型在预训练阶段所使用的目标和参数 。 基于Huggingface的预训练模型仓库中,我们一般称之为LMhead,本质上就是一个MLP,输入为一个大小为[batch_size, sequence_length, hidden_size]的张量,输出为[batch_size, sequence_length, vocab_size]的概率分布。 由于绝大多数的语言模型都采用MLM或ALM进行训练,所以我们现如今所看到的大多数基于Prompt的分类都要设计Template和Verbalizer。那么我们是否可以极大化地利用MLM和ALM的先验知识在不同的下游任务上获得更好的表现?是否可以设计一个全新的预训练任务来满足一些下游任务的需求呢? 我们介绍两个充分利用这个思想的方法:
参数有效性学习的背景 :在一般的计算资源条件下,大规模的模型(例如GPT-3)很难再进行微调,因为所有的参数都需要计算梯度并进行更新,消耗时间和空间资源。为了解决这个问题,参数有效性学习被提出,其旨在确保模型效果不受太大影响的条件下尽可能地提高训练的时间和空间效率。 参数有效性训练 :在参数有效性学习过程中,大模型中只需要指定或额外添加少量的可训练参数,而其余的参数全部冻结,这样可以大大提高模型的训练效率的同时,确保指标不会受到太大影响。
在BERT原文中,还添加了NSP任务,其主要目标是给定两个句子,来判断他们之间的关系,属于一种自然语言推理(NLI)任务。在NSP中则存在三种关系,分别是: