PEFT documentation
P-tuning
P-tuning

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
< 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]] = 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
< source >( config )
Параметры
- config (PromptEncoderConfig) — конфигурация промпт-энкодера.
Сеть кодировщика промпта, используемая для генерации эмбеддингов виртуальных токенов для 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)