cb
[Do It! 자연어 처리] Chapter 05 - 문장 쌍 분류하기 본문
본 게시물은 <Do It! BERT와 GPT로 배우는 자연어 처리>의 5장을 보고 정리한 글입니다. 실습에서 사용되는 오픈소스 패키지는 아래의 링크를 참고하시길 바랍니다
https://github.com/ratsgo/ratsnlp
GitHub - ratsgo/ratsnlp: tools for Natural Language Processing
tools for Natural Language Processing. Contribute to ratsgo/ratsnlp development by creating an account on GitHub.
github.com
문장 쌍 분류(sentence pair classification)
문장 쌍 분류란 문장 2개가 주어졌을 때 해당 문장 사이의 관계가 어떤 범주일지 분류하는 과제이다. 문장 쌍 분류의 대표 예로는 자연어 추론 과제(natural language inference, NLI)가 있다. 자연어 추론은 2개의 문장 또는 문서가 참, 거짓, 중립 또는 판단 불가인지 가려내는 것이다.
나 출근했어 + 난 백수야 -> 거짓
나 출근했어 + 난 개발자다 -> 중립
본 교재에서는 업스테이지에서 공개한 NLI 데이터셋을 사용해 실습을 진행한다. 이 데이터셋에는 전제(premise)에 대한 가설(hypothesis)이 참인지, 거짓인지, 중립인지 정보를 레이블로 주어져 있다.
모델 구조
NLI 과제 수행 모델의 입력은 전제와 가설 2개이다. 출력으로는 두 문장간의 관계가 어떤 범주일지 확률을 나타낸다. 그런 다음 출력에 적당한 후처리 과정을 거쳐 참(entailment), 거짓(contradiction), 중립(neutral) 등 사람이 보기에 좋은 형태로 가공한다.
이 책에서 사용하는 문장 쌍 분류 모델은 전제와 가설 두 문장을 각각 토큰화한 뒤 [CLS] + 전제 + [SEP] + 가설 + [SEP] 형태로 이어 붙인다. 다음 과정은 4장해서 진행한 문서에 꼬리표달기와 비슷하게 이루어진다. 이어 붙인 문장을 BERT 모델에 입력하고 문장 수준의 벡터(pooler_output)를 뽑으면, 이 벡터에는 전제와 가설의 의미가 응축되게 된다. 여기에 작은 추가 모듈을 덧붙여 모델 전체의 출력이 [전제에 대한 가설이 참일 확률, 전제에 대해 가설이 거짓일 확률, 전제에 대해 가설이 중립일 확률] 형태가 되도록 한다.
태스크 모듈
pooler_output 뒤에 붙는 추가 모듈에는 우선 드롭아웃을 적용한다. 그런 다음 가중치 행렬을 곱해 pooler_output을 분류해야 할 범주 수만큼의 차원을 갖는 벡터로 변환한다. 여기에 소프트맥스 함수를 취하면 모델의 최종 출력, y가 된다.
이렇게 만든 모델은 최종 출력과 정답 레이블을 비교해 모델 출력이 정답 레이블과 최대한 같아지도록 BERT 레이어를 포함한 모델 전체를 업데이트한다.
자연어 추론 모델 만들기
아래는 자연어 추론 모델의 데이터 전처리와 학습 과정에 대한 실습 코드이다.
# TPU 관련 패키지 설치
!pip install cloud-tpu-client==0.10 https://storage.googleapis.com/tpu-pytorch/wheels/torch_xla-1.9-cp37-cp37m-Linux_x86_64-whl
# 의존성 패키지 설치
!pip install ratsnlp
# 구글 드라이브와 연결
from google.colab import drive
drive.mount (/g'drive,' force remount=True)
# 모델 환경 설정
import torch
fromratsnlp.nlpbook.classification import ClassificationTrainArguments
args = ClassificationTrainArguments(
pretrained_model_name="beomi/kcbert-base",
downstream_task_name="pair-classification",
downstream_corpus_name="klue-nli",
downsrteam_model_dir="gdrive/My Drive/nlpbook/checkpoint-paircls",
batch_size=32 if torch.cuda.is_available() else 4,
learning_rate=5e-5,
max_seq_length=64,
epochs=5,
tpu_cores=0 if torch.cuda.is_available() else 8,
seed=7,)
# 랜덤 시드 고정
from ratsnlp import nlpbook
nlpbook.set_seed(args)
# 로거 설정
lpbook.set_logger(args)
# 말뭉치 내려받기
nlpbook.download_downstram_dataset(args)
# 토크나이저 준비
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(
args.pretrained_model_name,
do_lower_case=False,)
# 데이터 전처리하기
from ratsnlp.nlpbook.paircls import KlueNLICorpus
from ratsnlp.nlpbook.classification import ClassificationDataset
corpus = KlueNLICorpus()
train_dataset = ClassificationDataset(
args = args,
corpus = corpus,
tokenizer = tokenizer,
mode = "train",)
# 학습 데이터로더 구축
from torch.utils.data import Dataloader, RandomSampler
train_dataloader = DataLoader(
train_dataset,
batch_size = args.batch_size,
sampler = RandomSampler(train_dataset, replacement=False),
collate_fn = nlpbook.data_collator,
drop_last = False,
mun workers = args.cpuworkers,)
# 평가용 데이터로더 구축
val_dataset =ClassificationDataset(
args=args,
corpus=corpus,
tokenizer=tokenizer,
mode="test",)
val_dataloader = DataLoader(
val_dataset,
batch_size=args.batch_size,
sampler=SequentialSampler(val_dataset),
collate_fn=nlpbook.data_collator,
drop_last=False,
num_workers=args.cpu_workers,)
# 모델 초기화
from transformers import BertConfig, BertForSequenceClassification
pretrained_model_config = BertConfig.from_pretrained(
args.pretrained_model_name,
num_labels=corpus. num_labels,)
model = BertForSequenceClassification.from_pretrained(
args.pretrained_model_name,
config=pretrained_model_config,)
# Task 정의
from ratsnlp.nlpbook.classification import ClassificationTask
task = ClassificationTask(model, args)
# 트레이너 정의
trainer =nlpbook.get_trainer(args)
# 학습 개시
trainer.fit(
task,
train_dataloader=train_dataloader,
val_dataloaders=val_dataloader,
)
'ai - study' 카테고리의 다른 글
[3D Vision] Image Formation 강의 정리 (3) | 2024.08.08 |
---|---|
[Do It! 자연어 처리] Chapter 06 - 단어에 꼬리표 달기 (0) | 2024.04.29 |
[Do It! 자연어 처리] Chapter 04 - 문서에 꼬리표 달기 (0) | 2024.04.03 |
[Do It! 자연어 처리] Chapter 03 - 숫자 세계로 떠난 자연어 下 (0) | 2024.04.01 |
[Do It! 자연어 처리] Chapter 03 - 숫자 세계로 떠난 자연어 上 (1) | 2024.03.27 |