허깅페이스 트렌스포머 활용강좌, BigBird 추론

1. 서론

딥러닝 분야는 최근 몇 년 동안 가파른 발전을 이뤄냈으며, 특히 자연어 처리(NLP) 분야에서 많은 주목을 받고 있습니다. 본 글에서는 Hugging Face의 Transformers 라이브러리를 활용하여 BigBird 모델로 텍스트 추론을 수행하는 방법을 다루겠습니다. BigBird는 긴 문서의 의미를 이해하고 처리하는 데 강점을 가진 모델로, 특히 길이가 긴 입력을 처리하기 위해 설계되었습니다.

2. BigBird 모델 소개

BigBird는 구글에서 개발한 모델로, Transformer의 한계를 극복하기 위해 고안되었습니다. 기존의 Transformer 모델은 입력 길이가 길어질수록 계산 비용이 기하급수적으로 증가하는 문제가 있었습니다. BigBird는 희소성(sparsity)을 활용하여 이러한 문제를 해결하고, 4,096 토큰 이상의 긴 문서도 효과적으로 처리할 수 있는 능력을 갖추고 있습니다.

2.1. BigBird의 구조

BigBird의 구조는 기존 Transformer 모델의 어텐션 메커니즘을 확장하여, 부분적인 어텐션만 수행함으로써 성능을 높였습니다. 더 구체적으로, BigBird는 다음의 세 가지 어텐션 패턴을 조합하여 사용합니다.

  • 전역 어텐션 (Global Attention): 특정 입력 토큰에 대해 모든 다른 토큰과의 상관관계를 학습합니다.
  • 로컬 어텐션 (Local Attention): 인접한 토큰 간의 관계를 학습합니다.
  • 랜덤 어텐션 (Random Attention): 무작위로 선택된 토큰과의 관계를 학습합니다.

3. Hugging Face 설치 및 기본 세팅

Hugging Face의 Transformers 라이브러리를 사용하기 위해서는 먼저 필요한 패키지를 설치해야 합니다. 아래 명령어를 사용하여 설치할 수 있습니다:

pip install transformers torch

이제 모델을 로드하고 데이터를 준비하는 과정을 시작해 보겠습니다.

4. BigBird 모델 로딩 및 데이터 준비

BigBird 모델을 사용하여 추론하기 위한 코드 예제입니다. 먼저 필요한 라이브러리를 임포트하고 BigBird 모델과 토크나이저를 초기화하겠습니다.


import torch
from transformers import BigBirdTokenizer, BigBirdForSequenceClassification

# 모델 및 토크나이저 초기화
tokenizer = BigBirdTokenizer.from_pretrained('google/bigbird-pegasus-large-arxiv')
model = BigBirdForSequenceClassification.from_pretrained('google/bigbird-pegasus-large-arxiv')

# 예시 입력 텍스트
text = "딥러닝은 기계 학습의 한 분야로..."

# 입력 텍스트 토큰화
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
        

위 코드에서는 Hugging Face의 Transformers 라이브러리에서 BigBird 모델과 해당 토크나이저를 로드했습니다. BigBirdTokenizer를 사용하여 입력 텍스트를 토큰화하고, 모델의 입력으로 변환합니다.

5. 모델의 추론 수행하기

모델을 통해 입력 텍스트의 예측값을 생성할 수 있습니다. 아래 코드에서는 모델을 사용하여 추론을 수행하는 방법을 보여줍니다.


# 모델을 추론 모드로 전환
model.eval()

# 추론 수행
with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits

# 예측 확률
predictions = torch.nn.functional.softmax(logits, dim=-1)
predicted_class = torch.argmax(predictions)

print(f"예측된 클래스: {predicted_class.item()}, 확률: {predictions.max().item()}")
        

위 코드에서 모델을 평가 모드로 전환하고, 입력 텍스트에 대한 추론을 수행한 후 예측된 클래스와 해당 확률을 출력합니다.

6. 결론

