PEFT documentation
Prompt tuning
Prompt tuning

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
< 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 )
Paramètres
- prompt_tuning_init (Union[
PromptTuningInit,str]) — L’initialisation de l’embedding du prompt.TEXTinitialisera avec votre texte.SAMPLE_VOCABinitialisera avec des jetons échantillonnés aléatoirement dans le vocabulaire du modèle.RANDOMinitialisera 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 siprompt_tuning_initestTEXT. - tokenizer_name_or_path (
str, facultatif) — Le nom ou le chemin du tokenizer. Utilisé uniquement siprompt_tuning_initestTEXT. - tokenizer_kwargs (
dict, facultatif) — Les arguments par mot-clé à passer àAutoTokenizer.from_pretrained. Utilisé uniquement siprompt_tuning_initestTEXT.
Ceci est la classe de configuration destinée à stocker la configuration d'un PromptEmbedding.
PromptEmbedding
classe peft.PromptEmbedding
< source >( 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)