PEFT 文档
软提示
并获得增强的文档体验
开始使用
软提示
训练大型预训练语言模型非常耗时且计算密集。随着模型规模的持续增长,人们对更高效的训练方法越来越感兴趣,例如*提示(prompting)*。提示通过包含描述任务甚至演示任务示例的文本提示,来为一个特定的下游任务启动一个冻结的预训练模型。通过提示,你可以避免为每个下游任务完整地训练一个单独的模型,而是使用同一个冻结的预训练模型。这要容易得多,因为你可以将同一个模型用于几个不同的任务,而且训练和存储一小组提示参数比训练模型的所有参数要高效得多。
提示方法分为两类:
- 硬提示是手动精心设计的文本提示,包含离散的输入词元;缺点是创建一个好的提示需要花费大量精力。
- 软提示是与输入嵌入连接的可学习张量,可以针对数据集进行优化;缺点是它们不具备人类可读性,因为你没有将这些“虚拟词元”与真实单词的嵌入相匹配。
本概念指南简要概述了 🤗 PEFT 中包含的软提示方法:提示调优(prompt tuning)、前缀调优(prefix tuning)、P-tuning 和多任务提示调优(multitask prompt tuning)。
提示调优

提示调优是为 T5 模型上的文本分类任务开发的,所有下游任务都被视为文本生成任务。例如,序列分类通常为一段文本序列分配一个单一的类别标签。通过将其视为文本生成任务,构成类别标签的词元会被*生成*出来。提示作为一系列词元被添加到输入中。通常,模型参数是固定的,这意味着提示词元也受模型参数的固定。
提示调优的关键思想是提示词元拥有自己独立更新的参数。这意味着你可以保持预训练模型的参数冻结,只更新提示词元嵌入的梯度。结果与训练整个模型的传统方法相当,并且随着模型规模的增加,提示调优的性能也会提升。
请参阅因果语言模型的提示调优,了解如何使用提示调优训练模型的分步指南。
前缀调优

前缀调优是为 GPT 模型上的自然语言生成 (NLG) 任务设计的。它与提示调优非常相似;前缀调优也在输入前添加一系列特定于任务的向量,这些向量可以被训练和更新,同时保持预训练模型其余参数的冻结。
主要区别在于,前缀参数被插入到模型的**所有**层中,而提示调优仅将提示参数添加到模型的输入嵌入中。此外,前缀参数由一个单独的前馈网络 (FFN) 进行优化,而不是直接在软提示上训练,因为直接训练会导致不稳定并损害性能。在更新软提示后,该 FFN 会被丢弃。
结果,作者发现前缀调优的性能与完全微调模型相当,尽管其参数数量少了 1000 倍,并且在低数据量的情况下表现更好。
请参阅条件生成的前缀调优,了解如何使用前缀调优训练模型的分步指南。
P-tuning

P-tuning 专为自然语言理解 (NLU) 任务和所有语言模型设计。它是软提示方法的另一个变体;P-tuning 也添加了一个可训练的嵌入张量,可以通过优化找到更好的提示,并使用提示编码器(一个双向长短期记忆网络或 LSTM)来优化提示参数。然而,与前缀调优不同的是:
- 提示词元可以插入到输入序列的任何位置,而不仅限于开头。
- 提示词元仅添加到输入中,而不是添加到模型的每一层。
- 引入*锚点*词元可以提高性能,因为它们能指示输入序列中某个组件的特征。
结果表明,P-tuning 比手动设计提示更高效,并使类 GPT 模型在 NLU 任务上能够与类 BERT 模型竞争。
请参阅序列分类的 P-tuning,了解如何使用 P-tuning 训练模型的分步指南。
多任务提示调优

多任务提示调优 (MPT) 从数据中为多种任务类型学习一个单一的提示,该提示可以为不同的目标任务共享。其他现有方法为每个任务学习一个单独的软提示,这些提示需要被检索或聚合以适应目标任务。MPT 包括两个阶段:
- 源训练 - 对于每个任务,其软提示被分解为特定于任务的向量。这些特定于任务的向量相乘以形成另一个矩阵 W,然后使用哈达玛积在 W 和一个共享的提示矩阵 P 之间生成一个特定于任务的提示矩阵。特定于任务的提示被提炼成一个在所有任务间共享的单一提示矩阵。这个提示通过多任务训练进行训练。
- 目标适应 - 为了使单一提示适应目标任务,一个目标提示被初始化并表示为共享提示矩阵和特定于任务的低秩提示矩阵的哈达玛积。

情境感知提示调优 (CPT)

情境感知提示调优 (CPT) 旨在通过仅优化上下文嵌入来增强少样本分类。这种方法结合了上下文学习 (ICL)、提示调优 (PT) 和对抗性优化的思想,专注于使模型适应既参数高效又有效。在 CPT 中,只有特定的上下文词元嵌入被优化,而模型的其余部分保持冻结。为了防止过拟合和保持稳定性,CPT 使用受控扰动来将上下文嵌入的允许变化限制在预定义范围内。此外,为了解决新近偏见现象——即上下文末尾的示例往往比早期的示例更受重视——CPT 应用了一个衰减损失因子。
请参阅示例,了解如何使用 CPT 训练模型的分步指南。
< > 在 GitHub 上更新