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 foi projetado para tarefas de compreensão de linguagem natural (NLU) e para todos os modelos de linguagem.

O resumo do artigo é:

Embora GPTs com ajuste fino tradicional não consigam alcançar resultados robustos em compreensão de linguagem natural (NLU), demonstramos que GPTs podem ser superiores ou comparáveis a BERTs de tamanho semelhante em tarefas de NLU com um método inovador, o P-tuning — que utiliza embeddings de prompt contínuos treináveis. No benchmark de sondagem de conhecimento (LAMA), o melhor GPT recupera 64\% (P@1) do conhecimento do mundo sem nenhum texto adicional fornecido durante o tempo de teste, o que melhora substancialmente o melhor resultado anterior em mais de 20 pontos percentuais. No benchmark SuperGlue, GPTs alcançam desempenho comparável e, às vezes, superior ao de BERTs de tamanho semelhante em aprendizado supervisionado. Importantly, descobrimos que o P-tuning também melhora o desempenho dos BERTs tanto em configurações few-shot quanto supervisionadas, reduzindo significativamente a necessidade de engenharia de prompts. Consequentemente, o P-tuning supera as abordagens state-of-the-art no benchmark few-shot SuperGlue..

O método adiciona embeddings de prompt treináveis à entrada, que são otimizados por um codificador de prompt para encontrar um prompt melhor, eliminando a necessidade de projetar prompts manualmente. Os tokens de prompt podem ser adicionados em qualquer lugar da sequência de entrada, e o p-tuning também introduz tokens de âncora para melhorar o desempenho. Um codificador de prompt (uma rede de memória de curto e longo prazo bidirecional ou LSTM) é usado para otimizar os parâmetros do prompt. Diferente do prefix tuning:

  • os tokens do prompt podem ser inseridos em qualquer posição da sequência de entrada e não são restritos apenas ao início
  • os tokens do prompt são adicionados apenas à entrada, em vez de serem adicionados a cada camada do modelo
  • a introdução de tokens âncora pode melhorar o desempenho, pois eles indicam características de um componente na sequência de entrada

Os resultados do artigo sugerem que o P-tuning é mais eficiente do que a criação manual de prompts e permite que modelos semelhantes ao GPT competam com modelos semelhantes ao BERT em tarefas de NLU.

Uso

Crie um PromptEncoderConfig com o tipo de tarefa, o número de tokens virtuais a serem adicionados e aprendidos, e o tamanho oculto do codificador para a aprendizagem dos parâmetros do 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()

Visão geral do benchmark

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 )

Parâmetros

  • encoder_reparameterization_type (Union[PromptEncoderReparameterizationType, str]) — O tipo de reparametrização a ser usado.
  • encoder_hidden_size (int) — O tamanho oculto do codificador de prompt.
  • encoder_num_layers (int) — O número de camadas do codificador de prompt.
  • encoder_dropout (float) — A probabilidade de dropout do codificador de prompt.

Esta é a classe de configuração para armazenar a configuração de um PromptEncoder.

PromptEncoder

classe peft.PromptEncoder

< >

( config )

Parâmetros

A rede de codificador de prompt usada para gerar os embeddings de tokens virtuais para p-tuning.

Exemplo:

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

Atributos:

  • embedding (torch.nn.Embedding) — A camada de embedding do codificador do prompt.
  • mlp_head (torch.nn.Sequential) — A cabeça MLP do codificador de prompt, se inference_mode=False.
  • lstm_head (torch.nn.LSTM) — A cabeça LSTM do codificador de prompt se inference_mode=False e encoder_reparameterization_type="LSTM".
  • token_dim (int) — A dimensão de incorporação oculta do modelo transformer base.
  • input_size (int) — O tamanho de entrada do codificador de prompt.
  • output_size (int) — O tamanho de saída do codificador de prompt.
  • hidden_size (int) — O tamanho oculto do codificador de prompt.
  • total_virtual_tokens (int): O número total de tokens virtuais do codificador de prompt.
  • encoder_type (Union[PromptEncoderReparameterizationType, str]): O tipo de codificador do codificador de prompt.

Formato de entrada: (batch_size, total_virtual_tokens)

Formato de saída: (batch_size, total_virtual_tokens, token_dim)

Update on GitHub