BigBird 모델은 긴 입력 텍스트에 대한 자연어 처리 작업에서 뛰어난 성능을 보여줍니다. Hugging Face의 Transformers 라이브러리를 활용하면 모델을 손쉽게 로드하고 추론을 수행할 수 있습니다. 오늘 다룬 내용을 통해 BigBird 모델로 텍스트 분류 작업을 수행하는 기본적인 방법을 익히셨기를 바랍니다. 추가적으로 다양한 데이터셋과 태스크에 따라 BigBird 모델의 활용을 확장해 나가실 수 있기를 바랍니다.

블로그를 방문해 주셔서 감사합니다. 앞으로도 다양한 딥러닝 관련 기술과 팁을 공유하겠습니다.

허깅페이스 트렌스포머 활용강좌, BERT 앙상블 학습 라이브러리 설정

최근 인공지능 분야에서는 자연어 처리(NLP)가 중요한 도전 과제가 되었으며, BERT(Bidirectional Encoder Representations from Transformers)와 같은 모델이 이 분야의 혁신을 이끌어왔습니다. BERT 모델은 단어의 맥락을 양방향으로 이해할 수 있는 기능을 제공하며, 이는 더욱 정교한 방법으로 자연어 문제를 해결할 수 있게 합니다. 본 강좌에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 BERT 모델을 설정하고, 앙상블 학습을 구현하는 방법에 대해 자세히 알아보겠습니다.

1. BERT 앙상블 학습이란?

앙상블 학습은 여러 모델의 예측 결과를 결합하여 최종 예측을 만드는 방법론입니다. 여러 모델의 예측치를 평균하거나, 다수결의 원칙(Get majority vote)으로 결정하는 방식으로, 이는 단일 모델의 편향을 줄이고, 일반화 성능을 향상시키는 데 도움을 줍니다. BERT와 같은 강력한 언어 모델을 앙상블하여 활용하는 것은 모델의 학습 성능과 예측 성능을 극대화하는 효과를 가져올 수 있습니다.

2. 환경 설정

허깅페이스의 트랜스포머 라이브러리를 사용하기 위해서는 먼저 관련 패키지를 설치해야 합니다. 다음 명령어를 통해 설치할 수 있습니다.

pip install transformers torch

이외에 필요한 라이브러리로는 데이터 처리를 위한 pandas와 모델 성능 평가를 위한 scikit-learn을 사용할 예정입니다.

pip install pandas scikit-learn

3. 데이터 준비

이번 강좌에서는 영화 리뷰 감성 분석 데이터셋을 사용할 것입니다. 이 데이터셋은 리뷰와 감성 레이블이 포함되어 있으며, 긍정적 또는 부정적인 리뷰로 구분됩니다. 데이터셋은 pandas를 사용하여 불러올 수 있습니다.

import pandas as pd

# 데이터셋 로드
data = pd.read_csv('movie_reviews.csv')
print(data.head())

4. BERT 모델 설정

허깅페이스의 트랜스포머 라이브러리를 사용하여 BERT 모델을 설정합니다. BERT를 사용하기 위해서는 먼저 모델을 로드하고, 토크나이저를 설정하여 입력 데이터를 처리해야 합니다.

from transformers import BertTokenizer, BertForSequenceClassification
import torch

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

# 입력 데이터 토크나이징
def tokenize_data(sentences):
    return tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')

# 예시로 첫 번째 문장을 토크나이징
tokens = tokenize_data(data['review'].tolist())
print(tokens)  # 토크나이즈된 데이터 확인

5. 데이터 전처리

모델 학습을 위하여 데이터 전처리가 필요합니다. 각 리뷰는 토큰화되며, 이를 모델이 인식할 수 있는 포맷으로 변환해야 합니다. 또한, 배치 사이즈를 설정하여 GPU에서 학습 속도를 향상시킵니다.

from torch.utils.data import DataLoader, TensorDataset

# 입력 데이터와 레이블 설정
inputs = tokens['input_ids']
attn_masks = tokens['attention_mask']
labels = torch.tensor(data['label'].tolist())

# 텐서 데이터셋 생성
dataset = TensorDataset(inputs, attn_masks, labels)

# 데이터 로더 설정
batch_size = 16
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

6. 모델 학습

