Prompt Tuning
프롬프트 튜닝은 입력에 추가되는 소수의 소프트 프롬프트 벡터를 학습하여 동결된 모델을 특정 작업에 맞게 조정하므로, 하나의 모델로 여러 작업을 수행할 수 있습니다.
프롬프트 튜닝은 사전 학습된 파운데이션 모델을 새 작업에 맞게 조정하기 위해 소프트 프롬프트라고 부르는 소규모 벡터 집합을 학습합니다. 이 벡터는 입력 앞에 배치되며 모든 모델 가중치는 고정 상태로 유지됩니다. 소프트 프롬프트는 모델 토큰의 임베딩과 같은 공간에 있지만, 그 벡터는 역전파로 학습되며 실제 단어와 일치할 필요는 없습니다. Google의 Brian Lester, Rami Al-Rfou, Noah Constant는 EMNLP 2021에서 발표한 파라미터 효율적 프롬프트 튜닝을 위한 규모의 힘에서 이 방법을 소개했습니다. 이들은 110억 개의 파라미터를 가진 T5-XXL 모델에서 토큰 다섯 개짜리 프롬프트를 사용할 경우 작업당 파라미터가 20,480개만 필요하다고 설명했으며, 모델이 수십억 개 이상의 파라미터 규모로 커지면 프롬프트 튜닝이 전체 모델 튜닝과 동일한 정확도를 달성한다는 점을 보였습니다.
프롬프트 튜닝의 작동 방식#
대규모 언어 모델(LLM)은 각 입력 토큰을 임베딩 벡터로 바꾼 다음 Transformer 계층에 전달합니다. 프롬프트 튜닝은 시퀀스 앞에 k개의 추가 벡터를 붙입니다. Lester 등은 길이가 1~150인 프롬프트를 시험했으며 기본값으로 100을 사용했습니다. 학습 중에는 작업의 손실 함수를 고정된 네트워크 전체를 거쳐 입력까지 역전파하며, 옵티마이저는 프롬프트 벡터만 업데이트합니다. 결과물은 작업별 소형 텐서입니다. 모델 자체는 변경되지 않으므로 프롬프트를 제거해도 파국적 망각의 위험 없이 원래 동작을 복원할 수 있습니다. 또한 배치의 각 요청에 자체 소프트 프롬프트를 포함해 배포된 모델 사본 하나로 여러 작업을 동시에 처리할 수 있으며, Lester 등은 이를 혼합 작업 추론이라고 부릅니다.
다음 PyTorch 예시는 Hugging Face Transformers의 고정된 GPT-2를 대상으로 학습 리뷰 네 개와 보류된 리뷰 여덟 개를 사용해 감성 분석용 8벡터 소프트 프롬프트를 튜닝합니다.
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")코드는 Held-out reviews correct before tuning: 5/8을 출력한 다음 After tuning: 7/8, training 6,144 of 124,439,808 parameters을 출력합니다. 예시 네 개에 대해 Adam으로 30회 학습한 결과, 모델 전체의 0.005%에 해당하는 숫자 6,144개만 바뀌었으며, 고정된 GPT-2는 보지 못한 리뷰 두 개를 더 정확하게 분류했습니다.
프리픽스 튜닝과 시각적 프롬프트 튜닝#
프롬프트 튜닝은 파라미터 효율적 파인튜닝(PEFT)에 속하는 연속 프롬프트 기법의 한 종류입니다. Xiang Lisa Li와 Percy Liang의 프리픽스 튜닝은 각 Transformer 계층 앞에 붙이는 벡터를 학습합니다. 이 방식은 GPT-2 또는 BART 파라미터의 약 0.1%만 사용하며 테이블-텍스트 생성과 요약 작업에서 전체 파인튜닝과 대등한 성능을 보였습니다. 프롬프트 튜닝은 입력 계층에서만 벡터를 학습하도록 이 방식을 단순화합니다.
이 아이디어는 비전에도 적용됩니다. Menglin Jia와 동료들의 시각적 프롬프트 튜닝(VPT)은 고정된 비전 Transformer(ViT)의 패치 토큰 앞에 학습 가능한 토큰을 추가합니다. 1% 미만의 파라미터를 학습하면서 여러 이미지 분류 설정에서 전체 파인튜닝보다 뛰어난 성능을 보였습니다. 비전-언어 모델의 경우 Kaiyang Zhou와 동료들의 컨텍스트 최적화(CoOp)는 "a photo of a"와 같은 CLIP 프롬프트의 직접 작성한 단어를 학습된 벡터로 대체합니다. 11개 데이터셋에서 CoOp는 클래스당 라벨이 지정된 예시 한두 개만으로 직접 작성한 프롬프트보다 높은 성능을 보였으며, 클래스당 예시 16개를 사용할 때는 평균 약 15% 향상되었습니다.
개방형 어휘 탐지기도 관련 방식으로 조정됩니다. Ultralytics YOLOE는 클래스 이름을 텍스트 프롬프트 임베딩으로 변환합니다. 사용자 지정 데이터셋을 위한 선형 프로빙 레시피는 데이터셋 클래스 이름의 임베딩을 각 분류 분기의 마지막 컨볼루션에 융합한 다음, 백본, 넥, 나머지 헤드는 고정한 채 해당 계층만 학습합니다.
프롬프트 튜닝과 관련 기법 비교#
- 프롬프트 엔지니어링: 사람이 프롬프트를 텍스트로 작성하며, 이를 하드 프롬프트라고 부르기도 합니다. 학습은 수행하지 않습니다. 프롬프트 튜닝은 라벨이 있는 데이터에서 프롬프트를 학습하며 모델의 그래디언트에 접근해야 하므로 오픈 웨이트 모델에 적용됩니다.
- 전체 파인튜닝: 모든 가중치를 업데이트하므로 작업마다 모델 전체를 복사해야 하며 이전에 습득한 기술을 파국적으로 잊을 위험이 있습니다. Lester 등은 프롬프트 튜닝 모델이 완전히 튜닝된 모델보다 도메인 변화에도 더 강하다는 점을 발견했습니다.
- LoRA: 모델 가중치 계층 안에 학습 가능한 저랭크 행렬을 추가합니다. 프롬프트 튜닝은 계층을 그대로 두고 입력만 변경합니다.
- 프롬프트 내 퓨샷 학습: 모든 요청에서 라벨이 지정된 예시를 텍스트로 컨텍스트 윈도우에 넣습니다. 튜닝된 소프트 프롬프트는 예시에서 배운 내용을 벡터 몇 개에 저장하며 입력 위치 k개만 추가하면 됩니다.










