허깅페이스 트렌스포머 활용강좌, BERT 앙상블 파인튜닝

최근 몇 년간, 딥러닝 분야에서 자연어 처리(NLP)는 급격한 발전을 이루었으며, 그 중 가장 큰 선두주자 중 하나는 바로 BERT입니다. BERT(Bidirectional Encoder Representations from Transformers)는 구글에서 발표한 모델로, 문맥을 양 방향으로 이해할 수 있는 능력을 가지고 있습니다. 이 강좌에서는BERT 모델에 대해 자세히 알아보고, 여러 BERT 모델들을 앙상블하여 성능을 향상시키는 방법과 함께 허깅페이스(Hugging Face) 트랜스포머 라이브러리를 활용하여 파인튜닝하는 과정을 설명하겠습니다.

1. BERT란?

BERT는 ‘Bidirectional Encoder Representations from Transformers’의 약자로, 문맥을 이해하는 데 매우 강력한 능력을 지닌 사전 학습된 모델입니다. 전통적인 NLP 모델들은 일반적으로 한 방향으로만 문맥을 이해했지만, BERT는 Transformer 아키텍처를 기반으로 양 방향에서 문맥 정보를 동시에 수집할 수 있습니다. 이를 통해 단어의 의미를 문맥에 맞게 뽑아내는 데에 가능성을 제공합니다.

1.1. BERT의 특징

  • 양방향성: BERT는 입력 텍스트의 양쪽 문맥을 동시에 고려합니다.
  • 사전 학습(pre-trained): 대규모 코퍼스를 사용하여 사전 학습 완료 후, 특정 작업에 맞게 파인튜닝할 수 있습니다.
  • 층 구조: 다수의 Transformer 레이어로 구성되어 있어 복잡한 문맥을 효과적으로 처리합니다.

2. 허깅페이스 트랜스포머 라이브러리

허깅페이스는 BERT를 비롯한 다양한 사전 학습된 NLP 모델들을 쉽게 사용할 수 있게 해주는 라이브러리입니다. 이 라이브러리를 사용하면, 복잡한 구현 없이도 다양한 NLP 태스크를 수행할 수 있습니다. Hugging Face Transformers 라이브러리는 단순한 인터페이스와 함께 직관적인 API를 제공하여 학습 및 파인튜닝을 쉽게 할 수 있도록 돕습니다.

2.1. 설치하는 방법

!pip install transformers

3. BERT 앙상블 기법

앙상블 기법이란 여러 개의 모델을 결합하여 더 나은 성능을 얻는 방법입니다. BERT 모델을 앙상블하는 이유는 모델 간의 다양성이 있어 오버피팅을 방지하고, 일반화 성능을 향상시킬 수 있기 때문입니다. 앙상블 기법을 활용하면 BERT 모델의 강점을 보다 효과적으로 극대화할 수 있습니다.

3.1. 앙상블 방법론

전략은 다양하지만, 가장 일반적으로 사용되는 방법 중 두 가지는 하드 보팅소프트 보팅입니다.

  • 하드 보팅: 각 모델이 예측한 클래스 라벨 중 가장 많이 선택된 라벨을 결과로 채택합니다.
  • 소프트 보팅: 각 모델이 예측한 클래스 확률의 평균을 내어, 가장 높은 확률의 클래스를 결과로 채택합니다.

4. BERT 파인튜닝

이제 BERT 모델을 파인튜닝하는 방법에 대해 알아보겠습니다. 다음 단계에 따라 BERT 모델을 설정하고, 앙상블하는 방법을 진행하겠습니다.

4.1. 데이터셋 준비

먼저, 사용할 데이터셋을 준비합니다. 아래의 예제에서는 IMDB 영화 리뷰 데이터를 사용할 것입니다. 이 데이터는 긍정/부정 리뷰로 구분됩니다.

4.1.1. 데이터셋 로딩


import pandas as pd
from sklearn.model_selection import train_test_split

# IMDB 데이터셋 로드
data = pd.read_csv('imdb_reviews.csv')
train_data, test_data = train_test_split(data, test_size=0.2)
        

4.2. BERT 모델 로딩

이제 허깅페이스 트랜스포머 라이브러리를 사용하여 BERT 모델을 로드하겠습니다.


from transformers import BertTokenizer, BertForSequenceClassification

# BERT 토크나이저 및 모델 로드
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
        

4.3. 데이터 전처리

BERT 모델에 입력하기 위해 데이터를 전처리해야 합니다. 텍스트를 토크나이즈하고, 입력 IDs와 어텐션 마스크를 생성합니다.


def preprocess_data(data):
    inputs = tokenizer(data['text'].tolist(), padding=True, truncation=True, return_tensors="pt", max_length=512)
    labels = torch.tensor(data['label'].tolist())
    return inputs, labels

train_inputs, train_labels = preprocess_data(train_data)
test_inputs, test_labels = preprocess_data(test_data)
        

4.4. 모델 학습

모델을 학습하기 위해 PyTorch의 DataLoader를 사용하고, Adam 옵티마이저를 설정합니다.


from torch.utils.data import DataLoader, TensorDataset
from transformers import AdamW

train_dataset = TensorDataset(train_inputs['input_ids'], train_inputs['attention_mask'], train_labels)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
optimizer = AdamW(model.parameters(), lr=1e-5)

# 모델 학습
model.train()
for epoch in range(3):
    for batch in train_loader:
        optimizer.zero_grad()
        input_ids, attention_mask, labels = batch
        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
        loss = outputs.loss
        loss.backward()
        optimizer.step()
        print(f'Epoch: {epoch}, Loss: {loss.item()}')
        

4.5. 평가 및 앙상블

학습한 모델을 평가하고, 다른 BERT 모델도 동일한 방식으로 학습하여 앙상블을 진행합니다. 각 모델의 예측 결과를 수집하고, 하드 or 소프트 보팅을 통해 최종 예측을 합니다.


# 모델 평가 및 앙상블
def evaluate_and_ensemble(models, dataloader):
    ensemble_preds = []
    for model in models:
        model.eval()
        preds = []
        for batch in dataloader:
            input_ids, attention_mask = batch
            with torch.no_grad():
                outputs = model(input_ids, attention_mask=attention_mask)
            preds.append(torch.argmax(outputs.logits, dim=1))
        ensemble_preds.append(torch.cat(preds, dim=0))
    
    # 하드 보팅
    final_preds = torch.mode(torch.stack(ensemble_preds), dim=0)[0]
    return final_preds

final_predictions = evaluate_and_ensemble([model], test_loader)
        

5. 결론

이번 강좌에서는 허깅페이스 트랜스포머 라이브러리를 활용하여 BERT 모델을 앙상블하여 성능을 높이는 방법에 대해 알아보았습니다. BERT의 강력한 언어 이해 능력을 바탕으로, 적절한 데이터 전처리와 앙상블 기법을 통해 NLP 태스크에서 높은 성능을 달성할 수 있음을 보여주었습니다. 향후 이 기법을 통해 다양한 자연어 처리 문제를 해결해 나갈 수 있기를 기대합니다.

6. 참고 자료