BERT 모델을 학습하기 위해서는 옵티마이저와 손실 함수를 설정해야 합니다. 여기서는 AdamW 옵티마이저를 사용합니다. 모델 학습을 위한 손실 함수는 CrossEntropyLoss를 사용합니다.

from transformers import AdamW
from torch import nn

# 옵티마이저 설정
optimizer = AdamW(model.parameters(), lr=5e-5)

# 손실 함수 설정
loss_fn = nn.CrossEntropyLoss()

# 모델 훈련을 위한 함수 작성
def train_model(dataloader, model, optimizer, loss_fn, epochs=3):
    model.train()
    for epoch in range(epochs):
        total_loss = 0
        for batch in dataloader:
            input_ids, attention_masks, labels = batch
            
            # 모델에 데이터 전송
            input_ids = input_ids.to('cuda')
            attention_masks = attention_masks.to('cuda')
            labels = labels.to('cuda')
            
            # 기울기 초기화
            optimizer.zero_grad()
            
            # 모델 예측
            outputs = model(input_ids, token_type_ids=None, attention_mask=attention_masks)
            loss = loss_fn(outputs.logits, labels)
            
            # 손실 계산 및 역전파
            total_loss += loss.item()
            loss.backward()
            optimizer.step()
        print(f'Epoch: {epoch+1}, Loss: {total_loss/len(dataloader)}')

# 모델 학습 호출
train_model(dataloader, model.to('cuda'), optimizer, loss_fn)

7. 앙상블 모델 설정

이제 기본적인 BERT 모델을 설정했으니, 여러 개의 BERT 모델을 앙상블하여 성능을 향상시키겠습니다. 여기서는 두 개의 BERT 모델을 학습하고, 예측 결과를 평균하여 최종 예측을 만들겠습니다.

def create_ensemble_model(num_models=2):
    models = []
    for _ in range(num_models):
        model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2).to('cuda')
        models.append(model)
    return models

# 앙상블 모델 생성
ensemble_models = create_ensemble_model()

8. 앙상블 학습 및 예측

앙상블된 모델들을 학습하고, 테스트 데이터에 대해 예측을 수행한 후, 결과를 평균하여 최종 예측을 생성합니다.

def train_ensemble(models, dataloader, optimizer, loss_fn, epochs=3):
    for model in models:
        train_model(dataloader, model, optimizer, loss_fn, epochs)

def ensemble_predict(models, input_ids, attention_masks):
    preds = []
    for model in models:
        model.eval()
        with torch.no_grad():
            outputs = model(input_ids, attention_mask=attention_masks)
            preds.append(outputs.logits)
    return sum(preds) / len(preds)

# 앙상블 모델 학습
train_ensemble(ensemble_models, dataloader, optimizer, loss_fn)

# 예시로 첫 번째 문장 예측
inputs = tokenize_data([data['review'].iloc[0]])
average_logits = ensemble_predict(ensemble_models, inputs['input_ids'].to('cuda'), inputs['attention_mask'].to('cuda'))
predictions = torch.argmax(average_logits, dim=1)
print(f'Predicted label: {predictions}')  # 예측 결과 확인

9. 모델 성능 평가

마지막으로, 테스트 데이터셋에 대한 모델의 성능을 평가해 보겠습니다. 정확도, 정밀도, 재현율 등을 측정하여 성능을 검토합니다.

from sklearn.metrics import accuracy_score, classification_report

# 테스트 데이터 로드
test_data = pd.read_csv('movie_reviews_test.csv')
test_tokens = tokenize_data(test_data['review'].tolist())
test_inputs = test_tokens['input_ids'].to('cuda')
test_masks = test_tokens['attention_mask'].to('cuda')

# 앙상블 예측
test_logits = ensemble_predict(ensemble_models, test_inputs, test_masks)
test_predictions = torch.argmax(test_logits, axis=1)

# 정확도 및 평가 지표 출력
accuracy = accuracy_score(test_data['label'].tolist(), test_predictions.cpu())
report = classification_report(test_data['label'].tolist(), test_predictions.cpu())

print(f'Accuracy: {accuracy}\n')
print(report)

결론

