허깅페이스 트렌스포머 활용강좌, BERT 도큐먼트 벡터 표현 추출

안녕하세요! 이번 글에서는 허깅페이스(Hugging Face)의 트랜스포머 라이브러리를 이용하여 BERT(Bidirectional Encoder Representations from Transformers) 모델을 활용해 도큐먼트 벡터 표현을 추출하는 방법에 대해 자세히 설명하겠습니다. BERT는 자연어 처리(NLP) 분야에서 여러 작업에 전방위적으로 활용되고 있는 강력한 언어 모델입니다.

1. BERT 소개

BERT는 2018년 구글이 발표한 모델로, 자연어 이해(Task)에서 뛰어난 성능을 발휘합니다. BERT는 양방향적으로 문맥을 고려하여 단어를 이해할 수 있도록 설계되었습니다. 이 모델은 텍스트의 의미를 좀 더 깊이 이해하기 위해 ‘Masked Language Model’과 ‘Next Sentence Prediction’이라는 두 가지 방법을 사용하여 학습됩니다.

1.1 BERT의 동작 원리

BERT는 입력 문장에서 무작위로 몇 개의 단어를 가려(마스킹) 이를 맞추는 방식으로 학습됩니다. 그런 다음, 문장의 다음 문장이 주어졌을 때, 현재 문장이 그 다음 문장과 어떤 관계인지 예측합니다. 이러한 과정을 통해 문맥의 의미를 더 잘 이해하게 됩니다.

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

허깅페이스는 AI 연구자와 개발자들이 쉽게 자연어 처리 모델을 사용할 수 있도록 다양한 API와 라이브러리를 제공합니다. transformers 라이브러리를 사용하면 BERT를 포함한 다양한 트랜스포머 모델을 쉽게 사용할 수 있습니다. 이 라이브러리의 장점은 사전 학습된 모델을 제공한다는 것입니다. 따라서, 모델을 처음부터 학습할 필요 없이 다양한 작업에 활용할 수 있습니다.

3. 환경 설정

먼저, 파이썬 환경에 허깅페이스의 트랜스포머 라이브러리를 설치해야 합니다. 아래의 명령어를 입력하여 설치할 수 있습니다:

pip install transformers torch

4. BERT 모델 로드하기

이제 BERT 모델을 로드해보도록 하겠습니다. 허깅페이스의 트랜스포머 라이브러리를 사용하여 BERT 모델과 토크나이저를 로드할 수 있습니다. 다음 코드를 실행해 보세요:

from transformers import BertModel, BertTokenizer

# 모델과 토크나이저 로드
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

5. 도쿠먼트 벡터 표현 추출하기

이제 실제로 도큐먼트 벡터 표현을 추출해봅시다. BERT의 입력은 토큰화된 형태로 주어져야 하며, 토크나이저를 이용해 문장을 토큰화한 후 텐서 형태로 변환해야 합니다. 아래는 주어진 문장을 BERT를 통해 벡터 표현으로 변환하는 방법입니다.

# 예제 문장
document = "허깅페이스 라이브러리는 다양한 자연어 처리 모델을 지원합니다."

# 문장 토큰화
inputs = tokenizer(document, return_tensors='pt')

# 모델을 통해 벡터 표현 추출
with torch.no_grad():
    outputs = model(**inputs)

# 마지막 은닉 상태(hidden state) 가져오기
last_hidden_states = outputs.last_hidden_state

# [CLS] 토큰의 벡터를 사용하여 도큐먼트 벡터 표현
document_vector = last_hidden_states[0][0]
print(document_vector.shape)

5.1 문서 벡터의 의미

위 코드는 입력 문장의 마지막 은닉 상태(hidden state)를 출력합니다. BERT 모델에서 [CLS] 토큰은 문서 전체를 나타내는 벡터를 제공합니다. 이 벡터는 문서의 의미를 포괄적으로 표현할 수 있습니다.

6. 여러 문서에서 벡터 표현 추출하기

다양한 문서들의 벡터 표현을 추출하려면, 예제 문장을 리스트로 생성하고 반복문을 통해 각각의 문장에 대해 벡터를 추출할 수 있습니다.

# 여러 문서의 예시
documents = [
    "허깅페이스 라이브러리는 다양한 자연어 처리 모델을 지원합니다.",
    "BERT는 자연어 처리의 혁신적인 모델입니다.",
    "딥러닝은 여러 분야에 적용될 수 있습니다."
]

document_vectors = []

for doc in documents:
    inputs = tokenizer(doc, return_tensors='pt')
    with torch.no_grad():
        outputs = model(**inputs)
    document_vector = outputs.last_hidden_state[0][0]
    document_vectors.append(document_vector)

# Document 벡터 출력
for i, vec in enumerate(document_vectors):
    print(f"Document {i+1} Vector: {vec.shape}")

7. 문서 벡터 활용하기

도큐먼트 벡터 표현은 여러 자연어 처리 작업에서 유용하게 사용될 수 있습니다. 예를 들어, 문서 유사도 측정, 클러스터링, 분류 등 다양한 작업에 활용할 수 있습니다. 벡터의 내적(inner product)으로 두 벡터 간 유사도를 계산할 수 있습니다.

7.1 문서 유사도 측정 예제

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# Numpy 배열로 변환
document_vectors_np = np.array([vec.numpy() for vec in document_vectors])

# 코사인 유사도 계산
similarity_matrix = cosine_similarity(document_vectors_np)

print("문서 유사도 행렬:")
print(similarity_matrix)

8. 결론

이번 글에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 BERT 모델로 도큐먼트 벡터 표현을 추출하는 방법에 대해 알아보았습니다. BERT 모델을 통해 자연어 처리의 여러 작업에서 효과적으로 활용할 수 있는 벡터를 생성할 수 있음을 보여드렸습니다. 이 벡터는 다양한 NLP 어플리케이션에서 유용하게 사용될 수 있습니다.

딥러닝과 자연어 처리의 발전에 따라 앞으로도 많은 연구와 관심이 필요한 분야입니다. BERT와 같은 모델을 활용하여 더 많은 흥미로운 프로젝트와 응용을 시도해보시기 바랍니다. 감사합니다!