허깅페이스 트렌스포머 활용강좌, BERT 분류 파인튜닝

딥러닝의 발전과 함께 자연어 처리(NLP) 분야에서도 많은 혁신이 이루어졌습니다. 특히, 허깅페이스(Hugging Face)의 트랜스포머(Transformers) 라이브러리는 여러 강력한 사전 훈련(pre-trained) 모델을 제공하며, 연구자나 개발자가 손쉽게 자연어 처리 모델을 활용할 수 있게 해주고 있습니다. 이 강좌에서는 BERT(Bidirectional Encoder Representations from Transformers) 모델을 사용하여 텍스트 분류 작업을 수행하는 방법을 자세하게 설명하겠습니다.

1. BERT란 무엇인가?

BERT는 Google에서 발표한 자연어 처리 모델로, ‘양방향'(Bidirectional)이라는 특징이 있습니다. 이는 텍스트의 컨텍스트를 이해하는 데 매우 강력한 기능을 제공합니다. BERT는 텍스트 데이터를 처리할 때, 단어의 위치에 관계없이 문맥을 이해하기 때문에 전통적인 단어 임베딩 기법보다 우수한 성능을 보입니다.

2. 허깅페이스 Transformers 라이브러리 소개

허깅페이스의 Transformers 라이브러리는 BERT를 포함한 다양한 트랜스포머 모델을 손쉽게 사용할 수 있는 파이썬 라이브러리입니다. 현재 NLP 분야에서 널리 사용되고 있으며, 사전 훈련된 모델을 불러와서 파인튜닝(fine-tuning)하여 특정 작업에 맞게 효율적으로 사용할 수 있습니다.

2.1 설치하기

허깅페이스 Transformers 라이브러리를 설치하기 위해 아래의 pip 명령어를 사용합니다:

pip install transformers

3. BERT로 텍스트 분류하기

이번 강좌에서는 IMDB 영화 리뷰 데이터셋을 사용하여 영화 리뷰가 긍정적인지 부정적인지를 분류하는 모델을 구현합니다. 데이터셋은 다음과 같은 형태로 되어 있습니다:

  • 텍스트: 영화 리뷰
  • 레이블: 긍정(1) 또는 부정(0)

3.1 데이터셋 준비하기

먼저 데이터셋을 다운로드하고 전처리합니다.


import pandas as pd
from sklearn.model_selection import train_test_split

# IMDB 데이터셋 로드하기
url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
# 데이터를 로드하고 전처리
# 여기에 데이터 로딩 및 전처리 코드가 옵니다. (간단한 예시입니다)
data = pd.read_csv("imdb_reviews.csv")
data['label'] = data['sentiment'].apply(lambda x: 1 if x == 'positive' else 0)

train_texts, val_texts, train_labels, val_labels = train_test_split(data['review'], data['label'], test_size=0.2)
    

3.2 BERT Tokenization

텍스트 데이터를 BERT 모델에 맞게 변환하기 위해 토크나이저(tokenizer)를 사용합니다. 토크나이저는 텍스트를 분할하여 모델 입력 형식으로 변환하는 역할을 합니다.


from transformers import BertTokenizer

# BERT 토크나이저 초기화
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# BERT 입력 형태로 변환하는 함수
def encode(texts):
    return tokenizer(texts.tolist(), padding=True, truncation=True, return_tensors='pt')

train_encodings = encode(train_texts)
val_encodings = encode(val_texts)
    

3.3 데이터셋 만들기

토크나이저가 변환한 인코딩을 파이토치 텐서로 변환하여 데이터셋을 만듭니다.


import torch

class IMDbDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels

    def __getitem__(self, idx):
        item = {key: val[idx] for key, val in self.encodings.items()}
        item['labels'] = torch.tensor(self.labels[idx])
        return item

    def __len__(self):
        return len(self.labels)

train_dataset = IMDbDataset(train_encodings, train_labels.values)
val_dataset = IMDbDataset(val_encodings, val_labels.values)
    

4. BERT 모델 정의하기

이제 Hugging Face의 Transforms 라이브러리에서 제공하는 BERT 모델을 불러와서 분류 작업을 위한 파인튜닝을 진행합니다.


from transformers import BertForSequenceClassification

# BERT 모델 불러오기
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
    

5. 모델 훈련하기

모델을 훈련하기 위해 Trainer API를 사용할 수 있습니다. 이 API는 훈련 루프를 자동으로 처리하므로 매우 편리합니다.


from transformers import Trainer, TrainingArguments

# 훈련 환경 설정
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    warmup_steps=500,
    weight_decay=0.01,
    logging_dir='./logs',
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
)

# 훈련 시작
trainer.train()
    

6. 모델 평가하기

훈련된 모델을 평가하여 성능을 확인합니다.


trainer.evaluate()
    

결론

본 강좌에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 BERT 모델을 사용한 텍스트 분류 작업을 수행하는 방법을 배웠습니다. BERT는 다양한 자연어 처리 작업에서 우수한 성능을 발휘하며, 사전 훈련된 모델을 활용하면 적은 데이터만으로도 좋은 결과를 낼 수 있습니다. 앞으로 여러분이 다양한 NLP 프로젝트에서 BERT를 활용하길 바랍니다.

참고 자료