허깅페이스 트렌스포머 활용강좌, 앙상블 트레이닝에 사용할 사전학습 BERT 불러오기

오늘은 딥러닝 모델 중에서 가장 많이 사용되는 BERT(Bidirectional Encoder Representations from Transformers) 모델을 활용하여 앙상블 트레이닝에 적용하는 방법을 배워보겠습니다. 이 과정에서는 허깅페이스(Hugging Face)의 Transformers 라이브러리를 사용하여 사전학습된 BERT 모델을 로드하고, 이를 기반으로 앙상블 모델을 구축하는 방법을 설명할 것입니다.

어떻게 BERT가 작동하는가?

BERT 모델은 문맥을 이해하기 위해 양방향으로 전이 학습을 수행하는 모델입니다. 즉, 입력 문장의 왼편과 오른편의 단어들이 문맥을 어떻게 형성하는지를 동시에 고려합니다. 이를 통해 단어의 의미를 더욱 깊이 있는 방식으로 이해할 수 있습니다. BERT는 unsupervised 방식으로 대량의 텍스트 데이터에서 사전학습을 진행한 후, 다양한 다운스트림 태스크에 적합하게 fine-tuning 할 수 있습니다.

허깅페이스 라이브러리 설치

허깅페이스 Transformers 라이브러리는 BERT와 같은 다양한 사전학습 모델을 쉽게 사용할 수 있도록 해줍니다. 라이브러리를 설치하기 위해서는 아래의 명령어를 실행하여 설치할 수 있습니다:

pip install transformers torch

사전학습된 BERT 모델 불러오기

이제 Hugging Face Transformers 라이브러리를 사용하여 사전학습된 BERT 모델을 불러오겠습니다. 아래의 코드는 BERT 모델과 토크나이저를 불러오는 간단한 코드입니다.


from transformers import BertTokenizer, BertModel

# BERT 토크나이저와 모델 불러오기
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

# 테스트 문장
text = "Hello, how are you?"
inputs = tokenizer(text, return_tensors='pt')

# BERT 모델에 입력하여 출력 받기
outputs = model(**inputs)
print(outputs)
    

코드 설명

  • from transformers import BertTokenizer, BertModel: 허깅페이스의 트랜스포머에서 BERT 토크나이저와 모델을 가져옵니다.
  • tokenizer = BertTokenizer.from_pretrained('bert-base-uncased'): 사전학습된 BERT 토크나이저를 불러옵니다.
  • model = BertModel.from_pretrained('bert-base-uncased'): 사전학습된 BERT 모델을 불러옵니다.
  • inputs = tokenizer(text, return_tensors='pt'): 입력 문장을 토큰화하고 PyTorch 텐서로 변환합니다.
  • outputs = model(**inputs): 모델에 입력하여 출력을 받습니다.

앙상블 트레이닝 개요

앙상블 학습은 여러 모델의 예측 결과를 조합하여 최종 예측 성능을 향상시키는 방법입니다. 다양한 학습 모델의 장점을 합쳐서 보다 신뢰할 수 있는 예측 결과를 얻을 수 있습니다. 일반적으로 앙상블 학습에는 여러가지 기법이 있을 수 있으며, Bagging과 Boosting 방식이 널리 사용됩니다.

BERT로 앙상블 모델 구성하기

이제 BERT 모델을 사용하여 앙상블 모델을 구성하는 방법을 살펴보겠습니다. 여러 개의 BERT 모델을 학습시키고, 그 예측 값을 합쳐서 최종 예측을 도출해 보겠습니다.

모델 개요

우리는 다음과 같은 구조로 앙상블 모델을 구성할 것입니다:

  • 여러 개의 BERT 모델을 생성하여 훈련
  • 각 모델의 예측 값을 수집
  • 예측 값을 결합하여 최종 예측 생성

데이터셋 준비

우리는 간단한 텍스트 분류 문제를 사용할 것입니다. 예를 들어, 이메일 스팸 필터링 등의 문제를 가정할 수 있습니다. 먼저, 아래와 같이 편리한 데이터셋을 준비합니다.


import pandas as pd

# 예시 데이터셋 생성
data = {'text': ["Free money now", "Hello friend, how are you?", "Limited time offer", "Nice to see you"],
        'label': [1, 0, 1, 0]}  # 1: 스팸, 0: 일반 메일
