- LoRA: LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
- Prefix Tuning(2203): P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
- Prompt Tuning(2109): The Power of Scale for Parameter-Efficient Prompt Tuning
- P-Tuning(2103): GPT Understands, Too
위는 허깅페이스 에서 구현한 PEFT 라이브러리에 포함된 (2302 기준) 방법론 들이다.
** 이거 말고 “prefix tuning” 은 : Prefix-Tuning: Optimizing Continuous Prompts for Generation → 위의 prefix-tuning 은 이 논문의 방법론을 다른 task 에 적용한 것이다.
1. p-tuning (Liu)
GPT Understands, Too 논문
https://arxiv.org/pdf/2103.10385.pdf
Introduction
GPT 계열 모델의 단점은 NLU(Natural Language Understanding, NLI, AE 등) 에서 성능이 좋지 않다는 것.
또한 (수동) 프롬프트가 Large 단방향 모델에서 자연어 이해에 효과가 있을 수 있음을 확인할 수는 있었지만, 좋은 성능을 내는 프롬프트를 찾는 과정(prompting) 이 어렵다는 단점이 있다.
이 논문에서 제안하는 p-tuning 은 discrete space 에서 prompt 를 찾지 않고 continuous 한 space 에서 찾는 것이다.
여기서 Discrete 은 자연어 입력 토큰으로 이루어짐 을 의미하고, p-tuning 은 trainable parameter (훈련 가능한 프롬프트 임베딩) 를 이용하여 입력 토큰의 discrete 한 space 를 continuous 하게 변환시켜 주는 것을 말한다.
Related Works
최근에는 NLG 에 prefix-tuning 을 제안하였는데, 이는 continuous 프롬프트를 학습하는 p-tuning 과 비슷하다.
→ 그럼에도 불구하고, 특성이 조금 다르다.
1. prefix tuning 은 GPT 를 위한 NLG 에 사용하고, p-tuning 은 NLU (와 이외 모든 다른 task)에 사용한다.
2. prefix tuning 은 오직 인풋 시퀀스에 앞에 프롬프트 토큰을 더하는데, p-tuning 은 토큰을 어디에든 삽입할 수 있다.
3. prefix-tuning 은 invasive(침습적으로) continuous 프롬프트 토큰을 모든 레이어에 concat 한 하지만 p-tuning은 비침습적으로 입력에만 continuous 프롬프트를 추가한다.
4. p-tuning은 성능 개선을 위해 anchor prompts 를 사용하는 방법도 추가적으로 소개한다.
이러한 차이에도 p-tuning 과 prefix tuning 둘 다 continuous 프롬프트를 학습하는 방법이고, discrete 보다 뛰어나다는 공통점이 있다.
Method
M : Language Model
x0:n = {x0, x1, ..., xn} : discrete input token
{e(x0), e(x1), ..., e(xn)} : discrete 인풋 토큰의 임베딩, e = M 에 있는 pre-trained 임베딩 레이어
[P_i] : T 안에서의 i 번째 prompt token
프롬프트 p의 역할은 context x 와 target y 를 프롬프트로 엮어 템플릿 T 를 만드는 것이다.
T = {[D_0:i], x, [D_(i+1):j], y, [D_(j+1):k]}
그림 2 에서 (BERT 모델을 예시로 할 때) 템플릿 T이 “The capital of Britain is [MASK].” 일 때,
“The capital of ... is ... .” 가 프롬프트 p이고,
“Britain” 이 context x이고,
“[MASK]” 가 target y이 된다.
T = {[P0:i], x, [Pi+1:m], y} 라는 템플릿이 주어졌을 때,
전통적인 discrete 프롬프트를 T 를 위와 같이 매핑한다.
하지만 p-tuning 에서는 아래와 같이 임베딩을 매핑한다.
여기서 h_i (0≤i<m) 은 trainable parameter 이다.
그 이후 언어모델 M 의 파라미터는 고정시키고 원래 loss function L 을 이용하여 continuous prompt 를 optimize 한다.
이 논문에서는 prompt 인코더로 LSTM 에 ReLU를 사용하고 2개 mlp 로 이루어진 구조를 사용한다.
inference 에서는 output 임베딩 h 만 필요하므로 LSTM 헤드는 버린다. (= inference에서 다시 계산하는 게 아니라 미리 계산한 값을 기억하고 학습한 헤드는 버린다)
Experiments
LAMA 데이터셋으로 확인하는 Knowledge probing task 란, 모델이 pre-train 동안 얻은 real-world knowledge 를 평가하는 태스크이다.
이 논문에서는 LAMA 를 이용하여 Knowledge base 에서 가져온 triple 을 문장에 대한 빈칸 채우기로 바꿔서 태스크를 진행한다. 그러므로 모든 answer 는 single-token 포맷을 가진다.
예를 들어, (Dante, born-in, Florence) 라는 triple 을 문장 형식으로 변형하여 “Dante was born in [MASK].” 라는 prompt 로 만든다. 그리고 LM 에게 target 을 추측하게 한다.
→ 이렇게 만드니까 prompt 와 context 가 인풋 문장에서 어느 부분에 해당하는지 알 수 있다.
그렇지 못한 LLM NLG 태스크에서는 알 수 없기 때문에 사용할 수 없다.
** 이때 PLM 의 파라미터는 고정되어있다. (왜냐하면 사전훈련에서 얻은 지식을 평가하고 싶기 때문)
SuperGLUE 데이터셋에서는 8개의 NLU 태스크로 이루어진 데이터셋. 그 중 7개 사용.
P 튜닝은 단방향, 양방향 모델에 둘 다 쓸 수 있다. BERT-base 와 GPT2-base ,BERT-large 와 GPT2-medium랑 비교한다.
2. prompt tuning (Lester, 구글 리서치)
이 방법은 최근에 나온 prefix tuning 에서 더 단순화된 방법이다.
이 방법은 모델의 파라미터가 클수록 효과적으로 파인튜닝 성능에 가까워진다.
이 논문에서는 모든 태스크를 text 생성으로 사용한다. Text to text 인 T5 모델을 사용하기 때문.
그러면 classification을 위해 클래스에 대한 probability Pr(y|X) 를 내는 게 아니라 class label을 뜻하는 Y 텍스트 시퀀스를 출력한다. = $Pr_θ(Y |X)$ , 이때 θ 는 트랜스포머 파라미터.
원래의 프롬프팅은 토큰 P 를 인풋 X 에 붙여서 likelihood인 $Pr_θ(Y |[P; X])$ 로 표현할 수 있다. 이때 모델 파라미터 θ 는 고정시킨다.
P = {p1, p2, . . . , pn} (in GPT-3)
프롬프트 튜닝은 θ_P 을 업데이트할 수 있다.
프롬프트 디자인이란 고정된 모델의 정해진 vocab 에서 프롬프트 토큰을 고르는 것을 포함한다. 하지만 프롬프트 튜닝은 고정된 토큰의 프롬프트를 사용하되 임베딩만 업데이트 하는 것.
이 논문의 conditional generation 은 $Pr_{θ;θ_P} (Y |[P; X])$ 로 표현할 수 있다.
{x1, x2, . . . , xn} 가 처음 들어올 때 T5 모델은 행렬 $X_e ∈ R^{n×e}$ 로 임베딩한다. → 이때 e 는 임베딩 space 디멘션.
soft-prompt 는 파라미터 $P_e ∈ R^{p×e}$ 로 표현할 수 있고 이때 p 는 프롬프트 길이이다.
이 프롬프트는 임베딩된 인풋 문장에 concat 된다 = $[P_e; X_e] ∈ R^{(p+n)×e}$
prefix tuning 은 모든 트랜스포머 레이어에 prefix 시퀀스를 붙인다.
반면에 프롬프트 튜닝은 임베딩된 인풋에 single prompt representation 만 붙인다.
더 적은 파라미터를 사용해도 우리는 트랜스포머가 인풋 예시에 의한 context 대로 중간 레이어의 task representation 을 업데이트 할 수 있도록 한다.
prefix tuning 에서 BART 를 이용할 때 인코더와 디코더 둘다 prefix 를 포함하는데 프롬프트 튜닝은 인코더에만 사용한다.
또한 prefix tuning 은 학습을 안정시키기 위해 reparameterization 을 사용하여 더 많은 파라미터를 더해줘야하는데 우리는 이런 방법이 필요없다.
3. prefix tuning (p-tuning v2, Liu)
기존 프롬프트 튜닝 방법이 hard sequence labeling tasks 처리할 수 없는 task 보편성 과 normal-size 의 PLM 에서의 적용 보편성이 부족하다고 제시.
P-Tuning v2 방법은 NLU 를 위해 학습된 Deep Prompt Tuning (2개 논문을 구현 → 그중 하나가 prefix tuning (for NLG)) 의 구현이다.
결국 방법론은 밑의 prefix tuning 과 똑같음.
** 그리고 위 3의 논문의 토대가 되는 논문도 정리해보자
Prefix tuning (Li, Liang 스탠포드)
prefix tuning 은 p*-tuning 이라고도 한다.
[3] Problem Statement
그림 2처럼 2가지 task 를 진행하는디 x는 context 이고 y 는 토큰 시퀀스이다.
table-to-text 는 x는 선형화한 data table 이고 y는 그에 대한 text description이다.
Summarization 에서는 x는 article 이고 y 는 써머리다.
3.1. Autoregressive LM
pφ(y | x) 라는 auto regressive LM 에 φ는 파라미터다.
z = [x; y] 를 x 와 y 의 concat 이라고 할때 X_idx , Y_idx는 x, y에 해당하는 시퀀스의 인덱스
$h_i = [h^{(1)}_i; · · · ; h^{(n)}_i]$ 가 i의 모든 레이어의 activation 벡터 의 콘캣일때 time step i 에서의 activation 벡터 는 hi ∈ R^d , n 은 레이어 수
auto-regressive LM 은 h_i 를 left context 의 과거 activation 과 z_i 의 함수로서 계산한다.
hi 의 마지막 레이어는 밑의 식과 같이 다음 토큰의 분포를 계산하는 데에 사용된다.
$$ p_φ(z_{i+1} | h_{≤i}) = softmax(Wφ h^{(n)}_i) $$
Wφ 는 h^(n)_i 를 vocab 위의 로짓에 매핑하는 행렬이다.
3.3 Fine-tuning
Full 파인튜닝 에서는 pretrained 파라미터 φ로 초기화하고 pφ는 학습가능한 LM 의 분포 이다.
Log likelihood 식으로 학습한다.
[4] Prefix-Tuning
conditional generation tasks 을 하려고 한다!
4.1 Intuition
오바마라는 단어를 내고 싶을 때 컨텍스트로 버락을 주면 내가 원하는 단어에 LM 이 더 많은 확률을 부과할 것이다.
하지만 summarize 하라 라는 instruction 은 적당한 사이즈의 모델에서는 task 해결이 힘들 수 있다.
Discrete instructions 를 이용해 최적화하는 것이 도움이 될 수 는 있지만 computation 측면에서 어렵다.
그래서 continuous 워드 임베딩을 이용해 최적화하는 것.
Prefix tuning 은 (한 단계 더 올라가) 임베딩 레이어 뿐 아니라 모든 레이어의 activation 을 최적화한다. (= 프롬프트 부분만 업데이트 하는 건가 그래서 모든 레이어를 다 업데이트 한다)
4.2 Method
Auto regressive 디코더 에서는 z = [PREFIX; x; y] 의 (아마 hidden state) 를 얻고
인코더-디코더 모델에서는 z = [PREFIX; x; PREFIX'; y] 를 얻는다.
P_idx는 prefix 인덱스 시퀀스를 나타내고 |P_idx| 는 prefix 길이를 나타낸다.
행렬 P_θ (θ 로 파라미터화된) 의 디멘션은 |P_idx| × dim(hi) 이다.
학습 loss 함수는 식 2 랑 똑같다. 그냥 학습할 수 있는 파라미터가 바뀐것 뿐.
LM 의 파라미터인 φ 는 고정되고 prefix 파라미터인 θ만 학습가능하다.
각 h_i 는 학습가능한 P_θ 의 함수이다.
i ∈ P_idx 일때 h_i 는 P_θ 에서 바로 카피해오기 때문에 간단한데,
i \∈ P_idx 일때는 h_i 는 P_θ 에 의존한다. 왜냐하면 prefix activations 는 항상 left context 이고 그러므로 모든 right 컨택스트에 영향을 줄 수 있기 때문이다.
4.3 Parametrization of P_θ
바로(직접적으로) P_θ 파라미터를 업데이트 하는 것은 안정적이지 않고 성능이 조금 떨어질 수 있다.
그래서 P_θ[i, :] = MLP_θ(P'_θ[i, :]) 행렬을 큰 feedforward nn 인 (MLP_θ) 로 이루어진 (P’_θ) 로 reparametrize 한다.
<aside> 💡 reparametrize : 미분 가능하게 샘플링하기 위해 mean 과 var 를 각각 학습가능하게 파라미터화 한다는 것
</aside>
이제 학습 가능한 파라미터가 P’_θ 와 MLP_θ 가 포함된다.
P_θ 와 P’_θ 는 같은 row 개수(prefix length) 를 가지고 있지만 column 개수는 다르다.
학습이 끝나면 reparametrization parameter 는 버릴 수 있고 prefix (P_θ) 만 저장된다.
[5] Experimental Setup
그중에서 Summarization 을 가져옴 : XSUM 이라는 데이터셋을 사용. (news 기사 요약)
근데 summarization 은 BART (encoder-decoder 모델) Large 모델을 사용.
ROUGE-1, ROUGE-2, ROUGE-L metric 사용.
6.2 Summarization
말고 다른 task 는 table-to-text task: E2E, WebNLG, DART 데이터셋 사용.
순서대로 1, 14, open domain 을 가져서 점점 어려운 데이터셋이다.
GPT-2 MEDIUM 과 GPT2 LARGE 모델을 사용한다.
더 간단하게는
https://huggingface.co/docs/peft/conceptual_guides/prompting
를 참조할 수 있다!
'LLM 관련 논문 정리' 카테고리의 다른 글
CLM, MLM, TLM 그리고 Seq2Seq (0) | 2023.10.30 |
---|---|
Few-Shot Parameter-Efficient Fine-Tuning is Better and Cheaper than In-Context Learning (NIPS, 2208) (0) | 2023.09.30 |
InstructGPT 상세 리뷰 (0) | 2023.08.30 |
Rotary Position Embedding (RoPE) (0) | 2023.08.21 |
NTK-aware dynamic interpolation (0) | 2023.08.21 |