티스토리 뷰

AI/NLP

Prompt-based Learning이란?

미남잉 2023. 4. 22. 22:55
728x90

 

최근 NLP를 공부하면서 프롬프트(Prompt)라는 것을 알게 되었고, 현재도 프롬프트 러닝에 대해 이해하기 위해 노력 중이다. 일단 자연어처리 수업을 들으며 정확히는 아니더라도 NLP의 개념과 흐름에 대해 전반적으로 배우고 있는게 많은 도움이 되고 있다.

 

특히 Pre-train, Fine-tuning의 모델인 BERT를 공부한게 가장 잘한 것 같다. BERT는 prompt-based NLP가 시작하는 지점이라고 말하기도 한다. NLP의 패러다임을 간단히 살펴보면 아래와 같다.

 

a. Fully Supervised Learning (Non-Neural Network) - Features

b. Fully Supervised Learning (Neural Network) - Architecture (e.g. convolutional, recurrent, self-attentional)

c. Pre-train, Fine-tune - Objective (e.g. masked language modeling, next sequence prediction)

d. Pre-train, Prompt, Predict - Prompt (e.g. close, prefix)

 

프롬프트 기반의 학습 아이디어는 모델에 맞게 입력을 설계하는 것이다. 

 

아래의 표는 프롬프드를 표시하는 용어에 대한 내용이다.

 

아래 그림에서 볼 수 있듯이 입력 $(x)$(예: 영화 리뷰)으로 시작하여 예상 출력 $(y)$을 입력한다.첫 번째 작업은 프롬프트 함수(이미지에서 Fprompt 언급)를 사용하여 이 입력을 다시 포맷한다. 이 함수의 출력은 $(x')$ 로 표시된다. 이제 자리를 표시하는 $Z$ 대신 $z$ 값을 예측하는 것이 언어 모델의 작업이다. 그런 다음 슬롯 $Z$가 답변으로 채워지는 프롬프트의 경우 이를 Filled prompt라고 하고 해당 답변이 참이면 Answered prompt를 호출한다.

 

 

이 패러다임의 인기 있는 Application program 중 일부는 텍스트 생성, 질문 응답, 추론, 명명된 엔터티 인식, 관계 추출, 텍스트 분류 등이 있다.

 

프롬프트 기반 텍스트 분류 사용 사례

pip install openprompt

- 프롬프트 학습을 위한 오픈 소스 프레임워크를 사용

 

from openprompt.data_utils import InputExample
classes = [ 
    "Sports",
    "Health"
]
dataset = [
    InputExample(
        guid = 0,
        text_a = "Cricket is a really popular sport in India.",
    ),
    InputExample(
        guid = 1,
        text_a = "Coronavirus is an infectious disease.",
    ),
    InputExample(
        guid = 2,
        text_a = "It's common to get hurt while doing stunts.",
    )
]

클래스는 '스포츠'와 '건강'으로 두 개이다.  그 다음 분류 레이블을 가져오는데 관심이 있는 세 가지 입력 샘플을 정의한다.

 

from openprompt.plms import load_plm
plm, tokenizer, model_config, WrapperClass = load_plm("roberta", "roberta-base")

다음으로 언어 모델을 로드 하고 목적에 맞게 RoBERTa를 선택한다.

 

from openprompt.prompts import ManualTemplate
promptTemplate = ManualTemplate(
    text = '{"placeholder":"text_a"} It was {"mask"}',
    tokenizer = tokenizer,
)

다음으로 "text_a" 변수에 동적으로 저장된 입력 예제를 입력할 수 있는 템플릿을 정의. {"mask"} 토큰은 모델이 채우는 것이다. 템플릿을 작성하는 방법은 따로 존재한다. 모델과 task에 맞게 조정하면 되는 것 같다. (참고 사이트: OpenPrompt: How to Write a Template?)

 

from openprompt.prompts import ManualVerbalizer
promptVerbalizer = ManualVerbalizer(
    classes = classes,
    label_words = {
        "Health": ["Medicine"],
        "Sports": ["Game", "Play"],
    },
    tokenizer = tokenizer,
)

다음으로 모델의 예측을 미리 정의된 클래스 레이블에 투영할 수 있도록 하는 언어 변환기를 정의. 마찬가지로 버벌라이저를 작성하는 방법도 존재한다.  (참고 사이트: OpenPrompt: How to Write a Verbalizer?)

 
from openprompt import PromptForClassification
promptModel = PromptForClassification(
    template = promptTemplate,
    plm = plm,
    verbalizer = promptVerbalizer,
)

다음으로, 템플릿, 언어 모델 및 자연어 처리기와 같은 필수 매개변수를 전달하여 분류를 위한 프롬프트 모델을 만든다.

 

from openprompt import PromptDataLoader
data_loader = PromptDataLoader(
        dataset = dataset,
        tokenizer = tokenizer,
        template = promptTemplate,
        tokenizer_wrapper_class=WrapperClass,
    )

다음으로, 데이터 세트에서 미니 배치를 샘플링하기 위한 데이터 로더를 만든다.

 

import torch

promptModel.eval()
with torch.no_grad():
     for batch in data_loader:
         logits = promptModel(batch)
         preds = torch.argmax(logits, dim = -1)
         print(tokenizer.decode(batch['input_ids'][0], skip_special_tokens=True), classes[preds])

다음으로 모델을 평가 모드 로 설정 하고 MLM( Masked-Language Model ) 방식 으로 각 입력 예제에 대해 예측한다.

 

 

Cricket is a really popular sport in India. The topic is about Sports
Coronavirus is an infectious disease. The topic is about Health
It's common to get hurt while doing stunts. The topic is about Health

각 예제에 대한 출력을 보여준다.

 

프롬프트를 설계하기 위한 고려 사항은 아래와 같다.

1. 사전 훈련된 모델의 선택 - 사전 훈련된 objective 및 training style은 다운스트림 작업에 대한 모델의 적합성을 도출함

2. 프롬프트 설계 - 사전 훈련된 모델이 수정되면 원하는 답변을 반환하는 방식으로 프롬프트/신호를 설계하고 입력 텍스트의 형식을 지정하는 것이 중요. 한 가지 중요한 방법은 이러한 작업을 수동으로 하는 것이지만 노동 집약적인 문제로 자동화하는 연구가 있음

3. 답변 설계 - 마스크를 실제 답변과 라벨로 매핑하는 기능도 중요함

4. Prompt-based Training - 다운스트림 작업에 사용할 수 있는 학습 데이터가 있는 상황이 존재. 이러한 상황에서 prompt, LM 둘 다 매개변수를 훈련시키는 방법을 도출

 

 

Reference

Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing 📎 

 

728x90
댓글