이번 강좌에서는 BERT 모델을 활용하여 자연어 처리 문제를 해결하는 방법과, 여러 모델을 앙상블하여 성능을 향상시키는 방법에 대해 알아보았습니다. 허깅페이스의 트랜스포머 라이브러리를 통해 BERT 모델을 손쉽게 적용할 수 있으며, 사용자 맞춤형 앙상블 모델링을 통해 더욱 강력한 성능을 기대할 수 있습니다. 앞으로도 다양한 자연어 처리 문제에 대해 이와 같은 기술을 활용해 나가기를 바랍니다.

허깅페이스 트렌스포머 활용강좌, BERT 앙상블 학습 – 커스텀 데이터세트 정의

서론

딥러닝은 최근 몇 년간 자연어 처리(NLP) 분야에서 혁신을 일으켜왔습니다. 특히 BERT(Bidirectional Encoder Representations from Transformers) 모델은 문맥을 이해하는 데 강력한 성능을 발휘하며, 다양한 NLP 과제에서 최첨단 성능을 기록했습니다. 본 글에서는 허깅페이스의 Transformers 라이브러리를 활용하여 BERT 모델의 앙상블 학습을 구현하고, 커스텀 데이터셋을 정의하는 방법을 자세히 설명하겠습니다.

1. 허깅페이스 Transformers 소개

허깅페이스는 NLP 모델을 쉽게 사용할 수 있도록 다양한 고급 라이브러리를 만듭니다. 특히 Transformers 라이브러리는 BERT, GPT-2, T5 등 여러 최신 모델을 쉽게 사용할 수 있게 해줍니다. 이 라이브러리를 사용하면 복잡한 신경망 구성 과정을 단순화할 수 있습니다.

1.1 BERT란 무엇인가?

BERT는 양방향 Transformer 인코더로서, 문장 내에서의 단어 간의 관계를 효과적으로 파악할 수 있습니다. BERT는 두 가지 주요 단계로 학습됩니다: 마스킹 된 언어 모델링(MLM)과 다음 문장 예측(NSP)입니다. 이러한 학습 방식 덕분에 BERT는 문맥을 이해하고 다양한 NLP 과제에서 우수한 성능을 발휘합니다.

2. 앙상블 학습의 개념

앙상블 학습(Ensemble Learning)은 여러 개의 모델을 결합해 더 나은 예측 성능을 끌어내는 기법입니다. 단일 모델이 가지는 편향을 줄이고, 모델의 다양성을 통해 성능을 향상시킬 수 있습니다. 일반적으로 사용되는 앙상블 기법에는 배깅(Bagging)과 부스팅(Boosting) 등이 있습니다. BERT 모델의 앙상블 학습을 통해 다양한 모델의 강점을 결합해볼 것입니다.

3. 환경 설정

본 강좌에서는 Python과 Hugging Face Transformers 라이브러리를 사용합니다. 필요한 패키지를 설치하기 위해 아래의 명령어를 터미널에 입력합니다.

pip install transformers datasets torch

4. 커스텀 데이터셋 정의하기

NLP 모델을 학습시키기 위해서는 적절한 형식의 데이터셋이 필요합니다. 본 섹션에서는 커스텀 데이터셋을 정의하는 방법을 설명하겠습니다.

4.1 데이터셋 형식

데이터셋은 일반적으로 텍스트와 해당 레이블로 구성됩니다. 우리가 사용할 데이터셋은 CSV 형식으로 준비할 것입니다. 예를 들어, 다음과 같은 형식이어야 합니다.


    text,label
    "이 영화는 정말 재미있었습니다.",1
    "별로였다.",0
    

4.2 데이터 로드하기

이제 커스텀 데이터셋을 로드하는 코드를 작성해보겠습니다. Hugging Face의 datasets 라이브러리를 사용하여 간편하게 로드할 수 있습니다.


import pandas as pd
from datasets import Dataset

# CSV 파일에서 데이터 로드하기
data = pd.read_csv('custom_dataset.csv')
dataset = Dataset.from_pandas(data)
    

5. BERT 모델 구성 및 훈련

