허깅페이스 트렌스포머 활용강좌, Mobile BERT vs BERT Tokenizer

서론

딥러닝과 자연어 처리(NLP) 분야에서 최근 몇 년 간 가장 주목받는 기술 중 하나는 BERT(Bidirectional Encoder Representations from Transformers) 입니다. BERT는 문맥을 이해하는 데 탁월한 성능을 보여주며, 이는 다양한 NLP 작업에 활용되고 있습니다. 그러나 BERT는 크기가 크고 연산 비용이 많이 들어, 모바일 환경에서는 사용이 어렵습니다. 이러한 문제를 해결하기 위해 Mobile BERT가 등장하였습니다. 이번 강좌에서는 허깅페이스의 Transformers 라이브러리를 활용하여 BERT와 Mobile BERT의 특징을 비교하고, 두 모델의 Tokenizer를 사용해보겠습니다.

1. BERT 모델 소개

BERT는 2018년 구글에서 발표한 언어 표현 모델로, 사전 훈련된 언어 표현을 학습하여 다양한 NLP 작업을 수행할 수 있게 돕습니다. BERT는 Transformer’s encoder 구조를 기반으로 하며, Bidirectional 방식으로 문맥을 이해할 수 있습니다. 일반적인 NLP 작업으로는 감정 분석, 질문 답변 시스템, 문장 유사도 계산 등이 있습니다.

1.1 BERT의 특징

  • Bidirectional Attention: 문맥을 양 방향으로 이해합니다.
  • Masked Language Modeling: 입력 문장에서 일부 단어를 마스크하고, 이를 예측하는 방식으로 학습합니다.
  • Next Sentence Prediction: 두 문장이 연속적인 관계에 있는지를 예측합니다.

2. Mobile BERT 모델 소개

Mobile BERT는 BERT의 경량화 버전으로, 모바일 기기에서 효율적으로 사용할 수 있도록 설계되었습니다. Mobile BERT는 BERT의 파라미터 수를 대폭 줄였으나, 성능은 유지합니다. 이를 통해 모바일 기기에서도 자연어 처리 작업을 원활하게 수행할 수 있습니다.

2.1 Mobile BERT의 특징

  • 작은 모델 크기: Mobile BERT는 BERT보다 훨씬 작은 모델입니다.
  • 높은 처리 속도: 경량화된 구조 덕분에 모바일 환경에서도 빠르게 동작합니다.
  • 효율적인 메모리 사용: 적은 자원으로도 높은 성능을 발휘할 수 있도록 최적화되었습니다.

3. 허깅페이스 Transformers 라이브러리 소개

허깅페이스(Transformers)는 다양한 사전 훈련된 NLP 모델을 쉽게 사용할 수 있도록 도와주는 Python 라이브러리입니다. 이 라이브러리는 BERT, Mobile BERT, GPT-2 등 다양한 모델을 제공합니다. 또한, 모델의 Tokenizer도 함께 제공하여 텍스트를 손쉽게 전처리할 수 있도록 돕습니다.

3.1 설치 방법

pip install transformers torch

4. Mobile BERT vs BERT Tokenizer 사용 예제

이제 BERT와 Mobile BERT의 Tokenizer 사용법에 대해 살펴보겠습니다. 아래의 코드는 두 모델의 Tokenizer를 설치하고, 입력 텍스트에 대해 각각 토크나이징을 수행하는 예제입니다.

from transformers import BertTokenizer, MobileBertTokenizer

# BERT Tokenizer 초기화
bert_tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

# Mobile BERT Tokenizer 초기화
mobile_bert_tokenizer = MobileBertTokenizer.from_pretrained("google/mobilebert-uncased")

# 입력 텍스트
text = "딥러닝은 매우 흥미로운 분야입니다."

# BERT Tokenization
bert_tokens = bert_tokenizer.tokenize(text)
print("BERT Tokens:", bert_tokens)

# Mobile BERT Tokenization
mobile_bert_tokens = mobile_bert_tokenizer.tokenize(text)
print("Mobile BERT Tokens:", mobile_bert_tokens)

4.1 코드 설명

