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 dirancang untuk tugas pemahaman bahasa alami (NLU) dan semua model bahasa.

Abstrak dari makalah tersebut adalah:

Walaupun GPT dengan fine-tuning tradisional gagal mencapai hasil yang kuat pada pemahaman bahasa alami (NLU), kami menunjukkan bahwa GPT dapat lebih baik atau setara dengan BERT berukuran serupa pada tugas NLU dengan metode baru P-tuning β€” yang menggunakan prompt embeddings kontinu yang dapat dilatih. Pada benchmark knowledge probing (LAMA), GPT terbaik memulihkan 64\% (P@1) pengetahuan dunia tanpa teks tambahan apa pun yang diberikan saat pengujian, yang secara substansial meningkatkan hasil terbaik sebelumnya sebesar 20+ poin persentase. Pada benchmark SuperGlue, GPT mencapai kinerja yang setara dan terkadang lebih baik daripada BERT berukuran serupa dalam pembelajaran terawasi. Pentingnya, kami menemukan bahwa P-tuning juga meningkatkan kinerja BERT dalam pengaturan few-shot dan terawasi, sekaligus mengurangi kebutuhan akan prompt engineering secara signifikan. Akibatnya, P-tuning melampaui pendekatan state-of-the-art pada benchmark SuperGlue few-shot..

Metode ini menambahkan embedding prompt yang dapat dilatih ke input, yang dioptimalkan oleh prompt encoder untuk menemukan prompt yang lebih baik, sehingga menghilangkan kebutuhan untuk merancang prompt secara manual. Token prompt dapat ditambahkan di mana saja dalam urutan input, dan p-tuning juga memperkenalkan token anchor untuk meningkatkan kinerja. Prompt encoder (jaringan long-short term memory bidireksional atau LSTM) digunakan untuk mengoptimalkan parameter prompt. Berbeda dengan prefix tuning:

  • token prompt dapat disisipkan di mana saja dalam urutan input, dan tidak dibatasi hanya di bagian awal
  • token prompt hanya ditambahkan ke input, bukan ke setiap lapisan model
  • pengenalan token anchor dapat meningkatkan kinerja karena token tersebut mengindikasikan karakteristik komponen dalam urutan input

Hasil dari makalah tersebut menunjukkan bahwa P-tuning lebih efisien daripada pembuatan prompt secara manual, dan memungkinkan model serupa GPT untuk bersaing dengan model serupa BERT pada tugas NLU.

Penggunaan

Buat PromptEncoderConfig dengan tipe tugas, jumlah token virtual yang akan ditambahkan dan dipelajari, serta ukuran tersembunyi (hidden size) dari encoder untuk mempelajari parameter prompt.

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

Ikhtisar benchmark

API

PromptEncoderConfig

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

Parameter

  • encoder_reparameterization_type (Union[PromptEncoderReparameterizationType, str]) β€” Jenis reparameterisasi yang akan digunakan.
  • encoder_hidden_size (int) β€” Ukuran tersembunyi dari encoder prompt.
  • encoder_num_layers (int) β€” Jumlah lapisan dari prompt encoder.
  • encoder_dropout (float) β€” Probabilitas dropout dari prompt encoder.

Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari PromptEncoder.

PromptEncoder

kelas peft.PromptEncoder

< >

( config )

Parameter

Jaringan pengkode prompt yang digunakan untuk menghasilkan embedding token virtual untuk p-tuning.

Contoh:

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

Atribut:

  • embedding (torch.nn.Embedding) β€” Lapisan embedding dari prompt encoder.
  • mlp_head (torch.nn.Sequential) β€” Kepala MLP dari prompt encoder jika inference_mode=False.
  • lstm_head (torch.nn.LSTM) β€” Kepala LSTM dari prompt encoder jika inference_mode=False dan encoder_reparameterization_type="LSTM".
  • token_dim (int) β€” Dimensi embedding tersembunyi dari model transformer dasar.
  • input_size (int) β€” Ukuran input dari prompt encoder.
  • output_size (int) β€” Ukuran keluaran dari prompt encoder.
  • hidden_size (int) β€” Ukuran tersembunyi dari encoder prompt.
  • total_virtual_tokens (int): Jumlah total token virtual dari prompt encoder.
  • encoder_type (Union[PromptEncoderReparameterizationType, str]): Jenis encoder dari prompt encoder.

Bentuk input: (batch_size, total_virtual_tokens)

Bentuk output: (batch_size, total_virtual_tokens, token_dim)

Update on GitHub