df = pd.DataFrame(data)
    

모델 학습 및 앙상블 수행

이제 각각의 BERT 모델을 학습시키도록 하겠습니다. 학습된 모델은 앙상블을 위해 저장됩니다.


from sklearn.model_selection import train_test_split
import torch

# 데이터 분할
train_texts, test_texts, train_labels, test_labels = train_test_split(df['text'], df['label'], test_size=0.2, random_state=42)

# BERT 모델을 위한 데이터 준비
train_encodings = tokenizer(list(train_texts), truncation=True, padding=True, return_tensors='pt')
test_encodings = tokenizer(list(test_texts), truncation=True, padding=True, return_tensors='pt')

class BERTClassifier(torch.nn.Module):
    def __init__(self):
        super(BERTClassifier, self).__init__()
        self.bert = BertModel.from_pretrained('bert-base-uncased')
        self.classifier = torch.nn.Linear(self.bert.config.hidden_size, 2)  # 2 클래스 (스팸, 비스팸)

    def forward(self, input_ids, attention_mask):
        output = self.bert(input_ids, attention_mask=attention_mask)[1]
        return self.classifier(output)

# 모델 및 옵티마이저 선언
model1 = BERTClassifier()
model2 = BERTClassifier()  # 두 번째 모델 예시
optimizer = torch.optim.Adam(model1.parameters(), lr=5e-5)

# 간단한 학습 루프
model1.train()
for epoch in range(3):  # 3번 에폭
    optimizer.zero_grad()
    outputs = model1(input_ids=train_encodings['input_ids'], attention_mask=train_encodings['attention_mask'])
    loss = torch.nn.CrossEntropyLoss()(outputs, torch.tensor(train_labels.values))
    loss.backward()
    optimizer.step()
    print(f'Epoch {epoch + 1}, Loss: {loss.item()}')
    # 동일한 방식으로 model2도 학습

# 모델 저장
torch.save(model1.state_dict(), 'bert_model1.pth')
torch.save(model2.state_dict(), 'bert_model2.pth')
    

예측 수행 및 앙상블 결과

모델 학습이 완료되면, 각 모델의 예측 결과를 결합하여 최종 예측 값도 생성할 수 있습니다.


# 예측 함수 정의
def predict(model, encodings):
    model.eval()
    with torch.no_grad():
        outputs = model(input_ids=encodings['input_ids'], attention_mask=encodings['attention_mask'])
    return torch.argmax(outputs, dim=1)

# 모델 로드
model1.load_state_dict(torch.load('bert_model1.pth'))
model2.load_state_dict(torch.load('bert_model2.pth'))

# 개별 모델 예측
preds_model1 = predict(model1, test_encodings)
preds_model2 = predict(model2, test_encodings)

# 앙상블 예측
final_preds = (preds_model1 + preds_model2) / 2
final_preds = (final_preds > 0.5).int()  # 0.5를 임계값으로 사용하여 이진 예측
print(f'최종 예측: {final_preds}')
    

결론

오늘은 허깅페이스 트렌스포머 라이브러리를 사용하여 사전학습된 BERT 모델을 불러오고, 이를 기반으로 간단한 앙상블 트레이닝 방법을 살펴보았습니다. BERT는 복잡한 자연어 처리 태스크에서 훌륭한 성능을 보이며, 앙상블 기법을 사용할 경우 더욱 향상된 성능을 기대할 수 있습니다. 앞으로 다양한 태스크에서도 이러한 기법을 적용하여 더 나은 결과를 만들어 보시기 바랍니다.

참고 자료

허깅페이스 트렌스포머 활용강좌, 사전학습 모델 불러오기

1. 소개

딥러닝의 발전은 자연어 처리(NLP) 분야에서 특히 눈부신 성과를 이룩해왔습니다. 이러한 발전의 중심에는
사전학습 모델이 있습니다. 허깅페이스(Hugging Face)는 이러한 사전학습 모델을 보다 쉽게 사용할 수 있도록
해주는 강력한 라이브러리인 Transformers를 제공합니다. 본 강좌에서는 허깅페이스의
Transformers 라이브러리를 사용하여 사전학습 모델을 불러오는 방법에 대해 자세히 알아보겠습니다.

