Nlp_파이프라인구축

NLP 학습 Pipeline 구축

책 소개

이번 학기 동아리에서 진행한 “문장 감정 분석” 프로젝트를 진행함에서 참고한 “Do it BERT와 GPT로 배우는 자연어 처리”에 대해 좀더 깊이 있는 학습을 진행하기 위해 포스팅을 작성한다.

대학원, 혹은 관련 전공자 고학년 수업에서만 다루는 자연어 처리를 잘 모르는 독자들도 잘 이해할 수 있도록 잘 쓰여진 책이라 NLP에 입문하는 사람들에게 상당히 좋은 책이라 생각한다.

[BERT와 GPT로 배우는 자연어 처리 이기창 - 교보문고](https://product.kyobobook.co.kr/detail/S000001818045)

Do it! BERT와 GPT로 배우는 자연어 처리 대표 이미지


학습 파이프라인

설정값 선언 -> 데이터 준비 -> 프리트레인 마친 모델 준비 -> 토크나이저 준비 -> 데이터 로더 준비 -> 테스크 정의 -> 모델 학습

자연어를 입력받아 긍/부정을 판단할 수 있도록 하는 BERT를 FineTuning하는 코드를 간단히 작성해보며 위 파이프라인을 이해해보도록 하자


설정 값 선언

from ratsnlp.nlpbook.classification import ClassificationTrainArguments
args=ClassificationTrainArguments(
    pretrained_model_name="beomi/kcbert-base",
    downstream_corpus_name="nsmc",
    downstream_corpus_root_dir="/content/Korpora",
    downstream_model_dir="/gdrive/My Drive/nlpbook/checkpoint-doccls",
    learning_rate=5e-5,
    batch_size=32,
)

모델 학습에 있어 필요한 여러 인자들을 설정한다.

pretrained_model_name="beomi/kcbert-base"

한국어 문맥을 이해할 수 있도록 Pretrained된 kcbert-base 모델을 pretrained_model로 등록한다.

kcbert-base의 깃허브 : https://github.com/Beomi/KcBERT

downstream_corpus_name="nsmc"

nsmc는 “Naver sentiment movie corpus”의 약어이며, 네이버 영화 리뷰 댓글 말뭉치를 20만개 가지고 있는 데이터 셋이다.

긍/부정이 적절히 매핑되어 있어, 이를 다운스트림 데이터로 사용한다.

 downstream_corpus_root_dir="/content/Korpora"

이 nsmc를 저장할 디렉토리를 설정한다.

 downstream_model_dir="/gdrive/My Drive/nlpbook/checkpoint-doccls"

학습한 다운스트림 데이터를 저장할 디렉토리를 세팅해준다.

learning_rate=5e-5,
batch_size=32,

학습률과 배치사이즈를 설정해준다.


데이터 준비

BERT는 자연어의 문맥을 이해하도록 사전 훈련된 모델이다.

우리는 이 BERT를 적절히 FIneTuning하여 문장의 감정을 긍/부정 분류하는 다운테스크를 수행할 수 있도록 FineTunning할 예정이고, 이를 위해 Supervised-Learning에 필요한 데이터 셋이 필요하다.

from Korpora import Korpora
Korpora.fetch(
    corpus_name=args.downstream_corpus_name, ## nsmc
    root_dir=args.downstream_corpus_root_dir, ## /content/Korpora
    force_download=True, ## 다운로드를 강제함
)

필요한 데이터셋(nsmc)를 다운로드 하기 위하여 Korpora라는 파이썬 패키지를 사용한다.

Korpora의 깃허브 : https://github.com/ko-nlp/Korpora?tab=readme-ov-file

사용방법은 위 깃허브에 잘 나와있고, 예시를 간단하게 들어보면 아래와 같다.

from Korpora import Korpora
Korpora.fetch("kcbert")
corpus = Korpora.load("kcbert")

프리트레인을 마친 모델 준비하기

from transformers import BertConfig, BertForSequenceClassification
pretrained_model_config=BertConfig.from_pretrained(
    args.pretrained_model_name, ## pretrained_model_name="beomi/kcbert-base"
    num_labels=2, ## 분류 클래스 개수
)
model=BertForSequenceClassification.from_pretrained(
    args.pretrained_model_name, ## pretrained_model_name="beomi/kcbert-base",
    config=pretrained_model_config, ## 바로 위의 BERT의 설정 값
)

허깅스페이스에서 만든 transformers 파이썬 패키지를 사용하여 관련 모델을 import 한다.

이 패키지를 이용하면 트랜스포머 계열의 언어 모델을 사용할 수 있는데, 깃허브 주소는 아래와 같다.

https://github.com/huggingface/transformers


토크나이저 준비

from transformers import BertTokenizer
tokenizer=BertTokenizer.from_pretrained(
    args.pretrained_model_name, ## pretrained_model_name="beomi/kcbert-base"
    do_lower_case=False, ## 소문자 변환 X
)

자연어를 Tokenizing 하기 위해 필요한 Tokenzier를 import 한다.

참고로 Pretraining과 Finetuning시에 사용하는 Tokenizer는 동일해야함에 주의해야한다.

사실 생각해보면 당연한 사실이다. 동일 자연어가 들어왔을때 다른 토큰이 출력되게 되면 Pretraining 모델을 사용하는 의미가 없어지기 떄문


데이터 로더 준비

from ratsnlp import nlpbook
from torch.utils.data import DataLoader,RandomSampler
from ratsnlp.nlpbook.classification import NsmcCorpus,ClassificationDataset

corpus=NsmcCorpus()
train_dataset=ClassificationDataset(
    args=args,
    corpus=corpus,
    tokenizer=tokenizer,
    mode="train",
) ## 분류 테스크를 위한 데이터셋 준비
train_dataloader=DataLoader(
    train_dataset,
    batch_size=args.batch_size,
    sampler=RandomSampler(train_dataset,replacement=False), # 중복 제거
    collate_fn=nlpbook.data_collator, # Collate 설정, 패딩화 작업과 유사
    drop_last=False, # 마지막 배치 제외
    num_workers=args.cpu_workers,
)

모델을 학습하기 위한 다운스트림 데이터를 준비했으니, 이를 적절하게 샘플링과 전처리(컬레이트)하는 데이터 로더를 준비한다.


문장 분류 모델 학습

from ratsnlp.nlpbook.classification import ClassificationTask
task=ClassificationTask(model,args)
trainer=nlpbook.get_trainer(args)
trainer.fit(task,train_dataloaders=train_dataloader,)

모델 학습을 위한 데이터로더까지 준비가 되었으니 이를 통해 모델을 학습한다.

분류테스크임을 task 변수에 정해주고,

trainer라는 파이토치 라이트닝에서 제공하는 모델 학습 객체를 사용하여 학습을 진행한다.


Categories:

Updated:

Leave a comment