다중 클래스 분류용 BERT 사전학습 모델 불러오기
BERT(Bidirectional Encoder Representations from Transformers)는 구글에서 제안한 자연어 처리 모델로, 문맥 이해를 위해 양방향 Transformer 구조를 활용합니다. BERT는 사전 학습(pre-training) 및 미세 조정(fine-tuning) 단계를 통해 다양한 자연어 처리 태스크에 적용될 수 있습니다. 이번 강좌에서는 허깅페이스(Hugging Face) 트랜스포머 라이브러리를 사용하여 사전학습된 BERT 모델을 불러와 다중 클래스 분류 문제를 해결하는 방법을 소개하겠습니다.
1. 환경 설정
본 강좌에서는 다음의 라이브러리가 필요합니다:
- transformers
- torch (PyTorch)
- numpy
- pandas
다음 명령어를 통해 필요한 라이브러리를 설치할 수 있습니다:
!pip install transformers torch numpy pandas
2. 데이터 준비
우선, 다중 클래스 분류 문제를 위한 데이터셋을 준비해야 합니다. 예시로, 간단한 텍스트와 라벨을 가진 데이터프레임을 만들어 보겠습니다.
import pandas as pd
data = {
'text': [
'나는 자연어 처리가 좋아요.',
'PyTorch와 TensorFlow가 인기 있어요.',
'딥러닝은 머신러닝의 한 분야입니다.',
'대화형 AI는 많은 관심을 받고 있어요.',
'텍스트 분류는 중요한 작업입니다.'
],
'label': [0, 1, 1, 2, 0]
}
df = pd.DataFrame(data)
3. 데이터 전처리
BERT 모델의 입력 형식에 맞게 데이터를 전처리합니다. BERT Tokenizer를 사용하여 텍스트를 토큰화하고, 입력 아이디와 어텐션 마스크를 생성합니다.
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# 토큰화 및 입력 아이디, 어텐션 마스크 생성
def encode_data(text):
return tokenizer(text, padding='max_length', truncation=True, max_length=128, return_tensors='pt')
encoded_texts = [encode_data(text)['input_ids'] for text in df['text']]
attention_masks = [encode_data(text)['attention_mask'] for text in df['text']]
4. 데이터셋 분할
데이터를 학습용과 검증용으로 분할합니다. 여기서는 데이터의 80%를 학습 데이터로, 20%를 검증 데이터로 사용합니다.
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(
df['text'],
df['label'],
test_size=0.2,
random_state=42
)
5. 데이터 로더 생성
PyTorch의 DataLoader를 사용하여 배치 처리를 위한 데이터 로더를 생성합니다.
import torch
from torch.utils.data import Dataset, DataLoader
class TextDataset(Dataset):
def __init__(self, texts, labels):
self.texts = texts
self.labels = labels
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = encode_data(self.texts[idx])
return {
'input_ids': text['input_ids'].squeeze(),
'attention_mask': text['attention_mask'].squeeze(),
'labels': torch.tensor(self.labels[idx])
}
train_dataset = TextDataset(X_train.tolist(), y_train.tolist())
val_dataset = TextDataset(X_val.tolist(), y_val.tolist())
train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=2, shuffle=False)
6. 모델 불러오기
허깅페이스의 Transformers 라이브러리에서 사전 학습된 BERT 모델을 불러옵니다. 여기에 분류기를 추가하여 다중 클래스 분류 문제를 해결합니다.
from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=3)
7. 모델 학습
모델을 학습하기 위해 오차 함수와 최적화 알고리즘을 설정하고, 단순한 학습 루프를 작성해 봅니다.
from transformers import AdamW
from tqdm import tqdm
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
optimizer = AdamW(model.parameters(), lr=1e-5)
# 모델 학습
model.train()
for epoch in range(3): # 에포크 수
for batch in tqdm(train_loader):
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['labels'].to(device)
optimizer.zero_grad()
outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
loss = outputs.loss
loss.backward()
optimizer.step()
print(f'Epoch {epoch+1} Loss: {loss.item()}')
8. 검증 및 성능 평가
검증 데이터를 사용하여 모델의 성능을 평가합니다. 여기서는 정확도를 측정합니다.
model.eval()
correct = 0
total = 0
with torch.no_grad():
for batch in val_loader:
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['labels'].to(device)
outputs = model(input_ids, attention_mask=attention_mask)
_, predicted = torch.max(outputs.logits, dim=1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = correct / total
print(f'Accuracy: {accuracy:.2f}')
9. 결론
이번 강좌에서는 허깅페이스 트랜스포머 라이브러리를 이용하여 사전 학습된 BERT 모델을 다중 클래스 분류 문제에 활용하는 방법을 배웠습니다. BERT는 강력한 성능을 보이므로, 분석하고자 하는 많은 자연어 처리 문제에 적용할 수 있습니다. 실제 프로젝트에 사용하는 과정에서 여러 실험과 튜닝을 통해 최적의 결과를 얻을 수 있도록 해야 합니다. 트렌스포머 모델들은 빠르게 발전하고 있으므로, 지속적인 학습이 필요합니다.
더 궁금한 점이 있다면 언제든지 질문해 주세요!