2. 허깅페이스 Transformers 라이브러리란?

허깅페이스 Transformers 라이브러리는 다양한 자연어 처리(NLP) 모델을 제공하는 라이브러리로,
BERT, GPT, RoBERTa, T5
여러 모델을 포함하고 있습니다. 이 라이브러리를 통해 개발자는 손쉽게 사전학습된 언어 모델을 로드하고
이를 기반으로 다양한 NLP 작업을 수행할 수 있습니다.

3. 환경 설정

시작하기 전에 필요한 라이브러리를 설치해야 합니다. 아래의 명령어를 통해 기본적인 라이브러리를
설치할 수 있습니다.

pip install transformers torch

여기서, transformers는 허깅페이스 라이브러리이며, torch
PyTorch 프레임워크입니다. PyTorch 대신 TensorFlow를 사용하고 싶다면 TensorFlow를 설치하면 됩니다.

4. 사전학습 모델 불러오기

이제 사전학습된 모델을 불러와 보겠습니다. 예를 들어, BERT 모델을 이용하여
텍스트의 의미를 이해할 수 있습니다. 아래는 Python 코드를 통해 BERT 모델을 불러오는 방법입니다.

from transformers import BertTokenizer, BertModel

# BERT 모델의 토크나이저와 모델을 불러오기
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

# 예제 문장
sentence = "Hugging Face is creating a tool that democratizes AI."

# 문장을 토큰화하여 입력 벡터로 변환
inputs = tokenizer(sentence, return_tensors='pt')
outputs = model(**inputs)

# 출력 결과 확인
print(outputs)

위 코드에서 BertTokenizer 클래스는 입력된 문장을 BERT 모델이 이해할 수 있는
형태로 변환합니다. BertModel 클래스는 실제 모델을 불러오고, 변환된
입력을 모델에 통과시켜 출력을 생성합니다.

5. 출력 결과 분석

위의 코드에서 출력되는 outputs 변수는 두 가지 주요 정보를 포함하고 있습니다:

  • last_hidden_state: 마지막 은닉 상태(hidden state)로, 각 토큰의 벡터 표현을 보여줍니다.
  • pooler_output: 입력 시퀀스의 전체를 요약한 벡터로, 주로 분류 작업에 사용됩니다.

각 토큰의 벡터 표현은 자연어 처리를 위한 매우 유용한 정보입니다. 각 토큰에 대해 출력된
은닉 상태는 아래와 같이 접근할 수 있습니다.

# 마지막 은닉 상태 접근
hidden_states = outputs.last_hidden_state
print(hidden_states.shape)  # (배치 크기, 시퀀스 길이, 숨겨진 차원)

6. 다양한 사전학습 모델 사용하기

허깅페이스는 BERT 외에도 여러 다른 모델을 지원합니다. 사용자가 다양한 작업에 적합한
모델을 선택할 수 있도록 여러 모델을 제공합니다. GPT-2, RoBERTa,
T5 등 각 모델의 사용법은 대동소이합니다. 예를 들어, GPT-2 모델을
사용하고자 할 경우, 아래와 같은 방법으로 불러올 수 있습니다.

from transformers import GPT2Tokenizer, GPT2Model

# GPT-2 모델의 토크나이저와 모델을 불러오기
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2Model.from_pretrained('gpt2')

# 예제 문장
sentence = "Hugging Face has become a leader in NLP."

# 문장을 토큰화하여 입력 벡터로 변환
inputs = tokenizer(sentence, return_tensors='pt')
outputs = model(**inputs)

print(outputs)

7. 직접 모델 학습하기

사전학습된 모델을 가져오는 것뿐만 아니라, 사용자는 자신의 데이터셋에 맞춰 모델을 미세 조정할
수도 있습니다. 이 과정은 아래의 단계를 통해 진행됩니다:

  1. 데이터 준비 및 전처리
  2. 사전학습된 모델 불러오기
  3. 학습을 위한 손실 함수 및 옵티마이저 설정
  4. 모델 학습

7.1 데이터 준비 및 전처리

데이터는 CSV 파일 등의 형식으로 준비할 수 있으며, 이를 불러와 전처리하는 일련의 과정이 필요합니다.

import pandas as pd

# 데이터셋 불러오기
data = pd.read_csv('data.csv')
print(data.head())  # 데이터셋의 첫 5행 확인

