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 предназначен для задач понимания естественного языка (NLU) и всех языковых моделей.

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

Хотя GPT, обученные с помощью традиционной дообучения, не дают сильных результатов на задачах понимания естественного языка (NLU), мы показываем, что с помощью нового метода P-tuning, использующего обучаемые непрерывные эмбеддинги промптов, GPT могут превосходить или быть сопоставимы по качеству с BERT аналогичного размера на задачах NLU. На бенчмарке LAMA для проверки знаний лучшая GPT восстанавливает 64\% (P@1) мировых знаний без предоставления какого-либо дополнительного текста на этапе тестирования, что существенно превосходит предыдущий лучший результат более чем на 20 процентных пунктов. На бенчмарке SuperGlue GPT демонстрируют сопоставимую, а иногда и лучшую производительность по сравнению с BERT аналогичного размера в условиях обучения с учителем. Важно, что мы обнаружили, что P-tuning также улучшает производительность BERT как в few-shot, так и в условиях обучения с учителем, при этом значительно снижая необходимость в проектировании промптов. В результате P-tuning превосходит передовые подходы на few-shot бенчмарке SuperGlue..

Метод добавляет обучаемые эмбеддинги промптов к входным данным, которые оптимизируются промпт-энкодером для поиска более подходящего промпта, что исключает необходимость в ручном проектировании промптов. Токены промпта можно добавлять в любое место входной последовательности, а p-tuning также вводит якорные токены для улучшения производительности. Для оптимизации параметров промпта используется промпт-энкодер (двусторонняя сеть с долгой краткосрочной памятью или LSTM). В отличие от prefix tuning:

  • токены промпта можно вставлять в любое место входной последовательности, а не только в её начало
  • токены промпта добавляются только во вход, а не на каждый слой модели
  • введение токенов anchor может улучшить производительность, поскольку они указывают на характеристики компонента во входной последовательности

Результаты статьи показывают, что P-tuning эффективнее ручной разработки промптов и позволяет моделям типа GPT конкурировать с моделями типа BERT на задачах NLU.

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

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

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

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

API

PromptEncoderConfig

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

Параметры

  • encoder_reparameterization_type (Union[PromptEncoderReparameterizationType, str]) — Тип используемой репараметризации.
  • encoder_hidden_size (int) — Размер скрытого слоя кодировщика промпта.
  • encoder_num_layers (int) — Количество слоев кодировщика промпта.
  • encoder_dropout (float) — Вероятность dropout для кодировщика промпта.

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

PromptEncoder

класс peft.PromptEncoder

< >

( config )

Параметры

Сеть кодировщика промпта, используемая для генерации эмбеддингов виртуальных токенов для p-tuning.

Пример:

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

Атрибуты:

  • embedding (torch.nn.Embedding) — слой эмбеддингов кодировщика промпта.
  • mlp_head (torch.nn.Sequential) — MLP-головка кодировщика промпта, если inference_mode=False.
  • lstm_head (torch.nn.LSTM) — LSTM-головка кодировщика промпта, если inference_mode=False и encoder_reparameterization_type="LSTM".
  • token_dim (int) — Размерность скрытых эмбеддингов базовой трансформерной модели.
  • input_size (int) — Размер входа для кодировщика промпта.
  • output_size (int) — размер вывода кодировщика промпта.
  • hidden_size (int) — Размер скрытого слоя кодировщика промпта.
  • total_virtual_tokens (int): Общее количество виртуальных токенов кодировщика промпта.
  • encoder_type (Union[PromptEncoderReparameterizationType, str]): Тип энкодера для prompt encoder.

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

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

Update on GitHub