허깅페이스 트렌스포머 활용강좌, 파인튜닝 BERT 모델 학습 과정 시각화

딥러닝의 발전과 함께 자연어 처리(NLP) 분야에서도 많은 혁신이 이루어지고 있습니다. 특히, BERT(Bidirectional Encoder Representations from Transformers) 모델은 그 성능과 효율성 덕분에 많은 인기를 끌게 되었습니다. 이번 글에서는 허깅페이스(Hugging Face) 라이브러리를 통해 BERT 모델을 파인튜닝하고 그 과정과 결과를 시각화하는 방법을 상세히 다루어 보겠습니다.

1. BERT 모델 개요

BERT는 Google에서 개발한 사전 학습된 텍스트 표현 모델로, Bidirectional Attention Mechanism을 사용하여 단어의 문맥을 양방향에서 이해합니다. BERT는 두 가지 주요 작업, 즉 마스킹된 언어 모델링(Masked Language Modeling)과 다음 문장 예측(Next Sentence Prediction)을 통해 사전 학습됩니다. 이런 과정을 통해 BERT는 자연어 이해 및 생성 작업에 매우 높은 성능을 보이게 됩니다.

2. 환경 설정

BERT 모델을 파인튜닝하기 위해서는 먼저 필요한 패키지를 설치해야 합니다. 아래의 코드를 통해 Hugging Face의 Transformers과 기타 필요한 라이브러리를 설치합니다.

!pip install transformers torch datasets matplotlib seaborn

3. 데이터셋 준비

이번 예제에서는 IMDB 영화 리뷰 데이터셋을 사용하여 영화 리뷰가 긍정적인지 부정적인지를 분류하는 이진 분류 문제를 다룰 것입니다. Hugging Face의 datasets 라이브러리를 사용하여 손쉽게 데이터를 불러올 수 있습니다.

from datasets import load_dataset

dataset = load_dataset('imdb')
train_dataset = dataset['train']
test_dataset = dataset['test']

4. 데이터 전처리

BERT 모델에 입력하기 위해서는 텍스트 토큰화가 필요합니다. Hugging Face의 Tokenizer를 사용해 데이터를 준비합니다. BERT는 최대 입력 길이가 512로 제한되므로 이 점을 유의해야 합니다.

from transformers import BertTokenizer

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

def tokenize_function(examples):
    return tokenizer(examples['text'], padding='max_length', truncation=True)

tokenized_train = train_dataset.map(tokenize_function, batched=True)
tokenized_test = test_dataset.map(tokenize_function, batched=True)

5. 데이터 로더 설정

데이터를 로딩하고 배치로 나누는 과정입니다. 파이토치의 DataLoader를 사용하여 훈련 및 검증에 필요한 배치를 구성합니다.

import torch

train_loader = torch.utils.data.DataLoader(tokenized_train, batch_size=16, shuffle=True)
test_loader = torch.utils.data.DataLoader(tokenized_test, batch_size=16)

6. 모델 설정

이제 BERT 모델을 설정하고 이를 파인튜닝할 준비를 합니다. Hugging Face에서는 간단하게 BERT 모델을 불러올 수 있습니다.

from transformers import BertForSequenceClassification

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

7. 학습 준비

파인튜닝을 위한 손실 함수와 최적화 알고리즘을 설정합니다. BERT는 기본적으로 CrossEntropyLoss를 사용하여 분류 문제를 해결합니다.

from transformers import AdamW

optimizer = AdamW(model.parameters(), lr=5e-5)

8. 모델 학습

이제 모델 학습을 진행합니다. 각 에포크에서 훈련 데이터와 검증 데이터를 통해 모델을 학습시키고 성능을 평가합니다. 에포크 수, 손실 값, 정확도 등을 기록하여 모니터링합니다.

from tqdm import tqdm

model.train()
for epoch in range(3):
    for batch in tqdm(train_loader):
        optimizer.zero_grad()
        input_ids = batch['input_ids'].to(model.device)
        attention_mask = batch['attention_mask'].to(model.device)
        labels = batch['label'].to(model.device)

        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
        loss = outputs.loss
        loss.backward()
        optimizer.step()
        print(f"Epoch {epoch}, Loss: {loss.item()}")

9. 성능 평가

학습이 완료된 후, 테스트 데이터를 통해 모델의 성능을 평가합니다. 정확도, 정밀도, 재현율 등의 메트릭을 사용하여 모델을 평가합니다.

from sklearn.metrics import accuracy_score

model.eval()
predictions, true_labels = [], []
with torch.no_grad():
    for batch in test_loader:
        input_ids = batch['input_ids'].to(model.device)
        attention_mask = batch['attention_mask'].to(model.device)
        
        outputs = model(input_ids, attention_mask=attention_mask)
        preds = torch.argmax(outputs.logits, dim=-1)
        
        predictions.extend(preds.cpu().numpy())
        true_labels.extend(batch['label'].numpy())

accuracy = accuracy_score(true_labels, predictions)
print(f'Accuracy: {accuracy}') 

10. 학습 과정 시각화

모델의 학습 과정과 성능을 시각화하는 것은 모델을 이해하고 튜닝하는 데에 매우 중요합니다. 토치비전(TorchVision)과 매트플롯립(Matplotlib)을 사용하여 학습 손실을 그래프로 시각화합니다.

import matplotlib.pyplot as plt

def plot_loss(losses):
    plt.plot(losses, label='Training Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.title('Training Loss Over Epochs')
    plt.legend()
    plt.show()

losses = [...]  # 각 에포크의 손실을 기록
plot_loss(losses)

결론

이번 글에서는 허깅페이스 라이브러리를 활용하여 BERT 모델을 파인튜닝하는 전 과정을 살펴보았습니다. 데이터셋 준비, 모델 설정, 학습 과정, 성능 평가 그리고 시각화까지 다양한 과정을 통해 BERT 모델의 파인튜닝을 효과적으로 진행할 수 있음을 보여주었습니다.

딥러닝 모델의 성공적인 구현에는 적절한 데이터 전처리, 하이퍼파라미터 튜닝, 그리고 결과 분석이 필수적입니다. BERT와 같은 사전 훈련된 모델을 통해 자연어 처리 문제를 효율적으로 해결할 수 있음을 잊지 마세요.