7.2 사전학습된 모델 불러오기

위에서 설명한 방식으로 모델을 불러오면 됩니다.

7.3 손실 함수 및 옵티마이저 설정

모델 학습을 위해서는 손실 함수와 옵티마이저를 설정해야 합니다. 예를 들면,
AdamW 옵티마이저와 CrossEntropyLoss 손실 함수를 사용할 수 있습니다.

from transformers import AdamW

optimizer = AdamW(model.parameters(), lr=5e-5)  # 학습률 설정
loss_fn = torch.nn.CrossEntropyLoss()

7.4 모델 학습

전처리된 데이터와 설정된 손실 함수 및 옵티마이저를 이용하여 모델을 학습시킬 수 있습니다.
일반적으로 에폭을 설정하고 이를 반복하여 모델을 최적화합니다.

for epoch in range(num_epochs):
    model.train()
    outputs = model(**inputs)  # 모델의 출력
    loss = loss_fn(outputs, labels)  # 손실 계산
    loss.backward()  # 역전파
    optimizer.step()  # 가중치 업데이트
    optimizer.zero_grad()  # 기울기 초기화

8. 결론

본 강좌를 통해 허깅페이스의 Transformers 라이브러리를 활용하여 사전학습 모델을 불러오고,
또 이를 기반으로 다양한 작업을 수행할 수 있는 방법에 대해 알아보았습니다. 이 라이브러리는
자연어 처리 분야에서 강력한 도구가 되며, 특히 일정한 데이터셋과 평소의 손쉬운 API를 통해
모델을 활용할 수 있도록 돕습니다. 이제 여러분은 허깅페이스의 트렌스포머를 통해
자신의 프로젝트에 활용할 수 있는 능력을 갖추었습니다.

이 글은 허깅페이스 트렌스포머를 이용한 딥러닝 강좌의 일부입니다. 더 많은 강좌를 원하시면
관련 자료를 두고 학습하시기 바랍니다.

허깅페이스 트렌스포머 활용강좌, 샘플 이미지 데이터세트

최근 인공지능 및 딥러닝 분야에서 자연어 처리(NLP)와 컴퓨터 비전(CV) 분야 모두에서 허깅페이스(Hugging Face) 라이브러리가 널리 사용되고 있습니다. 이 글에서는 허깅페이스 트랜스포머 라이브러리를 활용하여 이미지 데이터셋을 어떻게 처리하고 모델을 학습할 수 있는지에 대해 설명하고, 예제 코드를 통해 구체적으로 알아보겠습니다.

1. 허깅페이스와 트랜스포머란?

허깅페이스는 자연어 처리와 관련된 다양한 미리 훈련된 모델을 제공하는 라이브러리로, BERT, GPT-2, T5와 같은 모델을 손쉽게 사용할 수 있습니다. 하지만 최근에는 이미지 처리 모델인 비전 트랜스포머(ViT), CLIP 등이 추가되어 컴퓨터 비전 작업에서도 강력한 성능을 발휘하고 있습니다.

2. 필요한 패키지 및 환경 설정

허깅페이스의 트랜스포머 라이브러리를 사용하기 위해서는 먼저 필요한 패키지를 설치해야 합니다. 아래의 코드로 간단히 설치할 수 있습니다.

pip install transformers torchvision torch

3. 샘플 이미지 데이터셋

이번 강좌에서는 CIFAR-10 데이터셋을 샘플 데이터로 사용합니다. CIFAR-10은 10개의 클래스(비행기, 자동차, 새, 고양이, 사슴, 개, 펭귄, 기차, 곰, 자동차)로 구성된 6만 개의 32×32 색상 이미지를 포함하고 있습니다. 이 데이터셋은 이미지 분류 문제에 매우 적합합니다.

3.1 데이터셋 불러오기

파이썬의 torchvision 라이브러리를 활용하여 CIFAR-10 데이터셋을 불러오고, 학습과 검증 세트로 나누어 보겠습니다.

import torchvision
import torchvision.transforms as transforms

# 데이터 변환 설정
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])

# 학습 및 검증 데이터셋 불러오기
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)

3.2 데이터 전처리