위의 예제에서, transformers 라이브러리에서 제공하는 BertTokenizerMobileBertTokenizer를 통해 두 개의 Tokenizer를 초기화하였습니다. 입력 텍스트를 tokenize 메소드를 사용해 토크나이즈한 뒤, 결과를 출력합니다. BERT와 Mobile BERT의 토큰화 결과를 비교할 수 있습니다.

5. 비교 분석

BERT와 Mobile BERT의 Tokenizer를 사용한 결과, 두 모델의 토큰화 결과를 비교하고, 각 모델의 특성을 분석해보겠습니다. 사용한 입력 문장은 “딥러닝은 매우 흥미로운 분야입니다.” 입니다.

# BERT Tokenization 결과
BERT Tokens: ['deep', '##learning', '은', '매우', '흥미로운', '분야', '입니다', '.']

# Mobile BERT Tokenization 결과
Mobile BERT Tokens: ['딥러닝', '은', '매우', '흥미로운', '분야', '입니다', '.']

5.1 분석

BERT Tokenizer는 한 단어를 여러 개의 서브워드로 분할하는 반면, Mobile BERT Tokenizer는 입력된 문장을 단어 단위로 잘게 쪼개지 않고 유지합니다. 이는 Mobile BERT가 모바일 환경에서 보다 효율적으로 작동할 수 있도록 최적화 되어 있기 때문입니다.

6. 고급 활용

Tokenization과 모델 로딩 외에도, 허깅페이스 라이브러리를 통해 BERT 및 Mobile BERT 모델을 활용한 다양한 고급 작업들을 진행할 수 있습니다. 예를 들어, 감정 분석 모델을 구축하거나, 특정 태스크에 대한 Fine-tuning을 수행할 수 있습니다.

6.1 모델 파인튜닝

모델 파인튜닝은 특정 데이터셋에 대해 사전 훈련된 모델을 재훈련하는 과정입니다. 아래의 코드는 BERT 모델을 파인튜닝하기 위한 기본적인 방법을 보여줍니다.

from transformers import BertForSequenceClassification, Trainer, TrainingArguments
import torch
from torch.utils.data import Dataset, DataLoader

# 예시 데이터셋 클래스
class CustomDataset(Dataset):
    def __init__(self, texts, labels, tokenizer):
        self.texts = texts
        self.labels = labels
        self.tokenizer = tokenizer

    def __len__(self):
        return len(self.texts)

    def __getitem__(self, idx):
        input_encoding = self.tokenizer(self.texts[idx], truncation=True, padding='max_length', max_length=512, return_tensors='pt')
        item = {key: val[0] for key, val in input_encoding.items()}
        item['labels'] = torch.tensor(self.labels[idx])
        return item

# 모델 초기화
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

# 데이터셋 및 DataLoader 생성
train_texts = ["이 영화는 좋았어요.", "이 영화는 별로였어요."]
train_labels = [1, 0]  # 감정 레이블 1: 긍정, 0: 부정
train_dataset = CustomDataset(train_texts, train_labels, bert_tokenizer)
train_loader = DataLoader(train_dataset, batch_size=2)

# TrainingArguments 설정
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=2,
    logging_dir='./logs',
)

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

# 모델 훈련
trainer.train()

6.2 코드 설명

코드에서는 CustomDataset 클래스를 정의하여 입력 데이터를 다루며, BERT 모델을 로드한 후 Trainer 객체를 통해 훈련을 시작합니다. 이 방법을 통해 BERT 모델을 특정 태스크에 맞게 조정할 수 있습니다.

7. 결론

이번 강좌에서는 허깅페이스의 Transformers 라이브러리를 사용하여 BERT와 Mobile BERT의 Tokenizer를 비교하고, 이를 기반으로 모델 훈련의 기본 과정을 살펴보았습니다. BERT는 성능이 뛰어나지만 고사양의 하드웨어를 요구하는 반면, Mobile BERT는 경량화된 모델로써 모바일 환경에서도 자연어 처리를 가능하게 합니다. 앞으로 더 다양한 실습과 연구를 통해 딥러닝과 자연어 처리 분야에서 성과를 이뤄나가기를 기대합니다.

참고 문헌

  • Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2018). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.
  • Sun, C., Qiu, X., Xu, Y., & Huang, X. (2019). MobileBERT: Transformer-based Model for Resource-bound Devices.