데이터셋이 준비되었으니 이제 BERT 모델을 구성하고 훈련시키는 단계로 넘어가겠습니다. Hugging Face의 Transformers 라이브러리를 사용하여 손쉽게 BERT 모델을 사용할 수 있습니다.

5.1 BERT 모델 불러오기

다음 코드는 BERT 모델과 토크나이저를 불러오는 방법을 보여줍니다.


from transformers import BertTokenizer, BertForSequenceClassification

# 모델과 토크나이저 불러오기
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)
    

5.2 데이터 전처리

BERT 모델에 입력하기 전에 데이터 전처리를 수행해야 합니다. 일반적으로 입력 텍스트를 토크나이즈하고, 적절한 형태로 패딩 및 트렁크를 하기 위해 아래 코드를 사용할 수 있습니다.


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

# 데이터 전처리 수행
tokenized_dataset = dataset.map(preprocess_function, batched=True)
    

5.3 모델 훈련

데이터 전처리가 끝났으니 이제 모델을 훈련시킬 준비가 되었습니다. trainer API를 사용하여 훈련 및 평가를 수행하겠습니다.


from transformers import Trainer, TrainingArguments

# 훈련 인자 설정
training_args = TrainingArguments(
    output_dir='./results',
    evaluation_strategy='epoch',
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    num_train_epochs=3,
)

# Trainer 객체 생성
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset,
)

# 모델 훈련
trainer.train()
    

6. 앙상블 모델 구현

여러 개의 BERT 모델을 앙상블하여 성능을 향상시키는 과정입니다. 각 모델의 예측 결과를 결합하여 최종 예측을 도출합니다. 이를 위해 두 개 이상의 모델을 훈련시키고, 그 결과를 결합해봅시다.

6.1 여러 모델 훈련


# BERT 모델 두 개 훈련
model1 = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)
model2 = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)

# 각각 훈련 수행
trainer1 = Trainer(
    model=model1,
    args=training_args,
    train_dataset=tokenized_dataset,
)

trainer2 = Trainer(
    model=model2,
    args=training_args,
    train_dataset=tokenized_dataset,
)

trainer1.train()
trainer2.train()
    

6.2 앙상블 예측 수행하기

두 모델의 예측 결과를 평균하여 앙상블 예측 결과를 도출합니다.


import numpy as np

# 예측 수행
preds1 = trainer1.predict(tokenized_dataset)['logits']
preds2 = trainer2.predict(tokenized_dataset)['logits']

# 앙상블 예측 수행
final_preds = (preds1 + preds2) / 2
final_predictions = np.argmax(final_preds, axis=1)
    

7. 결과 평가

모델의 성능을 평가하는 것은 중요하며, 우리는 정확도와 F1 점수를 사용하여 모델을 평가할 수 있습니다.


from sklearn.metrics import accuracy_score, f1_score

# 라벨과 예측 결과를 비교하여 성능 평가
true_labels = tokenized_dataset['label']
accuracy = accuracy_score(true_labels, final_predictions)
f1 = f1_score(true_labels, final_predictions)

print(f'Accuracy: {accuracy}')
print(f'F1 Score: {f1}')
    

결론

이번 강좌에서는 허깅페이스의 Transformers 라이브러리를 활용하여 BERT 모델의 앙상블 학습을 수행하는 과정을 살펴보았습니다. 커스텀 데이터셋 정의, 모델 구성 및 훈련, 앙상블 기법에 대해 배우며 딥러닝 모델의 성능을 향상시키는 방법을 익혔습니다. 이 과정을 통해 독자 분들이 BERT 모델의 사용법과 앙상블 학습의 개념을 보다 깊게 이해할 수 있었기를 바랍니다.

허깅페이스 트렌스포머 활용강좌, BERT 앙상블 학습 – 데이터 증강

1. 서론

현대 자연어 처리(NLP) 분야에서 BERT는 혁신적인 모델로 자리잡았습니다. BERT는 Bidirectional Encoder Representations from Transformers의 약자로, 양방향 컨텍스트를 이해할 수 있는 강력한 능력을 가지고 있습니다. 딥러닝 기반의 NLP 모델을 개발함에 있어, BERT의 활용은 필수적이며, 특히 앙상블 학습과 데이터 증강 기법을 통해 모델의 성능을 한층 끌어올릴 수 있습니다. 이 강좌에서는 Hugging Face의 Transformers 라이브러리를 사용하여 BERT 모델을 앙상블 학습 방법과 데이터 증강 기법으로 성능을 극대화하는 방법을 다룰 것입니다.

