cb
[Do It! 자연어 처리] Chapter 04 - 문서에 꼬리표 달기 본문
본 게시물은 <Do It! BERT와 GPT로 배우는 자연어 처리>의 4장을 보고 정리한 글입니다. 실습에서 사용되는 오픈소스 패키지는 아래의 링크를 참고하시길 바랍니다
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
문서 분류(document classification)
문서 분류란 문서가 주어졌을 때 해당 문서의 범주를 분류하는 과제이다. 뉴스를 입력으로 하고 정치, 경제, 연예 등 범주를 맞히거나, 영화 리뷰가 긍정/부정 등 어떤 극성(polarity)을 가지는지 분류하는 작업이 문서 분류의 대표적인 예이다.
감성 분석(sentiment analysis)은 아래와 같이 문장의 극성을 분류하는 과제이다.
본 교재에서는 네이버 영화 리뷰 말뭉치(NSMC) 데이터를 사용하여 문서 분류를 수행한다.
모델 구조
우선 이 책에서 사용하는 문서 분류 모델은 입력 문장을 토큰화한 뒤 문장 시작과 끝을 알리는 스페셜 토큰 CLS와 SEP를 각각 원래 토큰 시퀀스 앞뒤에 붙인다. 그런 다음 이를 BERT 모델에 입력하고, 문장 수준의 벡터(pooler output)를 추출한다. 이 벡터에 작은 추가 모듈을 덧붙인다면 모델 전체의 출력을 [해당 문장이 긍정일 확률, 해당 문장이 부정일 확률]형태로 바꿔줄 수 있다.
태스크 모듈
pooler_output 벡터 뒤에 붙는 추가 모듈의 구조는 아래와 같다. 먼저 pooler_output(그림에서 x)에 드롭아웃을 적용한 후, 가중치 행렬을 곱한다. 그런 다음 소프트맥스 함수를 취하면 최종 출력이 나오게 된다. 이렇게 만든 모델의 최종 출력과 정답 레이블을 비교해 모델 출력이 정답 레이블과 최대한 같아지도록 모델 전체를 업데이트한다. 이 과정에서는 태스크 모듈까지 포함하여 업데이트하기 때문에, 이를 파인튜닝이라고 할 수 있다.
영화 리뷰 감성 분석 모델 만들기
아래는 문서 분류 모델의 데이터 전처리와 학습 과정에 대한 실습 코드이다.
# 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_corpus_name="nsmc",
downsrteam_mode_ldri="gdrive/My Drive/nlpbook/checkpoint-doccls",
batch_size=32 if torch.cuda.is_available() else 4,
learning_rate=5e-5,
max_seq_length=128,
epochs=3,
tpu_cores=0 if torch.cuda.is_available() else 8,
seed=7,)
# 랜덤 시드 고정
fromratsnlp import nlpbook
nlpbook.set_seed (args)
# 로거 설정
lpbook. set_logger (args
# 말뭉치 내려받기
from Korpora import Korpora
Korpora.fetch(
corpus_name=args.downstream_corpus_name,
root_dir=args.downstream_corpus_root_dir,
force_down load=True,)
# 토크나이저 준비
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(
args.pretrained_model_name,
do_lower_case=False,)
# 데이터 전처리하기
from ratsnlp.nlpbook.classification import NsmcCorpus, ClassificationDataset
corpus = NsmcCorpus()
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,)
# 평가용 데이터로더 구축
from torch.utils.data miptor SequentialSampler
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' 카테고리의 다른 글
[Do It! 자연어 처리] Chapter 06 - 단어에 꼬리표 달기 (0) | 2024.04.29 |
---|---|
[Do It! 자연어 처리] Chapter 05 - 문장 쌍 분류하기 (0) | 2024.04.08 |
[Do It! 자연어 처리] Chapter 03 - 숫자 세계로 떠난 자연어 下 (0) | 2024.04.01 |
[Do It! 자연어 처리] Chapter 03 - 숫자 세계로 떠난 자연어 上 (1) | 2024.03.27 |
[Do It! 자연어 처리] Chapter 02 - 문장을 작은 단위로 쪼개기 (3) | 2024.03.18 |