허깅페이스 트렌스포머 활용강좌, BERT [CLS] 토큰의 도큐먼트 벡터 표현 함수 및 BERT 전처리

딥러닝과 자연어 처리 분야에서 BERT(Bidirectional Encoder Representations from Transformers)는
혁신적인 성과를 거두며 많은 연구자와 개발자들 사이에서 필수 도구로 자리 잡았습니다.
본 강좌에서는 허깅페이스 라이브러리를 활용하여 BERT 모델을 기반으로 [CLS] 토큰을 사용한
도큐먼트 벡터 표현 함수 및 BERT 전처리 방법에 대해 자세히 설명하겠습니다.

1. BERT란 무엇인가?

BERT는 구글에서 2018년 발표한 자연어 처리(NLP) 모델로, Transformer 구조를 기반으로 합니다.
BERT는 입력 문장의 단어들 간의 관계를 양방향으로 학습하는 방법을 채택해,
단어의 의미를 보다 풍부하게 표현할 수 있게 해줍니다. 이를 통해 BERT는 다양한 자연어 처리 과제에서
뛰어난 성능을 보여주고 있습니다.

2. BERT의 특성

  • 양방향성: BERT는 문장을 왼쪽에서 오른쪽, 오른쪽에서 왼쪽 모두에서 읽어서
    단어의 맥락을 이해합니다.
  • 대규모 사전 학습: BERT는 대량의 데이터에서 사전 학습을 통해
    다양한 언어적 패턴을 학습합니다.
  • [CLS] 토큰: BERT의 입력 시퀀스는 [CLS]라는 특별한 토큰으로 시작되며,
    이 토큰의 벡터가 문서 전체의 고수준 표현을 나타냅니다.

3. BERT 전처리 과정

BERT를 사용하기 위해서는 입력 데이터를 적절하게 전처리해야 합니다.
데이터 전처리 과정은 입력 데이터를 BERT 모델이 이해할 수 있는 형식으로 변환하는 단계입니다.
여기에서는 기본적인 BERT 전처리 단계에 대해 설명하겠습니다.

3.1. 입력 시퀀스 처리

BERT 모델에 입력될 데이터는 다음과 같은 단계로 전처리됩니다:

  1. 텍스트 토큰화: 입력 텍스트를 토큰으로 나누기 위해 BERT의 토크나이저를 사용합니다.
  2. 인덱스 변환: 각 토큰을 고유한 인덱스로 변환합니다.
  3. 어텐션 마스크 생성: 입력 시퀀스의 각 토큰이 실제 데이터인지 패딩인지 구분하기 위한
    어텐션 마스크를 생성합니다.
  4. 세그먼트 ID 생성: 입력이 여러 개의 문장으로 구성된 경우, 각 문장이 어떤 세그먼트에
    속하는지를 나타내는 ID를 생성합니다.

3.2. BERT 토큰화 예제

아래의 Python 코드는 허깅페이스의 트랜스포머 라이브러리를 사용하여 BERT 입력 시퀀스를
전처리하는 방법을 보여줍니다:


import torch
from transformers import BertTokenizer

# BERT tokenizer 초기화
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# 예제 문장
text = "딥러닝은 인공지능의 한 분야이다."

# 텍스트 토큰화
inputs = tokenizer(text, return_tensors="pt")

# 결과 출력
print("Input IDs:", inputs['input_ids'])
print("Attention Mask:", inputs['attention_mask'])
    

4. [CLS] 토큰을 사용한 도큐먼트 벡터 표현

BERT의 출력에서 [CLS] 토큰의 벡터 표현은 입력 문서의 고수준 의미를 나타냅니다.
이 벡터는 일반적으로 문서 분류, 감정 분석 등의 작업에서 사용됩니다. [CLS] 토큰의
벡터를 통해 전체 문서의 이해를 바탕으로 예측을 수행할 수 있습니다.

4.1. BERT 모델을 사용한 예제

다음은 BERT 모델을 사용하여 [CLS] 토큰의 벡터 표현을 추출하는 예제입니다:


from transformers import BertModel

# BERT 모델 초기화
model = BertModel.from_pretrained('bert-base-uncased')

# 모델에 입력 데이터 전달
with torch.no_grad():
    outputs = model(**inputs)

# [CLS] 토큰의 벡터 추출
cls_vector = outputs.last_hidden_state[0][0]

# 결과 출력
print("CLS Vector:", cls_vector)
    

5. 전체 코드 예제

전체 코드 예제를 통해 BERT의 전처리와 [CLS] 토큰의 벡터 표현을 추출하는 과정을
통합적으로 살펴보겠습니다:


import torch
from transformers import BertTokenizer, BertModel

# BERT tokenizer와 모델 초기화
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

# 예제 문장
text = "딥러닝은 인공지능의 한 분야이다."

# 텍스트 토큰화
inputs = tokenizer(text, return_tensors="pt")

# 모델에 전달하여 예측 수행
with torch.no_grad():
    outputs = model(**inputs)

# [CLS] 토큰의 벡터 추출
cls_vector = outputs.last_hidden_state[0][0]

print("Input IDs:", inputs['input_ids'])
print("Attention Mask:", inputs['attention_mask'])
print("CLS Vector:", cls_vector)
    

6. 마무리

본 강좌에서는 허깅페이스 라이브러리를 사용하여 BERT의 전처리 과정과 [CLS] 토큰의
벡터 표현을 추출하는 방법에 대해 살펴보았습니다. BERT를 활용하면 문서의 고수준 의미를
효과적으로 표현할 수 있으며, 이를 통해 다양한 자연어 처리 작업에서 경쟁력 있는 성능을
발휘할 수 있습니다. 앞으로 BERT를 활용한 더 많은 실습과 응용을 통해 실력을 키워보시기를
바랍니다.

이 글이 도움이 되셨다면 이 블로그를 공유해 주세요!