이번 글에서는 허깅페이스 트랜스포머 라이브러리가 제공하는 BERT 모델을 활용하여 앙상블 학습을 수행하고, 이를 통해 예측 성능을 개선하는 방법에 대해 다루어보겠습니다. 앙상블 학습은 여러 모델의 예측 결과를 결합하여 더 좋은 성능을 얻고자 하는 기법입니다. 본 강좌에서는 BERT 모델을 다양하게 조합하여 앙상블화를 구현하는 과정을 상세히 설명하겠습니다.
1. 앙상블 학습의 기초
앙상블 학습은 여러 개의 모델을 조합하여 최종 예측 결과를 만드는 방법입니다. 이 방식은 각각의 모델이 가지는 강점을 살려, 전체 모델의 성능을 향상시킬 수 있습니다. 일반적으로 활용되는 앙상블 방법으로는 다음과 같은 기법들이 있습니다:
- 배깅(Bagging): 여러 모델을 독립적으로 학습시켜, 최종 예측 결과를 평균하여 성능을 향상시킵니다.
- 부스팅(Boosting): 이전 모델이 잘못 예측한 데이터에 대한 가중치를 높여서 다음 모델을 학습시킵니다.
- 스태킹(Stacking): 다양한 모델의 예측값을 새로운 특징으로 사용하여 최종 예측을 위한 메타 모델을 학습합니다.
2. BERT 모델 소개
BERT(Bidirectional Encoder Representations from Transformers)는 Transformer 기반의 사전 훈련된 언어 모델로, 다양한 자연어 처리(NLP) 작업에 탁월한 성능을 보여주고 있습니다. BERT의 특징 중 두 가지는:
- 양방향성: BERT는 문맥을 양 방향에서 학습하여 단어의 의미를 보다 정확하게 이해할 수 있습니다.
- 사전 훈련: 방대한 데이터로 사전 훈련이 되어 있어, 별도의 미세 조정(fine-tuning)만으로도 다양한 과제가 가능합니다.
3. 데이터 준비
앙상블 학습을 위해 준비할 데이터셋은 간단한 자연어 처리 문제를 다루는 것이 좋습니다. 예를 들어, 영화 리뷰 데이터를 사용하여 긍정/부정 감성을 분류하는 작업을 해보겠습니다.
먼저, 허깅페이스 라이브러리와 필요한 패키지를 설치합니다:
!pip install transformers datasets torch scikit-learn
데이터셋 로드
다음으로 Hugging Face의 datasets
라이브러리를 사용하여 데이터셋을 로드하겠습니다:
from datasets import load_dataset
dataset = load_dataset('imdb')
train_data = dataset['train']
test_data = dataset['test']
4. 모델 설정
이번 예제에서는 BERT 모델을 기반으로 하는 두 개의 변형 모델을 만듭니다. 이를 통해 앙상블 효과를 얻을 수 있을 것입니다. 먼저, BERT 모델을 불러오는 함수를 작성하겠습니다:
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
# BERT 모델 및 토크나이저 불러오기
def load_model_and_tokenizer(model_name='bert-base-uncased'):
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)
return tokenizer, model
5. 데이터 전처리
모델의 입력으로 사용하기 위해 텍스트 데이터를 전처리하는 과정을 설명하겠습니다:
def preprocess_data(dataset, tokenizer, max_len=128):
inputs = tokenizer(dataset['text'], padding=True, truncation=True, max_length=max_len, return_tensors='pt')
inputs['labels'] = torch.tensor(dataset['label'])
return inputs
train_inputs = preprocess_data(train_data, tokenizer)
test_inputs = preprocess_data(test_data, tokenizer)
6. 모델 학습
이제 모델을 학습할 시간입니다. 앞서 불러온 모델과 전처리한 데이터를 사용하여 훈련합니다:
def train_model(model, train_inputs):
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=64,
evaluation_strategy='epoch',
logging_dir='./logs',
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_inputs,
)
trainer.train()
# 모델 학습
model1 = load_model_and_tokenizer()[1]
train_model(model1, train_inputs)
7. 앙상블 모델 학습
이제 두 번째 모델을 추가하여 앙상블을 수행합니다. BERT 구조는 동일하지만, 다른 초기화 또는 하이퍼파라미터를 사용할 수 있습니다:
model2 = load_model_and_tokenizer(model_name='bert-large-uncased')[1]
train_model(model2, train_inputs)
8. 앙상블 예측
모델 예측 결과를 앙상블하여 최종 결과를 생성합니다. 두 모델의 예측 결과를 평균 내어 최종 예측을 구합니다:
import numpy as np
def ensemble_predict(models, inputs):
preds = []
for model in models:
model.eval()
with torch.no_grad():
outputs = model(**inputs)
preds.append(outputs.logits)
ensemble_preds = np.mean(preds, axis=0)
return ensemble_preds
models = [model1, model2]
predictions = ensemble_predict(models, test_inputs)
9. 성능 평가
이제 앙상블 모델의 성능을 평가합니다. 정확도 또는 F1 점수와 같은 지표를 사용할 수 있습니다:
from sklearn.metrics import accuracy_score, f1_score
# 정답 레이블을 가져옵니다
labels = test_data['label']
# 앙상블 예측 결과와 레이블을 기반으로 지표 계산
predicted_labels = np.argmax(predictions, axis=1)
accuracy = accuracy_score(labels, predicted_labels)
f1 = f1_score(labels, predicted_labels)
print(f'Accuracy: {accuracy:.4f}, F1 Score: {f1:.4f}')
10. 결론 및 미래 작업
이번 강좌를 통해 BERT 모델을 활용한 앙상블 학습 방법에 대해 배워 보았습니다. 여러 모델의 예측을 결합함으로써 성능을 개선하는 방법을 익혔습니다. 향후 작업으로는 다음과 같은 것들이 있습니다:
- 더 많은 모델을 사용한 앙상블
- 전처리 개선 및 데이터 증강
- Hyperparameter tuning을 통한 성능 최적화
딥러닝 분야에서 앙상블 학습은 계속해서 유망한 방법으로 자리잡고 있으며, 다양한 모델을 혼합함으로써 더 높은 정확도를 달성할 수 있습니다. 앞서 언급한 것처럼, 여러 BERT 모델을 활용하여 성능을 끌어올리는 다양한 실험을 시도할 수 있습니다.