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はNLUタスクにおいて同規模のBERTと同等以上の性能を発揮できることを示します。知識探査(LAMA)ベンチマークでは、テスト時に追加のテキストを一切提供しない条件下で、最良のGPTが世界知識の64\%(P@1)を回復し、従来の最良結果を20ポイント以上上回りました。SuperGlueベンチマークでは、教師あり学習においてGPTは同規模のBERTと同等、場合によってはそれ以上の性能を達成します。さらに重要なのは、P-tuningが少ショット設定と教師あり設定の両方でBERTの性能を向上させ、かつプロンプトエンジニアリングの必要性を大幅に軽減する点です。その結果、P-tuningは少ショットSuperGlueベンチマークにおいて最先端のアプローチを上回る性能を示しました。

この手法では、プロンプトエンコーダーによって最適化される学習可能なプロンプト埋め込みを、より良いプロンプトを見つけるために入力に追加します。これにより、プロンプトを手動で設計する必要がなくなります。プロンプトトークンは入力シーケンスのどこに追加してもよく、p-tuningはパフォーマンス向上のためにアンカートークルも導入します。プロンプトパラメータの最適化には、プロンプトエンコーダー(双方向の長短期記憶ネットワーク、LSTM)が使用されます。プレフィックスチューニングとは異なり、

  • プロンプトトークンは入力シーケンス内のどこにでも挿入でき、先頭部分に限定されるわけではありません。
  • プロンプトのトークンは、モデルのすべての層に追加するのではなく、入力にのみ追加されます
  • anchorトークンを導入することで、入力シーケンス内のコンポーネントの特徴を示すため、パフォーマンスが向上する可能性があります。

論文の結果は、P-tuningが手動でプロンプトを作成するよりも効率的であり、GPTのようなモデルがNLUタスクにおいてBERTのようなモデルと競合できることを示唆しています。

使用方法

タスクタイプ、追加して学習する仮想トークンの数、およびプロンプトパラメータの学習に使用するエンコーダーの隠れ層サイズを指定して、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) — プロンプトエンコーダーのドロップアウト確率。

これは、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) — inference_mode=False の場合、プロンプトエンコーダーの MLP ヘッドです。
  • lstm_head (torch.nn.LSTM) — inference_mode=False かつ encoder_reparameterization_type="LSTM" の場合、プロンプトエンコーダーの LSTM ヘッドです。
  • token_dim (int) — ベースとなる Transformer モデルの隠れ埋め込み次元です。
  • input_size (int) — プロンプトエンコーダーの入力サイズ。
  • output_size (int) — プロンプトエンコーダーの出力サイズ。
  • hidden_size (int) — プロンプトエンコーダーの隠れ層サイズです。
  • total_virtual_tokens (int): プロンプトエンコーダーの仮想トークンの総数。
  • encoder_type (Union[PromptEncoderReparameterizationType, str]): プロンプトエンコーダーのエンコーダータイプです。

入力形状: (batch_size, total_virtual_tokens)

出力の形状: (batch_size, total_virtual_tokens, token_dim)

Update on GitHub