본문 바로가기

NLP/Prompt tuning

AutoPrompt 논문 리뷰

2020 EMNLP

논문 링크: https://arxiv.org/abs/2010.15980

코드 링크: https://github.com/ucinlp/autoprompt

 

요약:

Prompt embedding의 gradient를 이용하여 discrete prompt를 찾는다.

 

Abstract

Prompt를 활용하는 시도는 (parameter-efficient finetuning을 하려는 지금의 시도와는 다르게) Pretrained Language Model(이하 PLM)이 학습한 knowledge를 활용하려는 방법을 연구하면서 시작되었다(그게 그거일 수 있지만). 

 

그러한 관점에서 이 논문은 AUTOPROMPT - gradient-guided search를 기반으로 prompt를 찾는 automated method - 를 제안한다.

 

Introduction

PLM을 finetuning하여 각 task 별로 좋은 결과를 얻을 수 있지만, task를 위한 knowledge를 pretraining에서 얻었는지, finetuning에서 얻었는지는 불분명하다. 이를 분석하기 위한 방법으로 classifier(task 수행을 위해 추가된 맨 마지막 layer) probing, attention visualization 등이 있다.

 

좀 더 직접적인 방법으로 prompting이 있다. Prompting은 새로운 파라미터를 추가하지도 않고, 모델의 representation을 들여다보지도 않는다. 따라서 prompting은 모델이 알고 있는 지식의 하한선을 제공하며 더 유용한 도구라고 할 수 있다. 하지만 이를 위해 수동으로 조작된 prompt가 필요하며 이는 시간이 많이 들고, 직관적이지도 않고 모델이 매우 prompt에 민감하다.

 

이 논문에서는 AutoPrompt란 방법을 통해 이런 pormpt를 자동으로 만들어주는 방법을 제안한다. 

 

Overview of AutoPrompt

PLM의 knowledge를 활용하는 자연스러운 방법 중 하나는 빈칸 채우기 task를 수행하는 것이다. 그런데 prompt를 디자인하는 것은 시간도 많이 들지만 같은 prompt가 모든 모델에 대해 동일한 효과를 내는지도 확실치 않다. 그래서 AUTOPROMPT 모델을 제안한다. 모델의 구조는 아래와 같다.

 

 

Task의 input(x_inp)과 trigger token(x_trig)들을 template을 이용해 prompt 형태로 만든다(요즘 prompt는 보통 trigger token을 의미하는데 여기서는 살짝 다르다. 초기 논문이라 그런 것 같다). 이렇게 만들어진 prompt가 실제 모델의 input으로 사용된다. 같은 task의 input 모두가 같은 trigger token들은 공유한다. Sentiment analysis task의 경우 class label y에 대한 확률은 자동으로 찾아진 단어 집합(Section 2.3)에 대한 예측 확률 - p([MASK]|x_prompt) - 을 모두 더하여 얻어진다. 다른 task들은 class label y가 어떤 특정 단어이기 때문에 이런 과정이 필요 없을 수도 있다.

 

여기서 V_y는 label y에 매칭되는 token들의 집합이다.

 

Gradient-based Prompt Search

여기서의 목표는 label likelihood(위의 식)를 높이는 trigger token들을 찾는 것이다. 방법은 아래 수식과 같다.

 

 

각 trigger token의 embedding에 대한 logp(y|x_prompt)의 gradient를 구한 후, word embedding w와 곱해서 score가 가장 높은 k개를 candidate로 선정한다. 그리고 각 candidate들을 실제 input에 넣어서 p(y|x_prompt)를 계산한 후 가장 높은 값을 기록한 word를 선택한다.

 

Automating Label Token Selection

Sentiment analysis나 NLI 같은 task들은 class label에 해당하는 token들이 여러개가 될 수 있다. 따라서 이 set을 구하는 게 중요하다. 이 셋은 두 단계로 구할 수 있다.

 

첫번째로 class label을 예측하는 logistic classifier를 학습한다. 이 때 input의 trigger token 자리에 [MASK] 토큰을 넣어 아래와 같이 계산한다. 코드에서는 trigger token의 [MASK]와 위 그림에서 [P]에 해당하는 곳의 [MASK] 토큰은 별도의 masking을 통해 구분한다.

