PEFT documentation
P-tuning
P-tuning

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
< 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 )
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
< source >( config )
Parameter
- config (PromptEncoderConfig) β Konfigurasi dari prompt encoder.
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 jikainference_mode=False. - lstm_head (
torch.nn.LSTM) β Kepala LSTM dari prompt encoder jikainference_mode=Falsedanencoder_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)