불러온 데이터셋은 이미지 데이터를 텐서 형태로 변환하고 정규화 과정을 거쳐야 합니다. 위의 코드에서는 ToTensor() 메서드를 사용하여 이미지를 텐서로 변환하고, Normalize() 메서드를 사용하여 평균과 표준편차를 기반으로 정규화를 수행했습니다.

4. 비전 트랜스포머(ViT) 모델 구축

이제 ViT 모델을 구축하여 CIFAR-10 데이터셋에 대한 이미지를 분류하는 작업을 진행하겠습니다. 모델 정의는 허깅페이스의 transformers 라이브러리를 통해 간단하게 구현할 수 있습니다.

from transformers import ViTForImageClassification, ViTFeatureExtractor

# ViT 모델과 feature extractor 초기화
feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224', num_labels=10)

위 코드는 비전 트랜스포머 모델을 초기화하는 과정으로, `num_labels` 매개변수는 클래스 수를 설정하는 데 사용됩니다. 여기서는 10개의 클래스를 가지고 있으므로 해당 값으로 설정하였습니다.

5. 모델 학습

모델을 학습하기 위해서는 손실 함수 및 최적화 알고리즘을 정의해야 합니다. 여기서는 CrossEntropyLoss 손실 함수를 사용하고, Adam 옵티마이저를 사용할 것입니다.

import torch.optim as optim

# 손실 함수 및 최적화 알고리즘 정의
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 모델을 학습할 장치 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

# 모델 학습
for epoch in range(10):  # 10 에폭 동안 학습
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)

        # 기울기 초기화
        optimizer.zero_grad()

        # 순 forward + 역전파 + 최적화
        outputs = model(inputs).logits
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 2000 == 1999:  # 매 2000 미니배치마다 출력
            print(f"[{epoch + 1}, {i + 1}] loss: {running_loss / 2000:.3f}")
            running_loss = 0.0

위 코드는 에폭 수와 미니배치에 따라 모델을 학습하는 과정입니다. 각 배치에 대한 손실을 계산하고, 역전파를 통해 가중치를 업데이트하는 방식으로 진행합니다.

6. 모델 평가

학습이 완료된 모델을 평가하기 위해 테스트 데이터셋을 사용하겠습니다. 모델의 정확도를 평가하는 방법은 다음과 같습니다.

correct = 0
total = 0

with torch.no_grad():
    for data in testloader:
        images, labels = data
        images, labels = images.to(device), labels.to(device)
        outputs = model(images).logits
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')

위 코드는 테스트 데이터셋에서 모델의 정확도를 계산하는 과정입니다. 각 이미지에 대해 예측값과 실제 라벨을 비교하여 정확도를 산출합니다.

7. 결론

이번 글에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 CIFAR-10 데이터를 처리하고, 비전 트랜스포머 모델을 구축하여 이미지를 분류하는 방법을 알아보았습니다. 허깅페이스의 라이브러리를 사용하면 복잡한 모델을 손쉽게 구축하고, 다양한 데이터셋을 활용하여 성능을 최적화할 수 있습니다. 앞으로 더 다양한 모델과 데이터셋을 활용한 딥러닝 적용 사례를 계속 탐구해보시길 바랍니다.

문의 및 추가 정보가 필요하신 경우 댓글로 남겨주시면 감사하겠습니다.

허깅페이스 트렌스포머 활용강좌, 분류 정확도

딥러닝과 자연어 처리(NLP)의 발전은 오늘날의 기술 혁신을 이끄는 중요한 요소 중 하나입니다. 여러 라이브러리와 프레임워크가 존재하지만, 허깅페이스(Hugging Face)트랜스포머(transformers) 라이브러리는 특히 직관적이고 사용하기 쉽게 설계되어 있습니다. 본 글에서는 허깅페이스의 트랜스포머를 활용하여 문서 분류(Classification) 모델을 구축하고, 모델 성능을 평가하는 방법에 대해 다룰 것입니다.

1. 허깅페이스 트랜스포머란?

허깅페이스 트랜스포머 라이브러리는 다양한 모델 아키텍처를 지원하며, Pre-trained 모델을 쉽게 사용할 수 있도록 해줍니다. 트랜스포머는 자연어 처리에 혁신을 일으킨 모델로, Attention Mechanism을 기반으로 하고 있습니다. 이 모델들은 대규모 데이터셋으로 사전 학습되어, 특정 작업에 대해 미세 조정(Fine-tuning)하여 사용할 수 있습니다.