2. BERT: 개요

BERT는 단어의 맥락을 이해하기 위해 Transformer라는 아키텍처를 사용합니다. BERT의 가장 큰 특징은 토큰 간의 관계를 파악하는 데 있어 양방향성을 갖고 있다는 점입니다. 전통적인 RNN 기반 모델은 순차적으로 단어를 처리하는 반면, BERT는 문장 내 모든 단어의 맥락을 동시에 고려할 수 있습니다.

3. Hugging Face Transformers 라이브러리 소개

Hugging Face Transformers 라이브러리는 다양한 Transformer 모델을 손쉽게 사용할 수 있도록 만들어진 파이썬 라이브러리입니다. BERT뿐만 아니라, GPT, T5 등 다른 최신 모델도 지원합니다. 이 라이브러리를 통해 우리는 사전 학습된 모델을 손쉽게 로드하고, 우리의 데이터에 맞게 fine-tuning할 수 있습니다.

4. 데이터 증강의 중요성

데이터 증강(Data Augmentation)은 머신러닝의 성능을 높이는 데 있어 매우 중요한 기술입니다. 특히 NLP에서는 데이터가 부족한 경우, 새로운 데이터를 생성하거나 기존 데이터를 변형함으로써 모델의 일반화 성능을 높일 수 있습니다. 데이터 증강의 방법에는 다양한 기법이 있으며, 이 강좌에서는 특히 텍스트 데이터를 증강하는 방법에 대해 다룰 것입니다.

5. BERT 앙상블 학습

앙상블 학습(Ensemble Learning)은 여러 개의 모델을 조합하여 성능을 향상시키는 기법입니다. 일반적으로 여러 모델의 예측 결과를 결합하여 최종 결과를 도출합니다. BERT 앙상블 학습에서는 서로 다른 하이퍼파라미터로 학습된 여러 BERT 모델의 출력을 결합하여 성능을 개선할 수 있습니다.

6. 환경 설정

!pip install transformers torch

위 명령어를 통해 Hugging Face Transformers 라이브러리와 PyTorch를 설치합니다. 이 라이브러리들은 BERT 모델을 로드하고, 데이터 전처리 과정을 도와줍니다.

7. 데이터 준비 및 전처리

이번 강좌에서는 간단한 텍스트 분류 문제를 다룰 것입니다. 데이터는 다음과 같다고 가정하겠습니다.


data = {
    'text': ['이 영화는 정말로 좋습니다.', '최악의 영화였습니다.', '정말 재미있는 영화입니다.', '이 영화는 지루합니다.'],
    'label': [1, 0, 1, 0]  # 1: 긍정, 0: 부정
}
    

8. 데이터 증강 기법

여러 가지 데이터 증강 기법 중에서 우리가 사용할 기법은 다음과 같은 것들입니다:

  • 주요 단어 치환: 특정 단어를 동의어로 치환하여 새로운 문장을 생성합니다.
  • 무작위 삽입: 무작위로 선택된 단어를 기존 문장에 삽입하여 새로운 문장을 생성합니다.
  • 무작위 삭제: 특정 단어를 무작위로 삭제하여 문장을 변형합니다.

8.1 주요 단어 치환 예제


import random
from nltk.corpus import wordnet

def synonym_replacement(text):
    words = text.split()
    new_words = words.copy()
    random_word_idx = random.randint(0, len(words)-1)
    word = words[random_word_idx]
    
    synonyms = wordnet.synsets(word)
    if synonyms:
        synonym = synonyms[0].lemmas()[0].name()
        new_words[random_word_idx] = synonym.replace('_', ' ')
        
    return ' '.join(new_words)
    

8.2 무작위 삽입 예제


