허깅페이스 트렌스포머 활용강좌, IMDB 데이터세트

안녕하세요! 오늘은 자연어 처리 분야에서 널리 사용되는 허깅페이스(Hugging Face)의 트랜스포머(Transformers) 라이브러리를 활용하여 IMDB 데이터셋을 가지고 감정 분석 모델을 학습하는 방법에 대해 자세히 알아보겠습니다. 데이터 준비부터 모델 학습, 평가 및 예측까지 전 과정을 살펴보겠습니다.

1. 소개

IMDB 데이터셋은 영화 리뷰가 포함된 데이터셋으로, 주어진 리뷰가 긍정적(1) 또는 부정적(0)인지를 분류하는 작업에 널리 사용됩니다. 이 데이터셋은 25000개의 리뷰로 구성되어 있으며, 각 리뷰는 자연어로 작성된 텍스트 데이터입니다. 딥러닝 모델은 이 텍스트 데이터를 이해하고, 감정을 분류하는 데에 도움을 줍니다.

2. 환경 설정

우선, 필요한 라이브러리를 설치하고 환경을 설정하겠습니다. 허깅페이스 트랜스포머와 함께 사용하는 라이브러리는 torchdatasets입니다. 아래 코드는 필요한 라이브러리를 설치하는 방법입니다.

!pip install transformers torch datasets

3. 데이터셋 로드

IMDB 데이터셋을 로드하기 위해 datasets 라이브러리를 사용하겠습니다. 다음 코드를 실행하여 데이터를 불러옵니다.

from datasets import load_dataset

dataset = load_dataset("imdb")
print(dataset)

위 코드는 IMDB 데이터셋을 로드하고, 데이터셋 구조를 출력합니다. 출력 결과로 훈련 데이터와 테스트 데이터의 크기를 확인할 수 있습니다.

4. 데이터 전처리

모델이 이해할 수 있도록 텍스트 데이터를 전처리해야 합니다. 일반적으로 필요한 전처리 과정은 다음과 같습니다:

  • 필요 없는 문자 제거
  • 소문자 변환
  • 토큰화(Tokenization)

허깅페이스 트랜스포머 라이브러리를 이용해 BERT 모델을 기반으로 한 토크나이저를 사용할 수 있습니다. 다음 코드를 통해 토크나이저를 설정하고 데이터를 전처리하겠습니다.

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

def encode_review(review):
    return tokenizer(review, padding="max_length", truncation=True, max_length=512, return_tensors='pt')['input_ids'][0]

# 훈련 데이터에서 일부 리뷰를 전처리
train_encodings = { 'input_ids': [], 'label': [] }
for review, label in zip(dataset['train']['text'], dataset['train']['label']):
    train_encodings['input_ids'].append(encode_review(review))
    train_encodings['label'].append(label)

5. 데이터셋 분할

훈련 데이터셋을 훈련 세트와 검증 세트로 나누기 위해 데이터셋을 불러온 후, PyTorch의 데이터로더를 사용하여 데이터를 분할합니다. 아래 코드를 참고하세요.

import torch

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

    def __getitem__(self, idx):
        item = { 'input_ids': self.encodings['input_ids'][idx],
                 'labels': torch.tensor(self.labels[idx]) }
        return item

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

train_dataset = IMDBDataset(train_encodings, train_encodings['label'])

6. 모델 설정

이제 모델을 설정해야 합니다. BERT 모델을 감정 분석을 위한 전이학습(transfer learning)으로 사용할 수 있습니다. 아래 코드는 BERT 모델을 불러오는 방법입니다.

from transformers import BertForSequenceClassification

model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

7. 훈련

모델을 훈련하기 위해 옵티마이저와 손실 함수를 설정해야 합니다. 아래 코드는 Adam 옵티마이저를 사용하여 모델을 훈련하는 과정을 보여줍니다.

from transformers import AdamW
    from transformers import Trainer, TrainingArguments

    training_args = TrainingArguments(
        output_dir='./results',
        num_train_epochs=3,
        per_device_train_batch_size=8,
        logging_dir='./logs',
    )

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

    trainer.train()

8. 평가

모델의 성능을 평가하기 위해 검증 세트를 사용할 수 있습니다. 평가 메트릭은 정확도(accuracy)로 설정합니다.

eval_result = trainer.evaluate()
    print(eval_result)

9. 예측

훈련이 완료된 후, 모델을 사용하여 새로운 리뷰에 대한 감정 예측을 수행할 수 있습니다.

def predict_review(review):
        encoding = encode_review(review)
        with torch.no_grad():
            logits = model(torch.tensor(encoding).unsqueeze(0))[0]
            predicted_label = torch.argmax(logits, dim=-1).item()
        return predicted_label

sample_review = "This movie was fantastic! I loved it."
predicted_label = predict_review(sample_review)
print(f"Predicted label for the review: {predicted_label}") # 1: 긍정, 0: 부정

10. 결론

이번 강좌에서는 허깅페이스 트랜스포머를 활용하여 IMDB 데이터셋으로 영화 리뷰 감정 분석 모델을 구축하는 전 과정을 살펴보았습니다. 데이터셋 로드, 전처리, 모델 학습 및 평가 단계까지, 모든 과정을 거치며 딥러닝을 활용한 텍스트 분류의 흐름을 이해할 수 있었기를 바랍니다. 허깅페이스 라이브러리는 강력한 기능을 제공하므로 여러 NLP 작업에 활용해 보시기 바랍니다.

감사합니다!