h^i는 i번째 [MASK] 토큰에 해당하는 transformer의 output vector이다([MASK] 토큰이 여러 개라는 것은 class label string이 여러 개의 토큰으로 이루어져 있다는 뜻인 것 같다. 그런데 코드에서는 1개이다  -> 아래 설명 참조). 그리고 y(exp() 안의 y)와 베타는 learned weight, bias이다. 이렇게 얻은 값을 실제 라벨(예: {"ENTAILMENT": 0, "CONTRADICTION": 1, "NEUTRAL": 2})과 cross entropy loss를 이용해 loss를 계산하고, y와 베타를 학습한다.

 

처음 읽었을 때도 이상했지만, 다시봐도 역시 이 부분의 설명이 이상한데, 인덱스 i는 h가 아니라 y에 붙는 게 맞는 것 같다. 그리고 i는 [MASK] 토큰의 index가 아니라 라벨의 인덱스가 맞는 것 같다. 그리고 second step에 대한 설명에서 실제로 y * h (왜 순서가 위에랑 바꼈냐)처럼 커야 하는 것은 w * h가 아니라 y * w이다(설명에도 h^i를 w로 치환한다매... 계산 식에는 잘 써놓고). 전반적으로 h와 y를 헷갈린 느낌이다.

코드를 봐도 h는 prediction_mask를 사용해 한 개의 토큰만을 뽑아내며 아래 그림에서 찾아낸 label tokens를 봐도 토큰의 길이는 1이다. Learned weight라고 하는 벡터처럼 표시된 y는 실제로 (len(label) * hidden_dim) 형태를 갖는 matrix이며 각 row(y*h면 row, h*y면 column. 코드 상에서는 row이다)이 각 label에 해당하는 vector 파라미터가 된다.

 

두번째로 h^i를 word embedding w로 바꿔서 score를 계산한다(위 설명 참조). 여기서 앞서 학습한 y, b를 활용한다.

가장 높은 score를 갖는 k개를 class label string으로 선택한다. 

 

Evaluation Setup

이 방법을 BERT_Base, RoBERTa_Large 모델에 적용하여, sentiment analysis, NLI, fact retrieval, relation extraction task로 실험했다. Sentiment analysis와 NLI에는 위에서 설명한 Automating Label Token Selection 방법을 적용하여 label token을 찾았다.

 

 

Sentiment Analysis

SST-2 dataset을 이용해 실험했다. 찾아낸 label token들은 Table 3(위의 표)에 있다. Candidate token의 수는 {10, 100}, class label token의 수는 {1, 3, 5}, trigger token의 개수는 3,4,5,6 중에 하나를 선택해 실험했다.

 

실험 결과는 아래와 같다.

 

Supervised training 없이 BERT 모델은 BiLSTM과 비슷한 성능을 냈고, RoBERTa 모델은 finetuned BERT, ELMo 모델과 비슷한 성능을 냈다. 그리고 논문의 방법으로 학습한 prompt를 이용한 결과가 manual prompt를 이용한 결과보다 좋았다.

 

다른 실험 결과는 생략

 

Discussion

Prompting을 finetuning 대신 쓸 수 있다. 특히 low-data regime에서는 finetuning보다 우수했다. 그리고 저장해야할 파라미터 양이 finetuning보다 훨씬 적다. 하지만 모든 task에서 finetuning만큼 좋은 성능을 보이진 않았다. 그리고 자동으로 찾아진 prompt의 interpretability가 부족한 것이 단점이다. 또한 highly imbalanced data에서는 학습이 잘 되지 않을 수 있다.

 

 

정리

GPT3에서 처음 발견된 이후로 이전까지는 하나씩 넣어보며 평가했던 prompt를 gradient를 기반으로 하여 자동으로 찾아보려는 첫 시도를 한 논문인 것 같다. 이후 vocab에 있는 단어를 선택하는 discrete prompt가 아닌 soft prompt 방식이 주류가 되면서 많이 사용되고 있지는 않지만 그럼에도 학습에 의해 prompt를 찾으려는 의미있는 논문이다.

 

또한 초기 연구 논문이라 PLM의 knowledge의 활용에 초점이 맞춰져 있지만, 이후 prompt tuning은 parameter efficient finetuning의 한 방법으로 자리잡아 많은 연구가 이루어지게 됐다.