PEFT documentation

Ajuste de prompts

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

Ajuste de prompts

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

Prompt tuning añade un prompt virtual específico de la tarea a la entrada, que consiste en vectores entrenables en el espacio de embeddings. Los parámetros de los tokens virtuales se actualizan de forma independiente a los parámetros del modelo preentrenado, que permanecen congelados.

El resumen del artículo es:

En este trabajo, exploramos el “prompt tuning”, un mecanismo simple pero efectivo para aprender “soft prompts” que condicionan modelos de lenguaje congelados para que realicen tareas específicas de bajo nivel. A diferencia de los prompts de texto discreto utilizados por GPT-3, los soft prompts se aprenden mediante retropropagación y pueden ajustarse para incorporar señales de cualquier número de ejemplos etiquetados. Nuestro enfoque de aprendizaje de extremo a extremo supera con un amplio margen el aprendizaje “few-shot” de GPT-3. Aún más notablemente, mediante abstracciones sobre el tamaño del modelo utilizando T5, demostramos que el prompt tuning se vuelve más competitivo a medida que aumenta la escala: a medida que los modelos superan los miles de millones de parámetros, nuestro método “cierra la brecha” y iguala el fuerte rendimiento del model tuning (donde se ajustan todos los pesos del modelo). Este hallazgo es especialmente relevante dado que los modelos grandes son costosos de compartir y servir, y la capacidad de reutilizar un modelo congelado para múltiples tareas de bajo nivel puede aliviar esta carga. Nuestro método puede verse como una simplificación del “prefix tuning” propuesto recientemente por Li y Liang (2021), y proporcionamos una comparación con este y otros enfoques similares. Finalmente, demostramos que condicionar un modelo congelado con soft prompts confiere beneficios en la robustez ante la transferencia de dominio, en comparación con el model tuning completo.

A diferencia de prefix tuning, solo la entrada de la primera capa recibe los tokens virtuales.

Uso

Hay dos decisiones que tomar: cuántos tokens virtuales se añaden a la entrada del modelo (num_virtual_tokens) - esto definirá cuántos parámetros entrenables habrá - y cómo se inicializan estos tokens.

Cree una PromptTuningConfig con el tipo de tarea, el texto de prompt tuning inicial para entrenar el modelo, el número de tokens virtuales a añadir y aprender, y 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()

Resumen de las pruebas de rendimiento

API

PromptTuningConfig

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

Parámetros

  • prompt_tuning_init (Union[PromptTuningInit, str]) — La inicialización del embedding del prompt. TEXT lo inicializará con tu texto. SAMPLE_VOCAB lo inicializará con tokens muestreados aleatoriamente del vocabulario del modelo. RANDOM lo inicializará con tokens continuos y suaves muestreados aleatoriamente (advertencia: los tokens suaves muestreados pueden quedar fuera de la variedad del embedding)
  • prompt_tuning_init_text (str, opcional) — El texto para inicializar la incrustación del prompt. Solo se utiliza si prompt_tuning_init es TEXT.
  • tokenizer_name_or_path (str, opcional) — El nombre o la ruta del tokenizer. Solo se utiliza si prompt_tuning_init es TEXT.
  • tokenizer_kwargs (dict, opcional) — Los argumentos de palabra clave para pasar a AutoTokenizer.from_pretrained. Solo se usa si prompt_tuning_init es TEXT.

Esta es la clase de configuración para almacenar la configuración de un PromptEmbedding.

PromptEmbedding

clase peft.PromptEmbedding

< >

( configword_embeddings )

Parámetros

  • config (PromptTuningConfig) — La configuración del embedding de prompt.
  • word_embeddings (torch.nn.Module) — Las incrustaciones de palabras del modelo transformer base.

El modelo para codificar tokens virtuales en embeddings de prompt.

Atributos:

  • embedding (torch.nn.Embedding) — La capa de embedding del embedding del prompt.

Ejemplo:

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

Forma de entrada: (batch_size, total_virtual_tokens)

Forma de salida: (batch_size, total_virtual_tokens, token_dim)

Update on GitHub