최근 인공지능(AI) 및 머신러닝 분야에서 자연어 처리(NLP)의 중요성이 날로 증가하고 있습니다. 그 중심에는 허깅페이스(Hugging Face)의 트랜스포머 라이브러리가 있습니다. 이 라이브러리는 다양한 NLP 모델을 손쉽게 사용할 수 있도록 해주며, 특히 사전 훈련된(pre-trained) 모델을 통해 매우 쉽게 응용할 수 있는 장점을 가지고 있습니다. 본 강좌에서는 허깅페이스 트랜스포머 라이브러리를 사용하여 학습 및 검증 데이터셋을 분리하는 방법을 알려드리겠습니다.
1. 데이터셋 준비
첫 번째 단계는 사용할 데이터셋을 준비하는 것입니다. 일반적으로 NLP 문제를 해결하기 위해서는 레이블이 있는 데이터셋이 필요합니다. 이번 예제에서는 IMDb 영화 리뷰 데이터셋을 사용하여 긍정적인 리뷰와 부정적인 리뷰를 분류하는 모델을 학습할 것입니다. 이 데이터셋은 대중적으로 사용되며, 영화 리뷰의 텍스트와 그에 대한 레이블(긍정/부정)로 구성되어 있습니다.
1.1 데이터셋 다운로드
python
from datasets import load_dataset
dataset = load_dataset("imdb")
위 코드를 사용하여 IMDb 데이터셋을 다운로드 할 수 있습니다. load_dataset
함수는 Hugging Face 데이터셋 라이브러리에서 사용할 수 있는 함수로, 다양한 공개 데이터셋을 손쉽게 다운로드할 수 있도록 해줍니다.
1.2 데이터셋 구조 확인
python
print(dataset)
다운로드한 데이터셋의 구조를 확인해 볼 수 있습니다. 데이터셋은 훈련(train), 테스트(test) 및 검증(validation)으로 나누어져 있습니다.
2. 데이터셋 분리
일반적으로 머신러닝에서는 모델을 훈련시키기 위해 데이터를 여러 부분으로 나누는 것이 중요합니다. 주로 훈련 데이터와 검증 데이터를 나누는데, 훈련 데이터는 모델을 학습하는 데 사용되고, 검증 데이터는 모델의 성능을 평가하는 데 사용됩니다. 이번에는 훈련 데이터에서 일부를 추출하여 검증 데이터로 사용할 것입니다.
2.1 훈련 데이터와 검증 데이터 분리
python
from sklearn.model_selection import train_test_split
train_data = dataset['train']
train_texts = train_data['text']
train_labels = train_data['label']
train_texts, val_texts, train_labels, val_labels = train_test_split(
train_texts,
train_labels,
test_size=0.1, # 10%를 검증 세트로 사용
random_state=42
)
위 코드는 train_test_split
함수를 사용하여 훈련 데이터를 90%와 10%로 나누는 과정입니다. 여기서 test_size=0.1
로 설정하였으므로, 원래 훈련 데이터의 10%를 검증 데이터로 선택합니다. random_state
인자는 분할의 일관성을 보장합니다.
2.2 분리된 데이터 확인
python
print("훈련 데이터 개수:", len(train_texts))
print("검증 데이터 개수:", len(val_texts))
이제 분리된 훈련 및 검증 데이터의 개수를 확인할 수 있습니다. 이 정보는 우리의 데이터가 적절하게 분리되었는지를 판단하는 데 도움이 됩니다.
3. 허깅페이스 트랜스포머 모델 준비
데이터셋을 분리한 후에는 이제 모델을 준비해야 합니다. 허깅페이스의 트랜스포머 라이브러리에서는 다양한 사전 학습된 모델을 제공하므로, 우리가 원하는 용도에 맞는 모델을 선택할 수 있습니다.
3.1 사전 훈련된 모델 선택
python
from transformers import BertTokenizer, BertForSequenceClassification
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)
BertTokenizer
와 BertForSequenceClassification
를 사용하여 BERT 모델을 준비합니다. 이 모델은 텍스트 분류 작업에 적합하며, “bert-base-uncased”라는 사전 훈련된 버전을 사용하고 있습니다.
3.2 데이터 토큰화
python
train_encodings = tokenizer(train_texts, truncation=True, padding=True, return_tensors='pt')
val_encodings = tokenizer(val_texts, truncation=True, padding=True, return_tensors='pt')
tokenizer
를 사용하여 훈련 및 검증 데이터를 토큰화합니다. truncation=True
는 길이가 제한된 입력을 처리하며, padding=True
는 모든 입력의 길이를 동일하게 맞춰줍니다.
4. 모델 학습
모델의 학습을 위해 PyTorch의 DataLoader를 사용하여 배치로 데이터를 조작할 수 있습니다. 또한, optimizer와 loss 함수를 설정하여 모델을 학습시킬 것입니다.
4.1 데이터 로더 준비
python
import torch
from torch.utils.data import DataLoader, Dataset
class IMDbDataset(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)
val_dataset = IMDbDataset(val_encodings, val_labels)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=16, shuffle=False)
새로운 데이터셋 클래스를 정의하여 Dataset
클래스에서 상속받고, DataLoader
를 사용하여 배치 처리를 합니다. 배치 크기로 16을 사용하였습니다.
4.2 모델 학습 설정
python
from transformers import AdamW
optimizer = AdamW(model.parameters(), lr=5e-5)
model.train()
for epoch in range(3): # 총 3 에폭
total_loss = 0
for batch in train_loader:
optimizer.zero_grad()
outputs = model(**batch)
loss = outputs.loss
total_loss += loss.item()
loss.backward()
optimizer.step()
print(f"Epoch: {epoch + 1}, Loss: {total_loss / len(train_loader)}")
AdamW 최적화 알고리즘을 사용하여 모델을 학습합니다. 매 에폭마다 총 손실을 계산하고 출력합니다. 이번 예제에서는 3회 훈련하였습니다.
5. 모델 평가
모델이 훈련된 후에는 검증 데이터에 대한 성능을 평가해야 합니다. 이를 통해 모델이 얼마나 잘 일반화되는지를 확인할 수 있습니다.
5.1 모델 평가 함수 정의
python
from sklearn.metrics import accuracy_score
def evaluate_model(model, val_loader):
model.eval()
all_labels = []
all_preds = []
with torch.no_grad():
for batch in val_loader:
outputs = model(**batch)
preds = outputs.logits.argmax(dim=-1)
all_labels.extend(batch['labels'].tolist())
all_preds.extend(preds.tolist())
accuracy = accuracy_score(all_labels, all_preds)
return accuracy
accuracy = evaluate_model(model, val_loader)
print("검증 정확도:", accuracy)
evaluate_model
함수를 정의하여 모델의 성능을 평가합니다. 검증 데이터에 대한 정확도를 출력하여 모델의 성능을 파악합니다.
6. 결론
이번 강좌에서는 Hugging Face의 트랜스포머 라이브러리를 활용하여 IMDb 영화 리뷰 데이터셋을 다루는 방법을 배웠습니다. 데이터셋을 분리하고, 모델을 학습시키고, 성능을 평가하는 과정까지 전반적으로 살펴보았습니다. 이러한 과정을 통해 NLP 분야의 기초적인 이해를 할 수 있었기를 바랍니다. 이러한 기술은 다양한 언어 모델에 적용할 수 있으며, 이를 통해 더 나은 결과를 얻을 수 있습니다.