PEFT documentation
Prompt tuning
Prompt tuning

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
< 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 )
Параметры
- 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
< source >( 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)