软提示
训练大型预训练语言模型非常耗时且计算密集。随着模型规模的不断增长,人们越来越关注更有效的训练方法,例如提示。提示通过包含描述任务甚至演示任务示例的文本提示来为特定下游任务准备冻结的预训练模型。使用提示,您可以避免为每个下游任务完全训练一个单独的模型,而是使用相同的冻结预训练模型。这要容易得多,因为您可以将同一个模型用于多个不同的任务,并且训练和存储较小的一组提示参数比训练模型的所有参数要有效得多。
提示方法分为两类
- 硬提示是手动制作的具有离散输入标记的文本提示;缺点是创建好的提示需要花费大量精力
- 软提示是与输入嵌入连接的可学习张量,可以针对数据集进行优化;缺点是它们不是人类可读的,因为您没有将这些“虚拟标记”与真实单词的嵌入相匹配
本概念指南简要概述了 🤗 PEFT 中包含的软提示方法:提示微调、前缀微调、P-tuning 和多任务提示微调。
提示微调 (Prompt Tuning)
仅训练和存储一组更小的特定于任务的提示参数 (图片源)。提示微调 是为 T5 模型上的文本分类任务而开发的,所有下游任务都被转换为文本生成任务。例如,序列分类通常将单个类别标签分配给一段文本序列。通过将其转换为文本生成任务,构成类别标签的标记会被生成。提示作为一系列标记添加到输入中。通常,模型参数是固定的,这意味着提示标记也由模型参数固定。
提示微调背后的关键思想是,提示标记有自己的参数,这些参数可以独立更新。这意味着您可以保持预训练模型的参数不变,并且只更新提示标记嵌入的梯度。结果与训练整个模型的传统方法相当,并且提示微调性能随着模型规模的增加而扩展。
查看 因果语言建模的提示微调,了解如何使用提示微调训练模型的分步指南。
前缀微调 (Prefix Tuning)
为每个任务优化前缀参数 (图片源)。前缀微调 是为 GPT 模型上的自然语言生成 (NLG) 任务而设计的。它与提示微调非常相似;前缀微调也将在输入前添加一系列特定于任务的向量,这些向量可以在保持预训练模型其余参数不变的情况下进行训练和更新。
主要区别在于,前缀参数被插入到所有模型层中,而提示微调仅将提示参数添加到模型输入嵌入中。前缀参数还通过一个单独的前馈网络 (FFN) 进行优化,而不是直接在软提示上进行训练,因为这会导致不稳定并损害性能。更新软提示后,FFN 会被丢弃。
因此,作者发现,尽管前缀参数的数量减少了 1000 倍,但前缀微调表现出了与完全微调模型相当的性能,并且在数据量少的情况下表现得更好。
查看 条件生成的 前缀微调,了解如何使用前缀微调训练模型的分步指南。
P-tuning
提示标记可以插入输入序列中的任何位置,并且它们由提示编码器进行优化 (图片源)。P-tuning 是为自然语言理解 (NLU) 任务和所有语言模型而设计的。它是软提示方法的另一种变体;P-tuning 还添加了一个可训练的嵌入张量,可以对其进行优化以找到更好的提示,并且它使用提示编码器(双向长短期记忆网络或 LSTM)来优化提示参数。不过,与前缀微调不同
- 提示标记可以插入输入序列中的任何位置,而不限于开头
- 提示标记仅添加到输入中,而不是添加到模型的每一层
- 引入锚点标记可以提高性能,因为它们指示输入序列中组件的特征
结果表明,P-tuning 比手动设计提示更有效,并且它使类似 GPT 的模型能够在 NLU 任务上与类似 BERT 的模型竞争。
查看 序列分类的 P-tuning,了解如何使用 P-tuning 训练模型的分步指南。
多任务提示微调 (Multitask Prompt Tuning)
多任务提示微调支持参数高效的迁移学习。.多任务提示微调 (MPT) 从多个任务类型的数据中学习单个提示,该提示可以共享给不同的目标任务。其他现有方法为每个任务学习一个单独的软提示,需要检索或聚合以适应目标任务。MPT 包含两个阶段
- 源训练 - 对于每个任务,其软提示被分解为特定于任务的向量。特定于任务的向量相乘形成另一个矩阵 W,并且在 W 和共享提示矩阵 P 之间使用哈达玛积来生成特定于任务的提示矩阵。特定于任务的提示被蒸馏成一个在所有任务中共享的单个提示矩阵。此提示使用多任务训练进行训练。
- 目标适配 - 为了将单个提示适配到目标任务,初始化目标提示并将其表示为共享提示矩阵和特定于任务的低秩提示矩阵的哈达玛积。