PEFT documentation

Prompt tuning

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Prompt tuning

Only train and store a significantly smaller set of task-specific prompt parameters (image source).

Prompt tuning ajoute un prompt virtuel spécifique à la tâche à l’entrée, composé de vecteurs entraînables dans l’espace des plongements. Les paramètres des jetons virtuels sont mis à jour indépendamment des paramètres du modèle pré-entraîné, qui sont gelés.

L'abstract de l'article est :

Dans ce travail, nous explorons le « prompt tuning », un mécanisme simple mais efficace pour apprendre des « soft prompts » afin de conditionner des modèles de langage figés à effectuer des tâches spécifiques en aval. Contrairement aux prompts de texte discrets utilisés par GPT-3, les soft prompts sont appris par rétropropagation et peuvent être ajustés pour intégrer le signal d’un nombre quelconque d’exemples étiquetés. Notre approche apprise de bout en bout surpasse largement l’apprentissage « few-shot » de GPT-3. Plus remarquable encore, grâce à des ablations sur la taille du modèle utilisant T5, nous montrons que le prompt tuning devient plus compétitif à mesure que l’échelle augmente : lorsque les modèles dépassent le milliard de paramètres, notre méthode « comble l’écart » et égale les fortes performances du model tuning (où tous les poids du modèle sont ajustés). Ce constat est particulièrement pertinent dans la mesure où les grands modèles sont coûteux à partager et à servir, et la capacité à réutiliser un modèle figé pour plusieurs tâches en aval peut alléger cette charge. Notre méthode peut être vue comme une simplification du « prefix tuning » récemment proposé par Li et Liang (2021), et nous fournissons une comparaison avec celui-ci et d’autres approches similaires. Enfin, nous montrons que le conditionnement d’un modèle figé par des soft prompts confère des avantages en termes de robustesse au transfert de domaine, par rapport au model tuning complet.

Contrairement au prefix tuning, seuls les entrées de la première couche reçoivent les jetons virtuels.

Utilisation

Deux décisions sont à prendre : le nombre de jetons virtuels ajoutés à l’entrée du modèle (num_virtual_tokens) — ce qui définira le nombre de paramètres entraînables — et la manière dont ces jetons sont initialisés.

Créez un PromptTuningConfig avec le type de tâche, le texte de prompt tuning initial pour entraîner le modèle, le nombre de jetons virtuels à ajouter et à apprendre, ainsi qu'un tokenizer.

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()

Aperçu des benchmarks

API

PromptTuningConfig

classe peft.PromptTuningConfig

< >

( 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 )

Paramètres

  • prompt_tuning_init (Union[PromptTuningInit, str]) — L’initialisation de l’embedding du prompt. TEXT initialisera avec votre texte. SAMPLE_VOCAB initialisera avec des jetons échantillonnés aléatoirement dans le vocabulaire du modèle. RANDOM initialisera avec des jetons continus et souples échantillonnés aléatoirement (attention : les jetons souples échantillonnés peuvent se situer en dehors de la variété d’embedding)
  • prompt_tuning_init_text (str, facultatif) — Le texte à utiliser pour initialiser l’embedding du prompt. Utilisé uniquement si prompt_tuning_init est TEXT.
  • tokenizer_name_or_path (str, facultatif) — Le nom ou le chemin du tokenizer. Utilisé uniquement si prompt_tuning_init est TEXT.
  • tokenizer_kwargs (dict, facultatif) — Les arguments par mot-clé à passer à AutoTokenizer.from_pretrained. Utilisé uniquement si prompt_tuning_init est TEXT.

Ceci est la classe de configuration destinée à stocker la configuration d'un PromptEmbedding.

PromptEmbedding

classe peft.PromptEmbedding

< >

( configword_embeddings )

Paramètres

  • config (PromptTuningConfig) — La configuration de l’embedding de prompt.
  • word_embeddings (torch.nn.Module) — Les embeddings de mots du modèle transformer de base.

Le modèle à encoder les jetons virtuels en embeddings de prompt.

Attributs :

  • embedding (torch.nn.Embedding) — La couche d'embedding de l'embedding du prompt.

Exemple :

>>> 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)

Forme de l'entrée : (batch_size, total_virtual_tokens)

Forme de la sortie : (batch_size, total_virtual_tokens, token_dim)

Update on GitHub