Prompt Tuning
Prompt Tuning passt ein eingefrorenes Modell an eine Aufgabe an, indem einige wenige Soft-Prompt-Vektoren trainiert werden, die der Eingabe hinzugefügt werden. So kann ein Modell viele Aufgaben übernehmen.
Prompt Tuning passt ein vortrainiertes Grundlagenmodell an eine neue Aufgabe an, indem es eine kleine Menge von Vektoren trainiert, die Soft Prompt genannt wird und vor der Eingabe steht. Alle Modellgewichte bleiben dabei unverändert. Der Soft Prompt befindet sich im selben Raum wie die Token-Einbettungen des Modells. Seine Vektoren werden jedoch durch Backpropagation gelernt und müssen keinem realen Wort entsprechen. Brian Lester, Rami Al-Rfou und Noah Constant von Google stellten das Verfahren in The Power of Scale for Parameter-Efficient Prompt Tuning vor, das auf der EMNLP 2021 präsentiert wurde. Sie stellten fest, dass ein Prompt mit fünf Tokens für das T5-XXL-Modell mit 11 Milliarden Parametern pro Aufgabe nur 20.480 Parameter benötigt. Außerdem zeigten sie, dass Prompt Tuning bei Modellen mit mehreren Milliarden Parametern dieselbe Genauigkeit wie das Tuning des gesamten Modells erreicht.
So funktioniert Prompt Tuning#
Ein großes Sprachmodell (LLM) wandelt jedes Eingabe-Token in einen Einbettungsvektor um, bevor die Transformer-Schichten es verarbeiten. Prompt Tuning stellt dieser Sequenz k zusätzliche Vektoren voran. Lester et al. testeten Längen von 1 bis 150 und verwendeten standardmäßig 100. Beim Training wird die Verlustfunktion der Aufgabe durch das eingefrorene Netzwerk bis zurück zur Eingabe propagiert. Der Optimierer aktualisiert dabei nur die Prompt-Vektoren. Das Ergebnis ist ein kleiner Tensor pro Aufgabe. Da das Modell selbst unverändert bleibt, stellt das Entfernen des Prompts sein ursprüngliches Verhalten wieder her, ohne dass die Gefahr des katastrophalen Vergessens besteht. Eine bereitgestellte Modellkopie kann viele Aufgaben gleichzeitig bedienen. Bei Stapelverarbeitung enthält jede Anfrage ihren eigenen Soft Prompt. Lester et al. nennen dies Inferenz mit gemischten Aufgaben.
Das folgende Beispiel mit PyTorch stimmt einen Soft Prompt mit 8 Vektoren für die Sentimentanalyse ab. Dafür wird ein eingefrorenes GPT-2 aus Transformers von Hugging Face verwendet, mit vier Trainingsrezensionen und acht zurückgehaltenen Rezensionen:
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")Es gibt zuerst Held-out reviews correct before tuning: 5/8 und dann After tuning: 7/8, training 6,144 of 124,439,808 parameters aus. Dreißig Schritte mit Adam anhand von vier Beispielen änderten nur 6.144 Zahlen, also 0,005 % des Modells. Das eingefrorene GPT-2 klassifizierte anschließend zwei weitere, zuvor ungesehene Rezensionen korrekt.
Prefix Tuning und visuelles Prompt Tuning#
Prompt Tuning gehört zu einer Familie kontinuierlicher Prompt-Verfahren im Bereich des parametereffizienten Fine-Tunings (PEFT). Xiang Lisa Li und Percy Liang entwickelten das Prefix Tuning. Dabei werden Vektoren gelernt, die jeder Transformer-Schicht vorangestellt werden. Sie machen etwa 0,1 % der Parameter von GPT-2 oder BART aus und erreichten bei der Textgenerierung aus Tabellen sowie beim Zusammenfassen Ergebnisse, die mit vollständigem Fine-Tuning mithalten konnten. Prompt Tuning vereinfacht das Verfahren, indem es nur Vektoren auf der Eingabeschicht lernt.
Die Idee lässt sich auch auf die Bildverarbeitung übertragen. Visual Prompt Tuning (VPT) von Menglin Jia und Kollegen stellt lernbare Tokens den Patch-Tokens eines eingefrorenen Vision Transformers (ViT) voran und trainiert dabei weniger als 1 % der Parameter. Bei vielen Aufgaben zur Bildklassifizierung übertraf das Verfahren vollständiges Fine-Tuning. Bei Bild-Sprach-Modellen ersetzt Context Optimization (CoOp) von Kaiyang Zhou und Kollegen die von Hand geschriebenen Wörter in einem CLIP-Prompt wie „a photo of a“ durch gelernte Vektoren. Bei 11 Datensätzen übertraf CoOp von Hand erstellte Prompts mit ein oder zwei gekennzeichneten Beispielen pro Klasse. Mit 16 Beispielen pro Klasse lag die Genauigkeit im Durchschnitt etwa 15 % höher.
Open-Vocabulary-Detektoren lassen sich auf verwandte Weise anpassen. Ultralytics YOLOE wandelt Klassennamen in Text-Prompt-Einbettungen um. Beim Verfahren zum linearen Sondieren für eigene Datensätze werden die Einbettungen der Klassennamen des Datensatzes in die letzte Faltung jedes Klassifizierungszweigs integriert. Anschließend werden nur diese Schichten trainiert. Backbone, Neck und der restliche Head bleiben eingefroren.
Prompt Tuning und verwandte Verfahren#
- Prompt Engineering: Eine Person verfasst den Prompt als Text, manchmal auch als Hard Prompt bezeichnet. Es wird nichts trainiert. Prompt Tuning lernt den Prompt anhand gekennzeichneter Daten und benötigt Zugriff auf die Gradienten des Modells. Daher eignet es sich für Modelle mit offenen Gewichten.
- Vollständiges Fine-Tuning: Aktualisiert jedes Gewicht. Dadurch entsteht für jede Aufgabe eine vollständige Modellkopie, und frühere Fähigkeiten können katastrophal vergessen werden. Lester et al. stellten fest, dass prompt-getunte Modelle außerdem robuster gegenüber Domänenverschiebungen waren als vollständig getunte Modelle.
- LoRA: Fügt trainierbare Matrizen mit niedrigem Rang in die Gewichtsschichten des Modells ein. Prompt Tuning lässt die Schichten unangetastet und verändert nur die Eingabe.
- Few-Shot-Learning im Prompt: Fügt jeder Anfrage gekennzeichnete Beispiele als Text in das Kontextfenster ein. Ein getunter Soft Prompt speichert die aus den Beispielen gelernte Information in wenigen Vektoren und benötigt nur k zusätzliche Eingabepositionen.










