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 добавляет к входу виртуальный промпт, специфичный для задачи, состоящий из обучаемых векторов в пространстве эмбеддингов. Параметры виртуальных токенов обновляются независимо от параметров предобученной модели, которые остаются замороженными.

Аннотация из статьи:

В данной работе мы исследуем «prompt tuning» — простой, но эффективный механизм обучения «мягких промптов» для настройки замороженных языковых моделей на выполнение конкретных задач. В отличие от дискретных текстовых промптов, используемых в GPT-3, мягкие промпты обучаются с помощью обратного распространения ошибки и могут быть настроены так, чтобы учитывать сигналы из любого количества размеченных примеров. Наш подход, обучаемый end-to-end, значительно превосходит «few-shot» обучение GPT-3. Более того, проведя абляции по размеру модели на T5, мы показываем, что prompt tuning становится более конкурентоспособным с ростом масштаба: когда модели превышают миллиарды параметров, наш метод «сужает разрыв» и достигает уровня, сопоставимого с сильным результатом model tuning (когда настраиваются все веса модели). Это наблюдение особенно актуально, поскольку крупные модели дороги в плане распространения и обслуживания, а возможность переиспользовать одну замороженную модель для нескольких задач позволяет снизить эту нагрузку. Наш метод можно рассматривать как упрощение недавно предложенного «prefix tuning» Ли и Лианга (2021), и мы приводим сравнение с этим и другими похожими подходами. Наконец, мы показываем, что настройка замороженной модели с помощью мягких промптов обеспечивает преимущества в устойчивости к переносу в другую область по сравнению с полной настройкой модели.

В отличие от prefix tuning, виртуальные токены подаются только на вход первого слоя.

Использование

Необходимо принять два решения: сколько виртуальных токенов добавляется на вход модели (num_virtual_tokens) — это определит количество обучаемых параметров — и как эти токены инициализируются.

Создайте PromptTuningConfig с типом задачи, начальным текстом prompt tuning для обучения модели, количеством виртуальных токенов для добавления и обучения, а также токенизатором.

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

Обзор бенчмарков

API

PromptTuningConfig

класс 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 )

Параметры

  • prompt_tuning_init (Union[PromptTuningInit, str]) — Инициализация эмбеддинга промпта. TEXT инициализирует его вашим текстом. SAMPLE_VOCAB инициализирует его случайно выбранными токенами из словаря модели. RANDOM инициализирует его случайно выбранными непрерывными мягкими токенами (предупреждение: выбранные мягкие токены могут оказаться за пределами многообразия эмбеддингов)
  • prompt_tuning_init_text (str, необязательный) — Текст для инициализации эмбеддинга промпта. Используется только если prompt_tuning_init равно TEXT.
  • tokenizer_name_or_path (str, необязательный) — Имя или путь к токенизатору. Используется только в том случае, если prompt_tuning_init равно TEXT.
  • tokenizer_kwargs (dict, необязательный) — Параметры, передаваемые в AutoTokenizer.from_pretrained. Используется только если prompt_tuning_init равно TEXT.

Это класс конфигурации для хранения конфигурации PromptEmbedding.

PromptEmbedding

класс peft.PromptEmbedding

< >

( configword_embeddings )

Параметры

  • config (PromptTuningConfig) — конфигурация встраивания промпта.
  • word_embeddings (torch.nn.Module) — Векторные представления слов базовой трансформерной модели.

Модель для кодирования виртуальных токенов в эмбеддинги промпта.

Атрибуты:

  • embedding (torch.nn.Embedding) — слой эмбеддингов для эмбеддингов промпта.

Пример:

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

Форма входных данных: (batch_size, total_virtual_tokens)

Форма вывода: (batch_size, total_virtual_tokens, token_dim)

Update on GitHub