Search

Text Classification Using RoBERTa

파이토치 허브 번역 프로젝트에 앞서 번역을 희망하는 RoBERTa 모델을 사용해 보았습니다.

What is RoBERTa?

RoBERTa 모델은 2019년 Facebook에서 발표한 Robustly Optimized BERT Pretraining Approach 논문과 함께 공개되었다. 논문의 저자는 BERT가 undertrained 되었음을 찾아냈고, 개선하기 위한 방법으로 RoBERTa를 제안했다. RoBERTa에 적용한 것은 아래와 같다.
Training the model longer with bigger batch, over more data
NSP loss 제거 (Next sentence prediction) 이유, 효과 더 알아보기
Longer sequence 추가
Dynamic Masking 적용 적용 원리 알아보기
결과적으로 BERT 보다 우월한 성능을 보였으며, 이전에 간과 되었던 설계의 중요성을 드러냈다.

Text Classification Using RoBERTa

0. 실습 개요

주어진 문장의 부정(0)과 긍정(1) 두 가지 Sentiment Classification을 수행합니다.
Huggingface의 Text Classification TutorialRoBERTa Documentations를 참고하여 작성하였습니다.
학습 데이터셋 : IMDb (nternet Movie Database, Large Movie Review Dataset.)

1. Load Dataset

!pip install transformers !pip install datasets from datasets import load_dataset imdb = load_dataset("imdb")
Python

2. Preprocess

from transformers import RobertaTokenizer tokenizer = RobertaTokenizer.from_pretrained("roberta-base")
Python
def preprocess_function(examples): return tokenizer(examples["text"], truncation=True) tokenized_imdb = imdb.map(preprocess_function, batched=True)
Python
from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
Python
from transformers import RobertaForSequenceClassification, TrainingArguments, Trainer model = RobertaForSequenceClassification.from_pretrained("roberta-base", num_labels=2, ignore_mismatched_sizes=True)
Python

3. Train

training_args = TrainingArguments( output_dir="./results", learning_rate=2e-5, per_device_train_batch_size=16, per_device_eval_batch_size=16, num_train_epochs=5, weight_decay=0.01, ) trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_imdb["train"], eval_dataset=tokenized_imdb["test"], tokenizer=tokenizer, data_collator=data_collator, ) trainer.train()
Python

4. Evaluate & Visualize

trainer.evaluate()
Python
!pip install transformers_interpret from transformers_interpret import SequenceClassificationExplainer cls_explainer = SequenceClassificationExplainer( model, tokenizer) word_attributions = cls_explainer(imdb["test"][0]["text"]) cls_explainer.visualize()
Python
True Label과 Predicted가 일치한다.

Review

본래에는 파이토치 허브 RoBERTa 문서에 소개된 내용을 실습하려 했으나,
해결되지 않는 이슈로 실패했다. 때문에 파이토치 허브 사용을 한 차례 미루게 되어 아쉽다.
특히, RoBERTa가 긴 문장에 취약한 BERT의 단점을 보완한 모델인만큼
긴 문장을 처리하는 작업에서 두 모델의 성능을 비교 해보는 것도 좋겠다.
동일 조건에서 학습 시간이 BERT보다 오래 걸리는 듯? ⇒ 확인 필요
각 셀의 출력을 포함하면 글이 난잡해져서 뺐는데 함께 볼 수 있는 방법을 찾아봐야겠다.

Reference