Python/NLP Code

파이썬 BERT 모델 활용 IMDB 데이터셋 감성 분석 classification 예제

jimmy_AI 2022. 6. 18. 16:50
반응형

허깅페이스 BERT 영화 리뷰 감정 분류 튜토리얼

파이썬에서 transformers 라이브러리를 활용하여 BERT 구조 모델을

감성 분석 classification 과정에서 이용하는 예제에 대하여 다루어보도록 하겠습니다.

(데이터셋으로는 IMDB 영화 감성 분석 데이터셋을 사용하겠습니다.)

 

참고로, 이 글은 아래 링크의 허깅페이스 공식 사이트 글의 내용을 기반으로 작성되었으며,

여기서는 해당 공식 글의 해설을 위주로 글을 전개하도록 하겠습니다.

 

Text classification

To fine-tune a model in TensorFlow, start by converting your datasets to the tf.data.Dataset format with to_tf_dataset. Specify inputs and labels in columns, whether to shuffle the dataset order, batch size, and the data collator: >>> tf_train_set = tokeni

huggingface.co

 

만일, transformers 및 datasets 모듈이 설치되지 않았다면

아래 명령어를 통하여 해당 모듈들의 설치를 먼저 진행해주세요.

!pip install transformers
!pip install datasets

 

 

데이터셋 로드

허깅페이스에서 transformers 모듈과 함께 제공하는 datasets 모듈을 통하여

필요한 데이터셋 몇 가지를 편하게 받아올 수 있습니다.

 

아래의 코드로 대표적인 감성 분석 데이터셋인 IMDB도 쉽게 로드가 가능합니다.

(해당 과정에는 수 분 가량이 소요될 수 있습니다.)

from datasets import load_dataset

imdb = load_dataset("imdb")

 

데이터의 구성은 각 데이터는 text 부분과 label 부분(긍정 1, 부정 0)으로 되어있고,

train 데이터의 개수는 25000개로 나타났습니다.

print(imdb['train'])

'''
Dataset({
    features: ['text', 'label'],
    num_rows: 25000
})'''

print(imdb['train'][0])

''' {'text': 'I rented I AM CURIOUS-YELLOW from my video store because of all the controversy that #중간 생략...
, 'label': 0} '''

 

 

토크나이저 로드 및 토큰화 수행

여기서 사용할 모델 구조는 BERT이기에 모델에 맞는 tokenizer를 불러와야 합니다.

 

토크나이저를 불러온 이후에는 토큰화 과정을 수행해주어

텍스트의 각 단어를 머신러닝 모델이 이해할 수 있는 숫자 형태로 변환해주면 됩니다.

from transformers import AutoTokenizer

# BERT 모델 구조에 맞는 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 토큰화 수행(수 분 가량 소요 가능)
tokenized_imdb = imdb.map(lambda x : tokenizer(x['text'], truncation=True), batched=True)

참고로, padding 등의 추가적인 전처리 과정은 train 단계에서 Trainer의 기능을 활용하여

진행해도 무방하므로 뒷 부분에서 다루도록 하겠습니다.

 

반응형

 

사전 학습된 모델 불러오기

BERT 등의 transformers 구조의 모델들은 pre-train이 완료된 상태에서 사용하게 되며,

해당 모델의 파라미터 값들을 불러와야 합니다.

 

파이토치의 기능을 통하여 GPU 사용을 지정해주고

분류를 위한 가장 기본적인 BERT 파라미터를 불러오는 예시 코드는 아래와 같습니다.

from transformers import AutoModelForSequenceClassification
import torch

# 파이토치 기능을 통한 GPU 지정
device = torch.device('cuda:0') if torch.cuda.is_available() else torch.device('cpu')

# 가장 기본적인 분류를 위한 BERT 모델 로드
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2).to(device)

label의 종류는 긍정/부정의 두 가지이므로, num_labels 인자는 2로 지정하였으며,

 

기본 모델인 bert-base-uncased 대신 다르게 학습된 구조의 모델을 사용하고 싶다면

아래 사이트에서 모델의 이름을 검색하여 input으로 대신 지정해주시면 됩니다.

 

Models - Hugging Face

 

huggingface.co

 

 

학습 진행하기

transformers에서 제공해주는 Trainer 기능을 사용하면 원하는 하이퍼 파라미터 조건대로

쉽게 모델 학습을 진행할 수 있습니다.

 

가장 긴 길이에 맞추어 padding을 진행하기 위한 collator를 선언해주고, trainer 내부에서

자동 전처리가 수행되게 만들어줄 수 있습니다.

 

맨 위의 링크 글에 첨부되었던 학습 코드 지정의 예시는 다음과 같습니다.

from transformers import DataCollatorWithPadding, TrainingArguments, Trainer

data_collator = DataCollatorWithPadding(tokenizer=tokenizer) # sequence padding

training_args = TrainingArguments(
    output_dir="./results", # checkpoint 저장 디렉토리
    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, # 미리 선언했던 BERT 모델
    args=training_args, # 위에서 지정한 argument 조합
    train_dataset=tokenized_imdb["train"],
    eval_dataset=tokenized_imdb["test"],
    tokenizer=tokenizer,
    data_collator=data_collator, # 자동 전처리 기능
)

trainer.train() # 이 코드를 실행하면 학습 시작

 

학습을 시작하면 아래와 같이 진행 상황 및 중간 결과가 출력됩니다.

 

참고로, Trainer 및 TrainArgument에서는 학습 조건을 지정할 수 있는

많은 종류의 인자를 제공하고 있는데 이에 대한 내용은 아래의 공식 글을 확인해주세요.

 

Trainer

When using gradient accumulation, one step is counted as one step with backward pass. Therefore, logging, evaluation, save will be conducted every gradient_accumulation_steps * xxx_step training examples.

huggingface.co

 

BERT가 아닌 다른 구조의 transformers 모델 구조도 허깅페이스에서 지원한다면

같은 방식으로 사용이 가능합니다.(단, 토크나이저 종류도 맞춰주어야 합니다.)