Prompt Tuning
Il prompt tuning adatta un modello congelato a un'attività addestrando alcuni vettori di prompt soft aggiunti al suo input, così un solo modello può svolgere molte attività.
Il prompt tuning adatta un modello di base preaddestrato a un nuovo compito addestrando un piccolo insieme di vettori, detto soft prompt, che viene anteposto all'input mentre tutti i pesi del modello restano congelati. Il soft prompt vive nello stesso spazio dei vettori di embedding dei token del modello, ma i suoi vettori vengono appresi tramite retropropagazione e non devono corrispondere a parole reali. Brian Lester, Rami Al-Rfou e Noah Constant di Google hanno introdotto il metodo in The Power of Scale for Parameter-Efficient Prompt Tuning, presentato a EMNLP 2021. Hanno osservato che un prompt di cinque token per il modello T5-XXL da 11 miliardi di parametri richiede solo 20.480 parametri per attività e hanno mostrato che, quando i modelli superano i miliardi di parametri, il prompt tuning raggiunge l'accuratezza del tuning dell'intero modello.
Come funziona il prompt tuning#
Un modello linguistico di grandi dimensioni (LLM) converte ogni token di input in un vettore di embedding prima che venga elaborato dai livelli Transformer. Il prompt tuning antepone k vettori aggiuntivi a questa sequenza; Lester e colleghi hanno testato lunghezze da 1 a 150 e ne hanno usate 100 come impostazione predefinita. Durante l'addestramento, la funzione di perdita dell'attività viene propagata all'indietro attraverso la rete congelata fino all'input, e l'ottimizzatore aggiorna solo i vettori del prompt. Il risultato è un piccolo tensore per ogni attività. Poiché il modello in sé non cambia mai, rimuovere il prompt ripristina il comportamento originale senza rischio di oblio catastrofico; una singola copia distribuita può servire molte attività contemporaneamente, con ogni richiesta in un batch che include il proprio soft prompt, una modalità che Lester e colleghi chiamano inferenza a compiti misti.
L'esempio seguente in PyTorch esegue il tuning di un soft prompt di 8 vettori per l'analisi del sentiment su GPT-2 congelato di Transformers di Hugging Face, usando quattro recensioni di addestramento e otto di test:
import torch
from torch.nn.functional import cross_entropy
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2").requires_grad_(False) # freeze all 124M weights
embed = model.get_input_embeddings()
# Soft prompt: 8 trainable vectors in GPT-2's embedding space, initialized from the word " review"
soft_prompt = torch.nn.Parameter(embed.weight[tokenizer.encode(" review")].repeat(8, 1).clone())
optimizer = torch.optim.Adam([soft_prompt], lr=0.01)
labels = tokenizer.encode(" positive negative") # token ids for label 0 and label 1
# Reviews alternate between positive (label 0) and negative (label 1)
train = ["Loved every minute.", "A waste of time.", "Great story and acting.", "Boring and slow."]
test = ["What a wonderful film.", "I fell asleep halfway.", "A fantastic ending.", "Terrible dialogue."]
test += ["A joy to watch.", "Dull and predictable.", "Superb from start to end.", "I want my money back."]
def label_scores(text):
"""Score both label tokens after the soft prompt and the review."""
ids = tokenizer.encode(f"{text} Sentiment:", return_tensors="pt")
return model(inputs_embeds=torch.cat([soft_prompt[None], embed(ids)], dim=1)).logits[0, -1, labels]
def correct():
"""Count held-out reviews whose higher-scoring label is right."""
with torch.no_grad():
return sum(int(label_scores(text).argmax()) == i % 2 for i, text in enumerate(test))
print(f"Held-out reviews correct before tuning: {correct()}/8")
for step in range(30):
loss = sum(cross_entropy(label_scores(text), torch.tensor(i % 2)) for i, text in enumerate(train))
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"After tuning: {correct()}/8, training {soft_prompt.numel():,} of {model.num_parameters():,} parameters")Stampa Held-out reviews correct before tuning: 5/8 e poi After tuning: 7/8, training 6,144 of 124,439,808 parameters. Trenta passaggi di Adam su quattro esempi hanno modificato solo 6.144 numeri, lo 0,005% del modello, e GPT-2 congelato ha classificato correttamente altre due recensioni mai viste.
Prefix tuning e visual prompt tuning#
Il prompt tuning appartiene a una famiglia di metodi basati su prompt continui nell'ambito del fine-tuning efficiente in termini di parametri (PEFT). Il prefix tuning di Xiang Lisa Li e Percy Liang apprende vettori anteposti a ogni livello Transformer, circa lo 0,1% dei parametri di GPT-2 o BART, e ha eguagliato il fine-tuning completo nella generazione da tabelle a testo e nella sintesi. Il prompt tuning semplifica questo metodo apprendendo vettori solo nel livello di input.
L'idea si applica anche alla visione. Il Visual Prompt Tuning (VPT) di Menglin Jia e colleghi antepone token apprendibili ai token delle patch di un Vision Transformer (ViT) congelato, addestrando meno dell'1% dei parametri, e ha superato il fine-tuning completo in molte configurazioni di classificazione delle immagini. Per i modelli visione-linguaggio, il Context Optimization (CoOp) di Kaiyang Zhou e colleghi sostituisce le parole scritte a mano in un prompt CLIP, come "una foto di", con vettori appresi. Su 11 dataset, CoOp ha superato i prompt creati a mano con uno o due esempi etichettati per classe e li ha migliorati di circa il 15% in media con 16 esempi per classe.
I rilevatori a vocabolario aperto si adattano in modo correlato. Ultralytics YOLOE trasforma i nomi delle classi in vettori di embedding testuali dei prompt, e la sua procedura di sondaggio lineare per dataset personalizzati fonde i vettori di embedding dei nomi delle classi del dataset nell'ultima convoluzione di ogni ramo di classificazione, quindi addestra solo quei livelli mentre backbone, neck e resto della head rimangono congelati.
Prompt tuning e metodi correlati#
- Prompt engineering: Una persona scrive il prompt come testo, talvolta detto prompt rigido, e non viene addestrato nulla. Il prompt tuning apprende il prompt dai dati etichettati e richiede l'accesso ai gradienti del modello, quindi si applica ai modelli con pesi aperti.
- Fine-tuning completo: Aggiorna tutti i pesi, producendo una copia completa del modello per ogni attività e rischiando l'oblio catastrofico delle competenze precedenti. Lester e colleghi hanno rilevato che i modelli sottoposti a prompt tuning erano anche più robusti al cambiamento di dominio rispetto a quelli sottoposti a tuning completo.
- LoRA: Aggiunge matrici a basso rango addestrabili all'interno dei livelli dei pesi del modello. Il prompt tuning lascia intatti i livelli e modifica solo l'input.
- Apprendimento few-shot nel prompt: Inserisce esempi etichettati nella finestra di contesto come testo a ogni richiesta. Un soft prompt sottoposto a tuning memorizza ciò che gli esempi insegnano in pochi vettori e costa solo k posizioni di input aggiuntive.










