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

딥러닝과 자연어 처리(NLP)는 현대의 인공지능 기술에서 중요한 역할을 하고 있습니다. 그 중에서도 BERT(Bidirectional Encoder Representations from Transformers)는 구글이 개발한 강력한 언어 모델로, 많은 NLP 작업에서 뛰어난 성능을 보여주고 있습니다. 이번 강좌에서는 허깅페이스의 트렌스포머 라이브러리를 활용하여 BERT 모델을 파인튜닝하고, 텍스트 분류 작업을 수행하는 방법에 대해 자세히 알아보겠습니다.

1. 허깅페이스와 BERT 소개

허깅페이스(Hugging Face)는 자연어 처리 모델을 쉽게 사용할 수 있도록 다양한 모델과 툴을 제공하는 라이브러리입니다. 특히, BERT와 같은 트렌스포머 기반의 모델을 간편하게 사용할 수 있도록 해줍니다. BERT 모델은 문맥의 양쪽 정보를 동시에 고려하여 더 깊이 있는 이해를 가능하게 합니다. 이는 전통적인 RNN이나 LSTM 기반 모델들보다 더 우수한 성능을 발휘할 수 있는 이유입니다.

2. BERT 모델의 기본 구조

BERT는 인코더 – 디코더 구조의 트렌스포머 모델로, 주로 인코더 부분이 사용됩니다. BERT의 주요 특징은 다음과 같습니다:

  • 양방향 Attention: BERT는 양방향 문맥을 학습할 수 있어 특정 단어의 의미를 더 풍부하게 이해합니다.
  • Masked Language Model: 학습 중 일부 단어를 마스킹하고, 모델은 마스킹된 단어를 예측하도록 훈련됩니다.
  • Next Sentence Prediction: 두 문장이 주어졌을 때, 두 문장이 실제로 연속적인 문장인지 여부를 예측합니다.

3. Hugging Face Transformers 설치

먼저, 허깅페이스의 트렌스포머 라이브러리를 설치해야 합니다. 이를 위해서는 다음과 같은 명령어를 사용하여 설치할 수 있습니다:

pip install transformers

4. 데이터셋 준비하기

딥러닝 모델을 훈련시키기 위해서는 적절한 데이터셋이 필요합니다. 본 강좌에서는 간단한 텍스트 분류 작업을 위해 IMDB 영화 리뷰 데이터셋을 사용하겠습니다. 이 데이터셋은 긍정적인 리뷰와 부정적인 리뷰로 구성되어 있습니다.


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'
# 데이터를 다운로드하고 압축 해제합니다.
!wget {url}
!tar -xvf aclImdb_v1.tar.gz

# 긍정 및 부정 리뷰 로드
pos_reviews = pd.read_csv('aclImdb/train/pos/*.txt', delimiter="\n", header=None)
neg_reviews = pd.read_csv('aclImdb/train/neg/*.txt', delimiter="\n", header=None)

# 데이터 준비
positive = [(1, review) for review in pos_reviews[0]]
negative = [(0, review) for review in neg_reviews[0]]

data = positive + negative
df = pd.DataFrame(data, columns=['label', 'review'])
df['label'] = df['label'].map({0: 'negative', 1: 'positive'})

# 훈련 데이터와 테스트 데이터로 분리
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)
    

5. 데이터 전처리

BERT 모델을 사용하기 위해서는 데이터를 적절한 형식으로 전처리해야 합니다. 허깅페이스의 트렌스포머 라이브러리에서 제공하는 BERT 토크나이저를 사용하겠습니다.


from transformers import BertTokenizer

# BertTokenizer 로드
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# 데이터 토큰화
def tokenize_data(data):
    return tokenizer(data['review'].tolist(), padding=True, truncation=True, return_tensors='pt')

train_encodings = tokenize_data(train_df)
test_encodings = tokenize_data(test_df)
    

6. 데이터셋 생성

토큰화된 데이터를 Dataset 클래스를 사용해 PyTorch Dataset으로 변환합니다.


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'] = self.labels[idx]
        return item

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

train_dataset = IMDbDataset(train_encodings, train_df['label'].tolist())
test_dataset = IMDbDataset(test_encodings, test_df['label'].tolist())
    

7. 모델 설정 및 파인튜닝

이제 BERT 모델을 로드하고, 분류 작업을 위해 파인튜닝을 진행하겠습니다.


from transformers import BertForSequenceClassification, Trainer, TrainingArguments

# BERT 모델 로드
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)

# 훈련 인자 설정
training_args = TrainingArguments(
    output_dir='./results',
    evaluation_strategy='epoch',
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    num_train_epochs=3,
    weight_decay=0.01,
)

# 트레이너 객체 생성
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset,
)
    
# 모델 훈련
trainer.train()
    

8. 평가 및 예측

모델 훈련 후, 테스트 데이터셋을 이용하여 모델 성능을 평가하고 예측해 보겠습니다.


# 모델 평가
trainer.evaluate()

# 예측
predictions = trainer.predict(test_dataset)
predicted_labels = predictions.predictions.argmax(-1)
    

9. 결과 해석

모델이 예측한 라벨을 원본 라벨과 비교하여 정확도를 계산하고, 수정할 부분이 있는지 분석합니다. Confusion Matrix를 통해서 더욱 자세한 결과를 시각화할 수도 있습니다.


from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

confusion_mtx = confusion_matrix(test_df['label'].tolist(), predicted_labels)
plt.figure(figsize=(10,7))
sns.heatmap(confusion_mtx, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
    

10. 결론

이번 강좌에서는 허깅페이스 트렌스포머 라이브러리를 활용하여 BERT 모델을 파인튜닝하고 텍스트 분류 작업을 수행하는 방법을 살펴보았습니다. BERT와 같은 사전 훈련된 모델을 사용하는 것은 시간과 자원을 절약할 뿐만 아니라 성능도 크게 향상시킬 수 있습니다. 앞으로도 다양한 NLP 작업에서 BERT와 같은 모델을 활용하여 더 나은 성능을 달성할 수 있기를 바랍니다.

참고사항

  • 허깅페이스 트렌스포머 공식 문서: 링크
  • BERT 원 논문: 링크