def random_insertion(text):
    words = text.split()
    new_words = words.copy()
    random_word = random.choice(words)
    new_words.insert(random.randint(0, len(new_words)-1), random_word)
    return ' '.join(new_words)
    

8.3 무작위 삭제 예제


def random_deletion(text, p=0.5):
    words = text.split()
    if len(words) == 1:  # only one word, it's better not to drop it
        return text
    
    remaining = list(filter(lambda x: random.random() > p, words))
    return ' '.join(remaining) if len(remaining) > 0 else ' '.join(random.sample(words, 1))
    

9. 데이터 증강 적용하기

이제 수집된 데이터에 데이터 증강을 적용해 보겠습니다.


augmented_texts = []
augmented_labels = []

for index, row in enumerate(data['text']):
    augmented_texts.append(row)  # 원본 데이터 추가
    augmented_labels.append(data['label'][index])  # 해당 label 추가
    
    # 데이터 증강
    augmented_texts.append(synonym_replacement(row))
    augmented_labels.append(data['label'][index])
    
    augmented_texts.append(random_insertion(row))
    augmented_labels.append(data['label'][index])
    
    augmented_texts.append(random_deletion(row))
    augmented_labels.append(data['label'][index])

print("증강된 데이터 수:", len(augmented_texts))
    

10. BERT 모델 학습

데이터 증강이 완료되면, 이제 BERT 모델을 학습시켜야 합니다. 다음 코드를 통해 BERT 모델을 불러오고 학습을 시작할 수 있습니다.


from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
import torch

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

# 데이터 토크나이즈
train_encodings = tokenizer(augmented_texts, truncation=True, padding=True)
train_labels = augmented_labels

# 데이터셋 정의
class AugmentedDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels
        
    def __getitem__(self, idx):
        item = {k: torch.tensor(v[idx]) for k, v in self.encodings.items()}
        item['labels'] = torch.tensor(self.labels[idx])
        return item
    
    def __len__(self):
        return len(self.labels)

train_dataset = AugmentedDataset(train_encodings, train_labels)

# 학습 인자 설정
training_args = TrainingArguments(
    per_device_train_batch_size=4,
    num_train_epochs=3,
    logging_dir='./logs',
    logging_steps=10,
)

# Trainer 초기화 및 학습
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
)

trainer.train()
    

11. 앙상블 학습

이제 여러 다른 하이퍼파라미터로 BERT 모델을 학습시키고 앙상블 학습을 적용해보겠습니다.


def create_and_train_model(learning_rate, epochs):
    model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
    training_args = TrainingArguments(
        per_device_train_batch_size=4,
        num_train_epochs=epochs,
        learning_rate=learning_rate,
        logging_dir='./logs',
        logging_steps=10,
    )

    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=train_dataset,
    )
    
    trainer.train()
    return model

models = []
for lr in [5e-5, 2e-5]:
    for epoch in [3, 4]:
        models.append(create_and_train_model(lr, epoch))
    

12. 앙상블 예측

최종 모델의 예측은 일반적으로 여러 모델의 예측값을 평균하여 생성합니다. 다음 코드를 사용해 앙상블 예측을 수행할 수 있습니다.


def ensemble_predict(models, texts):
    predictions = []
    
    for model in models:
        model_predictions = trainer.predict(texts)
        predictions.append(model_predictions.predictions)
    
    predictions = sum(predictions) / len(predictions)
    return predictions

ensemble_results = ensemble_predict(models, test_data)  # test_data는 별도의 테스트 데이터
    

13. 결론

이번 강좌에서는 허깅페이스의 트렌스포머 라이브러리를 통해 BERT 모델을 앙상블 학습하는 방법과 데이터 증강 기법을 적용하는 방법에 대해 알아보았습니다. BERT는 강력한 성능을 제공하지만, 데이터가 부족하거나 편향된 경우 성능이 저하될 수 있습니다. 데이터 증강 및 앙상블 기법은 이러한 문제를 해결하는 유용한 방법입니다.

14. 참고자료

  • Hugging Face Transformers Documentation: https://transformers.huggingface.co/
  • Paper: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  • Natural Language Processing with Transformers (Book)

허깅페이스 트렌스포머 활용강좌, 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. 참고 자료