PEFT documentation
提示词调整
提示词调整

Prompt tuning 会在输入中添加一个任务特定的虚拟提示,该提示由嵌入空间中可训练的向量组成。虚拟 token 参数独立于预训练模型参数进行更新,而预训练模型参数保持冻结。
该论文的摘要如下:
在本工作中,我们探索了“提示微调”(prompt tuning),这是一种简单而有效的机制,用于学习“软提示”(soft prompts),以引导冻结的语言模型执行特定的下游任务。与 GPT-3 使用的离散文本提示不同,软提示通过反向传播学习,并且可以针对任意数量的带标签示例进行调优以融入信号。我们端到端的学习方法大幅优于 GPT-3 的“少样本”(few-shot)学习。更值得注意的是,通过基于 T5 的模型规模消融实验,我们表明提示微调随着规模扩大而更具竞争力:当模型参数量超过数十亿时,我们的方法“缩小了差距”,并达到了模型微调(即调优所有模型权重)的强劲性能。这一发现尤其相关,因为大型模型的共享和部署成本高昂,而能够复用一个冻结模型来处理多个下游任务可以减轻这一负担。我们的方法可以被视为对 Li 和 Liang (2021) 最近提出的“前缀微调”(prefix tuning)的简化,我们提供了该方法与其他类似方法的比较。最后,我们表明,与全模型微调相比,使用软提示对冻结模型进行条件化在领域迁移的鲁棒性方面具有优势
与前缀微调不同,只有第一层的输入会接收虚拟标记。
用法
需要做出两个决定:向模型输入添加多少个虚拟 token(num_virtual_tokens)——这将决定可训练参数的数量——以及这些 token 如何初始化。
创建一个 PromptTuningConfig,其中包含任务类型、用于训练模型的初始提示调优文本、要添加并学习的虚拟令牌数量,以及一个分词器。
from peft import PromptTuningConfig, PromptTuningInit, get_peft_model
prompt_tuning_init_text = "Classify if the tweet is a complaint or no complaint.\n"
peft_config = PromptTuningConfig(
task_type="CAUSAL_LM",
prompt_tuning_init=PromptTuningInit.TEXT,
num_virtual_tokens=len(tokenizer(prompt_tuning_init_text)["input_ids"]),
prompt_tuning_init_text=prompt_tuning_init_text,
tokenizer_name_or_path="bigscience/bloomz-560m",
)
model = get_peft_model(model, peft_config)
model.print_healthcheck()基准测试概览
API
PromptTuningConfig
类 peft.PromptTuningConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falsenum_virtual_tokens: int = Nonetoken_dim: int = Nonenum_transformer_submodules: Optional[int] = Nonenum_attention_heads: Optional[int] = Nonenum_layers: Optional[int] = Nonemodules_to_save: Optional[list[str]] = Noneprompt_tuning_init: peft.tuners.prompt_tuning.config.PromptTuningInit | str = <PromptTuningInit.RANDOM: 'RANDOM'>prompt_tuning_init_text: str | None = Nonetokenizer_name_or_path: str | None = Nonetokenizer_kwargs: dict | None = None )
参数
- prompt_tuning_init (Union[
PromptTuningInit,str]) — 提示嵌入的初始化方式。TEXT将使用您的文本进行初始化。SAMPLE_VOCAB将使用从模型词汇表中随机采样的 token 进行初始化。RANDOM将使用随机采样的连续软 token 进行初始化(警告:采样的软 token 可能落在嵌入流形之外) - prompt_tuning_init_text (
str, 可选) — 用于初始化提示嵌入的文本。仅在prompt_tuning_init为TEXT时使用。 - tokenizer_name_or_path (
str, 可选) — 分词器的名称或路径。仅在prompt_tuning_init为TEXT时使用。 - tokenizer_kwargs (
dict, 可选) — 传递给AutoTokenizer.from_pretrained的关键字参数。仅当prompt_tuning_init为TEXT时使用。
这是用于存储 PromptEmbedding 配置的类。
PromptEmbedding
类 peft.PromptEmbedding
< source >( configword_embeddings )
参数
- config (PromptTuningConfig) — 提示嵌入的配置。
- word_embeddings (
torch.nn.Module) — 基础 Transformer 模型的词嵌入。
用于将虚拟令牌编码为提示嵌入的模型。
属性:
- 嵌入 (
torch.nn.Embedding) — 提示词嵌入的嵌入层。
示例:
>>> from peft import PromptEmbedding, PromptTuningConfig
>>> config = PromptTuningConfig(
... peft_type="PROMPT_TUNING",
... task_type="SEQ_2_SEQ_LM",
... num_virtual_tokens=20,
... token_dim=768,
... num_transformer_submodules=1,
... num_attention_heads=12,
... num_layers=12,
... prompt_tuning_init="TEXT",
... prompt_tuning_init_text="Predict if sentiment of this review is positive, negative or neutral",
... tokenizer_name_or_path="t5-base",
... )
>>> # t5_model.shared is the word embeddings of the base model
>>> prompt_embedding = PromptEmbedding(config, t5_model.shared)输入形状: (batch_size, total_virtual_tokens)
输出形状: (batch_size, total_virtual_tokens, token_dim)