PEFT documentation

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

P-tuning

Prompt tokens can be inserted anywhere in the input sequence, and they are optimized by a prompt encoder (image source).

P-tuning est conçu pour les tâches de compréhension du langage naturel (NLU) et tous les modèles de langage.

L'abstract de l'article est :

Bien que les GPT entraînés par fine-tuning traditionnel échouent à obtenir de bons résultats en compréhension du langage naturel (NLU), nous montrons que les GPT peuvent surpasser ou égaler des BERT de taille comparable sur les tâches de NLU grâce à une méthode novatrice, P-tuning, qui utilise des embeddings de prompts continus entraînables. Sur le benchmark de sondage de connaissances (LAMA), le meilleur GPT récupère 64\% (P@1) des connaissances du monde sans aucun texte supplémentaire fourni au moment du test, améliorant ainsi le meilleur résultat précédent de plus de 20 points de pourcentage. Sur le benchmark SuperGlue, les GPT atteignent des performances comparables, et parfois supérieures, à celles de BERT de taille comparable en apprentissage supervisé. Il est important de noter que nous constatons que P-tuning améliore également les performances des BERT dans les configurations few-shot et supervisées, tout en réduisant considérablement le besoin d’ingénierie de prompts. Par conséquent, P-tuning surpasse les approches de l’état de l’art sur le benchmark SuperGlue few-shot..

La méthode ajoute des embeddings de prompt entraînables à l'entrée, qui sont optimisés par un encodeur de prompt pour trouver un prompt plus performant, éliminant ainsi le besoin de concevoir manuellement des prompts. Les jetons de prompt peuvent être ajoutés n'importe où dans la séquence d'entrée, et p-tuning introduit également des jetons d'ancrage pour améliorer les performances. Un encodeur de prompt (un réseau à mémoire à long et court terme bidirectionnel ou LSTM) est utilisé pour optimiser les paramètres du prompt. Contrairement au prefix tuning :

  • les jetons du prompt peuvent être insérés n’importe où dans la séquence d’entrée, et ne sont pas limités au début uniquement
  • les jetons du prompt ne sont ajoutés qu'à l'entrée, au lieu d'être ajoutés à chaque couche du modèle
  • l'introduction de jetons anchor peut améliorer les performances car ils indiquent les caractéristiques d'un composant dans la séquence d'entrée

Les résultats de l’article suggèrent que le P-tuning est plus efficace que la création manuelle de prompts, et qu’il permet aux modèles de type GPT de rivaliser avec les modèles de type BERT sur les tâches de NLU.

Utilisation

Créez un PromptEncoderConfig avec le type de tâche, le nombre de jetons virtuels à ajouter et à apprendre, ainsi que la taille cachée de l'encodeur pour l'apprentissage des paramètres du prompt.

from peft import PromptEncoderConfig, get_peft_model

peft_config = PromptEncoderConfig(task_type="CAUSAL_LM", num_virtual_tokens=20, encoder_hidden_size=128)
model = get_peft_model(model, peft_config)
model.print_healthcheck()

Aperçu des benchmarks

API

PromptEncoderConfig

classe peft.PromptEncoderConfig

< >

( 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]] = Noneencoder_reparameterization_type: str | peft.tuners.p_tuning.config.PromptEncoderReparameterizationType = <PromptEncoderReparameterizationType.MLP: 'MLP'>encoder_hidden_size: int = Noneencoder_num_layers: int = 2encoder_dropout: float = 0.0 )

Paramètres

  • encoder_reparameterization_type (Union[PromptEncoderReparameterizationType, str]) — Le type de reparamétrisation à utiliser.
  • encoder_hidden_size (int) — La taille cachée de l'encodeur de prompt.
  • encoder_num_layers (int) — Le nombre de couches de l'encodeur de prompt.
  • encoder_dropout (float) — Probabilité de dropout de l'encodeur de prompt.

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

PromptEncoder

classe peft.PromptEncoder

< >

( config )

Paramètres

Le réseau d'encodeur de prompt utilisé pour générer les embeddings de jetons virtuels pour p-tuning.

Exemple :

>>> from peft import PromptEncoder, PromptEncoderConfig

>>> config = PromptEncoderConfig(
...     peft_type="P_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,
...     encoder_reparameterization_type="MLP",
...     encoder_hidden_size=768,
... )

>>> prompt_encoder = PromptEncoder(config)

Attributs :

  • embedding (torch.nn.Embedding) — La couche d'embedding de l'encodeur de prompt.
  • mlp_head (torch.nn.Sequential) — La tête MLP de l'encodeur de prompt si inference_mode=False.
  • lstm_head (torch.nn.LSTM) — La tête LSTM de l'encodeur de prompt si inference_mode=False et encoder_reparameterization_type="LSTM".
  • token_dim (int) — La dimension d'incorporation cachée du modèle de base transformer.
  • input_size (int) — La taille d'entrée de l'encodeur de prompt.
  • output_size (int) — La taille de sortie de l'encodeur de prompt.
  • hidden_size (int) — La taille cachée de l'encodeur de prompt.
  • total_virtual_tokens (int) : Le nombre total de jetons virtuels de l'encodeur de prompt.
  • encoder_type (Union[PromptEncoderReparameterizationType, str]) : Le type d'encodeur de l'encodeur de prompt.

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

Forme de sortie : (batch_size, total_virtual_tokens, token_dim)

Update on GitHub