이번 강좌에서는 허깅페이스(Hugging Face)의 트랜스포머(Transformers) 라이브러리를 활용하여 Mobile BERT 모델을 사용한 빈칸 채우기 퀴즈를 만들어보겠습니다. Mobile BERT는 BERT 모델을 경량화하여 모바일 환경에서도 효과적으로 사용할 수 있는 모델로, 텍스트 임베딩, 질의 응답, 텍스트 분류 등 다양한 NLP 작업에 활용됩니다.
1. 준비사항
이 강좌를 진행하기 위해 필요한 환경과 라이브러리는 다음과 같습니다:
- Python 3.6 이상
- Transformers 라이브러리
- torch 라이브러리
- pandas (선택 사항, 데이터프레임을 사용하기 위해)
2. 환경 설정
!pip install transformers torch pandas
3. Mobile BERT 모델 소개
Mobile BERT는 Google에서 개발한 BERT(Base Bidirectional Encoder Representations from Transformers)를 기반으로 한 경량화된 변형 모델입니다. Mobile BERT는 BERT와 동일한 아키텍처를 활용하지만, 모델 크기를 줄이고 수행 속도를 높이기 위해 몇 가지 기술적인 조정을 거쳤습니다. 이는 모바일 및 엣지 디바이스에서도 자연어 처리 작업을 지원할 수 있도록 설계되었습니다.
4. 데이터 준비
이번 예제에서는 빈칸 채우기 문제를 구성하기 위해 텍스트 샘플을 준비합니다. 샘플 텍스트에는 특정 단어가 빈칸으로 표시되며, 우리의 목표는 해당 위치에 가장 적합한 단어를 찾는 것입니다.
sample_text = "나는 [MASK]를 사랑합니다. 기계 학습은 [MASK]의 일종입니다."
5. Mobile BERT 모델 로드
허깅페이스의 트랜스포머 라이브러리를 사용하여 Mobile BERT 모델을 로드합니다. 모델과 토크나이저를 가져오기 위해 아래 코드를 사용합니다:
from transformers import MobileBertTokenizer, MobileBertForMaskedLM
import torch
# Mobile BERT 토크나이저와 모델 로드
tokenizer = MobileBertTokenizer.from_pretrained('google/mobilebert-uncased')
model = MobileBertForMaskedLM.from_pretrained('google/mobilebert-uncased')
6. 빈칸 채우기 함수 구현
이제 빈칸 채우기를 수행하는 함수를 구현합니다. 이 함수는 텍스트를 입력으로 받아, [MASK]를 포함하는 문장을 토크나이즈하고, 모델을 통해 예측한 결과를 반환합니다.
def fill_mask(text):
# 텍스트 토크나이즈
input_ids = tokenizer.encode(text, return_tensors='pt')
# 모델 예측
with torch.no_grad():
outputs = model(input_ids)
# 예측된 토큰 ID 얻기
predictions = outputs.logits.argmax(dim=-1)
# 예측된 단어들로부터 텍스트 복원
filled_text = tokenizer.decode(predictions[0])
return filled_text
7. 빈칸 채우기 호출
이제 구현한 함수를 사용하여 빈칸 채우기를 해보겠습니다. 다음은 빈칸이 있는 문장을 입력으로 사용한 코드입니다.
# 빈칸 있는 샘플 텍스트
sample_text = "나는 [MASK]를 사랑합니다. 기계 학습은 [MASK]의 일종입니다."
# 빈칸 채우기 함수 호출
filled_text = fill_mask(sample_text)
print(filled_text)
8. 결과 해석
모델이 예측한 결과를 해석합니다. Mobile BERT는 사전 훈련된 모델로, 자연어의 문맥을 이해하고 적절한 단어를 선택하는 데 뛰어난 성능을 보입니다. 이 예제를 통해 모델이 어떻게 빈칸을 채우는지 이해할 수 있습니다.
9. 실습: 여러 문장에 대한 빈칸 채우기
여러 개의 문장에 대해 빈칸 채우기를 실습해보겠습니다. 여러 샘플을 리스트에 넣고, 반복문을 통해 결과를 확인해보세요.
# 빈칸 있는 여러 문장 샘플
samples = [
"나는 [MASK]를 사랑합니다.",
"기계 학습은 [MASK]의 일종입니다.",
"[MASK]는 매우 중요한 개념입니다."
]
# 각 샘플에 대해 빈칸 채우기
for sample in samples:
filled = fill_mask(sample)
print(f"원래 문장: {sample} -> 채워진 문장: {filled}")
10. 결론
이번 강좌에서는 Mobile BERT를 활용하여 NLP 빈칸 채우기 문제를 해결해보았습니다. 허깅페이스의 트랜스포머 라이브러리를 사용하면 복잡한 자연어 처리 작업을 손쉽게 수행할 수 있습니다. Mobile BERT는 모바일 환경에서도 효율적으로 작동하기 때문에, 경량화된 머신러닝 애플리케이션에 매우 적합합니다.
11. 참고 문헌
- Hugging Face Transformers Documentation: https://huggingface.co/transformers/
- Google’s Mobile BERT Paper: https://arxiv.org/abs/1904.08836