최근 몇 년 동안 자연어 처리(NLP) 분야는 비약적인 발전을 이루었습니다. 그 중심에는 딥러닝과 트랜스포머 모델이 자리 잡고 있으며, 특히 허깅페이스의 Transformers 라이브러리는 많은 연구자 및 개발자들에게 널리 사용되고 있습니다. 이 글에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 텍스트 분류 모델을 학습하고 평가하는 방법을 살펴보겠습니다.
1. 허깅페이스 트렌스포머 라이브러리 소개
허깅페이스의 Transformers 라이브러리는 사용자가 사전 학습된 다양한 트랜스포머 모델을 쉽게 사용하고, 자신의 데이터에 맞게 모델을 fine-tuning할 수 있도록 돕는 오픈소스 라이브러리입니다. BERT, GPT-2, RoBERTa 등 다양한 모델이 포함되어 있으며, API가 직관적이어서 간편하게 사용할 수 있습니다.
2. 텍스트 분류 문제 정의
텍스트 분류는 주어진 텍스트 데이터를 하나 이상의 클래스 레이블로 분류하는 작업입니다. 예를 들어, 이메일이 스팸인지 아닌지를 분류하는 문제 또는 영화 리뷰가 긍정적인지 부정적인지를 분류하는 문제가 이에 해당합니다. 본 강좌에서는 간단한 예로 IMDB 영화 리뷰 데이터셋을 사용하여 긍정 및 부정 리뷰로 분류하는 모델을 구축하겠습니다.
3. 데이터로드 및 기본 전처리
우선, 필요한 라이브러리를 설치하고, IMDB 데이터셋을 로드하겠습니다. IMDB 데이터셋은 영화 리뷰와 해당 리뷰의 감정 레이블을 포함하고 있습니다.
python
# 필요한 라이브러리 설치
!pip install transformers torch datasets
# 라이브러리 임포트
from datasets import load_dataset
# IMDB 데이터셋 로드
dataset = load_dataset('imdb')
print(dataset)
위 코드를 실행하면 IMDB 데이터셋이 로드되고, train과 validation 세트로 나누어져 있는 것을 볼 수 있습니다. 각 데이터셋은 영화 리뷰와 감정 레이블을 포함하고 있습니다.
4. 데이터 전처리
모델에 데이터를 입력하기 위해서는 텍스트 토큰화와 인코딩이 필요합니다. 허깅페이스의 트랜스포머 모델에서 제공하는 토크나이저를 사용하여 텍스트를 처리하겠습니다.
python
from transformers import AutoTokenizer
# 모델명 설정
model_name = 'distilbert-base-uncased'
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 샘플 데이터 확인
sample_text = dataset['train'][0]['text']
encoded_input = tokenizer(sample_text, padding='max_length', truncation=True, return_tensors='pt')
print(encoded_input)
위 코드는 DistilBERT 모델의 토크나이저를 사용하여 첫 번째 영화 리뷰를 토큰화하고, 최대 길이에 맞게 패딩 및 잘라내기를 수행하여 인코딩된 텐서를 출력합니다.
5. 모델 정의 및 학습
이제 모델을 정의하고 학습을 진행하겠습니다. 허깅페이스의 Trainer API를 활용하여 학습 과정을 간편하게 수행할 수 있습니다.
python
from transformers import AutoModelForSequenceClassification, Trainer, TrainingArguments
# 모델 로드
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
# 학습 인자 정의
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 = Trainer(
model=model,
args=training_args,
train_dataset=dataset['train'],
eval_dataset=dataset['test']
)
# 모델 학습
trainer.train()
위 코드는 DistilBERT 기반의 텍스트 분류 모델을 정의하고, Trainer API를 사용하여 IMDB 데이터셋을 학습합니다. 학습이 완료되면 가중치가 ./results 폴더에 저장됩니다.
6. 모델 평가
모델 학습 후, 테스트 데이터셋을 이용하여 모델의 성능을 평가해보겠습니다. 평가 지표로는 정확도(Accuracy)를 사용하겠습니다.
python
# 테스트 데이터셋으로 평가
results = trainer.evaluate()
print(f"Accuracy: {results['eval_accuracy']:.2f}")
모델 평가 후 정확도를 출력하게 됩니다. 이를 통해 모델의 성능을 확인할 수 있습니다.
7. 예측 및 분류 리포트
이제, 학습된 모델을 사용하여 새로운 데이터에 대한 예측을 수행할 수 있습니다. 다음 코드를 통해 예측 결과를 확인하고, 그 결과의 분류 리포트를 출력해보겠습니다.
python
from sklearn.metrics import classification_report
import numpy as np
# 예측 데이터 준비
predictions = trainer.predict(dataset['test'])
preds = np.argmax(predictions.predictions, axis=1)
# 분류 리포트 출력
report = classification_report(dataset['test']['label'], preds)
print(report)
위 코드는 테스트 데이터셋에 대해 예측을 수행하고, sklearn의 classification_report를 활용하여 Precision, Recall, F1-Score 등의 지표를 출력합니다. 이 리포트를 통해 모델의 성능에 대한 상세한 정보를 얻을 수 있습니다.
8. 결론 및 다음 단계
이번 강좌에서는 허깅페이스의 트렌스포머 라이브러리를 활용하여 간단한 텍스트 분류 모델을 구축하고, 이를 평가하는 과정을 살펴보았습니다. 모델의 성능을 지속적으로 개선하기 위해 데이터 전처리 단계에서 더욱 다양한 기법을 적용하거나, Hyperparameter 튜닝 등을 고려할 수 있습니다.
앞으로도 다양한 자연어 처리 문제를 다루며, 허깅페이스 트랜스포머 라이브러리를 활용한 심화 강좌를 진행할 예정이오니 많은 관심 부탁드립니다. 감사합니다!