2. 필요한 라이브러리 설치하기

허깅페이스 트랜스포머를 사용하기 위해 필요한 라이브러리를 설치하겠습니다. 주로 사용할 라이브러리는 transformers, torch, datasets입니다. 다음의 명령어를 사용하여 설치하세요:

!pip install transformers torch datasets

3. 데이터셋 준비하기

문서 분류를 위해 사용할 데이터셋을 준비합니다. 여기서는 AG News 데이터셋을 사용할 것입니다. AG News는 뉴스 기사 분류를 위한 데이터셋으로, 4개의 클래스를 갖고 있습니다:

  • World
  • Sports
  • Business
  • Science/Technology

다음의 코드를 실행하면 데이터셋을 다운로드받고, 학습 및 테스트 데이터로 나눕니다.

from datasets import load_dataset

dataset = load_dataset("ag_news")

4. 데이터 전처리

데이터를 불러온 후에는 텍스트와 레이블을 분리하고, 필요한 전처리를 진행해야 합니다. 다음 코드는 샘플 데이터와 라벨을 확인하는 과정을 보여줍니다.

train_texts = dataset['train']['text']
train_labels = dataset['train']['label']

test_texts = dataset['test']['text']
test_labels = dataset['test']['label']

print("샘플 뉴스 기사:", train_texts[0])
print("라벨:", train_labels[0])

5. 모델 및 토크나이저 준비하기

이제 transformers 라이브러리를 통해 사전 학습된 모델과 토크나이저를 불러옵니다. 여기서는 BertForSequenceClassification 모델을 사용할 것입니다.

from transformers import BertTokenizer, BertForSequenceClassification

model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=4)

6. 데이터 토큰화

문서 분류를 위해 각 텍스트를 BERT 모델에 맞게 토큰화합니다. 다음 코드에서는 Padding을 추가해 배치 처리에 용이하도록 만듭니다.

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

tokenized_datasets = dataset.map(tokenize_function, batched=True)

7. 모델 학습하기

모델을 학습하기 위해 Trainer 클래스를 사용합니다. Trainer는 학습 및 평가를 자동으로 처리해 줍니다. 다음 코드는 설정 및 학습을 위한 준비 과정을 포함합니다.

from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir="./results",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=3,
    weight_decay=0.01,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets['train'],
    eval_dataset=tokenized_datasets['test']
)

trainer.train()

8. 모델 평가하기

모델 학습이 완료되면, 평가 함수를 통해 성능을 측정할 수 있습니다. metrics 라이브러리를 활용하여 정확도를 계산해보겠습니다.

import numpy as np
from sklearn.metrics import accuracy_score

predictions, label_ids, _ = trainer.predict(tokenized_datasets['test'])
preds = np.argmax(predictions, axis=1)

accuracy = accuracy_score(label_ids, preds)
print("분류 정확도:", accuracy)

9. 결론

허깅페이스 트랜스포머를 사용하여 데이터셋을 불러오고, 사전 학습된 모델을 활용하여 텍스트 분류를 수행하는 방법을 알아보았습니다. 이 과정을 통해 자연어 처리 작업에서 트랜스포머 모델의 유용성을 알 수 있었습니다. 추가적으로 Hyperparameter 튜닝이나 다양한 모델을 시도해보면 성능을 더욱 향상시킬 수 있습니다.

10. 참고 자료

더 많은 정보와 예제를 원하는 독자를 위해 다음의 자료를 추천합니다:

허깅페이스 트렌스포머 활용강좌, 모더나 화이자 Covid-19 백신 BERT [CLS] 벡터 추출

딥러닝과 자연어 처리(NLP)의 발전으로 많은 기업들이 텍스트 데이터를 분석하는 다양한 방법들을 모색하고 있습니다. 그 중에서도 BERT(Bidirectional Encoder Representations from Transformers)는 텍스트 데이터의 의미를 보다 깊이 이해하는 데 혁신적인 모델로 자리잡았습니다. 본 강좌에서는 허깅페이스의 트랜스포머(Transformers) 라이브러리를 이용해 모더나와 화이자 Covid-19 백신 관련 텍스트에서 [CLS] 벡터를 추출하는 방법을 다루겠습니다.

1. BERT 모델 소개

BERT는 구글에서 개발한 사전 학습된 언어 모델로, 주어진 문장의 컨텍스트를 이해하고 다양한 자연어 처리 태스크에 활용할 수 있습니다. BERT의 구조는 다음과 같습니다:

  • Bidirectional: BERT는 문맥을 이해하기 위해 문장을 양방향으로 처리합니다. 이는 단어의 의미를 주변 단어들과의 관계에서 파악할 수 있게 합니다.
  • Transformer: BERT는 Transformer 아키텍처를 기반으로 하며, self-attention 메커니즘을 통해 문장 내의 모든 단어 간의 관계를 학습합니다.
  • [CLS] 토큰: BERT 모델에 입력되는 문장의 시작 부분에는 항상 [CLS]라는 특별한 토큰이 추가됩니다. 이 토큰의 벡터는 문장 전체의 의미를 표현하며, 분류 문제에서 중요한 역할을 합니다.

2. 허깅페이스 트랜스포머 라이브러리 설치

허깅페이스 트랜스포머 라이브러리는 자연어 처리 작업을 위한 다양한 모델과 토크나이저를 제공합니다. 설치는 다음과 같이 진행합니다:

pip install transformers torch

3. 데이터 준비

이제 모더나와 화이자 관련 문서들을 준비하겠습니다. 여기서는 예시로 간단한 문장들을 사용하겠습니다. 실제 사용 시에는 더 많은 데이터를 수집해야 합니다.

texts = [
        "모더나 Covid-19 백신은 94.1%의 효능을 보였다.",
        "화이자 백신의 효능은 95%로 보고되었다.",
        "모더나와 화이자 백신은 mRNA 기술을 사용한다."
    ]

4. BERT 모델 로드 및 벡터 추출

BERT 모델과 토크나이저를 로드한 후, 입력 문장에 대한 [CLS] 벡터를 추출하는 방법을 소개하겠습니다.


from transformers import BertTokenizer, BertModel
import torch

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

# 텍스트 입력
texts = [
    "모더나 Covid-19 백신은 94.1%의 효능을 보였다.",
    "화이자 백신의 효능은 95%로 보고되었다.",
    "모더나와 화이자 백신은 mRNA 기술을 사용한다."
]

# [CLS] 벡터 추출
cls_vectors = []
for text in texts:
    inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True)
    outputs = model(**inputs)
    cls_vector = outputs.last_hidden_state[0][0]  # [CLS] 벡터
    cls_vectors.append(cls_vector.detach().numpy())

5. 결과 분석

위 코드를 실행하면 각 문장에 대한 [CLS] 벡터가 추출됩니다. 이 벡터들은 문장의 의미를 고차원 공간에서 표현하므로, 이후 다른 NLP 태스크에 활용될 수 있습니다.

5.1. 벡터 시각화 예제

추출한 벡터를 시각화하거나 군집화하여 문장 간의 유사성 분석을 진행할 수 있습니다.


import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 벡터를 2차원으로 축소
pca = PCA(n_components=2)
reduced_vectors = pca.fit_transform(np.array(cls_vectors))

# 시각화
plt.figure(figsize=(10, 6))
for i, text in enumerate(texts):
    plt.scatter(reduced_vectors[i, 0], reduced_vectors[i, 1])
    plt.annotate(text, (reduced_vectors[i, 0], reduced_vectors[i, 1]))
plt.title('BERT [CLS] Vectors Visualization')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.grid()
plt.show()

6. 결론

이번 강좌에서는 허깅페이스의 트랜스포머 라이브러리를 활용하여 BERT 모델로부터 모더나와 화이자 백신 관련 텍스트의 [CLS] 벡터를 추출하는 과정을 다루었습니다. 이를 통해 텍스트 데이터의 의미를 이해하고, 다양한 NLP 응용 프로그램에 활용할 수 있는 기초를 마련하였습니다.

이러한 기술들은 연구 논문, 사회적 여론 분석 등 많은 분야에서 활용될 수 있으며, 앞으로도 더욱 발전할 것입니다. 차후에는 이러한 벡터를 이용한 분류 문제나 감정 분석 같은 보다 다양한 응용 예제를 다룰 수 있도록 하겠습니다.

7. 참고자료